Merge "fix clickable area of FAB on pre-Lollipop devices"
am: cebdfafcff
* commit 'cebdfafcff5e9b4b479533126b3deb916fe9d587':
fix clickable area of FAB on pre-Lollipop devices
diff --git a/.gitignore b/.gitignore
index c8c3ed8..a72b3dc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,3 +6,5 @@
project.properties
**/bin
**/gen
+*.iml
+**/out
diff --git a/build.gradle b/build.gradle
index cea5ad0..7bd791a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -34,6 +34,7 @@
}
ext.supportRepoOut = new File(buildDir, 'support_repo')
+ext.testApkDistOut = new File(buildDir, 'test_apks')
// Main task called by the build server.
task(createArchive) << {
diff --git a/design/api/current.txt b/design/api/current.txt
index a1d9fab..7d85b1b 100644
--- a/design/api/current.txt
+++ b/design/api/current.txt
@@ -222,10 +222,15 @@
ctor public FloatingActionButton(android.content.Context);
ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet);
ctor public FloatingActionButton(android.content.Context, android.util.AttributeSet, int);
+ method public android.graphics.drawable.Drawable getContentBackground();
method public boolean getContentRect(android.graphics.Rect);
+ method public float getFloatingActionButtonElevation();
+ method public boolean getUseCompatPadding();
method public void hide();
method public void hide(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
+ method public void setFloatingActionButtonElevation(float);
method public void setRippleColor(int);
+ method public void setUseCompatPadding(boolean);
method public void show();
method public void show(android.support.design.widget.FloatingActionButton.OnVisibilityChangedListener);
}
@@ -370,7 +375,7 @@
method public void setTabMode(int);
method public void setTabTextColors(android.content.res.ColorStateList);
method public void setTabTextColors(int, int);
- method public void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
+ method public deprecated void setTabsFromPagerAdapter(android.support.v4.view.PagerAdapter);
method public void setupWithViewPager(android.support.v4.view.ViewPager);
field public static final int GRAVITY_CENTER = 1; // 0x1
field public static final int GRAVITY_FILL = 0; // 0x0
@@ -431,12 +436,14 @@
method public boolean isCounterEnabled();
method public boolean isErrorEnabled();
method public boolean isHintAnimationEnabled();
+ method public boolean isHintEnabled();
method public void setCounterEnabled(boolean);
method public void setCounterMaxLength(int);
method public void setError(java.lang.CharSequence);
method public void setErrorEnabled(boolean);
method public void setHint(java.lang.CharSequence);
method public void setHintAnimationEnabled(boolean);
+ method public void setHintEnabled(boolean);
method public void setHintTextAppearance(int);
method public void setTypeface(android.graphics.Typeface);
}
diff --git a/design/base/android/support/design/widget/FloatingActionButtonImpl.java b/design/base/android/support/design/widget/FloatingActionButtonImpl.java
index 8c9e0ab..189060a 100644
--- a/design/base/android/support/design/widget/FloatingActionButtonImpl.java
+++ b/design/base/android/support/design/widget/FloatingActionButtonImpl.java
@@ -20,6 +20,7 @@
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.PorterDuff;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.support.annotation.Nullable;
@@ -28,6 +29,14 @@
abstract class FloatingActionButtonImpl {
+ Drawable mShapeDrawable;
+ Drawable mRippleDrawable;
+ CircularBorderDrawable mBorderDrawable;
+ Drawable mContentBackground;
+
+ float mElevation;
+ float mPressedTranslationZ;
+
interface InternalVisibilityChangedListener {
public void onShown();
public void onHidden();
@@ -44,6 +53,7 @@
final VisibilityAwareImageButton mView;
final ShadowViewDelegate mShadowViewDelegate;
+ private final Rect mTmpRect = new Rect();
private ViewTreeObserver.OnPreDrawListener mPreDrawListener;
FloatingActionButtonImpl(VisibilityAwareImageButton view,
@@ -61,9 +71,25 @@
abstract void setRippleColor(int rippleColor);
- abstract void setElevation(float elevation);
+ final void setElevation(float elevation) {
+ if (mElevation != elevation) {
+ mElevation = elevation;
+ onElevationChanged(elevation);
+ }
+ }
- abstract void setPressedTranslationZ(float translationZ);
+ abstract float getElevation();
+
+ final void setPressedTranslationZ(float translationZ) {
+ if (mPressedTranslationZ != translationZ) {
+ mPressedTranslationZ = translationZ;
+ onTranslationZChanged(translationZ);
+ }
+ }
+
+ abstract void onElevationChanged(float elevation);
+
+ abstract void onTranslationZChanged(float translationZ);
abstract void onDrawableStateChanged(int[] state);
@@ -73,6 +99,23 @@
abstract void show(@Nullable InternalVisibilityChangedListener listener, boolean fromUser);
+ final Drawable getContentBackground() {
+ return mContentBackground;
+ }
+
+ abstract void onCompatShadowChanged();
+
+ final void updatePadding() {
+ Rect rect = mTmpRect;
+ getPadding(rect);
+ onPaddingUpdated(rect);
+ mShadowViewDelegate.setShadowPadding(rect.left, rect.top, rect.right, rect.bottom);
+ }
+
+ abstract void getPadding(Rect rect);
+
+ void onPaddingUpdated(Rect padding) {}
+
void onAttachedToWindow() {
if (requirePreDrawListener()) {
ensurePreDrawListener();
diff --git a/design/base/android/support/design/widget/ShadowViewDelegate.java b/design/base/android/support/design/widget/ShadowViewDelegate.java
index 9a395e6..83a3a7a 100644
--- a/design/base/android/support/design/widget/ShadowViewDelegate.java
+++ b/design/base/android/support/design/widget/ShadowViewDelegate.java
@@ -22,4 +22,5 @@
float getRadius();
void setShadowPadding(int left, int top, int right, int bottom);
void setBackgroundDrawable(Drawable background);
+ boolean isCompatPaddingEnabled();
}
diff --git a/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java b/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
index 577682f..92f9603 100644
--- a/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
+++ b/design/eclair-mr1/android/support/design/widget/FloatingActionButtonEclairMr1.java
@@ -23,7 +23,6 @@
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
-import android.os.Build;
import android.support.annotation.Nullable;
import android.support.design.R;
import android.support.design.widget.AnimationUtils.AnimationListenerAdapter;
@@ -34,20 +33,12 @@
class FloatingActionButtonEclairMr1 extends FloatingActionButtonImpl {
- Drawable mShapeDrawable;
- Drawable mRippleDrawable;
- CircularBorderDrawable mBorderDrawable;
-
- private float mElevation;
- private float mPressedTranslationZ;
private int mAnimationDuration;
-
private StateListAnimator mStateListAnimator;
+ private boolean mIsHiding;
ShadowDrawableWrapper mShadowDrawable;
- private boolean mIsHiding;
-
FloatingActionButtonEclairMr1(VisibilityAwareImageButton view,
ShadowViewDelegate shadowViewDelegate) {
super(view, shadowViewDelegate);
@@ -96,17 +87,16 @@
layers = new Drawable[] {mShapeDrawable, mRippleDrawable};
}
+ mContentBackground = new LayerDrawable(layers);
+
mShadowDrawable = new ShadowDrawableWrapper(
mView.getResources(),
- new LayerDrawable(layers),
+ mContentBackground,
mShadowViewDelegate.getRadius(),
mElevation,
mElevation + mPressedTranslationZ);
mShadowDrawable.setAddPaddingForCorners(false);
-
mShadowViewDelegate.setBackgroundDrawable(mShadowDrawable);
-
- updatePadding();
}
@Override
@@ -128,18 +118,21 @@
}
@Override
- void setElevation(float elevation) {
- if (mElevation != elevation && mShadowDrawable != null) {
+ float getElevation() {
+ return mElevation;
+ }
+
+ @Override
+ void onElevationChanged(float elevation) {
+ if (mShadowDrawable != null) {
mShadowDrawable.setShadowSize(elevation, elevation + mPressedTranslationZ);
- mElevation = elevation;
updatePadding();
}
}
@Override
- void setPressedTranslationZ(float translationZ) {
- if (mPressedTranslationZ != translationZ && mShadowDrawable != null) {
- mPressedTranslationZ = translationZ;
+ void onTranslationZChanged(float translationZ) {
+ if (mShadowDrawable != null) {
mShadowDrawable.setMaxShadowSize(mElevation + translationZ);
updatePadding();
}
@@ -214,10 +207,13 @@
}
}
- private void updatePadding() {
- Rect rect = new Rect();
+ @Override
+ void onCompatShadowChanged() {
+ // Ignore pre-v21
+ }
+
+ void getPadding(Rect rect) {
mShadowDrawable.getPadding(rect);
- mShadowViewDelegate.setShadowPadding(rect.left, rect.top, rect.right, rect.bottom);
}
private Animation setupAnimation(Animation animation) {
diff --git a/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java b/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
index e68102d..2b85845 100644
--- a/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
+++ b/design/lollipop/android/support/design/widget/FloatingActionButtonLollipop.java
@@ -22,7 +22,9 @@
import android.annotation.TargetApi;
import android.content.res.ColorStateList;
import android.graphics.PorterDuff;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
+import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.RippleDrawable;
import android.os.Build;
@@ -34,16 +36,16 @@
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
class FloatingActionButtonLollipop extends FloatingActionButtonIcs {
- private Interpolator mInterpolator;
+ private final Interpolator mInterpolator;
+ private InsetDrawable mInsetDrawable;
FloatingActionButtonLollipop(VisibilityAwareImageButton view,
ShadowViewDelegate shadowViewDelegate) {
super(view, shadowViewDelegate);
- if (!view.isInEditMode()) {
- mInterpolator = AnimationUtils.loadInterpolator(mView.getContext(),
- android.R.interpolator.fast_out_slow_in);
- }
+ mInterpolator = view.isInEditMode() ? null
+ : AnimationUtils.loadInterpolator(mView.getContext(),
+ android.R.interpolator.fast_out_slow_in);
}
@Override
@@ -68,8 +70,9 @@
mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor),
rippleContent, null);
+ mContentBackground = mRippleDrawable;
+
mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable);
- mShadowViewDelegate.setShadowPadding(0, 0, 0, 0);
}
@Override
@@ -82,14 +85,16 @@
}
@Override
- public void setElevation(float elevation) {
- ViewCompat.setElevation(mView, elevation);
+ public void onElevationChanged(float elevation) {
+ mView.setElevation(elevation);
+ if (mShadowViewDelegate.isCompatPaddingEnabled()) {
+ updatePadding();
+ }
}
@Override
- void setPressedTranslationZ(float translationZ) {
+ void onTranslationZChanged(float translationZ) {
StateListAnimator stateListAnimator = new StateListAnimator();
-
// Animate translationZ to our value when pressed or focused
stateListAnimator.addState(PRESSED_ENABLED_STATE_SET,
setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", translationZ)));
@@ -98,8 +103,32 @@
// Animate translationZ to 0 otherwise
stateListAnimator.addState(EMPTY_STATE_SET,
setupAnimator(ObjectAnimator.ofFloat(mView, "translationZ", 0f)));
-
mView.setStateListAnimator(stateListAnimator);
+
+ if (mShadowViewDelegate.isCompatPaddingEnabled()) {
+ updatePadding();
+ }
+ }
+
+ @Override
+ public float getElevation() {
+ return mView.getElevation();
+ }
+
+ @Override
+ void onCompatShadowChanged() {
+ updatePadding();
+ }
+
+ @Override
+ void onPaddingUpdated(Rect padding) {
+ if (mShadowViewDelegate.isCompatPaddingEnabled()) {
+ mInsetDrawable = new InsetDrawable(mRippleDrawable,
+ padding.left, padding.top, padding.right, padding.bottom);
+ mShadowViewDelegate.setBackgroundDrawable(mInsetDrawable);
+ } else {
+ mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable);
+ }
}
@Override
@@ -126,4 +155,18 @@
CircularBorderDrawable newCircularDrawable() {
return new CircularBorderDrawableLollipop();
}
+
+ void getPadding(Rect rect) {
+ if (mShadowViewDelegate.isCompatPaddingEnabled()) {
+ final float radius = mShadowViewDelegate.getRadius();
+ final float maxShadowSize = getElevation() + mPressedTranslationZ;
+ final int hPadding = (int) Math.ceil(
+ ShadowDrawableWrapper.calculateHorizontalPadding(maxShadowSize, radius, false));
+ final int vPadding = (int) Math.ceil(
+ ShadowDrawableWrapper.calculateVerticalPadding(maxShadowSize, radius, false));
+ rect.set(hPadding, vPadding, hPadding, vPadding);
+ } else {
+ rect.set(0, 0, 0, 0);
+ }
+ }
}
diff --git a/design/proguard-rules.pro b/design/proguard-rules.pro
index ea77945..96e2ee0 100644
--- a/design/proguard-rules.pro
+++ b/design/proguard-rules.pro
@@ -17,3 +17,6 @@
public <init>(android.content.Context, android.util.AttributeSet);
public <init>();
}
+
+# Make sure we keep annotations for CoordinatorLayout's DefaultBehavior
+-keepattributes *Annotation*
diff --git a/design/res/values/attrs.xml b/design/res/values/attrs.xml
index 0179ec7..29ca0af 100644
--- a/design/res/values/attrs.xml
+++ b/design/res/values/attrs.xml
@@ -34,6 +34,8 @@
<attr name="pressedTranslationZ" format="dimension"/>
<!-- The width of the border around the FAB. -->
<attr name="borderWidth" format="dimension"/>
+ <!-- Enable compat padding. -->
+ <attr name="useCompatPadding" format="boolean"/>
</declare-styleable>
<declare-styleable name="ScrimInsetsFrameLayout">
@@ -162,6 +164,8 @@
<attr name="hintTextAppearance" format="reference"/>
<!-- The hint to display in the floating label -->
<attr name="android:hint"/>
+ <!-- Whether the layout's floating label functionality is enabled -->
+ <attr name="hintEnabled" format="boolean"/>
<!-- Whether the layout is laid out as if an error will be displayed -->
<attr name="errorEnabled" format="boolean"/>
<!-- TextAppearance of any error message displayed -->
diff --git a/design/src/android/support/design/internal/ForegroundLinearLayout.java b/design/src/android/support/design/internal/ForegroundLinearLayout.java
index 373ba48..eff89e3 100644
--- a/design/src/android/support/design/internal/ForegroundLinearLayout.java
+++ b/design/src/android/support/design/internal/ForegroundLinearLayout.java
@@ -45,7 +45,7 @@
boolean mForegroundBoundsChanged = false;
public ForegroundLinearLayout(Context context) {
- super(context);
+ this(context, null);
}
public ForegroundLinearLayout(Context context, AttributeSet attrs) {
diff --git a/design/src/android/support/design/widget/AppBarLayout.java b/design/src/android/support/design/widget/AppBarLayout.java
index 4b910ba..eb7a962 100644
--- a/design/src/android/support/design/widget/AppBarLayout.java
+++ b/design/src/android/support/design/widget/AppBarLayout.java
@@ -369,6 +369,9 @@
if ((flags & LayoutParams.SCROLL_FLAG_ENTER_ALWAYS_COLLAPSED) != 0) {
// If they're set to enter collapsed, use the minimum height
range += ViewCompat.getMinimumHeight(child);
+ } else if ((flags & LayoutParams.SCROLL_FLAG_EXIT_UNTIL_COLLAPSED) != 0) {
+ // Only enter by the amount of the collapsed height
+ range += childHeight - ViewCompat.getMinimumHeight(child);
} else {
// Else use the full height
range += childHeight;
@@ -379,7 +382,7 @@
break;
}
}
- return mDownPreScrollRange = range;
+ return mDownPreScrollRange = Math.max(0, range - getTopInset());
}
/**
@@ -668,7 +671,7 @@
private int mOffsetDelta;
private boolean mSkipNestedPreScroll;
- private boolean mWasFlung;
+ private boolean mWasNestedFlung;
private ValueAnimatorCompat mAnimator;
@@ -743,14 +746,14 @@
@Override
public void onStopNestedScroll(CoordinatorLayout coordinatorLayout, AppBarLayout abl,
View target) {
- if (!mWasFlung) {
+ if (!mWasNestedFlung) {
// If we haven't been flung then let's see if the current view has been set to snap
snapToChildIfNeeded(coordinatorLayout, abl);
}
// Reset the flags
mSkipNestedPreScroll = false;
- mWasFlung = false;
+ mWasNestedFlung = false;
// Keep a reference to the previous nested scrolling child
mLastNestedScrollingChildRef = new WeakReference<>(target);
}
@@ -790,7 +793,7 @@
}
}
- mWasFlung = flung;
+ mWasNestedFlung = flung;
return flung;
}
@@ -907,6 +910,11 @@
abl.resetPendingAction();
mOffsetToChildIndexOnLayout = INVALID_POSITION;
+ // We may have changed size, so let's constrain the top and bottom offset correctly,
+ // just in case we're out of the bounds
+ setTopAndBottomOffset(
+ MathUtils.constrain(getTopAndBottomOffset(), -abl.getTotalScrollRange(), 0));
+
// Make sure we update the elevation
dispatchOffsetUpdates(abl);
@@ -933,6 +941,12 @@
}
@Override
+ void onFlingFinished(CoordinatorLayout parent, AppBarLayout layout) {
+ // At the end of a manual fling, check to see if we need to snap to the edge-child
+ snapToChildIfNeeded(parent, layout);
+ }
+
+ @Override
int getMaxDragOffset(AppBarLayout view) {
return -view.getDownNestedScrollRange();
}
diff --git a/design/src/android/support/design/widget/CollapsingTextHelper.java b/design/src/android/support/design/widget/CollapsingTextHelper.java
index 152385b..9a38c7d 100644
--- a/design/src/android/support/design/widget/CollapsingTextHelper.java
+++ b/design/src/android/support/design/widget/CollapsingTextHelper.java
@@ -560,7 +560,7 @@
final int w = Math.round(mTextPaint.measureText(mTextToDraw, 0, mTextToDraw.length()));
final int h = Math.round(mTextureDescent - mTextureAscent);
- if (w <= 0 && h <= 0) {
+ if (w <= 0 || h <= 0) {
return; // If the width or height are 0, return
}
diff --git a/design/src/android/support/design/widget/DrawableUtils.java b/design/src/android/support/design/widget/DrawableUtils.java
new file mode 100644
index 0000000..1c46e6b2
--- /dev/null
+++ b/design/src/android/support/design/widget/DrawableUtils.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.design.widget;
+
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
+import android.os.Build;
+import android.util.Log;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+
+/**
+ * Caution. Gross hacks ahead.
+ */
+class DrawableUtils {
+
+ private static final String LOG_TAG = "DrawableUtils";
+
+ private static Method sSetConstantStateMethod;
+ private static boolean sSetConstantStateMethodFetched;
+
+ private static Field sDrawableContainerStateField;
+ private static boolean sDrawableContainerStateFieldFetched;
+
+ private DrawableUtils() {}
+
+ static boolean setContainerConstantState(DrawableContainer drawable,
+ Drawable.ConstantState constantState) {
+ if (Build.VERSION.SDK_INT >= 9) {
+ // We can use getDeclaredMethod() on v9+
+ return setContainerConstantStateV9(drawable, constantState);
+ } else {
+ // Else we'll just have to set the field directly
+ return setContainerConstantStateV7(drawable, constantState);
+ }
+ }
+
+ private static boolean setContainerConstantStateV9(DrawableContainer drawable,
+ Drawable.ConstantState constantState) {
+ if (!sSetConstantStateMethodFetched) {
+ try {
+ sSetConstantStateMethod = DrawableContainer.class.getDeclaredMethod(
+ "setConstantState", DrawableContainer.DrawableContainerState.class);
+ sSetConstantStateMethod.setAccessible(true);
+ } catch (NoSuchMethodException e) {
+ Log.e(LOG_TAG, "Could not fetch setConstantState(). Oh well.");
+ }
+ sSetConstantStateMethodFetched = true;
+ }
+ if (sSetConstantStateMethod != null) {
+ try {
+ sSetConstantStateMethod.invoke(drawable, constantState);
+ return true;
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Could not invoke setConstantState(). Oh well.");
+ }
+ }
+ return false;
+ }
+
+ private static boolean setContainerConstantStateV7(DrawableContainer drawable,
+ Drawable.ConstantState constantState) {
+ if (!sDrawableContainerStateFieldFetched) {
+ try {
+ sDrawableContainerStateField = DrawableContainer.class
+ .getDeclaredField("mDrawableContainerStateField");
+ sDrawableContainerStateField.setAccessible(true);
+ } catch (NoSuchFieldException e) {
+ Log.e(LOG_TAG, "Could not fetch mDrawableContainerStateField. Oh well.");
+ }
+ sDrawableContainerStateFieldFetched = true;
+ }
+ if (sDrawableContainerStateField != null) {
+ try {
+ sDrawableContainerStateField.set(drawable, constantState);
+ return true;
+ } catch (Exception e) {
+ Log.e(LOG_TAG, "Could not set mDrawableContainerStateField. Oh well.");
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/design/src/android/support/design/widget/FloatingActionButton.java b/design/src/android/support/design/widget/FloatingActionButton.java
index 45bc967..c39b852 100644
--- a/design/src/android/support/design/widget/FloatingActionButton.java
+++ b/design/src/android/support/design/widget/FloatingActionButton.java
@@ -94,6 +94,7 @@
private int mImagePadding;
private Rect mTouchArea;
+ private boolean mCompatPadding;
private final Rect mShadowPadding;
private final FloatingActionButtonImpl mImpl;
@@ -126,6 +127,7 @@
final float elevation = a.getDimension(R.styleable.FloatingActionButton_elevation, 0f);
final float pressedTranslationZ = a.getDimension(
R.styleable.FloatingActionButton_pressedTranslationZ, 0f);
+ mCompatPadding = a.getBoolean(R.styleable.FloatingActionButton_useCompatPadding, false);
a.recycle();
final ShadowViewDelegate delegate = new ShadowViewDelegate() {
@@ -137,7 +139,6 @@
@Override
public void setShadowPadding(int left, int top, int right, int bottom) {
mShadowPadding.set(left, top, right, bottom);
-
setPadding(left + mImagePadding, top + mImagePadding,
right + mImagePadding, bottom + mImagePadding);
}
@@ -146,6 +147,11 @@
public void setBackgroundDrawable(Drawable background) {
FloatingActionButton.super.setBackgroundDrawable(background);
}
+
+ @Override
+ public boolean isCompatPaddingEnabled() {
+ return mCompatPadding;
+ }
};
final int sdk = Build.VERSION.SDK_INT;
@@ -164,6 +170,7 @@
mRippleColor, mBorderWidth);
mImpl.setElevation(elevation);
mImpl.setPressedTranslationZ(pressedTranslationZ);
+ mImpl.updatePadding();
}
@Override
@@ -189,6 +196,8 @@
* When running on devices with KitKat or below, we draw a fill rather than a ripple.
*
* @param color ARGB color to use for the ripple.
+ *
+ * @attr ref android.support.design.R.styleable#FloatingActionButton_rippleColor
*/
public void setRippleColor(@ColorInt int color) {
if (mRippleColor != color) {
@@ -222,7 +231,6 @@
}
}
-
/**
* Return the blending mode used to apply the tint to the background
* drawable, if specified.
@@ -311,6 +319,36 @@
mImpl.hide(wrapOnVisibilityChangedListener(listener), fromUser);
}
+ /**
+ * Set whether FloatingActionButton should add inner padding on platforms Lollipop and after,
+ * to ensure consistent dimensions on all platforms.
+ *
+ * @param useCompatPadding true if FloatingActionButton is adding inner padding on platforms
+ * Lollipop and after, to ensure consistent dimensions on all platforms.
+ *
+ * @attr ref android.support.design.R.styleable#FloatingActionButton_useCompatPadding
+ * @see #getUseCompatPadding()
+ */
+ public void setUseCompatPadding(boolean useCompatPadding) {
+ if (mCompatPadding != useCompatPadding) {
+ mCompatPadding = useCompatPadding;
+ mImpl.onCompatShadowChanged();
+ }
+ }
+
+ /**
+ * Returns whether FloatingActionButton will add inner padding on platforms Lollipop and after.
+ *
+ * @return true if FloatingActionButton is adding inner padding on platforms Lollipop and after,
+ * to ensure consistent dimensions on all platforms.
+ *
+ * @attr ref android.support.design.R.styleable#FloatingActionButton_useCompatPadding
+ * @see #setUseCompatPadding(boolean)
+ */
+ public boolean getUseCompatPadding() {
+ return mCompatPadding;
+ }
+
@Nullable
private InternalVisibilityChangedListener wrapOnVisibilityChangedListener(
@Nullable final OnVisibilityChangedListener listener) {
@@ -385,6 +423,14 @@
}
}
+ /**
+ * Returns the FloatingActionButton's background, minus any compatible shadow implementation.
+ */
+ @NonNull
+ public Drawable getContentBackground() {
+ return mImpl.getContentBackground();
+ }
+
private static int resolveAdjustedSize(int desiredSize, int measureSpec) {
int result = desiredSize;
int specMode = MeasureSpec.getMode(measureSpec);
@@ -615,4 +661,27 @@
}
}
}
+
+ /**
+ * Returns the backward compatible elevation of the FloatingActionButton.
+ *
+ * @return the backward compatible elevation in pixels.
+ * @attr ref android.support.design.R.styleable#FloatingActionButton_elevation
+ * @see #setFloatingActionButtonElevation(float)
+ */
+ public float getFloatingActionButtonElevation() {
+ return mImpl.getElevation();
+ }
+
+ /**
+ * Updates the backward compatible elevation of the FloatingActionButton.
+ *
+ * @param elevation The backward compatible elevation in pixels.
+ * @attr ref android.support.design.R.styleable#FloatingActionButton_elevation
+ * @see #getFloatingActionButtonElevation()
+ * @see #setUseCompatPadding(boolean)
+ */
+ public void setFloatingActionButtonElevation(float elevation) {
+ mImpl.setElevation(elevation);
+ }
}
diff --git a/design/src/android/support/design/widget/HeaderBehavior.java b/design/src/android/support/design/widget/HeaderBehavior.java
index 6e7a1c0..9924d48 100644
--- a/design/src/android/support/design/widget/HeaderBehavior.java
+++ b/design/src/android/support/design/widget/HeaderBehavior.java
@@ -247,8 +247,18 @@
mFlingRunnable = new FlingRunnable(coordinatorLayout, layout);
ViewCompat.postOnAnimation(layout, mFlingRunnable);
return true;
+ } else {
+ onFlingFinished(coordinatorLayout, layout);
+ return false;
}
- return false;
+ }
+
+ /**
+ * Called when a fling has finished, or the fling was initiated but there wasn't enough
+ * velocity to start it.
+ */
+ void onFlingFinished(CoordinatorLayout parent, V layout) {
+ // no-op
}
/**
@@ -286,11 +296,14 @@
@Override
public void run() {
- if (mLayout != null && mScroller != null && mScroller.computeScrollOffset()) {
- setHeaderTopBottomOffset(mParent, mLayout, mScroller.getCurrY());
-
- // Post ourselves so that we run on the next animation
- ViewCompat.postOnAnimation(mLayout, this);
+ if (mLayout != null && mScroller != null) {
+ if (mScroller.computeScrollOffset()) {
+ setHeaderTopBottomOffset(mParent, mLayout, mScroller.getCurrY());
+ // Post ourselves so that we run on the next animation
+ ViewCompat.postOnAnimation(mLayout, this);
+ } else {
+ onFlingFinished(mParent, mLayout);
+ }
}
}
}
diff --git a/design/src/android/support/design/widget/TabLayout.java b/design/src/android/support/design/widget/TabLayout.java
index d42108d..fe1a105 100755
--- a/design/src/android/support/design/widget/TabLayout.java
+++ b/design/src/android/support/design/widget/TabLayout.java
@@ -21,6 +21,7 @@
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.database.DataSetObserver;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
@@ -33,6 +34,7 @@
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.design.R;
+import android.support.v4.util.Pools;
import android.support.v4.view.GravityCompat;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewCompat;
@@ -63,6 +65,10 @@
import java.util.ArrayList;
import java.util.Iterator;
+import static android.support.v4.view.ViewPager.SCROLL_STATE_DRAGGING;
+import static android.support.v4.view.ViewPager.SCROLL_STATE_IDLE;
+import static android.support.v4.view.ViewPager.SCROLL_STATE_SETTLING;
+
/**
* TabLayout provides a horizontal layout to display tabs.
*
@@ -81,15 +87,8 @@
* notified when any tab's selection state has been changed.
* <p>
* If you're using a {@link android.support.v4.view.ViewPager} together
- * with this layout, you can use {@link #setTabsFromPagerAdapter(PagerAdapter)} which will populate
- * the tabs using the given {@link PagerAdapter}'s page titles. You should also use a
- * {@link TabLayoutOnPageChangeListener} to forward the scroll and selection changes to this
- * layout like so:
- * <pre>
- * ViewPager viewPager = ...;
- * TabLayout tabLayout = ...;
- * viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(tabLayout));
- * </pre>
+ * with this layout, you can use {@link #setupWithViewPager(ViewPager)} to link the two together.
+ * This layout will be automatically populated from the {@link PagerAdapter}'s page titles.</p>
*
* @see <a href="http://www.google.com/design/spec/components/tabs.html">Tabs</a>
*/
@@ -105,6 +104,8 @@
private static final int ANIMATION_DURATION = 300;
+ private static final Pools.Pool<Tab> sTabPool = new Pools.SynchronizedPool<>(16);
+
/**
* Scrollable tabs display a subset of tabs at any given moment, and can contain longer tab
* labels and a larger number of tabs. They are best used for browsing contexts in touch
@@ -215,7 +216,14 @@
private View.OnClickListener mTabClickListener;
private ValueAnimatorCompat mScrollAnimator;
- private ValueAnimatorCompat mIndicatorAnimator;
+
+ private ViewPager mViewPager;
+ private PagerAdapter mPagerAdapter;
+ private DataSetObserver mPagerAdapterObserver;
+ private TabLayoutOnPageChangeListener mPageChangeListener;
+
+ // Pool we use as a simple RecyclerBin
+ private final Pools.Pool<TabView> mTabViewPool = new Pools.SimplePool<>(12);
public TabLayout(Context context) {
this(context, null);
@@ -329,20 +337,30 @@
* @param updateSelectedText Whether to update the text's selected state.
*/
public void setScrollPosition(int position, float positionOffset, boolean updateSelectedText) {
- if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
- return;
- }
- if (position < 0 || position >= mTabStrip.getChildCount()) {
+ setScrollPosition(position, positionOffset, updateSelectedText, true);
+ }
+
+ private void setScrollPosition(int position, float positionOffset, boolean updateSelectedText,
+ boolean updateIndicatorPosition) {
+ final int roundedPosition = Math.round(position + positionOffset);
+ if (roundedPosition < 0 || roundedPosition >= mTabStrip.getChildCount()) {
return;
}
- // Set the indicator position and update the scroll to match
- mTabStrip.setIndicatorPositionFromTabPosition(position, positionOffset);
+ // Set the indicator position, if enabled
+ if (updateIndicatorPosition) {
+ mTabStrip.setIndicatorPositionFromTabPosition(position, positionOffset);
+ }
+
+ // Now update the scroll position, canceling any running animation
+ if (mScrollAnimator != null && mScrollAnimator.isRunning()) {
+ mScrollAnimator.cancel();
+ }
scrollTo(calculateScrollXForTab(position, positionOffset), 0);
- // Update the 'selected state' view as we scroll
+ // Update the 'selected state' view as we scroll, if enabled
if (updateSelectedText) {
- setSelectedTabView(Math.round(position + positionOffset));
+ setSelectedTabView(roundedPosition);
}
}
@@ -427,7 +445,8 @@
*/
@NonNull
public Tab newTab() {
- return new Tab(this);
+ final Tab poolTab = sTabPool.acquire();
+ return poolTab != null ? poolTab : new Tab(this);
}
/**
@@ -480,9 +499,10 @@
final int selectedTabPosition = mSelectedTab != null ? mSelectedTab.getPosition() : 0;
removeTabViewAt(position);
- Tab removedTab = mTabs.remove(position);
+ final Tab removedTab = mTabs.remove(position);
if (removedTab != null) {
- removedTab.setPosition(Tab.INVALID_POSITION);
+ removedTab.reset();
+ sTabPool.release(removedTab);
}
final int newTabCount = mTabs.size();
@@ -500,12 +520,15 @@
*/
public void removeAllTabs() {
// Remove all the views
- mTabStrip.removeAllViews();
+ for (int i = mTabStrip.getChildCount() - 1; i >= 0; i--) {
+ removeTabViewAt(i);
+ }
- for (Iterator<Tab> i = mTabs.iterator(); i.hasNext(); ) {
- Tab tab = i.next();
- tab.setPosition(Tab.INVALID_POSITION);
+ for (final Iterator<Tab> i = mTabs.iterator(); i.hasNext();) {
+ final Tab tab = i.next();
i.remove();
+ tab.reset();
+ sTabPool.release(tab);
}
mSelectedTab = null;
@@ -591,57 +614,102 @@
/**
* The one-stop shop for setting up this {@link TabLayout} with a {@link ViewPager}.
*
- * <p>This method will:
- * <ul>
- * <li>Add a {@link ViewPager.OnPageChangeListener} that will forward events to
- * this TabLayout.</li>
- * <li>Populate the TabLayout's tabs from the ViewPager's {@link PagerAdapter}.</li>
- * <li>Set our {@link TabLayout.OnTabSelectedListener} which will forward
- * selected events to the ViewPager</li>
- * </ul>
- * </p>
+ * <p>This method will link the given ViewPager and this TabLayout together so that any
+ * changes in one are automatically reflected in the other. This includes adapter changes,
+ * scroll state changes, and clicks. The tabs displayed in this layout will be populated
+ * from the ViewPager adapter's page titles.</p>
*
- * @see #setTabsFromPagerAdapter(PagerAdapter)
- * @see TabLayoutOnPageChangeListener
- * @see ViewPagerOnTabSelectedListener
+ * <p>After this method is called, you will not need this method again unless you want
+ * to change the linked ViewPager.</p>
+ *
+ * <p>If the given ViewPager is non-null, it needs to already have a
+ * {@link PagerAdapter} set.</p>
+ *
+ * @param viewPager The ViewPager to link, or {@code null} to clear any previous link.
*/
- public void setupWithViewPager(@NonNull ViewPager viewPager) {
- final PagerAdapter adapter = viewPager.getAdapter();
- if (adapter == null) {
- throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
+ public void setupWithViewPager(@Nullable final ViewPager viewPager) {
+ if (mViewPager != null && mPageChangeListener != null) {
+ // If we've already been setup with a ViewPager, remove us from it
+ mViewPager.removeOnPageChangeListener(mPageChangeListener);
}
- // First we'll add Tabs, using the adapter's page titles
- setTabsFromPagerAdapter(adapter);
-
- // Now we'll add our page change listener to the ViewPager
- viewPager.addOnPageChangeListener(new TabLayoutOnPageChangeListener(this));
-
- // Now we'll add a tab selected listener to set ViewPager's current item
- setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
-
- // Make sure we reflect the currently set ViewPager item
- if (adapter.getCount() > 0) {
- final int curItem = viewPager.getCurrentItem();
- if (getSelectedTabPosition() != curItem) {
- selectTab(getTabAt(curItem));
+ if (viewPager != null) {
+ final PagerAdapter adapter = viewPager.getAdapter();
+ if (adapter == null) {
+ throw new IllegalArgumentException("ViewPager does not have a PagerAdapter set");
}
+
+ mViewPager = viewPager;
+
+ // Add our custom OnPageChangeListener to the ViewPager
+ if (mPageChangeListener == null) {
+ mPageChangeListener = new TabLayoutOnPageChangeListener(this);
+ }
+ mPageChangeListener.reset();
+ viewPager.addOnPageChangeListener(mPageChangeListener);
+
+ // Now we'll add a tab selected listener to set ViewPager's current item
+ setOnTabSelectedListener(new ViewPagerOnTabSelectedListener(viewPager));
+
+ // Now we'll populate ourselves from the pager adapter
+ setPagerAdapter(adapter, true);
+ } else {
+ // We've been given a null ViewPager so we need to clear out the internal state,
+ // listeners and observers
+ mViewPager = null;
+ setOnTabSelectedListener(null);
+ setPagerAdapter(null, true);
}
}
/**
- * Populate our tab content from the given {@link PagerAdapter}.
- * <p>
- * Any existing tabs will be removed first. Each tab will have it's text set to the value
- * returned from {@link PagerAdapter#getPageTitle(int)}
- * </p>
- *
- * @param adapter the adapter to populate from
+ * @deprecated Use {@link #setupWithViewPager(ViewPager)} to link a TabLayout with a ViewPager
+ * together. When that method is used, the TabLayout will be automatically updated
+ * when the {@link PagerAdapter} is changed.
*/
- public void setTabsFromPagerAdapter(@NonNull PagerAdapter adapter) {
+ @Deprecated
+ public void setTabsFromPagerAdapter(@Nullable final PagerAdapter adapter) {
+ setPagerAdapter(adapter, false);
+ }
+
+ private void setPagerAdapter(@Nullable final PagerAdapter adapter, final boolean addObserver) {
+ if (mPagerAdapter != null && mPagerAdapterObserver != null) {
+ // If we already have a PagerAdapter, unregister our observer
+ mPagerAdapter.unregisterDataSetObserver(mPagerAdapterObserver);
+ }
+
+ mPagerAdapter = adapter;
+
+ if (addObserver && adapter != null) {
+ // Register our observer on the new adapter
+ if (mPagerAdapterObserver == null) {
+ mPagerAdapterObserver = new PagerAdapterObserver();
+ }
+ adapter.registerDataSetObserver(mPagerAdapterObserver);
+ }
+
+ // Finally make sure we reflect the new adapter
+ populateFromPagerAdapter();
+ }
+
+ private void populateFromPagerAdapter() {
removeAllTabs();
- for (int i = 0, count = adapter.getCount(); i < count; i++) {
- addTab(newTab().setText(adapter.getPageTitle(i)));
+
+ if (mPagerAdapter != null) {
+ final int adapterCount = mPagerAdapter.getCount();
+ for (int i = 0; i < adapterCount; i++) {
+ addTab(newTab().setText(mPagerAdapter.getPageTitle(i)), false);
+ }
+
+ // Make sure we reflect the currently set ViewPager item
+ if (mViewPager != null && adapterCount > 0) {
+ final int curItem = mViewPager.getCurrentItem();
+ if (curItem != getSelectedTabPosition() && curItem < getTabCount()) {
+ selectTab(getTabAt(curItem));
+ }
+ }
+ } else {
+ removeAllTabs();
}
}
@@ -651,8 +719,12 @@
}
}
- private TabView createTabView(Tab tab) {
- final TabView tabView = new TabView(getContext(), tab);
+ private TabView createTabView(@NonNull final Tab tab) {
+ TabView tabView = mTabViewPool != null ? mTabViewPool.acquire() : null;
+ if (tabView == null) {
+ tabView = new TabView(getContext());
+ }
+ tabView.setTab(tab);
tabView.setFocusable(true);
tabView.setMinimumWidth(getTabMinWidth());
@@ -785,7 +857,12 @@
}
private void removeTabViewAt(int position) {
+ final TabView view = (TabView) mTabStrip.getChildAt(position);
mTabStrip.removeViewAt(position);
+ if (view != null) {
+ view.reset();
+ mTabViewPool.release(view);
+ }
requestLayout();
}
@@ -1164,10 +1241,19 @@
public CharSequence getContentDescription() {
return mContentDesc;
}
+
+ private void reset() {
+ mTag = null;
+ mIcon = null;
+ mText = null;
+ mContentDesc = null;
+ mPosition = INVALID_POSITION;
+ mCustomView = null;
+ }
}
class TabView extends LinearLayout implements OnLongClickListener {
- private final Tab mTab;
+ private Tab mTab;
private TextView mTextView;
private ImageView mIconView;
@@ -1177,9 +1263,8 @@
private int mDefaultMaxLines = 2;
- public TabView(Context context, Tab tab) {
+ public TabView(Context context) {
super(context);
- mTab = tab;
if (mTabBackgroundResId != 0) {
setBackgroundDrawable(
AppCompatDrawableManager.get().getDrawable(context, mTabBackgroundResId));
@@ -1188,7 +1273,6 @@
mTabPaddingEnd, mTabPaddingBottom);
setGravity(Gravity.CENTER);
setOrientation(VERTICAL);
- update();
}
@Override
@@ -1288,9 +1372,21 @@
}
}
+ private void setTab(@Nullable final Tab tab) {
+ if (tab != mTab) {
+ mTab = tab;
+ update();
+ }
+ }
+
+ private void reset() {
+ setTab(null);
+ setSelected(false);
+ }
+
final void update() {
final Tab tab = mTab;
- final View custom = tab.getCustomView();
+ final View custom = tab != null ? tab.getCustomView() : null;
if (custom != null) {
final ViewParent customParent = custom.getParent();
if (customParent != this) {
@@ -1342,18 +1438,20 @@
if (mTabTextColors != null) {
mTextView.setTextColor(mTabTextColors);
}
- updateTextAndIcon(tab, mTextView, mIconView);
+ updateTextAndIcon(mTextView, mIconView);
} else {
// Else, we'll see if there is a TextView or ImageView present and update them
if (mCustomTextView != null || mCustomIconView != null) {
- updateTextAndIcon(tab, mCustomTextView, mCustomIconView);
+ updateTextAndIcon(mCustomTextView, mCustomIconView);
}
}
}
- private void updateTextAndIcon(Tab tab, TextView textView, ImageView iconView) {
- final Drawable icon = tab.getIcon();
- final CharSequence text = tab.getText();
+ private void updateTextAndIcon(@Nullable final TextView textView,
+ @Nullable final ImageView iconView) {
+ final Drawable icon = mTab != null ? mTab.getIcon() : null;
+ final CharSequence text = mTab != null ? mTab.getText() : null;
+ final CharSequence contentDesc = mTab != null ? mTab.getContentDescription() : null;
if (iconView != null) {
if (icon != null) {
@@ -1364,20 +1462,20 @@
iconView.setVisibility(GONE);
iconView.setImageDrawable(null);
}
- iconView.setContentDescription(tab.getContentDescription());
+ iconView.setContentDescription(contentDesc);
}
final boolean hasText = !TextUtils.isEmpty(text);
if (textView != null) {
if (hasText) {
textView.setText(text);
- textView.setContentDescription(tab.getContentDescription());
textView.setVisibility(VISIBLE);
setVisibility(VISIBLE);
} else {
textView.setVisibility(GONE);
textView.setText(null);
}
+ textView.setContentDescription(contentDesc);
}
if (iconView != null) {
@@ -1393,7 +1491,7 @@
}
}
- if (!hasText && !TextUtils.isEmpty(tab.getContentDescription())) {
+ if (!hasText && !TextUtils.isEmpty(contentDesc)) {
setOnLongClickListener(this);
} else {
setOnLongClickListener(null);
@@ -1443,7 +1541,7 @@
private int mIndicatorLeft = -1;
private int mIndicatorRight = -1;
- private ValueAnimatorCompat mCurrentAnimator;
+ private ValueAnimatorCompat mIndicatorAnimator;
SlidingTabStrip(Context context) {
super(context);
@@ -1476,6 +1574,10 @@
}
void setIndicatorPositionFromTabPosition(int position, float positionOffset) {
+ if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
+ mIndicatorAnimator.cancel();
+ }
+
mSelectedPosition = position;
mSelectionOffset = positionOffset;
updateIndicatorPosition();
@@ -1546,13 +1648,13 @@
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
- if (mCurrentAnimator != null && mCurrentAnimator.isRunning()) {
+ if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
// If we're currently running an animation, lets cancel it and start a
// new animation with the remaining duration
- mCurrentAnimator.cancel();
- final long duration = mCurrentAnimator.getDuration();
+ mIndicatorAnimator.cancel();
+ final long duration = mIndicatorAnimator.getDuration();
animateIndicatorToPosition(mSelectedPosition,
- Math.round((1f - mCurrentAnimator.getAnimatedFraction()) * duration));
+ Math.round((1f - mIndicatorAnimator.getAnimatedFraction()) * duration));
} else {
// If we've been layed out, update the indicator position
updateIndicatorPosition();
@@ -1592,6 +1694,10 @@
}
void animateIndicatorToPosition(final int position, int duration) {
+ if (mIndicatorAnimator != null && mIndicatorAnimator.isRunning()) {
+ mIndicatorAnimator.cancel();
+ }
+
final boolean isRtl = ViewCompat.getLayoutDirection(this)
== ViewCompat.LAYOUT_DIRECTION_RTL;
@@ -1645,15 +1751,8 @@
mSelectedPosition = position;
mSelectionOffset = 0f;
}
-
- @Override
- public void onAnimationCancel(ValueAnimatorCompat animator) {
- mSelectedPosition = position;
- mSelectionOffset = 0f;
- }
});
animator.start();
- mCurrentAnimator = animator;
}
}
@@ -1741,12 +1840,16 @@
int positionOffsetPixels) {
final TabLayout tabLayout = mTabLayoutRef.get();
if (tabLayout != null) {
- // Update the scroll position, only update the text selection if we're being
- // dragged (or we're settling after a drag)
- final boolean updateText = (mScrollState == ViewPager.SCROLL_STATE_DRAGGING)
- || (mScrollState == ViewPager.SCROLL_STATE_SETTLING
- && mPreviousScrollState == ViewPager.SCROLL_STATE_DRAGGING);
- tabLayout.setScrollPosition(position, positionOffset, updateText);
+ // Only update the text selection if we're not settling, or we are settling after
+ // being dragged
+ final boolean updateText = mScrollState != SCROLL_STATE_SETTLING ||
+ mPreviousScrollState == SCROLL_STATE_DRAGGING;
+ // Update the indicator if we're not settling after being idle. This is caused
+ // from a setCurrentItem() call and will be handled by an animation from
+ // onPageSelected() instead.
+ final boolean updateIndicator = !(mScrollState == SCROLL_STATE_SETTLING
+ && mPreviousScrollState == SCROLL_STATE_IDLE);
+ tabLayout.setScrollPosition(position, positionOffset, updateText, updateIndicator);
}
}
@@ -1756,10 +1859,16 @@
if (tabLayout != null && tabLayout.getSelectedTabPosition() != position) {
// Select the tab, only updating the indicator if we're not being dragged/settled
// (since onPageScrolled will handle that).
- tabLayout.selectTab(tabLayout.getTabAt(position),
- mScrollState == ViewPager.SCROLL_STATE_IDLE);
+ final boolean updateIndicator = mScrollState == SCROLL_STATE_IDLE
+ || (mScrollState == SCROLL_STATE_SETTLING
+ && mPreviousScrollState == SCROLL_STATE_IDLE);
+ tabLayout.selectTab(tabLayout.getTabAt(position), updateIndicator);
}
}
+
+ private void reset() {
+ mPreviousScrollState = mScrollState = SCROLL_STATE_IDLE;
+ }
}
/**
@@ -1789,4 +1898,16 @@
}
}
+ private class PagerAdapterObserver extends DataSetObserver {
+ @Override
+ public void onChanged() {
+ populateFromPagerAdapter();
+ }
+
+ @Override
+ public void onInvalidated() {
+ populateFromPagerAdapter();
+ }
+ }
+
}
diff --git a/design/src/android/support/design/widget/TextInputLayout.java b/design/src/android/support/design/widget/TextInputLayout.java
index 402878c..32abe85 100644
--- a/design/src/android/support/design/widget/TextInputLayout.java
+++ b/design/src/android/support/design/widget/TextInputLayout.java
@@ -22,7 +22,10 @@
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
+import android.graphics.PorterDuff;
import android.graphics.Typeface;
+import android.graphics.drawable.Drawable;
+import android.graphics.drawable.DrawableContainer;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StyleRes;
@@ -61,11 +64,14 @@
private static final int INVALID_MAX_LENGTH = -1;
private EditText mEditText;
+
+ private boolean mHintEnabled;
private CharSequence mHint;
private Paint mTmpPaint;
private LinearLayout mIndicatorArea;
+ private int mIndicatorsAdded;
private boolean mErrorEnabled;
private TextView mErrorView;
@@ -87,6 +93,8 @@
private boolean mHintAnimationEnabled;
private ValueAnimatorCompat mAnimator;
+ private boolean mHasReconstructedEditTextBackground;
+
public TextInputLayout(Context context) {
this(context, null);
}
@@ -111,6 +119,7 @@
final TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.TextInputLayout, defStyleAttr, R.style.Widget_Design_TextInputLayout);
+ mHintEnabled = a.getBoolean(R.styleable.TextInputLayout_hintEnabled, true);
setHint(a.getText(R.styleable.TextInputLayout_android_hint));
mHintAnimationEnabled = a.getBoolean(
R.styleable.TextInputLayout_hintAnimationEnabled, true);
@@ -198,7 +207,7 @@
mEditText.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
- updateLabelVisibility(true);
+ updateLabelState(true);
if (mCounterEnabled) {
updateCounter(s.length());
}
@@ -216,8 +225,8 @@
mDefaultTextColor = mEditText.getHintTextColors();
}
- // If we do not have a valid hint, try and retrieve it from the EditText
- if (TextUtils.isEmpty(mHint)) {
+ // If we do not have a valid hint, try and retrieve it from the EditText, if enabled
+ if (mHintEnabled && TextUtils.isEmpty(mHint)) {
setHint(mEditText.getHint());
// Clear the EditText's hint as we will display it ourselves
mEditText.setHint(null);
@@ -232,7 +241,7 @@
}
// Update the label visibility with no animation
- updateLabelVisibility(false);
+ updateLabelState(false);
}
private LayoutParams updateEditTextMargin(ViewGroup.LayoutParams lp) {
@@ -240,17 +249,21 @@
// to the EditText so make room for the label
LayoutParams llp = lp instanceof LayoutParams ? (LayoutParams) lp : new LayoutParams(lp);
- if (mTmpPaint == null) {
- mTmpPaint = new Paint();
+ if (mHintEnabled) {
+ if (mTmpPaint == null) {
+ mTmpPaint = new Paint();
+ }
+ mTmpPaint.setTypeface(mCollapsingTextHelper.getCollapsedTypeface());
+ mTmpPaint.setTextSize(mCollapsingTextHelper.getCollapsedTextSize());
+ llp.topMargin = (int) -mTmpPaint.ascent();
+ } else {
+ llp.topMargin = 0;
}
- mTmpPaint.setTypeface(mCollapsingTextHelper.getCollapsedTypeface());
- mTmpPaint.setTextSize(mCollapsingTextHelper.getCollapsedTextSize());
- llp.topMargin = (int) -mTmpPaint.ascent();
return llp;
}
- private void updateLabelVisibility(boolean animate) {
+ private void updateLabelState(boolean animate) {
final boolean hasText = mEditText != null && !TextUtils.isEmpty(mEditText.getText());
final boolean isFocused = arrayContains(getDrawableState(), android.R.attr.state_focused);
final boolean isErrorShowing = !TextUtils.isEmpty(getError());
@@ -287,25 +300,89 @@
}
/**
- * Set the hint to be displayed in the floating label
+ * Set the hint to be displayed in the floating label, if enabled.
+ *
+ * @see #setHintEnabled(boolean)
*
* @attr ref android.support.design.R.styleable#TextInputLayout_android_hint
*/
public void setHint(@Nullable CharSequence hint) {
+ if (mHintEnabled) {
+ setHintInternal(hint);
+ sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
+ }
+ }
+
+ private void setHintInternal(CharSequence hint) {
mHint = hint;
mCollapsingTextHelper.setText(hint);
-
- sendAccessibilityEvent(AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED);
}
/**
- * Returns the hint which is displayed in the floating label.
+ * Returns the hint which is displayed in the floating label, if enabled.
+ *
+ * @return the hint, or null if there isn't one set, or the hint is not enabled.
*
* @attr ref android.support.design.R.styleable#TextInputLayout_android_hint
*/
@Nullable
public CharSequence getHint() {
- return mHint;
+ return mHintEnabled ? mHint : null;
+ }
+
+ /**
+ * Sets whether the floating label functionality is enabled or not in this layout.
+ *
+ * <p>If enabled, any non-empty hint in the child EditText will be moved into the floating
+ * hint, and its existing hint will be cleared. If disabled, then any non-empty floating hint
+ * in this layout will be moved into the EditText, and this layout's hint will be cleared.</p>
+ *
+ * @see #setHint(CharSequence)
+ * @see #isHintEnabled()
+ *
+ * @attr ref android.support.design.R.styleable#TextInputLayout_hintEnabled
+ */
+ public void setHintEnabled(boolean enabled) {
+ if (enabled != mHintEnabled) {
+ mHintEnabled = enabled;
+
+ final CharSequence editTextHint = mEditText.getHint();
+ if (!mHintEnabled) {
+ if (!TextUtils.isEmpty(mHint) && TextUtils.isEmpty(editTextHint)) {
+ // If the hint is disabled, but we have a hint set, and the EditText doesn't,
+ // pass it through...
+ mEditText.setHint(mHint);
+ }
+ // Now clear out any set hint
+ setHintInternal(null);
+ } else {
+ if (!TextUtils.isEmpty(editTextHint)) {
+ // If the hint is now enabled and the EditText has one set, we'll use it if
+ // we don't already have one, and clear the EditText's
+ if (TextUtils.isEmpty(mHint)) {
+ setHint(editTextHint);
+ }
+ mEditText.setHint(null);
+ }
+ }
+
+ // Now update the EditText top margin
+ if (mEditText != null) {
+ final LayoutParams lp = updateEditTextMargin(mEditText.getLayoutParams());
+ mEditText.setLayoutParams(lp);
+ }
+ }
+ }
+
+ /**
+ * Returns whether the floating label functionality is enabled or not in this layout.
+ *
+ * @see #setHintEnabled(boolean)
+ *
+ * @attr ref android.support.design.R.styleable#TextInputLayout_hintEnabled
+ */
+ public boolean isHintEnabled() {
+ return mHintEnabled;
}
/**
@@ -318,7 +395,7 @@
mFocusedTextColor = ColorStateList.valueOf(mCollapsingTextHelper.getCollapsedTextColor());
if (mEditText != null) {
- updateLabelVisibility(false);
+ updateLabelState(false);
// Text size might have changed so update the top margin
LayoutParams lp = updateEditTextMargin(mEditText.getLayoutParams());
@@ -345,6 +422,7 @@
}
mIndicatorArea.setVisibility(View.VISIBLE);
mIndicatorArea.addView(indicator, index);
+ mIndicatorsAdded++;
}
private void adjustIndicatorPadding() {
@@ -356,7 +434,7 @@
private void removeIndicator(TextView indicator) {
if (mIndicatorArea != null) {
mIndicatorArea.removeView(indicator);
- if (mIndicatorArea.getChildCount() == 0) {
+ if (--mIndicatorsAdded == 0) {
mIndicatorArea.setVisibility(View.GONE);
}
}
@@ -425,24 +503,37 @@
}
if (!TextUtils.isEmpty(error)) {
- ViewCompat.setAlpha(mErrorView, 0f);
- mErrorView.setText(error);
- ViewCompat.animate(mErrorView)
- .alpha(1f)
- .setDuration(ANIMATION_DURATION)
- .setInterpolator(AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR)
- .setListener(new ViewPropertyAnimatorListenerAdapter() {
- @Override
- public void onAnimationStart(View view) {
- view.setVisibility(VISIBLE);
- }
- })
- .start();
+ boolean animate;
+ if (TextUtils.equals(error, mErrorView.getText())) {
+ // We've been given the same error message, so only animate if needed
+ animate = !mErrorView.isShown() || ViewCompat.getAlpha(mErrorView) < 1f;
+ } else {
+ animate = true;
+ mErrorView.setText(error);
+ }
+
+ if (animate) {
+ if (ViewCompat.getAlpha(mErrorView) == 1f) {
+ // If it's currently 100% show, we'll animate it from 0
+ ViewCompat.setAlpha(mErrorView, 0f);
+ }
+ ViewCompat.animate(mErrorView)
+ .alpha(1f)
+ .setDuration(ANIMATION_DURATION)
+ .setInterpolator(AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR)
+ .setListener(new ViewPropertyAnimatorListenerAdapter() {
+ @Override
+ public void onAnimationStart(View view) {
+ view.setVisibility(VISIBLE);
+ }
+ })
+ .start();
+ }
// Set the EditText's background tint to the error color
mErrorShown = true;
updateEditTextBackground();
- updateLabelVisibility(true);
+ updateLabelState(true);
} else {
if (mErrorView.getVisibility() == VISIBLE) {
ViewCompat.animate(mErrorView)
@@ -454,7 +545,7 @@
public void onAnimationEnd(View view) {
view.setVisibility(INVISIBLE);
- updateLabelVisibility(true);
+ updateLabelState(true);
}
}).start();
@@ -547,23 +638,66 @@
length, mCounterMaxLength));
}
if (mEditText != null && wasCounterOverflowed != mCounterOverflowed) {
- updateLabelVisibility(false);
+ updateLabelState(false);
updateEditTextBackground();
}
}
private void updateEditTextBackground() {
+ ensureBackgroundDrawableStateWorkaround();
+
+ final Drawable editTextBackground = mEditText.getBackground();
+ if (editTextBackground == null) {
+ return;
+ }
+
if (mErrorShown && mErrorView != null) {
- // Set the EditText's background tint to the error color
- ViewCompat.setBackgroundTintList(mEditText,
- ColorStateList.valueOf(mErrorView.getCurrentTextColor()));
+ // Set a color filter of the error color
+ editTextBackground.setColorFilter(
+ AppCompatDrawableManager.getPorterDuffColorFilter(
+ mErrorView.getCurrentTextColor(), PorterDuff.Mode.SRC_IN));
} else if (mCounterOverflowed && mCounterView != null) {
- ViewCompat.setBackgroundTintList(mEditText,
- ColorStateList.valueOf(mCounterView.getCurrentTextColor()));
+ // Set a color filter of the counter color
+ editTextBackground.setColorFilter(
+ AppCompatDrawableManager.getPorterDuffColorFilter(
+ mCounterView.getCurrentTextColor(), PorterDuff.Mode.SRC_IN));
} else {
- ViewCompat.setBackgroundTintList(mEditText,
- AppCompatDrawableManager.get()
- .getTintList(getContext(), R.drawable.abc_edit_text_material));
+ // Else reset the color filter and refresh the drawable state so that the
+ // normal tint is used
+ editTextBackground.clearColorFilter();
+ mEditText.refreshDrawableState();
+ }
+ }
+
+ private void ensureBackgroundDrawableStateWorkaround() {
+ final Drawable bg = mEditText.getBackground();
+ if (bg == null) {
+ return;
+ }
+
+ if (!mHasReconstructedEditTextBackground) {
+ // This is gross. There is an issue in the platform which affects container Drawables
+ // where the first drawable retrieved from resources will propogate any changes
+ // (like color filter) to all instances from the cache. We'll try to workaround it...
+
+ final Drawable newBg = bg.getConstantState().newDrawable();
+
+ if (bg instanceof DrawableContainer) {
+ // If we have a Drawable container, we can try and set it's constant state via
+ // reflection from the new Drawable
+ mHasReconstructedEditTextBackground =
+ DrawableUtils.setContainerConstantState(
+ (DrawableContainer) bg, newBg.getConstantState());
+ }
+
+ if (!mHasReconstructedEditTextBackground) {
+ // If we reach here then we just need to set a brand new instance of the Drawable
+ // as the background. This has the unfortunate side-effect of wiping out any
+ // user set padding, but I'd hope that use of custom padding on an EditText
+ // is limited.
+ mEditText.setBackgroundDrawable(newBg);
+ mHasReconstructedEditTextBackground = true;
+ }
}
}
@@ -609,14 +743,17 @@
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
- mCollapsingTextHelper.draw(canvas);
+
+ if (mHintEnabled) {
+ mCollapsingTextHelper.draw(canvas);
+ }
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
- if (mEditText != null) {
+ if (mHintEnabled && mEditText != null) {
final int l = mEditText.getLeft() + mEditText.getCompoundPaddingLeft();
final int r = mEditText.getRight() - mEditText.getCompoundPaddingRight();
@@ -637,7 +774,7 @@
public void refreshDrawableState() {
super.refreshDrawableState();
// Drawable state has changed so see if we need to update the label
- updateLabelVisibility(ViewCompat.isLaidOut(this));
+ updateLabelState(ViewCompat.isLaidOut(this));
}
private void collapseHint(boolean animate) {
diff --git a/design/src/android/support/design/widget/ViewOffsetHelper.java b/design/src/android/support/design/widget/ViewOffsetHelper.java
index a76ca9a..1254f17 100644
--- a/design/src/android/support/design/widget/ViewOffsetHelper.java
+++ b/design/src/android/support/design/widget/ViewOffsetHelper.java
@@ -66,9 +66,9 @@
}
private static void tickleInvalidationFlag(View view) {
- final float x = ViewCompat.getTranslationX(view);
- ViewCompat.setTranslationY(view, x + 1);
- ViewCompat.setTranslationY(view, x);
+ final float y = ViewCompat.getTranslationY(view);
+ ViewCompat.setTranslationY(view, y + 1);
+ ViewCompat.setTranslationY(view, y);
}
/**
diff --git a/graphics/drawable/Android.mk b/graphics/drawable/Android.mk
index 63e93b7..06d8d6f 100644
--- a/graphics/drawable/Android.mk
+++ b/graphics/drawable/Android.mk
@@ -17,8 +17,8 @@
#static vector drawable library
include $(CLEAR_VARS)
LOCAL_MODULE := android-support-v7-vectordrawable
-LOCAL_SDK_VERSION := 7
-LOCAL_SRC_FILES := $(call all-java-files-under, static)
+LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := $(call all-java-files-under, static util)
LOCAL_JAVA_LIBRARIES := android-support-v4
@@ -29,8 +29,8 @@
#Animated vector drawable library
include $(CLEAR_VARS)
LOCAL_MODULE := android-support-v11-animatedvectordrawable
-LOCAL_SDK_VERSION := 11
-LOCAL_SRC_FILES := $(call all-java-files-under, animated)
+LOCAL_SDK_VERSION := current
+LOCAL_SRC_FILES := $(call all-java-files-under, animated util)
LOCAL_JAVA_LIBRARIES := android-support-v4
@@ -38,4 +38,5 @@
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v7-vectordrawable
+LOCAL_AAPT_FLAGS := --no-version-vectors
include $(BUILD_STATIC_JAVA_LIBRARY)
\ No newline at end of file
diff --git a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
index 78ef62d..eff9670 100644
--- a/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
+++ b/graphics/drawable/animated/src/android/support/graphics/drawable/AnimatedVectorDrawableCompat.java
@@ -16,7 +16,6 @@
import android.animation.Animator;
import android.animation.AnimatorInflater;
-import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
@@ -45,12 +44,12 @@
/**
* This class uses {@link android.animation.ObjectAnimator} and
* {@link android.animation.AnimatorSet} to animate the properties of a
- * {@link android.graphics.drawable.VectorDrawableCompat} to create an animated drawable.
+ * {@link android.support.graphics.drawable.VectorDrawableCompat} to create an animated drawable.
* <p>
* AnimatedVectorDrawableCompat are normally defined as 3 separate XML files.
* </p>
* <p>
- * First is the XML file for {@link android.graphics.drawable.VectorDrawableCompat}. Note that we
+ * First is the XML file for {@link android.support.graphics.drawable.VectorDrawableCompat}. Note that we
* allow the animation to happen on the group's attributes and path's attributes, which requires they
* are uniquely named in this XML file. Groups and paths without animations do not need names.
* </p>
@@ -306,9 +305,9 @@
}
if (ANIMATED_VECTOR.equals(tagName)) {
final TypedArray a =
- obtainAttributes(res, theme, attrs, R.styleable.AnimatedVectorDrawable);
+ obtainAttributes(res, theme, attrs, AndroidResources.styleable_AnimatedVectorDrawable);
- int drawableRes = a.getResourceId(R.styleable.AnimatedVectorDrawable_drawable,
+ int drawableRes = a.getResourceId(AndroidResources.styleable_AnimatedVectorDrawable_drawable,
0);
if (DBG_ANIMATION_VECTOR_DRAWABLE) {
Log.v(LOGTAG, "drawableRes is " + drawableRes);
@@ -327,11 +326,11 @@
a.recycle();
} else if (TARGET.equals(tagName)) {
final TypedArray a =
- res.obtainAttributes(attrs, R.styleable.AnimatedVectorDrawableTarget);
+ res.obtainAttributes(attrs, AndroidResources.styleable_AnimatedVectorDrawableTarget);
final String target = a.getString(
- R.styleable.AnimatedVectorDrawableTarget_name);
+ AndroidResources.styleable_AnimatedVectorDrawableTarget_name);
- int id = a.getResourceId(R.styleable.AnimatedVectorDrawableTarget_animation, 0);
+ int id = a.getResourceId(AndroidResources.styleable_AnimatedVectorDrawableTarget_animation, 0);
if (id != 0) {
Animator objectAnimator = AnimatorInflater.loadAnimator(mContext, id);
setupAnimatorsForTarget(target, objectAnimator);
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java b/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java
index a92c3e5..8503fae 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/PathParser.java
@@ -131,8 +131,8 @@
}
for (int i = 0; i < nodesFrom.length; i ++) {
- if (nodesFrom[i].mType != nodesTo[i].mType
- || nodesFrom[i].mParams.length != nodesTo[i].mParams.length) {
+ if (nodesFrom[i].type != nodesTo[i].type
+ || nodesFrom[i].params.length != nodesTo[i].params.length) {
return false;
}
}
@@ -148,9 +148,9 @@
*/
public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {
for (int i = 0; i < source.length; i ++) {
- target[i].mType = source[i].mType;
- for (int j = 0; j < source[i].mParams.length; j ++) {
- target[i].mParams[j] = source[i].mParams[j];
+ target[i].type = source[i].type;
+ for (int j = 0; j < source[i].params.length; j ++) {
+ target[i].params[j] = source[i].params[j];
}
}
}
@@ -288,17 +288,18 @@
* An array of PathDataNode can represent the whole "d" attribute.
*/
public static class PathDataNode {
- private char mType;
- private float[] mParams;
+ /*package*/
+ char type;
+ float[] params;
private PathDataNode(char type, float[] params) {
- mType = type;
- mParams = params;
+ this.type = type;
+ this.params = params;
}
private PathDataNode(PathDataNode n) {
- mType = n.mType;
- mParams = copyOfRange(n.mParams, 0, n.mParams.length);
+ type = n.type;
+ params = copyOfRange(n.params, 0, n.params.length);
}
/**
@@ -311,8 +312,8 @@
float[] current = new float[6];
char previousCommand = 'm';
for (int i = 0; i < node.length; i++) {
- addCommand(path, current, previousCommand, node[i].mType, node[i].mParams);
- previousCommand = node[i].mType;
+ addCommand(path, current, previousCommand, node[i].type, node[i].params);
+ previousCommand = node[i].type;
}
}
@@ -327,9 +328,9 @@
*/
public void interpolatePathDataNode(PathDataNode nodeFrom,
PathDataNode nodeTo, float fraction) {
- for (int i = 0; i < nodeFrom.mParams.length; i++) {
- mParams[i] = nodeFrom.mParams[i] * (1 - fraction)
- + nodeTo.mParams[i] * fraction;
+ for (int i = 0; i < nodeFrom.params.length; i++) {
+ params[i] = nodeFrom.params[i] * (1 - fraction)
+ + nodeTo.params[i] * fraction;
}
}
diff --git a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
index d33c204..c0e5b40 100644
--- a/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
+++ b/graphics/drawable/static/src/android/support/graphics/drawable/VectorDrawableCompat.java
@@ -196,7 +196,7 @@
private static final int LINEJOIN_ROUND = 1;
private static final int LINEJOIN_BEVEL = 2;
- private static final boolean DBG_VECTOR_DRAWABLE = true;
+ private static final boolean DBG_VECTOR_DRAWABLE = false;
private VectorDrawableState mVectorState;
@@ -420,7 +420,6 @@
final VectorDrawableCompat drawable = new VectorDrawableCompat();
drawable.inflate(res, parser, attrs, theme);
-
return drawable;
} catch (XmlPullParserException e) {
Log.e(LOGTAG, "parser error", e);
@@ -462,8 +461,9 @@
final VPathRenderer pathRenderer = new VPathRenderer();
state.mVPathRenderer = pathRenderer;
- final TypedArray a = obtainAttributes(res, theme, attrs, R.styleable.VectorDrawable);
- updateStateFromTypedArray(a);
+ final TypedArray a = obtainAttributes(res, theme, attrs, AndroidResources.styleable_VectorDrawableTypeArray);
+
+ updateStateFromTypedArray(a, parser);
a.recycle();
state.mChangingConfigurations = getChangingConfigurations();
state.mCacheDirty = true;
@@ -472,30 +472,47 @@
mTintFilter = updateTintFilter(mTintFilter, state.mTint, state.mTintMode);
}
- private void updateStateFromTypedArray(TypedArray a) throws XmlPullParserException {
+
+ /**
+ * Parses a {@link android.graphics.PorterDuff.Mode} from a tintMode
+ * attribute's enum value.
+ */
+ private static PorterDuff.Mode parseTintMode(int value, Mode defaultMode) {
+ switch (value) {
+ case 3: return Mode.SRC_OVER;
+ case 5: return Mode.SRC_IN;
+ case 9: return Mode.SRC_ATOP;
+ case 14: return Mode.MULTIPLY;
+ case 15: return Mode.SCREEN;
+ case 16: return Mode.ADD;
+ default: return defaultMode;
+ }
+ }
+
+ private void updateStateFromTypedArray(TypedArray a, XmlPullParser parser) throws XmlPullParserException {
final VectorDrawableState state = mVectorState;
final VPathRenderer pathRenderer = state.mVPathRenderer;
// Account for any configuration changes.
// state.mChangingConfigurations |= Utils.getChangingConfigurations(a);
- final int tintMode = a.getInt(R.styleable.VectorDrawable_tintMode, -1);
- // if (tintMode != -1) {
- // state.mTintMode = Utils.parseTintMode(tintMode, DEFAULT_TINT_MODE);
- // }
+ final int mode = TypedArrayUtils.getNamedInt(a, parser, "tintMode",
+ AndroidResources.styleable_VectorDrawable_Mode, -1);
+ state.mTintMode = parseTintMode(mode, Mode.SRC_IN);
- final ColorStateList tint = a.getColorStateList(R.styleable.VectorDrawable_tint);
+ final ColorStateList tint = a.getColorStateList(AndroidResources.styleable_VectorDrawable_tint);
if (tint != null) {
state.mTint = tint;
}
- state.mAutoMirrored = a.getBoolean(
- R.styleable.VectorDrawable_autoMirrored, state.mAutoMirrored);
+ state.mAutoMirrored = TypedArrayUtils.getNamedBoolean(a, parser, "autoMirrored",
+ AndroidResources.styleable_VectorDrawable_autoMirrored, state.mAutoMirrored);
- pathRenderer.mViewportWidth = a.getFloat(
- R.styleable.VectorDrawable_viewportWidth, pathRenderer.mViewportWidth);
- pathRenderer.mViewportHeight = a.getFloat(
- R.styleable.VectorDrawable_viewportHeight, pathRenderer.mViewportHeight);
+ pathRenderer.mViewportWidth = TypedArrayUtils.getNamedFloat(a, parser, "viewportWidth",
+ AndroidResources.styleable_VectorDrawable_viewportWidth, pathRenderer.mViewportWidth);
+
+ pathRenderer.mViewportHeight = TypedArrayUtils.getNamedFloat(a, parser, "viewportHeight",
+ AndroidResources.styleable_VectorDrawable_viewportHeight, pathRenderer.mViewportHeight);
if (pathRenderer.mViewportWidth <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
@@ -506,10 +523,9 @@
}
pathRenderer.mBaseWidth = a.getDimension(
- R.styleable.VectorDrawable_width, pathRenderer.mBaseWidth);
+ AndroidResources.styleable_VectorDrawable_width, pathRenderer.mBaseWidth);
pathRenderer.mBaseHeight = a.getDimension(
- R.styleable.VectorDrawable_height, pathRenderer.mBaseHeight);
-
+ AndroidResources.styleable_VectorDrawable_height, pathRenderer.mBaseHeight);
if (pathRenderer.mBaseWidth <= 0) {
throw new XmlPullParserException(a.getPositionDescription() +
"<vector> tag requires width > 0");
@@ -518,11 +534,12 @@
"<vector> tag requires height > 0");
}
- final float alphaInFloat = a.getFloat(R.styleable.VectorDrawable_alpha,
- pathRenderer.getAlpha());
+ // shown up from API 11.
+ final float alphaInFloat = TypedArrayUtils.getNamedFloat(a, parser, "alpha",
+ AndroidResources.styleable_VectorDrawable_alpha, pathRenderer.getAlpha());
pathRenderer.setAlpha(alphaInFloat);
- final String name = a.getString(R.styleable.VectorDrawable_name);
+ final String name = a.getString(AndroidResources.styleable_VectorDrawable_name);
if (name != null) {
pathRenderer.mRootName = name;
pathRenderer.mVGTargetsMap.put(name, pathRenderer);
@@ -545,10 +562,9 @@
if (eventType == XmlPullParser.START_TAG) {
final String tagName = parser.getName();
final VGroup currentGroup = groupStack.peek();
- Log.v(LOGTAG, tagName);
if (SHAPE_PATH.equals(tagName)) {
final VFullPath path = new VFullPath();
- path.inflate(res, attrs, theme);
+ path.inflate(res, attrs, theme, parser);
currentGroup.mChildren.add(path);
if (path.getPathName() != null) {
pathRenderer.mVGTargetsMap.put(path.getPathName(), path);
@@ -557,7 +573,7 @@
state.mChangingConfigurations |= path.mChangingConfigurations;
} else if (SHAPE_CLIP_PATH.equals(tagName)) {
final VClipPath path = new VClipPath();
- path.inflate(res, attrs, theme);
+ path.inflate(res, attrs, theme, parser);
currentGroup.mChildren.add(path);
if (path.getPathName() != null) {
pathRenderer.mVGTargetsMap.put(path.getPathName(), path);
@@ -565,7 +581,7 @@
state.mChangingConfigurations |= path.mChangingConfigurations;
} else if (SHAPE_GROUP.equals(tagName)) {
VGroup newChildGroup = new VGroup();
- newChildGroup.inflate(res, attrs, theme);
+ newChildGroup.inflate(res, attrs, theme, parser);
currentGroup.mChildren.add(newChildGroup);
groupStack.push(newChildGroup);
if (newChildGroup.getGroupName() != null) {
@@ -614,6 +630,8 @@
Object child = currentGroup.mChildren.get(i);
if (child instanceof VGroup) {
printGroupTree((VGroup) child, level + 1);
+ } else {
+ ((VPath) child).printVPath(level + 1);
}
}
}
@@ -1017,29 +1035,41 @@
return mLocalMatrix;
}
- public void inflate(Resources res, AttributeSet attrs, Theme theme) {
+ public void inflate(Resources res, AttributeSet attrs, Theme theme, XmlPullParser parser) {
final TypedArray a = obtainAttributes(res, theme, attrs,
- R.styleable.VectorDrawableGroup);
- updateStateFromTypedArray(a);
+ AndroidResources.styleable_VectorDrawableGroup);
+ updateStateFromTypedArray(a, parser);
a.recycle();
}
- private void updateStateFromTypedArray(TypedArray a) {
+ private void updateStateFromTypedArray(TypedArray a, XmlPullParser parser) {
// Account for any configuration changes.
// mChangingConfigurations |= Utils.getChangingConfigurations(a);
// Extract the theme attributes, if any.
mThemeAttrs = null; // TODO TINT THEME Not supported yet a.extractThemeAttrs();
- mRotate = a.getFloat(R.styleable.VectorDrawableGroup_rotation, mRotate);
- mPivotX = a.getFloat(R.styleable.VectorDrawableGroup_pivotX, mPivotX);
- mPivotY = a.getFloat(R.styleable.VectorDrawableGroup_pivotY, mPivotY);
- mScaleX = a.getFloat(R.styleable.VectorDrawableGroup_scaleX, mScaleX);
- mScaleY = a.getFloat(R.styleable.VectorDrawableGroup_scaleY, mScaleY);
- mTranslateX = a.getFloat(R.styleable.VectorDrawableGroup_translateX, mTranslateX);
- mTranslateY = a.getFloat(R.styleable.VectorDrawableGroup_translateY, mTranslateY);
+ // This is added in API 11
+ mRotate = TypedArrayUtils.getNamedFloat(a, parser, "rotation",
+ AndroidResources.styleable_VectorDrawableGroup_rotation, mRotate);
- final String groupName = a.getString(R.styleable.VectorDrawableGroup_name);
+ mPivotX = a.getFloat(AndroidResources.styleable_VectorDrawableGroup_pivotX, mPivotX);
+ mPivotY = a.getFloat(AndroidResources.styleable_VectorDrawableGroup_pivotY, mPivotY);
+
+ // This is added in API 11
+ mScaleX = TypedArrayUtils.getNamedFloat(a, parser, "scaleX",
+ AndroidResources.styleable_VectorDrawableGroup_scaleX, mScaleX);
+
+ // This is added in API 11
+ mScaleY = TypedArrayUtils.getNamedFloat(a, parser, "scaleY",
+ AndroidResources.styleable_VectorDrawableGroup_scaleY, mScaleY);
+
+ mTranslateX = TypedArrayUtils.getNamedFloat(a, parser, "translateX",
+ AndroidResources.styleable_VectorDrawableGroup_translateX, mTranslateX);
+ mTranslateY = TypedArrayUtils.getNamedFloat(a, parser, "translateY",
+ AndroidResources.styleable_VectorDrawableGroup_translateY, mTranslateY);
+
+ final String groupName = a.getString(AndroidResources.styleable_VectorDrawableGroup_name);
if (groupName != null) {
mGroupName = groupName;
}
@@ -1162,6 +1192,28 @@
// Empty constructor.
}
+ public void printVPath(int level) {
+ String indent = "";
+ for (int i = 0; i < level; i++) {
+ indent += " ";
+ }
+ Log.v(LOGTAG, indent + "current path is :" + mPathName +
+ " pathData is " + NodesToString(mNodes));
+
+ }
+
+ public String NodesToString(PathParser.PathDataNode[] nodes) {
+ String result = " ";
+ for (int i = 0; i < nodes.length; i++) {
+ result += nodes[i].type + ":";
+ float[] params = nodes[i].params;
+ for (int j = 0; j < params.length; j++) {
+ result += params[j] + ",";
+ }
+ }
+ return result;
+ }
+
public VPath(VPath copy) {
mPathName = copy.mPathName;
mChangingConfigurations = copy.mChangingConfigurations;
@@ -1219,10 +1271,14 @@
super(copy);
}
- public void inflate(Resources r, AttributeSet attrs, Theme theme) {
+ public void inflate(Resources r, AttributeSet attrs, Theme theme, XmlPullParser parser) {
// TODO TINT THEME Not supported yet
+ final boolean hasPathData = TypedArrayUtils.hasAttribute(parser, "pathData");
+ if (!hasPathData) {
+ return;
+ }
final TypedArray a = obtainAttributes(r, theme, attrs,
- R.styleable.VectorDrawableClipPath);
+ AndroidResources.styleable_VectorDrawableClipPath);
updateStateFromTypedArray(a);
a.recycle();
}
@@ -1231,12 +1287,12 @@
// Account for any configuration changes.
// mChangingConfigurations |= Utils.getChangingConfigurations(a);;
- final String pathName = a.getString(R.styleable.VectorDrawableClipPath_name);
+ final String pathName = a.getString(AndroidResources.styleable_VectorDrawableClipPath_name);
if (pathName != null) {
mPathName = pathName;
}
- final String pathData = a.getString(R.styleable.VectorDrawableClipPath_pathData);
+ final String pathData = a.getString(AndroidResources.styleable_VectorDrawableClipPath_pathData);
if (pathData != null) {
mNodes = PathParser.createNodesFromPathData(pathData);
}
@@ -1325,52 +1381,64 @@
return mThemeAttrs != null;
}
- public void inflate(Resources r, AttributeSet attrs, Theme theme) {
+ public void inflate(Resources r, AttributeSet attrs, Theme theme, XmlPullParser parser) {
final TypedArray a = obtainAttributes(r, theme, attrs,
- R.styleable.VectorDrawablePath);
- updateStateFromTypedArray(a);
+ AndroidResources.styleable_VectorDrawablePath);
+ updateStateFromTypedArray(a, parser);
a.recycle();
}
- private void updateStateFromTypedArray(TypedArray a) {
+ private void updateStateFromTypedArray(TypedArray a, XmlPullParser parser) {
// Account for any configuration changes.
// mChangingConfigurations |= Utils.getChangingConfigurations(a);
// Extract the theme attributes, if any.
mThemeAttrs = null; // TODO TINT THEME Not supported yet a.extractThemeAttrs();
- final String pathName = a.getString(R.styleable.VectorDrawablePath_name);
+ // In order to work around the conflicting id issue, we need to double check the existence
+ // of the attribute.
+ // B/c if the attribute existed in the compiled XML, then calling TypedArray will be safe
+ // since the framework will look up in the XML first.
+ // Note that each getAttributeValue take roughly 0.03ms, it is a price we have to pay here.
+ final boolean hasPathData = TypedArrayUtils.hasAttribute(parser, "pathData");
+ if (!hasPathData) {
+ //If there is no pathData in the <path> tag, then this is an empty path, nothing need to be drawn.
+ return;
+ }
+
+ final String pathName = a.getString(AndroidResources.styleable_VectorDrawablePath_name);
if (pathName != null) {
mPathName = pathName;
}
-
- final String pathData = a.getString(R.styleable.VectorDrawablePath_pathData);
+ final String pathData = a.getString(AndroidResources.styleable_VectorDrawablePath_pathData);
if (pathData != null) {
mNodes = PathParser.createNodesFromPathData(pathData);
}
- mFillColor = a.getColor(R.styleable.VectorDrawablePath_fillColor,
- mFillColor);
- mFillAlpha = a.getFloat(R.styleable.VectorDrawablePath_fillAlpha,
- mFillAlpha);
- mStrokeLineCap = getStrokeLineCap(a.getInt(
- R.styleable.VectorDrawablePath_strokeLineCap, -1), mStrokeLineCap);
- mStrokeLineJoin = getStrokeLineJoin(a.getInt(
- R.styleable.VectorDrawablePath_strokeLineJoin, -1), mStrokeLineJoin);
- mStrokeMiterlimit = a.getFloat(
- R.styleable.VectorDrawablePath_strokeMiterLimit, mStrokeMiterlimit);
- mStrokeColor = a.getColor(R.styleable.VectorDrawablePath_strokeColor,
- mStrokeColor);
- mStrokeAlpha = a.getFloat(R.styleable.VectorDrawablePath_strokeAlpha,
- mStrokeAlpha);
- mStrokeWidth = a.getFloat(R.styleable.VectorDrawablePath_strokeWidth,
- mStrokeWidth);
- mTrimPathEnd = a.getFloat(R.styleable.VectorDrawablePath_trimPathEnd,
- mTrimPathEnd);
- mTrimPathOffset = a.getFloat(
- R.styleable.VectorDrawablePath_trimPathOffset, mTrimPathOffset);
- mTrimPathStart = a.getFloat(
- R.styleable.VectorDrawablePath_trimPathStart, mTrimPathStart);
+ mFillColor = TypedArrayUtils.getNamedColor(a, parser, "fillColor",
+ AndroidResources.styleable_VectorDrawablePath_fillColor, mFillColor);
+ mFillAlpha = TypedArrayUtils.getNamedFloat(a, parser, "alpha",
+ AndroidResources.styleable_VectorDrawablePath_fillAlpha, mFillAlpha);
+ final int lineCap = TypedArrayUtils.getNamedInt(a, parser, "strokeLineCap",
+ AndroidResources.styleable_VectorDrawablePath_strokeLineCap, -1);
+ mStrokeLineCap = getStrokeLineCap(lineCap, mStrokeLineCap);
+ final int lineJoin = TypedArrayUtils.getNamedInt(a, parser, "strokeLineJoin",
+ AndroidResources.styleable_VectorDrawablePath_strokeLineJoin, -1);
+ mStrokeLineJoin = getStrokeLineJoin(lineJoin, mStrokeLineJoin);
+ mStrokeMiterlimit = TypedArrayUtils.getNamedFloat(a, parser, "strokeMiterLimit",
+ AndroidResources.styleable_VectorDrawablePath_strokeMiterLimit, mStrokeMiterlimit);
+ mStrokeColor = TypedArrayUtils.getNamedColor(a, parser, "strokeColor",
+ AndroidResources.styleable_VectorDrawablePath_strokeColor, mStrokeColor);
+ mStrokeAlpha = TypedArrayUtils.getNamedFloat(a, parser, "strokeAlpha",
+ AndroidResources.styleable_VectorDrawablePath_strokeAlpha, mStrokeAlpha);
+ mStrokeWidth = TypedArrayUtils.getNamedFloat(a, parser, "strokeWidth",
+ AndroidResources.styleable_VectorDrawablePath_strokeWidth, mStrokeWidth);
+ mTrimPathEnd = TypedArrayUtils.getNamedFloat(a, parser, "trimPathEnd",
+ AndroidResources.styleable_VectorDrawablePath_trimPathEnd, mTrimPathEnd);
+ mTrimPathOffset = TypedArrayUtils.getNamedFloat(a, parser, "trimPathOffset",
+ AndroidResources.styleable_VectorDrawablePath_trimPathOffset, mTrimPathOffset);
+ mTrimPathStart = TypedArrayUtils.getNamedFloat(a, parser, "trimPathStart",
+ AndroidResources.styleable_VectorDrawablePath_trimPathStart, mTrimPathStart);
}
@Override
@@ -1381,7 +1449,7 @@
/*
* TODO TINT THEME Not supported yet final TypedArray a =
- * t.resolveAttributes(mThemeAttrs, R.styleable.VectorDrawablePath);
+ * t.resolveAttributes(mThemeAttrs, styleable_VectorDrawablePath);
* updateStateFromTypedArray(a); a.recycle();
*/
}
diff --git a/graphics/drawable/testanimated/Android.mk b/graphics/drawable/testanimated/Android.mk
index c888d9e..004cddb 100644
--- a/graphics/drawable/testanimated/Android.mk
+++ b/graphics/drawable/testanimated/Android.mk
@@ -18,7 +18,7 @@
LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := 11
+LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -30,6 +30,8 @@
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v11-animatedvectordrawable android-support-v4
-LOCAL_AAPT_FLAGS += --auto-add-overlay --extra-packages android.support.graphics.drawable
+LOCAL_AAPT_FLAGS += --auto-add-overlay \
+ --extra-packages android.support.graphics.drawable \
+ --no-version-vectors
include $(BUILD_PACKAGE)
diff --git a/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml b/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml
index 7c3b1de..dac981b 100644
--- a/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml
+++ b/graphics/drawable/testanimated/res/drawable/animation_vector_drawable_grouping_1.xml
@@ -14,14 +14,13 @@
limitations under the License.
-->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:drawable="@drawable/vector_drawable_grouping_1" >
+ android:drawable="@drawable/vector_drawable_grouping_1" >
<target
- auto:name="sun"
- auto:animation="@anim/animation_grouping_1_01" />
+ android:name="sun"
+ android:animation="@anim/animation_grouping_1_01" />
<target
- auto:name="earth"
- auto:animation="@anim/animation_grouping_1_01" />
+ android:name="earth"
+ android:animation="@anim/animation_grouping_1_01" />
</animated-vector>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml b/graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml
index e37d2a1..2944dc2 100644
--- a/graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml
+++ b/graphics/drawable/testanimated/res/drawable/animation_vector_progress_bar.xml
@@ -14,13 +14,12 @@
limitations under the License.
-->
<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:drawable="@drawable/vector_drawable_progress_bar" >
+ android:drawable="@drawable/vector_drawable_progress_bar" >
<target
- auto:name="pie1"
- auto:animation="@anim/trim_path_animation_progress_bar" />
+ android:name="pie1"
+ android:animation="@anim/trim_path_animation_progress_bar" />
<target
- auto:name="root_bar"
- auto:animation="@anim/alpha_animation_progress_bar" />
+ android:name="root_bar"
+ android:animation="@anim/alpha_animation_progress_bar" />
</animated-vector>
\ No newline at end of file
diff --git a/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml b/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml
index eceda71..06f098e 100644
--- a/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml
+++ b/graphics/drawable/testanimated/res/drawable/vector_drawable_grouping_1.xml
@@ -14,37 +14,36 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="256"
- auto:viewportWidth="256" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="256"
+ android:viewportWidth="256" >
<group
- auto:name="shape_layer_1"
- auto:translateX="128"
- auto:translateY="128" >
- <group auto:name="sun" >
+ android:name="shape_layer_1"
+ android:translateX="128"
+ android:translateY="128" >
+ <group android:name="sun" >
<path
- auto:name="ellipse_path_1"
- auto:fillColor="#ffff8000"
- auto:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0" />
+ android:name="ellipse_path_1"
+ android:fillColor="#ffff8000"
+ android:pathData="m -25 0 a 25,25 0 1,0 50,0 a 25,25 0 1,0 -50,0" />
<group
- auto:name="earth"
- auto:translateX="75" >
+ android:name="earth"
+ android:translateX="75" >
<path
- auto:name="ellipse_path_1_1"
- auto:fillColor="#ff5656ea"
- auto:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0" />
+ android:name="ellipse_path_1_1"
+ android:fillColor="#ff5656ea"
+ android:pathData="m -10 0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0" />
<group
- auto:name="moon"
- auto:translateX="25" >
+ android:name="moon"
+ android:translateX="25" >
<path
- auto:name="ellipse_path_1_2"
- auto:fillColor="#ffadadad"
- auto:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0" />
+ android:name="ellipse_path_1_2"
+ android:fillColor="#ffadadad"
+ android:pathData="m -5 0 a 5,5 0 1,0 10,0 a 5,5 0 1,0 -10,0" />
</group>
</group>
</group>
diff --git a/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml b/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml
index 0b8884b..535265e 100644
--- a/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml
+++ b/graphics/drawable/testanimated/res/drawable/vector_drawable_progress_bar.xml
@@ -14,36 +14,35 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="64"
- auto:viewportWidth="64"
- auto:name="root_bar" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="64"
+ android:viewportWidth="64"
+ android:name="root_bar" >
<group
- auto:name="root"
- auto:pivotX="0.0"
- auto:pivotY="0.0"
- auto:rotation="0"
- auto:translateX="32.0"
- auto:translateY="32.0" >
+ android:name="root"
+ android:pivotX="0.0"
+ android:pivotY="0.0"
+ android:rotation="0"
+ android:translateX="32.0"
+ android:translateY="32.0" >
<group
- auto:name="rotationGroup"
- auto:pivotX="0.0"
- auto:pivotY="0.0"
- auto:rotation="0" >
+ android:name="rotationGroup"
+ android:pivotX="0.0"
+ android:pivotY="0.0"
+ android:rotation="0" >
<path
- auto:name="pie1"
- auto:fillColor="#00000000"
- auto:pathData="M0, 0 m 0, -9.5 a 9.5,9.5 0 1,1 0,19 a 9.5,9.5 0 1,1 0,-19"
- auto:strokeColor="#FF00FFFF"
- auto:strokeLineCap="round"
- auto:strokeLineJoin="miter"
- auto:strokeWidth="2"
- auto:trimPathEnd="0.1"
- auto:trimPathOffset="0"
- auto:trimPathStart="0" />
+ android:name="pie1"
+ android:fillColor="#00000000"
+ android:pathData="M0, 0 m 0, -9.5 a 9.5,9.5 0 1,1 0,19 a 9.5,9.5 0 1,1 0,-19"
+ android:strokeColor="#FF00FFFF"
+ android:strokeLineCap="round"
+ android:strokeLineJoin="miter"
+ android:strokeWidth="2"
+ android:trimPathEnd="0.1"
+ android:trimPathOffset="0"
+ android:trimPathStart="0" />
</group>
</group>
diff --git a/graphics/drawable/teststatic/Android.mk b/graphics/drawable/teststatic/Android.mk
index d8a0fd7..4c4a7ba 100644
--- a/graphics/drawable/teststatic/Android.mk
+++ b/graphics/drawable/teststatic/Android.mk
@@ -18,7 +18,7 @@
LOCAL_MODULE_TAGS := tests
-LOCAL_SDK_VERSION := 7
+LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := $(call all-java-files-under, src)
@@ -32,7 +32,8 @@
LOCAL_AAPT_FLAGS := \
--auto-add-overlay \
- --extra-packages android.support.graphics.drawable
+ --extra-packages android.support.graphics.drawable \
+ --no-version-vectors
include $(BUILD_PACKAGE)
diff --git a/graphics/drawable/teststatic/AndroidManifest.xml b/graphics/drawable/teststatic/AndroidManifest.xml
index 19586fb..39ac8ba 100644
--- a/graphics/drawable/teststatic/AndroidManifest.xml
+++ b/graphics/drawable/teststatic/AndroidManifest.xml
@@ -17,7 +17,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.support.test.vectordrawable" >
- <uses-sdk android:minSdkVersion="7" />
+ <uses-sdk android:minSdkVersion="7"/>
<application android:icon="@drawable/app_sample_code" android:label="VectorDrawableCompatTest" >
<activity android:name="android.support.test.vectordrawable.TestActivity" />
@@ -29,4 +29,4 @@
</intent-filter>
</application>
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml
index 12357ef..286b487 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable01.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2015 The Android Open Source Project
@@ -15,20 +14,16 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="48dp"
- auto:viewportHeight="480"
- auto:viewportWidth="480"
- auto:width="48dp" >
+ android:height="48dp"
+ android:width="48dp"
+ android:viewportHeight="480"
+ android:viewportWidth="480" >
<group>
<path
- auto:name="box1"
- auto:fillColor="?android:attr/textColorPrimary"
- auto:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
- auto:strokeColor="?android:attr/colorBackground"
- auto:strokeLineCap="round"
- auto:strokeLineJoin="round" />
+ android:name="box1"
+ android:pathData="m20,200l100,90l180-180l-35-35l-145,145l-60-60l-40,40z"
+ android:strokeLineCap="round"
+ android:strokeLineJoin="round" />
</group>
-
-</vector>
\ No newline at end of file
+</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml
index cb6b9df..7567887 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable02.xml
@@ -1,5 +1,4 @@
-<!--
- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,24 +13,20 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:viewportHeight="320"
- auto:viewportWidth="320"
- auto:width="64dp" >
-
+ android:width="64dp"
+ android:height="64dp" android:viewportWidth="320"
+ android:viewportHeight="320">
<group
- auto:pivotX="70"
- auto:pivotY="120"
- auto:rotation="180" >
+ android:rotation="180"
+ android:pivotX="70"
+ android:pivotY="120">
<path
- auto:name="house"
- auto:fillColor="#ff440000"
- auto:pathData="M 130,225 L 130,115 L 130,115 L 70,15 L 10,115 L 10,115 L 10,225 z"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="10"
- auto:trimPathEnd=".9"
- auto:trimPathStart=".1" />
+ android:name="house"
+ android:pathData="M 130,225 L 130,115 L 130,115 L 70,15 L 10,115 L 10,115 L 10,225 z"
+ android:fillColor="#ff440000"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10"
+ android:trimPathStart=".1"
+ android:trimPathEnd=".9"/>
</group>
-
-</vector>
\ No newline at end of file
+</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml
index 37d0086..454468a 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable03.xml
@@ -14,51 +14,57 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:viewportHeight="12.25"
- auto:viewportWidth="7.30625"
- auto:width="64dp" >
+ android:height="64dp"
+ android:viewportHeight="12.25"
+ android:viewportWidth="7.30625"
+ android:width="64dp" >
<group
- auto:pivotX="3.65"
- auto:pivotY="6.125"
- auto:rotation="-30" >
+ android:pivotX="3.65"
+ android:pivotY="6.125"
+ android:rotation="-30" >
<clip-path
- auto:name="clip1"
- auto:pathData="
+ android:name="clip1"
+ android:pathData="
M 0, 6.125
l 7.3, 0
l 0, 12.25
l-7.3, 0
z" />
- </group>
- <group>
- <path
- auto:name="one"
- auto:fillColor="#ff88ff"
- auto:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+
+ <group
+ android:pivotX="3.65"
+ android:pivotY="6.125"
+ android:rotation="30" >
+ <path
+ android:name="one"
+ android:fillColor="#ff88ff"
+ android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
l-5.046875,0.0 0.0-1.0Z" />
+ </group>
</group>
<group
- auto:pivotX="3.65"
- auto:pivotY="6.125"
- auto:rotation="-30" >
+ android:pivotX="3.65"
+ android:pivotY="6.125"
+ android:rotation="-30" >
<clip-path
- auto:name="clip2"
- auto:pathData="
+ android:name="clip2"
+ android:pathData="
M 0, 0
l 7.3, 0
l 0, 6.125
l-7.3, 0
z" />
- </group>
- <group>
- <path
- auto:name="two"
- auto:fillColor="#ff88ff"
- auto:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+
+ <group
+ android:pivotX="3.65"
+ android:pivotY="6.125"
+ android:rotation="30" >
+ <path
+ android:name="two"
+ android:fillColor="#ff88ff"
+ android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
@@ -67,6 +73,7 @@
q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
q-0.78125024,0.8125-2.2187502,2.265625Z" />
+ </group>
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml
index 4e2086f..e6658a6 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable04.xml
@@ -13,38 +13,41 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:width="64dp"
- auto:height="64dp"
- auto:viewportWidth="7.30625"
- auto:viewportHeight="12.25"
- auto:autoMirrored="true">
+ android:autoMirrored="true"
+ android:height="64dp"
+ android:viewportHeight="12.25"
+ android:viewportWidth="7.30625"
+ android:width="64dp" >
<group>
<clip-path
- auto:name="clip1"
- auto:pathData="
+ android:name="clip1"
+ android:pathData="
M 3.65, 6.125
m-.001, 0
a .001,.001 0 1,0 .002,0
- a .001,.001 0 1,0-.002,0z"/>
- <path
- auto:name="one"
- auto:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
- l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
- l-5.046875,0.0 0.0-1.0Z"
- auto:fillColor="#ff88ff"/>
+ a .001,.001 0 1,0-.002,0z" />
+ <path
+ android:name="one"
+ android:fillColor="#ff88ff"
+ android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+ l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
+ l-5.046875,0.0 0.0-1.0Z" />
+ </group>
+ <group>
<clip-path
- auto:name="clip2"
- auto:pathData="
+ android:name="clip2"
+ android:pathData="
M 3.65, 6.125
m-6, 0
a 6,6 0 1,0 12,0
- a 6,6 0 1,0-12,0z"/>
+ a 6,6 0 1,0-12,0z" />
+
<path
- auto:name="two"
- auto:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+ android:name="two"
+ android:fillColor="#ff88ff"
+ android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
@@ -52,7 +55,7 @@
q 0.625-0.15625 1.140625-0.15625 1.3593752,0.0 2.1718752,0.6875
q 0.8125,0.671875 0.8125,1.8125 0.0,0.53125-0.203125,1.015625
q-0.203125,0.484375-0.734375,1.140625-0.15625,0.171875-0.9375,0.984375
- q-0.78125024,0.8125-2.2187502,2.265625Z"
- auto:fillColor="#ff88ff"/>
+ q-0.78125024,0.8125-2.2187502,2.265625Z" />
</group>
-</vector>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml
index 48801e3..d1723dc 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable05.xml
@@ -14,24 +14,23 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="12.25"
- auto:viewportWidth="7.30625" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="12.25"
+ android:viewportWidth="7.30625" >
<group>
<path
- auto:name="one"
- auto:fillColor="#ffff00"
- auto:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
+ android:name="one"
+ android:fillColor="#ffff00"
+ android:pathData="M 1.215625,9.5l 1.9375,0.0 0.0-6.671875-2.109375,0.421875 0.0-1.078125
l 2.09375-0.421875 1.1874998,0.0 0.0,7.75 1.9375,0.0 0.0,1.0
l-5.046875,0.0 0.0-1.0Z" />
<path
- auto:name="two"
- auto:fillColor="#ffff00"
- auto:fillAlpha="0"
- auto:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
+ android:name="two"
+ android:fillColor="#ffff00"
+ android:fillAlpha="0"
+ android:pathData="M 2.534375,9.6875l 4.140625,0.0 0.0,1.0-5.5625,0.0 0.0-1.0q 0.671875-0.6875 1.828125-1.859375
q 1.1718752-1.1875 1.4687502-1.53125 0.578125-0.625 0.796875-1.0625
q 0.234375-0.453125 0.234375-0.875 0.0-0.703125-0.5-1.140625
q-0.484375-0.4375-1.2656252-0.4375-0.5625,0.0-1.1875,0.1875
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml
index 24173e2..4b530fd 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable06.xml
@@ -13,37 +13,36 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:width="64dp"
- auto:height="64dp"
- auto:viewportWidth="700"
- auto:viewportHeight="700">
+ android:width="64dp"
+ android:height="64dp"
+ android:viewportWidth="700"
+ android:viewportHeight="700">
<group>
- <path auto:pathData="M 569.374 461.472L 569.374 160.658L 160.658 160.658L 160.658 461.472L 569.374 461.472z"
- auto:name="path2451"
- auto:fillColor="#00000000"
- auto:strokeColor="#FF000000"
- auto:strokeWidth="30.65500000000000"/>
- <path auto:pathData="M 365.015 311.066"
- auto:name="path2453"
- auto:fillColor="#00000000"
- auto:strokeColor="#FF000000"
- auto:strokeWidth="30.655000000000001"/>
- <path auto:pathData="M 164.46 164.49L 340.78 343.158C 353.849 356.328 377.63 356.172 390.423 343.278L 566.622 165.928"
- auto:name="path2455"
- auto:strokeColor="#FF000000"
- auto:fillColor="#FFFFFFFF"
- auto:strokeWidth="30.655000000000001"/>
- <path auto:pathData="M 170.515 451.566L 305.61 313.46"
- auto:name="path2457"
- auto:fillColor="#00000000"
- auto:strokeColor="#000000"
- auto:strokeWidth="30.655000000000001"/>
- <path auto:pathData="M 557.968 449.974L 426.515 315.375"
- auto:name="path2459"
- auto:fillColor="#00000000"
- auto:strokeColor="#000000"
- auto:strokeWidth="30.655000000000001"/>
+ <path android:pathData="M 569.374 461.472L 569.374 160.658L 160.658 160.658L 160.658 461.472L 569.374 461.472z"
+ android:name="path2451"
+ android:fillColor="#00000000"
+ android:strokeColor="#FF000000"
+ android:strokeWidth="30.65500000000000"/>
+ <path android:pathData="M 365.015 311.066"
+ android:name="path2453"
+ android:fillColor="#00000000"
+ android:strokeColor="#FF000000"
+ android:strokeWidth="30.655000000000001"/>
+ <path android:pathData="M 164.46 164.49L 340.78 343.158C 353.849 356.328 377.63 356.172 390.423 343.278L 566.622 165.928"
+ android:name="path2455"
+ android:strokeColor="#FF000000"
+ android:fillColor="#FFFFFFFF"
+ android:strokeWidth="30.655000000000001"/>
+ <path android:pathData="M 170.515 451.566L 305.61 313.46"
+ android:name="path2457"
+ android:fillColor="#00000000"
+ android:strokeColor="#000000"
+ android:strokeWidth="30.655000000000001"/>
+ <path android:pathData="M 557.968 449.974L 426.515 315.375"
+ android:name="path2459"
+ android:fillColor="#00000000"
+ android:strokeColor="#000000"
+ android:strokeWidth="30.655000000000001"/>
</group>
</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml
index 90435d3..bbf2451 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable07.xml
@@ -13,18 +13,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:width="64dp"
- auto:height="64dp" auto:viewportWidth="140"
- auto:viewportHeight="110">
+ android:width="64dp"
+ android:height="64dp" android:viewportWidth="140"
+ android:viewportHeight="110">
<group>
<path
- auto:name="back"
- auto:pathData="M 20,55 l 35.3-35.3 7.07,7.07-35.3,35.3 z
+ android:name="back"
+ android:pathData="M 20,55 l 35.3-35.3 7.07,7.07-35.3,35.3 z
M 27,50 l 97,0 0,10-97,0 z
M 20,55 l 7.07-7.07 35.3,35.3-7.07,7.07 z"
- auto:fillColor="#ffffffff"
+ android:fillColor="#ffffffff"
/>
</group>
</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml
index 251d694..e5b59df 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable08.xml
@@ -13,18 +13,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:width="64dp"
- auto:height="64dp" auto:viewportWidth="600"
- auto:viewportHeight="600">
+ android:width="64dp"
+ android:height="64dp" android:viewportWidth="600"
+ android:viewportHeight="600">
<group>
<path
- auto:name="pie1"
- auto:pathData="M535.441,412.339A280.868,280.868 0 1,1 536.186,161.733L284.493,286.29Z"
- auto:fillColor="#ffffcc00"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="1"/>
+ android:name="pie1"
+ android:pathData="M535.441,412.339A280.868,280.868 0 1,1 536.186,161.733L284.493,286.29Z"
+ android:fillColor="#ffffcc00"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="1"/>
</group>
</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml
index eccb0d0..ce2441d 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable09.xml
@@ -14,20 +14,19 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="200"
- auto:viewportWidth="200" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200" >
<group
- auto:pivotX="100"
- auto:pivotY="100"
- auto:rotation="90">
+ android:pivotX="100"
+ android:pivotY="100"
+ android:rotation="90">
<path
- auto:name="house"
- auto:fillColor="#ffffffff"
- auto:pathData="M 100,20 l 0,0 0,140-80,0 z M 100,20 l 0,0 80,140-80,0 z"/>
+ android:name="house"
+ android:fillColor="#ffffffff"
+ android:pathData="M 100,20 l 0,0 0,140-80,0 z M 100,20 l 0,0 80,140-80,0 z"/>
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml
index b26d30d..935d4a5 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable10.xml
@@ -15,29 +15,28 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportWidth="200"
- auto:viewportHeight="200">
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportWidth="200"
+ android:viewportHeight="200">
<group>
<path
- auto:name="bar3"
- auto:fillColor="#FFFFFFFF"
- auto:pathData="M49.001,60c-5.466,0-9.899,4.478-9.899,10s4.434,10,9.899,10c5.468,0,9.899-4.478,9.899-10S54.469,60,49.001,60z" />
+ android:name="bar3"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M49.001,60c-5.466,0-9.899,4.478-9.899,10s4.434,10,9.899,10c5.468,0,9.899-4.478,9.899-10S54.469,60,49.001,60z" />
<path
- auto:name="bar2"
- auto:fillColor="#FFFFFFFF"
- auto:pathData="M28.001,48.787l7,7.07c7.731-7.811,20.269-7.81,28.001,0l6.999-7.07C58.403,37.071,39.599,37.071,28.001,48.787z" />
+ android:name="bar2"
+ android:fillColor="#FFFFFFFF"
+ android:pathData="M28.001,48.787l7,7.07c7.731-7.811,20.269-7.81,28.001,0l6.999-7.07C58.403,37.071,39.599,37.071,28.001,48.787z" />
<path
- auto:name="bar1"
- auto:fillColor="#FF555555"
- auto:pathData="M14.001,34.645 L21,41.716c15.464-15.621,40.536-15.621,56,0l7.001-7.071C64.672,15.119,33.33,15.119,14.001,34.645z" />
+ android:name="bar1"
+ android:fillColor="#FF555555"
+ android:pathData="M14.001,34.645 L21,41.716c15.464-15.621,40.536-15.621,56,0l7.001-7.071C64.672,15.119,33.33,15.119,14.001,34.645z" />
<path
- auto:name="bar0"
- auto:fillColor="#FF555555"
- auto:pathData="M0,20.502l6.999,7.071 c23.196-23.431,60.806-23.431,84.002,0L98,20.503C70.938-6.834,27.063-6.834,0,20.502z" />
+ android:name="bar0"
+ android:fillColor="#FF555555"
+ android:pathData="M0,20.502l6.999,7.071 c23.196-23.431,60.806-23.431,84.002,0L98,20.503C70.938-6.834,27.063-6.834,0,20.502z" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml
index eb440f5..05f481b 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable11.xml
@@ -14,23 +14,22 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="80"
- auto:viewportWidth="40" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="80"
+ android:viewportWidth="40" >
<group>
<path
- auto:name="battery"
- auto:fillColor="#3388ff"
- auto:pathData="M 20.28125,2.0000002 C 17.352748,2.0000002 15,4.3527485 15,7.2812502 L 15,8.0000002 L 13.15625,8.0000002 C 9.7507553,8.0000002 7,10.750759 7,14.15625 L 7,39.84375 C 7,43.24924 9.7507558,46 13.15625,46 L 33.84375,46 C 37.249245,46 39.999999,43.24924 40,39.84375 L 40,14.15625 C 40,10.75076 37.249243,8.0000002 33.84375,8.0000002 L 32,8.0000002 L 32,7.2812502 C 32,4.3527485 29.647252,2.0000002 26.71875,2.0000002 L 20.28125,2.0000002 z"
- auto:strokeColor="#ff8833"
- auto:strokeWidth="1" />
+ android:name="battery"
+ android:fillColor="#3388ff"
+ android:pathData="M 20.28125,2.0000002 C 17.352748,2.0000002 15,4.3527485 15,7.2812502 L 15,8.0000002 L 13.15625,8.0000002 C 9.7507553,8.0000002 7,10.750759 7,14.15625 L 7,39.84375 C 7,43.24924 9.7507558,46 13.15625,46 L 33.84375,46 C 37.249245,46 39.999999,43.24924 40,39.84375 L 40,14.15625 C 40,10.75076 37.249243,8.0000002 33.84375,8.0000002 L 32,8.0000002 L 32,7.2812502 C 32,4.3527485 29.647252,2.0000002 26.71875,2.0000002 L 20.28125,2.0000002 z"
+ android:strokeColor="#ff8833"
+ android:strokeWidth="1" />
<path
- auto:name="spark"
- auto:fillColor="#FFFF0000"
- auto:pathData="M 30,18.031528 L 25.579581,23.421071 L 29.370621,26.765348 L 20.096792,37 L 21.156922,28.014053 L 17,24.902844 L 20.880632,18 L 30,18.031528 z" />
+ android:name="spark"
+ android:fillColor="#FFFF0000"
+ android:pathData="M 30,18.031528 L 25.579581,23.421071 L 29.370621,26.765348 L 20.096792,37 L 21.156922,28.014053 L 17,24.902844 L 20.880632,18 L 30,18.031528 z" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml
index 94a23e8..94338a7 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable12.xml
@@ -14,79 +14,78 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:name="rootGroup"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="600"
- auto:viewportWidth="600"
- auto:alpha="0.5" >
+ android:name="rootGroup"
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="600"
+ android:viewportWidth="600"
+ android:alpha="0.5" >
<group
- auto:name="rotationGroup"
- auto:pivotX="300.0"
- auto:pivotY="300.0"
- auto:rotation="45.0" >
+ android:name="rotationGroup"
+ android:pivotX="300.0"
+ android:pivotY="300.0"
+ android:rotation="45.0" >
<path
- auto:name="pie1"
- auto:fillColor="#00000000"
- auto:pathData="M300,70 a230,230 0 1,0 1,0 z"
- auto:strokeColor="#FF777777"
- auto:strokeWidth="70"
- auto:trimPathEnd=".75"
- auto:trimPathOffset="0"
- auto:trimPathStart="0" />
+ android:name="pie1"
+ android:fillColor="#00000000"
+ android:pathData="M300,70 a230,230 0 1,0 1,0 z"
+ android:strokeColor="#FF777777"
+ android:strokeWidth="70"
+ android:trimPathEnd=".75"
+ android:trimPathOffset="0"
+ android:trimPathStart="0" />
<path
- auto:name="v"
- auto:fillColor="#000000"
- auto:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
+ android:name="v"
+ android:fillColor="#000000"
+ android:pathData="M300,70 l 0,-70 70,70 0,0 -70,70z" />
<group
- auto:name="translateToCenterGroup"
- auto:rotation="0.0"
- auto:translateX="200.0"
- auto:translateY="200.0" >
+ android:name="translateToCenterGroup"
+ android:rotation="0.0"
+ android:translateX="200.0"
+ android:translateY="200.0" >
<group
- auto:name="rotationGroup2"
- auto:pivotX="0.0"
- auto:pivotY="0.0"
- auto:rotation="-45.0" >
+ android:name="rotationGroup2"
+ android:pivotX="0.0"
+ android:pivotY="0.0"
+ android:rotation="-45.0" >
<path
- auto:name="twoLines1"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="20" />
+ android:name="twoLines1"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="20" />
<group
- auto:name="translateGroupHalf"
- auto:translateX="65.0"
- auto:translateY="80.0" >
+ android:name="translateGroupHalf"
+ android:translateX="65.0"
+ android:translateY="80.0" >
<group
- auto:name="rotationGroup3"
- auto:pivotX="-65.0"
- auto:pivotY="-80.0"
- auto:rotation="-45.0" >
+ android:name="rotationGroup3"
+ android:pivotX="-65.0"
+ android:pivotY="-80.0"
+ android:rotation="-45.0" >
<path
- auto:name="twoLines2"
- auto:fillColor="#FF00FF00"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="20" />
+ android:name="twoLines2"
+ android:fillColor="#FF00FF00"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="20" />
<group
- auto:name="translateGroup"
- auto:translateX="65.0"
- auto:translateY="80.0" >
+ android:name="translateGroup"
+ android:translateX="65.0"
+ android:translateY="80.0" >
<group
- auto:name="rotationGroupBlue"
- auto:pivotX="-65.0"
- auto:pivotY="-80.0"
- auto:rotation="-45.0" >
+ android:name="rotationGroupBlue"
+ android:pivotX="-65.0"
+ android:pivotY="-80.0"
+ android:rotation="-45.0" >
<path
- auto:name="twoLines3"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FF0000FF"
- auto:strokeWidth="20" />
+ android:name="twoLines3"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="20" />
</group>
</group>
</group>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml
index 43fc7ea..097e028 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable13.xml
@@ -14,25 +14,24 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="600" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="600" >
<group>
<path
- auto:name="pie1"
- auto:fillColor="#ffffffff"
- auto:pathData="M300,200 h-150 a150,150 0 1,0 150,-150 z"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="1" />
+ android:name="pie1"
+ android:fillColor="#ffffffff"
+ android:pathData="M300,200 h-150 a150,150 0 1,0 150,-150 z"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="1" />
<path
- auto:name="half"
- auto:fillColor="#FFFF0000"
- auto:pathData="M275,175 v-150 a150,150 0 0,0 -150,150 z"
- auto:strokeColor="#FF0000FF"
- auto:strokeWidth="5" />
+ android:name="half"
+ android:fillColor="#FFFF0000"
+ android:pathData="M275,175 v-150 a150,150 0 0,0 -150,150 z"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="5" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable14.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable14.xml
index 5b4fdd1..102ae7a 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable14.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable14.xml
@@ -14,26 +14,25 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="500"
- auto:viewportWidth="800" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="500"
+ android:viewportWidth="800" >
<group
- auto:pivotX="90"
- auto:pivotY="100"
- auto:rotation="20">
+ android:pivotX="90"
+ android:pivotY="100"
+ android:rotation="20">
<path
- auto:name="pie2"
- auto:pathData="M200,350 l 50,-25
+ android:name="pie2"
+ android:pathData="M200,350 l 50,-25
a25,12 -30 0,1 100,-50 l 50,-25
a25,25 -30 0,1 100,-50 l 50,-25
a25,37 -30 0,1 100,-50 l 50,-25
a25,50 -30 0,1 100,-50 l 50,-25"
- auto:fillColor="#00000000"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="10" />
+ android:fillColor="#00000000"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml
index f4ef87f..bdfcf81 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable15.xml
@@ -14,22 +14,21 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="500" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="500" >
<group
- auto:pivotX="250"
- auto:pivotY="200"
- auto:rotation="180">
+ android:pivotX="250"
+ android:pivotY="200"
+ android:rotation="180">
<path
- auto:name="house"
- auto:fillColor="#ff440000"
- auto:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="10" />
+ android:name="house"
+ android:fillColor="#ff440000"
+ android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="10" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml
index 0c64bca..ed1efa0 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable16.xml
@@ -14,35 +14,34 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="200"
- auto:viewportWidth="200" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200" >
<group>
<path
- auto:name="background1"
- auto:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
- auto:fillColor="#FF000000"/>
+ android:name="background1"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+ android:fillColor="#FF000000"/>
<path
- auto:name="background2"
- auto:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
- auto:fillColor="#FF000000"/>
+ android:name="background2"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+ android:fillColor="#FF000000"/>
</group>
<group
- auto:pivotX="100"
- auto:pivotY="100"
- auto:rotation="90"
- auto:scaleX="0.75"
- auto:scaleY="0.5"
- auto:translateX="0.0"
- auto:translateY="100.0">
+ android:pivotX="100"
+ android:pivotY="100"
+ android:rotation="90"
+ android:scaleX="0.75"
+ android:scaleY="0.5"
+ android:translateX="0.0"
+ android:translateY="100.0">
<path
- auto:name="twoLines"
- auto:pathData="M 100,10 v 90 M 10,100 h 90"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="10" />
+ android:name="twoLines"
+ android:pathData="M 100,10 v 90 M 10,100 h 90"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml
index 28cf09a..ba15f41 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable17.xml
@@ -13,18 +13,17 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:width="64dp"
- auto:height="64dp" auto:viewportWidth="1200"
- auto:viewportHeight="600">
+ android:width="64dp"
+ android:height="64dp" android:viewportWidth="1200"
+ android:viewportHeight="600">
<group>
<path
- auto:name="house"
- auto:pathData="M200,300 Q400,50 600,300 T1000,300"
- auto:fillColor="#00000000"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="10"/>
+ android:name="house"
+ android:pathData="M200,300 Q400,50 600,300 T1000,300"
+ android:fillColor="#00000000"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="10"/>
</group>
</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml
index d66d4ff..ee2122a 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable18.xml
@@ -14,19 +14,18 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="500" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="500" >
<group>
<path
- auto:name="house"
- auto:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
- auto:fillColor="#00000000"
- auto:strokeColor="#FFFFFF00"
- auto:strokeWidth="10" />
+ android:name="house"
+ android:pathData="M100,200 C100,100 250,100 250,200 S400,300 400,200"
+ android:fillColor="#00000000"
+ android:strokeColor="#FFFFFF00"
+ android:strokeWidth="10" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml
index 3a6559d..b98e1de 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable19.xml
@@ -14,21 +14,20 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="800"
- auto:viewportWidth="1000" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="800"
+ android:viewportWidth="1000" >
<group>
<path
- auto:name="house"
- auto:pathData="M10,300 Q400,550 600,300 T1000,300"
- auto:pivotX="90"
- auto:pivotY="100"
- auto:fillColor="#00000000"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="60" />
+ android:name="house"
+ android:pathData="M10,300 Q400,550 600,300 T1000,300"
+ android:pivotX="90"
+ android:pivotY="100"
+ android:fillColor="#00000000"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="60" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml
index d6fd704..1c86818 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable20.xml
@@ -14,22 +14,21 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="480"
- auto:viewportWidth="480" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="480"
+ android:viewportWidth="480" >
<group>
<path
- auto:name="edit"
- auto:fillColor="#FF00FFFF"
- auto:pathData="M406.667,180c0,0 -100 -100 -113.334 -113.333
+ android:name="edit"
+ android:fillColor="#FF00FFFF"
+ android:pathData="M406.667,180c0,0 -100 -100 -113.334 -113.333
c-13.333 -13.334 -33.333,0 -33.333,0l-160,160c0,0 -40,153.333 -40,173.333c0,13.333,13.333,13.333,13.333,13.333l173.334 -40
c0,0,146.666 -146.666,160 -160C420,200,406.667,180,406.667,180z M226.399,356.823L131.95,378.62l-38.516 -38.522
c7.848 -34.675,20.152 -82.52,23.538 -95.593l3.027,2.162l106.667,106.666L226.399,356.823z"
- auto:strokeColor="#FF000000"
- auto:strokeWidth="10" />
+ android:strokeColor="#FF000000"
+ android:strokeWidth="10" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml
index 9136b73..247f6bc 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable21.xml
@@ -14,35 +14,34 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="200"
- auto:viewportWidth="200" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200" >
<group>
<path
- auto:name="background1"
- auto:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
- auto:fillColor="#FF000000"/>
+ android:name="background1"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z"
+ android:fillColor="#FF000000"/>
<path
- auto:name="background2"
- auto:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
- auto:fillColor="#FF000000"/>
+ android:name="background2"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z"
+ android:fillColor="#FF000000"/>
</group>
<group
- auto:pivotX="0"
- auto:pivotY="0"
- auto:rotation="90"
- auto:scaleX="0.75"
- auto:scaleY="0.5"
- auto:translateX="100.0"
- auto:translateY="100.0">
+ android:pivotX="0"
+ android:pivotY="0"
+ android:rotation="90"
+ android:scaleX="0.75"
+ android:scaleY="0.5"
+ android:translateX="100.0"
+ android:translateY="100.0">
<path
- auto:name="twoLines"
- auto:pathData="M 100,10 v 90 M 10,100 h 90"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="10" />
+ android:name="twoLines"
+ android:pathData="M 100,10 v 90 M 10,100 h 90"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml
index 2b33a89..39d891f 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable22.xml
@@ -14,53 +14,52 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="400" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="400" >
- <group auto:name="backgroundGroup" >
+ <group android:name="backgroundGroup" >
<path
- auto:name="background1"
- auto:fillColor="#80000000"
- auto:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+ android:name="background1"
+ android:fillColor="#80000000"
+ android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
<path
- auto:name="background2"
- auto:fillColor="#80000000"
- auto:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+ android:name="background2"
+ android:fillColor="#80000000"
+ android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
</group>
<group
- auto:name="translateToCenterGroup"
- auto:translateX="50.0"
- auto:translateY="90.0" >
+ android:name="translateToCenterGroup"
+ android:translateX="50.0"
+ android:translateY="90.0" >
<path
- auto:name="twoLines"
- auto:pathData="M 0,0 v 100 M 0,0 h 100"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="20" />
+ android:name="twoLines"
+ android:pathData="M 0,0 v 100 M 0,0 h 100"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="20" />
<group
- auto:name="rotationGroup"
- auto:pivotX="0.0"
- auto:pivotY="0.0"
- auto:rotation="-45.0" >
+ android:name="rotationGroup"
+ android:pivotX="0.0"
+ android:pivotY="0.0"
+ android:rotation="-45.0" >
<path
- auto:name="twoLines1"
- auto:pathData="M 0,0 v 100 M 0,0 h 100"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="20" />
+ android:name="twoLines1"
+ android:pathData="M 0,0 v 100 M 0,0 h 100"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="20" />
<group
- auto:name="translateGroup"
- auto:translateX="130.0"
- auto:translateY="160.0" >
- <group auto:name="scaleGroup" >
+ android:name="translateGroup"
+ android:translateX="130.0"
+ android:translateY="160.0" >
+ <group android:name="scaleGroup" >
<path
- auto:name="twoLines2"
- auto:pathData="M 0,0 v 100 M 0,0 h 100"
- auto:strokeColor="#FF0000FF"
- auto:strokeWidth="20" />
+ android:name="twoLines2"
+ android:pathData="M 0,0 v 100 M 0,0 h 100"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="20" />
</group>
</group>
</group>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml
index d5759f9..4a1c062 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable23.xml
@@ -14,67 +14,66 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="400" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="400" >
- <group auto:name="backgroundGroup" >
+ <group android:name="backgroundGroup" >
<path
- auto:name="background1"
- auto:fillColor="#80000000"
- auto:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+ android:name="background1"
+ android:fillColor="#80000000"
+ android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
<path
- auto:name="background2"
- auto:fillColor="#80000000"
- auto:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+ android:name="background2"
+ android:fillColor="#80000000"
+ android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
</group>
<group
- auto:name="translateToCenterGroup"
- auto:translateX="50.0"
- auto:translateY="90.0" >
+ android:name="translateToCenterGroup"
+ android:translateX="50.0"
+ android:translateY="90.0" >
<path
- auto:name="twoLines"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="20" />
+ android:name="twoLines"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="20" />
<group
- auto:name="rotationGroup"
- auto:pivotX="0.0"
- auto:pivotY="0.0"
- auto:rotation="-45.0" >
+ android:name="rotationGroup"
+ android:pivotX="0.0"
+ android:pivotY="0.0"
+ android:rotation="-45.0" >
<path
- auto:name="twoLines1"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="20" />
+ android:name="twoLines1"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="20" />
<group
- auto:name="translateGroup"
- auto:translateX="130.0"
- auto:translateY="160.0" >
- <group auto:name="scaleGroup" >
+ android:name="translateGroup"
+ android:translateX="130.0"
+ android:translateY="160.0" >
+ <group android:name="scaleGroup" >
<path
- auto:name="twoLines3"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FF0000FF"
- auto:strokeWidth="20" />
+ android:name="twoLines3"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="20" />
</group>
</group>
<group
- auto:name="translateGroupHalf"
- auto:translateX="65.0"
- auto:translateY="80.0" >
- <group auto:name="scaleGroup" >
+ android:name="translateGroupHalf"
+ android:translateX="65.0"
+ android:translateY="80.0" >
+ <group android:name="scaleGroup" >
<path
- auto:name="twoLines2"
- auto:pathData="@string/twoLinePathData"
- auto:fillColor="#FFFFFFFF"
- auto:strokeColor="#FFFFFFFF"
- auto:strokeWidth="20" />
+ android:name="twoLines2"
+ android:pathData="@string/twoLinePathData"
+ android:fillColor="?android:attr/colorForeground"
+ android:strokeColor="?android:attr/colorForeground"
+ android:strokeWidth="20" />
</group>
</group>
</group>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml
index b054692..a7a8bd3 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable24.xml
@@ -14,67 +14,66 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="400" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="400" >
- <group auto:name="backgroundGroup">
+ <group android:name="backgroundGroup">
<path
- auto:name="background1"
- auto:fillColor="#FF000000"
- auto:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 200,0 l 0, 200 l -200, 0 z" />
<path
- auto:name="background2"
- auto:fillColor="#FF000000"
- auto:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 200,200 l 200,0 l 0, 200 l -200, 0 z" />
</group>
<group
- auto:name="translateToCenterGroup"
- auto:translateX="50.0"
- auto:translateY="90.0" >
+ android:name="translateToCenterGroup"
+ android:translateX="50.0"
+ android:translateY="90.0" >
<path
- auto:name="twoLines"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FFFF0000"
- auto:strokeWidth="20" />
+ android:name="twoLines"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FFFF0000"
+ android:strokeWidth="20" />
<group
- auto:name="rotationGroup"
- auto:pivotX="0.0"
- auto:pivotY="0.0"
- auto:rotation="-45.0">
+ android:name="rotationGroup"
+ android:pivotX="0.0"
+ android:pivotY="0.0"
+ android:rotation="-45.0">
<path
- auto:name="twoLines1"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FF00FF00"
- auto:strokeWidth="20" />
+ android:name="twoLines1"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="20" />
<group
- auto:name="translateGroup"
- auto:translateX="130.0"
- auto:translateY="160.0">
- <group auto:name="scaleGroup" >
+ android:name="translateGroup"
+ android:translateX="130.0"
+ android:translateY="160.0">
+ <group android:name="scaleGroup" >
<path
- auto:name="twoLines3"
- auto:pathData="@string/twoLinePathData"
- auto:strokeColor="#FF0000FF"
- auto:strokeWidth="20" />
+ android:name="twoLines3"
+ android:pathData="@string/twoLinePathData"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="20" />
</group>
</group>
<group
- auto:name="translateGroupHalf"
- auto:translateX="65.0"
- auto:translateY="80.0">
- <group auto:name="scaleGroup" >
+ android:name="translateGroupHalf"
+ android:translateX="65.0"
+ android:translateY="80.0">
+ <group android:name="scaleGroup" >
<path
- auto:name="twoLines2"
- auto:pathData="@string/twoLinePathData"
- auto:fillColor="#FFFFFFFF"
- auto:strokeColor="#FFFFFFFF"
- auto:strokeWidth="20" />
+ android:name="twoLines2"
+ android:pathData="@string/twoLinePathData"
+ android:fillColor="?android:attr/colorForeground"
+ android:strokeColor="?android:attr/colorForeground"
+ android:strokeWidth="20" />
</group>
</group>
</group>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml
index 7a94ed6..7c9e771 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable25.xml
@@ -14,70 +14,69 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:width="64dp"
- auto:viewportHeight="400"
- auto:viewportWidth="400" >
+ android:height="64dp"
+ android:width="64dp"
+ android:viewportHeight="400"
+ android:viewportWidth="400" >
<group
- auto:name="FirstLevelGroup"
- auto:translateX="100.0"
- auto:translateY="0.0" >
+ android:name="FirstLevelGroup"
+ android:translateX="100.0"
+ android:translateY="0.0" >
<group
- auto:name="SecondLevelGroup1"
- auto:translateX="-100.0"
- auto:translateY="50.0" >
+ android:name="SecondLevelGroup1"
+ android:translateX="-100.0"
+ android:translateY="50.0" >
<path
- auto:fillColor="#FF00FF00"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FF00FF00"
+ android:pathData="@string/rectangle200" />
<group
- auto:name="ThridLevelGroup1"
- auto:translateX="-100.0"
- auto:translateY="50.0" >
+ android:name="ThridLevelGroup1"
+ android:translateX="-100.0"
+ android:translateY="50.0" >
<path
- auto:fillColor="#FF0000FF"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FF0000FF"
+ android:pathData="@string/rectangle200" />
</group>
<group
- auto:name="ThridLevelGroup2"
- auto:translateX="100.0"
- auto:translateY="50.0" >
+ android:name="ThridLevelGroup2"
+ android:translateX="100.0"
+ android:translateY="50.0" >
<path
- auto:fillColor="#FF000000"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FF000000"
+ android:pathData="@string/rectangle200" />
</group>
</group>
<group
- auto:name="SecondLevelGroup2"
- auto:translateX="100.0"
- auto:translateY="50.0" >
+ android:name="SecondLevelGroup2"
+ android:translateX="100.0"
+ android:translateY="50.0" >
<path
- auto:fillColor="#FF0000FF"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FF0000FF"
+ android:pathData="@string/rectangle200" />
<group
- auto:name="ThridLevelGroup3"
- auto:translateX="-100.0"
- auto:translateY="50.0" >
+ android:name="ThridLevelGroup3"
+ android:translateX="-100.0"
+ android:translateY="50.0" >
<path
- auto:fillColor="#FFFF0000"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FFFF0000"
+ android:pathData="@string/rectangle200" />
</group>
<group
- auto:name="ThridLevelGroup4"
- auto:translateX="100.0"
- auto:translateY="50.0" >
+ android:name="ThridLevelGroup4"
+ android:translateX="100.0"
+ android:translateY="50.0" >
<path
- auto:fillColor="#FF00FF00"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FF00FF00"
+ android:pathData="@string/rectangle200" />
</group>
</group>
<path
- auto:fillColor="#FFFF0000"
- auto:pathData="@string/rectangle200" />
+ android:fillColor="#FFFF0000"
+ android:pathData="@string/rectangle200" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml
index b2dd4a3..eda06d8 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable26.xml
@@ -14,33 +14,32 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:viewportHeight="200"
- auto:viewportWidth="200"
- auto:width="64dp" >
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp" >
<group>
<path
- auto:name="background1"
- auto:fillColor="#FF000000"
- auto:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
<path
- auto:name="background2"
- auto:fillColor="#FF000000"
- auto:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
</group>
<group
- auto:translateX="50"
- auto:translateY="50" >
+ android:translateX="50"
+ android:translateY="50" >
<path
- auto:name="twoLines"
- auto:pathData="M 100,20 l 0 80 l -30 -80"
- auto:strokeColor="#FF00FF00"
- auto:strokeLineCap="butt"
- auto:strokeLineJoin="miter"
- auto:strokeMiterLimit="5"
- auto:strokeWidth="20" />
+ android:name="twoLines"
+ android:pathData="M 100,20 l 0 80 l -30 -80"
+ android:strokeColor="#FF00FF00"
+ android:strokeLineCap="butt"
+ android:strokeLineJoin="miter"
+ android:strokeMiterLimit="5"
+ android:strokeWidth="20" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml
index b8f88ce..cd46dd9 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable27.xml
@@ -14,33 +14,32 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:viewportHeight="200"
- auto:viewportWidth="200"
- auto:width="64dp" >
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp" >
<group>
<path
- auto:name="background1"
- auto:fillColor="#FF000000"
- auto:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
<path
- auto:name="background2"
- auto:fillColor="#FF000000"
- auto:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
</group>
<group
- auto:translateX="50"
- auto:translateY="50" >
+ android:translateX="50"
+ android:translateY="50" >
<path
- auto:name="twoLines"
- auto:pathData="M 100,20 l 0 80 l -30 -80"
- auto:strokeColor="#FF00FF00"
- auto:strokeLineCap="round"
- auto:strokeLineJoin="round"
- auto:strokeMiterLimit="10"
- auto:strokeWidth="20" />
+ android:name="twoLines"
+ android:pathData="M 100,20 l 0 80 l -30 -80"
+ android:strokeColor="#FF00FF00"
+ android:strokeLineCap="round"
+ android:strokeLineJoin="round"
+ android:strokeMiterLimit="10"
+ android:strokeWidth="20" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml
index 30c7fce..812af6b 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable28.xml
@@ -14,34 +14,33 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="64dp"
- auto:viewportHeight="200"
- auto:viewportWidth="200"
- auto:width="64dp"
- auto:autoMirrored="true" >
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp"
+ android:autoMirrored="true" >
<group>
<path
- auto:name="background1"
- auto:fillColor="#FF000000"
- auto:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
<path
- auto:name="background2"
- auto:fillColor="#FF000000"
- auto:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
</group>
<group
- auto:translateX="50"
- auto:translateY="50" >
+ android:translateX="50"
+ android:translateY="50" >
<path
- auto:name="twoLines"
- auto:pathData="M 100,20 l 0 80 l -30 -80"
- auto:strokeColor="#FF00FF00"
- auto:strokeLineCap="square"
- auto:strokeLineJoin="bevel"
- auto:strokeMiterLimit="10"
- auto:strokeWidth="20" />
+ android:name="twoLines"
+ android:pathData="M 100,20 l 0 80 l -30 -80"
+ android:strokeColor="#FF00FF00"
+ android:strokeLineCap="square"
+ android:strokeLineJoin="bevel"
+ android:strokeMiterLimit="10"
+ android:strokeWidth="20" />
</group>
</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable29.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable29.xml
index 2ac1d42..b24d31c 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable29.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable29.xml
@@ -14,16 +14,15 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="48dp"
- auto:width="48dp"
- auto:viewportHeight="1"
- auto:viewportWidth="1" >
+ android:height="48dp"
+ android:width="48dp"
+ android:viewportHeight="1"
+ android:viewportWidth="1" >
<group>
<path
- auto:name="box1"
- auto:pathData="l0.0.0.5.0.0.5-0.5.0.0-.5z"
- auto:fillColor="#ff00ff00"/>
+ android:name="box1"
+ android:pathData="l0.0.0.5.0.0.5-0.5.0.0-.5z"
+ android:fillColor="#ff00ff00"/>
</group>
</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml
index 6abb455..24f7372 100644
--- a/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable30.xml
@@ -14,16 +14,15 @@
limitations under the License.
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:auto="http://schemas.android.com/apk/res-auto"
- auto:height="48dp"
- auto:width="48dp"
- auto:viewportHeight="48"
- auto:viewportWidth="48" >
+ android:height="48dp"
+ android:width="48dp"
+ android:viewportHeight="48"
+ android:viewportWidth="48" >
<group>
<path
- auto:name="plus1"
- auto:pathData="M20 16h-4v8h-8v4h8v8h4v-8h8v-4h-8zm9-3.84v3.64l5-1v21.2h4v-26z"
- auto:fillColor="#ff00ff00"/>
+ android:name="plus1"
+ android:pathData="M20 16h-4v8h-8v4h8v8h4v-8h8v-4h-8zm9-3.84v3.64l5-1v21.2h4v-26z"
+ android:fillColor="#ff00ff00"/>
</group>
</vector>
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale0.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale0.xml
new file mode 100644
index 0000000..828f0d9
--- /dev/null
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale0.xml
@@ -0,0 +1,57 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp" >
+
+ <group>
+ <path
+ android:name="background1"
+ android:fillColor="@color/color0"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ <path
+ android:name="background2"
+ android:fillColor="@color/color2"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ </group>
+ <group
+ android:pivotX="0"
+ android:pivotY="0"
+ android:rotation="90" >
+ <group
+ android:scaleX="1.5"
+ android:scaleY="1" >
+ <group
+ android:pivotX="0"
+ android:pivotY="0"
+ android:rotation="-90" >
+ <group
+ android:scaleX="1.5"
+ android:scaleY="1" >
+ <path
+ android:name="twoLines"
+ android:fillColor="#FFFF0000"
+ android:pathData="@string/triangle100"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
+ </group>
+ </group>
+ </group>
+ </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale1.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale1.xml
new file mode 100644
index 0000000..530c73b
--- /dev/null
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale1.xml
@@ -0,0 +1,52 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp" >
+
+ <group>
+ <path
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ <path
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ </group>
+ <group
+ android:scaleX="-1"
+ android:scaleY="-1" >
+ <group
+ android:scaleX="-1"
+ android:scaleY="-1" >
+ <group
+ android:pivotX="100"
+ android:pivotY="100"
+ android:rotation="45" >
+ <path
+ android:name="twoLines"
+ android:fillColor="#FFFF0000"
+ android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
+ </group>
+ </group>
+ </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale2.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale2.xml
new file mode 100644
index 0000000..200eb61
--- /dev/null
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale2.xml
@@ -0,0 +1,48 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp" >
+
+ <group>
+ <path
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ <path
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ </group>
+ <group
+ android:scaleX="2"
+ android:scaleY="0.5" >
+ <group
+ android:pivotX="100"
+ android:pivotY="100"
+ android:rotation="45" >
+ <path
+ android:name="twoLines"
+ android:fillColor="#FFFF0000"
+ android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
+ </group>
+ </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_drawable_scale3.xml b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale3.xml
new file mode 100644
index 0000000..a40fc9c2
--- /dev/null
+++ b/graphics/drawable/teststatic/res/drawable/vector_drawable_scale3.xml
@@ -0,0 +1,62 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="64dp"
+ android:viewportHeight="200"
+ android:viewportWidth="200"
+ android:width="64dp" >
+
+ <group>
+ <path
+ android:name="background1"
+ android:fillColor="#FF000000"
+ android:pathData="M 0,0 l 100,0 l 0, 100 l -100, 0 z" />
+ <path
+ android:name="background2"
+ android:fillColor="#FF000000"
+ android:pathData="M 100,100 l 100,0 l 0, 100 l -100, 0 z" />
+ </group>
+ <group
+ android:pivotX="0"
+ android:pivotY="0"
+ android:rotation="45" >
+ <group
+ android:pivotX="0"
+ android:pivotY="0"
+ android:rotation="90" >
+ <group
+ android:scaleX="1.5"
+ android:scaleY="1" >
+ <group
+ android:pivotX="0"
+ android:pivotY="0"
+ android:rotation="-90" >
+ <group
+ android:scaleX="1.5"
+ android:scaleY="1" >
+ <path
+ android:name="twoLines"
+ android:fillColor="#FFFF0000"
+ android:pathData="M 100, 0 l 0, 100, -100, 0 z"
+ android:strokeColor="#FF00FF00"
+ android:strokeWidth="10" />
+ </group>
+ </group>
+ </group>
+ </group>
+ </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_test01.xml b/graphics/drawable/teststatic/res/drawable/vector_test01.xml
new file mode 100644
index 0000000..8b891d6
--- /dev/null
+++ b/graphics/drawable/teststatic/res/drawable/vector_test01.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="128dp"
+ android:width="128dp"
+ android:viewportHeight="512"
+ android:viewportWidth="512" >
+
+ <group>
+ <path
+ android:name="002b"
+ android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0t-200,299"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="4"
+ android:fillColor="#00000000" />
+ </group>
+
+</vector>
\ No newline at end of file
diff --git a/graphics/drawable/teststatic/res/drawable/vector_test02.xml b/graphics/drawable/teststatic/res/drawable/vector_test02.xml
new file mode 100644
index 0000000..e0af323
--- /dev/null
+++ b/graphics/drawable/teststatic/res/drawable/vector_test02.xml
@@ -0,0 +1,31 @@
+<!--
+ Copyright (C) 2015 The Android Open Source Project
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at"+
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:height="128dp"
+ android:width="128dp"
+ android:viewportHeight="512"
+ android:viewportWidth="512" >
+
+ <group>
+ <path
+ android:name="002b"
+ android:pathData="M100,200c0,-100 150,-100 150,0s150,100 150,0T-200,299"
+ android:strokeColor="#FF0000FF"
+ android:strokeWidth="4"
+ android:fillColor="#00000000" />
+ </group>
+
+</vector>
\ No newline at end of file
diff --git a/v17/leanback/res/animator/lb_guidedactions_item_checked.xml b/graphics/drawable/teststatic/res/values/colors.xml
similarity index 60%
copy from v17/leanback/res/animator/lb_guidedactions_item_checked.xml
copy to graphics/drawable/teststatic/res/values/colors.xml
index 463b9f7..6eb3036 100644
--- a/v17/leanback/res/animator/lb_guidedactions_item_checked.xml
+++ b/graphics/drawable/teststatic/res/values/colors.xml
@@ -1,6 +1,4 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 The Android Open Source Project
+<!-- Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,9 +12,9 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="@integer/lb_guidedactions_item_animation_duration"
- android:propertyName="alpha"
- android:valueFrom="0.0"
- android:valueTo="1.0"
- android:valueType="floatType" />
+<resources>
+ <color name="color0">#a6e4ea</color>
+ <color name="color1">#ff3838</color>
+ <color name="color2">#ffff51</color>
+ <color name="color3">#0ed300</color>
+</resources>
diff --git a/graphics/drawable/teststatic/res/values/strings.xml b/graphics/drawable/teststatic/res/values/strings.xml
index c5451c88..065e7d9 100644
--- a/graphics/drawable/teststatic/res/values/strings.xml
+++ b/graphics/drawable/teststatic/res/values/strings.xml
@@ -25,4 +25,5 @@
<string name="round_box">"m2.10001,-6c-1.9551,0 -0.5,0.02499 -2.10001,0.02499c-1.575,0 0.0031,-0.02499 -1.95,-0.02499c-2.543,0 -4,2.2816 -4,4.85001c0,3.52929 0.25,6.25 5.95,6.25c5.7,0 6,-2.72071 6,-6.25c0,-2.56841 -1.35699,-4.85001 -3.89999,-4.85001"</string>
<string name="heart"> "m4.5,-7c-1.95509,0 -3.83009,1.26759 -4.5,3c-0.66991,-1.73241 -2.54691,-3 -4.5,-3c-2.543,0 -4.5,1.93159 -4.5,4.5c0,3.5293 3.793,6.2578 9,11.5c5.207,-5.2422 9,-7.9707 9,-11.5c0,-2.56841 -1.957,-4.5 -4.5,-4.5"</string>
<string name="rectangle200">"M 0,0 l 200,0 l 0, 200 l -200, 0 z"</string>
-</resources>
\ No newline at end of file
+ <string name="triangle100">"M 100, 0 l 0, 100, -100, 0 z"</string>
+</resources>
diff --git a/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java b/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java
index 8bb766e5..c92ff47 100644
--- a/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java
+++ b/graphics/drawable/teststatic/src/android/support/test/vectordrawable/TestActivity.java
@@ -34,6 +34,10 @@
private static final String LOGCAT = "VectorDrawable1";
protected int[] icon = {
+ R.drawable.vector_drawable_scale0,
+ R.drawable.vector_drawable_scale1,
+ R.drawable.vector_drawable_scale2,
+ R.drawable.vector_drawable_scale3,
R.drawable.vector_drawable01,
R.drawable.vector_drawable02,
R.drawable.vector_drawable03,
@@ -64,6 +68,8 @@
R.drawable.vector_drawable28,
R.drawable.vector_drawable29,
R.drawable.vector_drawable30,
+ R.drawable.vector_test01,
+ R.drawable.vector_test02
};
private static final int EXTRA_TESTS = 2;
@@ -85,8 +91,10 @@
time = android.os.SystemClock.currentThreadTimeMillis()-time;
// Testing Tint on one particular case.
- d[3].setTint(0x8000FF00);
- d[3].setTintMode(Mode.MULTIPLY);
+ if (d.length > 3) {
+ d[3].setTint(0x8000FF00);
+ d[3].setTintMode(Mode.MULTIPLY);
+ }
// Testing Constant State like operation by creating the first 2 icons
// from the 3rd one's constant state.
diff --git a/graphics/drawable/util/src/android/support/graphics/drawable/AndroidResources.java b/graphics/drawable/util/src/android/support/graphics/drawable/AndroidResources.java
new file mode 100644
index 0000000..e6b2e14
--- /dev/null
+++ b/graphics/drawable/util/src/android/support/graphics/drawable/AndroidResources.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package android.support.graphics.drawable;
+
+public class AndroidResources {
+
+ // Resources ID generated in the latest R.java for framework.
+ static final int[] styleable_VectorDrawableTypeArray = {
+ android.R.attr.name, android.R.attr.tint, android.R.attr.height,
+ android.R.attr.width, android.R.attr.alpha, android.R.attr.autoMirrored,
+ android.R.attr.mode, android.R.attr.viewportWidth, android.R.attr.viewportHeight
+ };
+ static final int styleable_VectorDrawable_alpha = 4;
+ static final int styleable_VectorDrawable_autoMirrored = 5;
+ static final int styleable_VectorDrawable_height = 2;
+ static final int styleable_VectorDrawable_name = 0;
+ static final int styleable_VectorDrawable_tint = 1;
+ static final int styleable_VectorDrawable_Mode = 6;
+ static final int styleable_VectorDrawable_viewportHeight = 8;
+ static final int styleable_VectorDrawable_viewportWidth = 7;
+ static final int styleable_VectorDrawable_width = 3;
+ static final int[] styleable_VectorDrawableGroup = {
+ android.R.attr.name, android.R.attr.pivotX, android.R.attr.pivotY,
+ android.R.attr.scaleX, android.R.attr.scaleY, android.R.attr.rotation,
+ android.R.attr.translateX, android.R.attr.translateY
+ };
+ static final int styleable_VectorDrawableGroup_name = 0;
+ static final int styleable_VectorDrawableGroup_pivotX = 1;
+ static final int styleable_VectorDrawableGroup_pivotY = 2;
+ static final int styleable_VectorDrawableGroup_rotation = 5;
+ static final int styleable_VectorDrawableGroup_scaleX = 3;
+ static final int styleable_VectorDrawableGroup_scaleY = 4;
+ static final int styleable_VectorDrawableGroup_translateX = 6;
+ static final int styleable_VectorDrawableGroup_translateY = 7;
+ static final int[] styleable_VectorDrawablePath = {
+ android.R.attr.name, android.R.attr.fillColor, android.R.attr.pathData,
+ android.R.attr.strokeColor, android.R.attr.strokeWidth, android.R.attr.trimPathStart,
+ android.R.attr.trimPathEnd, android.R.attr.trimPathOffset, android.R.attr.strokeLineCap,
+ android.R.attr.strokeLineJoin, android.R.attr.strokeMiterLimit,
+ android.R.attr.strokeAlpha, android.R.attr.fillAlpha
+ };
+ static final int styleable_VectorDrawablePath_fillAlpha = 12;
+ static final int styleable_VectorDrawablePath_fillColor = 1;
+ static final int styleable_VectorDrawablePath_name = 0;
+ static final int styleable_VectorDrawablePath_pathData = 2;
+ static final int styleable_VectorDrawablePath_strokeAlpha = 11;
+ static final int styleable_VectorDrawablePath_strokeColor = 3;
+ static final int styleable_VectorDrawablePath_strokeLineCap = 8;
+ static final int styleable_VectorDrawablePath_strokeLineJoin = 9;
+ static final int styleable_VectorDrawablePath_strokeMiterLimit = 10;
+ static final int styleable_VectorDrawablePath_strokeWidth = 4;
+ static final int styleable_VectorDrawablePath_trimPathEnd = 6;
+ static final int styleable_VectorDrawablePath_trimPathOffset = 7;
+ static final int styleable_VectorDrawablePath_trimPathStart = 5;
+ static final int[] styleable_VectorDrawableClipPath = {
+ android.R.attr.name, android.R.attr.pathData
+ };
+ static final int styleable_VectorDrawableClipPath_name = 0;
+ static final int styleable_VectorDrawableClipPath_pathData = 1;
+
+ static final int[] styleable_AnimatedVectorDrawable = {
+ android.R.attr.drawable
+ };
+ static final int styleable_AnimatedVectorDrawable_drawable = 0;
+ static final int[] styleable_AnimatedVectorDrawableTarget = {
+ android.R.attr.name, android.R.attr.animation
+ };
+ static final int styleable_AnimatedVectorDrawableTarget_animation = 1;
+ static final int styleable_AnimatedVectorDrawableTarget_name = 0;
+}
diff --git a/graphics/drawable/util/src/android/support/graphics/drawable/TypedArrayUtils.java b/graphics/drawable/util/src/android/support/graphics/drawable/TypedArrayUtils.java
new file mode 100644
index 0000000..161eae6
--- /dev/null
+++ b/graphics/drawable/util/src/android/support/graphics/drawable/TypedArrayUtils.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package android.support.graphics.drawable;
+
+import android.content.res.TypedArray;
+import org.xmlpull.v1.XmlPullParser;
+
+
+public class TypedArrayUtils {
+ private static final String NAMESPACE = "http://schemas.android.com/apk/res/android";
+
+ public static boolean hasAttribute(XmlPullParser parser, String attrName) {
+ return parser.getAttributeValue(NAMESPACE, attrName) != null;
+ }
+
+ public static float getNamedFloat(TypedArray a, XmlPullParser parser, String attrName,
+ int resId, float defaultValue) {
+ final boolean hasAttr = hasAttribute(parser, attrName);
+ if (!hasAttr) {
+ return defaultValue;
+ } else {
+ return a.getFloat(resId, defaultValue);
+ }
+ }
+
+ public static boolean getNamedBoolean(TypedArray a, XmlPullParser parser, String attrName,
+ int resId, boolean defaultValue) {
+ final boolean hasAttr = hasAttribute(parser, attrName);
+ if (!hasAttr) {
+ return defaultValue;
+ } else {
+ return a.getBoolean(resId, defaultValue);
+ }
+ }
+
+ public static int getNamedInt(TypedArray a, XmlPullParser parser, String attrName,
+ int resId, int defaultValue) {
+ final boolean hasAttr = hasAttribute(parser, attrName);
+ if (!hasAttr) {
+ return defaultValue;
+ } else {
+ return a.getInt(resId, defaultValue);
+ }
+ }
+
+ public static int getNamedColor(TypedArray a, XmlPullParser parser, String attrName,
+ int resId, int defaultValue) {
+ final boolean hasAttr = hasAttribute(parser, attrName);
+ if (!hasAttr) {
+ return defaultValue;
+ } else {
+ return a.getColor(resId, defaultValue);
+ }
+ }
+}
diff --git a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
index 9558d01..b9fc935 100644
--- a/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
+++ b/v14/preference/src/android/support/v14/preference/PreferenceFragment.java
@@ -63,7 +63,7 @@
* hierarchy. Furthermore, subsequent {@link PreferenceScreen} in the hierarchy
* denote a screen break--that is the preferences contained within subsequent
* {@link PreferenceScreen} should be shown on another screen. The preference
- * framework handles showing these other screens from the preference hierarchy.
+ * framework handles this by calling {@link #onNavigateToScreen(PreferenceScreen)}.
* <p>
* The preference hierarchy can be formed in multiple ways:
* <li> From an XML file specifying the hierarchy
diff --git a/v17/leanback/.classpath b/v17/leanback/.classpath
index 7bc01d9..f568681 100644
--- a/v17/leanback/.classpath
+++ b/v17/leanback/.classpath
@@ -1,9 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="src" path="src"/>
- <classpathentry kind="src" path="gen"/>
<classpathentry kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="src" path="api21"/>
+ <classpathentry kind="src" path="api23"/>
+ <classpathentry kind="src" path="jbmr2"/>
+ <classpathentry kind="src" path="common"/>
+ <classpathentry kind="src" path="kitkat"/>
+ <classpathentry kind="src" path="gen"/>
<classpathentry kind="output" path="bin/classes"/>
</classpath>
diff --git a/v17/leanback/api/current.txt b/v17/leanback/api/current.txt
index c81549d..a4decd8 100644
--- a/v17/leanback/api/current.txt
+++ b/v17/leanback/api/current.txt
@@ -207,45 +207,51 @@
method public static int addAsRoot(android.app.Activity, android.support.v17.leanback.app.GuidedStepFragment, int);
method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
method public int findActionPositionById(long);
+ method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
+ method public int findButtonActionPositionById(long);
method public void finishGuidedStepFragments();
method public java.lang.String generateStackEntryName();
method public static java.lang.String generateStackEntryName(int, java.lang.Class);
method public android.view.View getActionItemView(int);
method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
- method protected int getContainerIdForBackground();
+ method public android.view.View getButtonActionItemView(int);
+ method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
method public static android.support.v17.leanback.app.GuidedStepFragment getCurrentGuidedStepFragment(android.app.FragmentManager);
method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+ method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
method public static java.lang.String getGuidedStepFragmentClassName(java.lang.String);
method public int getSelectedActionPosition();
+ method public int getSelectedButtonActionPosition();
method public int getUiStyle();
method public static boolean isUiStyleDefault(java.lang.String);
method public static boolean isUiStyleEntrance(java.lang.String);
method public void notifyActionChanged(int);
+ method public void notifyButtonActionChanged(int);
+ method protected void onAddSharedElementTransition(android.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepFragment);
method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+ method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+ method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+ method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
- method protected android.app.Fragment onProvideBackgroundFragment();
method protected void onProvideFragmentTransitions();
method public int onProvideTheme();
method public void popBackStackToGuidedStepFragment(java.lang.Class, int);
method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+ method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
method public void setSelectedActionPosition(int);
+ method public void setSelectedButtonActionPosition(int);
method public void setUiStyle(int);
field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
- field public static final int UI_STYLE_DEFAULT = 0; // 0x0
field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
- }
-
- public static class GuidedStepFragment.GuidedStepBackgroundFragment extends android.app.Fragment {
- ctor public GuidedStepFragment.GuidedStepBackgroundFragment();
- method protected void onProvideFragmentTransitions();
+ field public static final int UI_STYLE_REPLACE = 0; // 0x0
}
public class GuidedStepSupportFragment extends android.support.v4.app.Fragment {
@@ -255,45 +261,51 @@
method public static int addAsRoot(android.support.v4.app.FragmentActivity, android.support.v17.leanback.app.GuidedStepSupportFragment, int);
method public android.support.v17.leanback.widget.GuidedAction findActionById(long);
method public int findActionPositionById(long);
+ method public android.support.v17.leanback.widget.GuidedAction findButtonActionById(long);
+ method public int findButtonActionPositionById(long);
method public void finishGuidedStepSupportFragments();
method public java.lang.String generateStackEntryName();
method public static java.lang.String generateStackEntryName(int, java.lang.Class);
method public android.view.View getActionItemView(int);
method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getActions();
- method protected int getContainerIdForBackground();
+ method public android.view.View getButtonActionItemView(int);
+ method public java.util.List<android.support.v17.leanback.widget.GuidedAction> getButtonActions();
method public static android.support.v17.leanback.app.GuidedStepSupportFragment getCurrentGuidedStepSupportFragment(android.support.v4.app.FragmentManager);
method public android.support.v17.leanback.widget.GuidanceStylist getGuidanceStylist();
method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedActionsStylist();
+ method public android.support.v17.leanback.widget.GuidedActionsStylist getGuidedButtonActionsStylist();
method public static java.lang.String getGuidedStepSupportFragmentClassName(java.lang.String);
method public int getSelectedActionPosition();
+ method public int getSelectedButtonActionPosition();
method public int getUiStyle();
method public static boolean isUiStyleDefault(java.lang.String);
method public static boolean isUiStyleEntrance(java.lang.String);
method public void notifyActionChanged(int);
+ method public void notifyButtonActionChanged(int);
+ method protected void onAddSharedElementTransition(android.support.v4.app.FragmentTransaction, android.support.v17.leanback.app.GuidedStepSupportFragment);
method public void onCreateActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateActionsStylist();
+ method public android.view.View onCreateBackgroundView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle);
+ method public void onCreateButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>, android.os.Bundle);
+ method public android.support.v17.leanback.widget.GuidedActionsStylist onCreateButtonActionsStylist();
method public android.support.v17.leanback.widget.GuidanceStylist.Guidance onCreateGuidance(android.os.Bundle);
method public android.support.v17.leanback.widget.GuidanceStylist onCreateGuidanceStylist();
method public void onGuidedActionClicked(android.support.v17.leanback.widget.GuidedAction);
method public void onGuidedActionEdited(android.support.v17.leanback.widget.GuidedAction);
method public long onGuidedActionEditedAndProceed(android.support.v17.leanback.widget.GuidedAction);
method public void onGuidedActionFocused(android.support.v17.leanback.widget.GuidedAction);
- method protected android.support.v4.app.Fragment onProvideBackgroundSupportFragment();
method protected void onProvideFragmentTransitions();
method public int onProvideTheme();
method public void popBackStackToGuidedStepSupportFragment(java.lang.Class, int);
method public void setActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
+ method public void setButtonActions(java.util.List<android.support.v17.leanback.widget.GuidedAction>);
method public void setSelectedActionPosition(int);
+ method public void setSelectedButtonActionPosition(int);
method public void setUiStyle(int);
field public static final java.lang.String EXTRA_UI_STYLE = "uiStyle";
field public static final int UI_STYLE_ACTIVITY_ROOT = 2; // 0x2
- field public static final int UI_STYLE_DEFAULT = 0; // 0x0
field public static final int UI_STYLE_ENTRANCE = 1; // 0x1
- }
-
- public static class GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment extends android.support.v4.app.Fragment {
- ctor public GuidedStepSupportFragment.GuidedStepBackgroundSupportFragment();
- method protected void onProvideFragmentTransitions();
+ field public static final int UI_STYLE_REPLACE = 0; // 0x0
}
public class HeadersFragment extends android.support.v17.leanback.app.BaseRowFragment {
@@ -966,6 +978,7 @@
method public android.widget.ImageView getIconView();
method public android.widget.TextView getTitleView();
method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.support.v17.leanback.widget.GuidanceStylist.Guidance);
+ method public void onDestroyView();
method public void onImeAppearing(java.util.List<android.animation.Animator>);
method public void onImeDisappearing(java.util.List<android.animation.Animator>);
method public int onProvideLayoutId();
@@ -980,6 +993,7 @@
}
public class GuidedAction extends android.support.v17.leanback.widget.Action {
+ ctor protected GuidedAction();
method public int getCheckSetId();
method public java.lang.CharSequence getDescription();
method public int getDescriptionEditInputType();
@@ -998,11 +1012,13 @@
method public boolean isEditTitleUsed();
method public boolean isEditable();
method public boolean isEnabled();
+ method public boolean isFocusable();
method public void setChecked(boolean);
method public void setDescription(java.lang.CharSequence);
method public void setEditDescription(java.lang.CharSequence);
method public void setEditTitle(java.lang.CharSequence);
method public void setEnabled(boolean);
+ method public void setFocusable(boolean);
method public void setTitle(java.lang.CharSequence);
field public static final long ACTION_ID_CANCEL = -5L; // 0xfffffffffffffffbL
field public static final long ACTION_ID_CONTINUE = -7L; // 0xfffffffffffffff9L
@@ -1012,13 +1028,15 @@
field public static final long ACTION_ID_NO = -9L; // 0xfffffffffffffff7L
field public static final long ACTION_ID_OK = -4L; // 0xfffffffffffffffcL
field public static final long ACTION_ID_YES = -8L; // 0xfffffffffffffff8L
+ field public static final int CHECKBOX_CHECK_SET_ID = -1; // 0xffffffff
field public static final int DEFAULT_CHECK_SET_ID = 1; // 0x1
field public static final int NO_CHECK_SET = 0; // 0x0
}
public static class GuidedAction.Builder {
ctor public GuidedAction.Builder();
- method public android.support.v17.leanback.widget.GuidedAction build();
+ method protected final void applyValues(android.support.v17.leanback.widget.GuidedAction);
+ method public final android.support.v17.leanback.widget.GuidedAction build();
method public android.support.v17.leanback.widget.GuidedAction.Builder checkSetId(int);
method public android.support.v17.leanback.widget.GuidedAction.Builder checked(boolean);
method public android.support.v17.leanback.widget.GuidedAction.Builder constructCancel(android.content.Context);
@@ -1036,6 +1054,7 @@
method public android.support.v17.leanback.widget.GuidedAction.Builder editTitle(java.lang.CharSequence);
method public android.support.v17.leanback.widget.GuidedAction.Builder editable(boolean);
method public android.support.v17.leanback.widget.GuidedAction.Builder enabled(boolean);
+ method public android.support.v17.leanback.widget.GuidedAction.Builder focusable(boolean);
method public android.support.v17.leanback.widget.GuidedAction.Builder hasNext(boolean);
method public android.support.v17.leanback.widget.GuidedAction.Builder icon(android.graphics.drawable.Drawable);
method public android.support.v17.leanback.widget.GuidedAction.Builder iconResourceId(int, android.content.Context);
@@ -1057,21 +1076,29 @@
public class GuidedActionsStylist implements android.support.v17.leanback.widget.FragmentAnimationProvider {
ctor public GuidedActionsStylist();
method public android.support.v17.leanback.widget.VerticalGridView getActionsGridView();
+ method public int getItemViewType(android.support.v17.leanback.widget.GuidedAction);
+ method public boolean isButtonActions();
method public void onAnimateItemChecked(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
method public void onAnimateItemFocused(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
method public void onAnimateItemPressed(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, boolean);
+ method public void onAnimateItemPressedCancelled(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder);
+ method public void onBindCheckMarkView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+ method public void onBindChevronView(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
method public void onBindViewHolder(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
method public android.view.View onCreateView(android.view.LayoutInflater, android.view.ViewGroup);
method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup);
+ method public android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder onCreateViewHolder(android.view.ViewGroup, int);
+ method public void onDestroyView();
method protected void onEditingModeChange(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
method public void onImeAppearing(java.util.List<android.animation.Animator>);
method public void onImeDisappearing(java.util.List<android.animation.Animator>);
method public int onProvideItemLayoutId();
+ method public int onProvideItemLayoutId(int);
method public int onProvideLayoutId();
+ method public void setAsButtonActions();
method public void setEditingMode(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction, boolean);
- field protected android.support.v17.leanback.widget.VerticalGridView mActionsGridView;
- field protected android.view.View mMainView;
- field protected android.view.View mSelectorView;
+ method protected void setupImeOptions(android.support.v17.leanback.widget.GuidedActionsStylist.ViewHolder, android.support.v17.leanback.widget.GuidedAction);
+ field public static final int VIEW_TYPE_DEFAULT = 0; // 0x0
}
public static class GuidedActionsStylist.ViewHolder {
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java b/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
index b19c6d7..1762c15 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/FadeAndShortSlide.java
@@ -150,6 +150,10 @@
if (endValues == null) {
return null;
}
+ if (sceneRoot == view) {
+ // workaround b/25375640, avoid run animation on sceneRoot
+ return null;
+ }
int[] position = (int[]) endValues.values.get(PROPNAME_SCREEN_POSITION);
int left = position[0];
float endX = view.getTranslationX();
@@ -168,6 +172,10 @@
if (startValues == null) {
return null;
}
+ if (sceneRoot == view) {
+ // workaround b/25375640, avoid run animation on sceneRoot
+ return null;
+ }
int[] position = (int[]) startValues.values.get(PROPNAME_SCREEN_POSITION);
int left = position[0];
float startX = view.getTranslationX();
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java b/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
index 45e4dd1..c5a33cb 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/TransitionHelperApi21.java
@@ -18,6 +18,7 @@
import android.content.Context;
import android.transition.ChangeTransform;
import android.transition.Transition;
+import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.animation.AnimationUtils;
@@ -35,6 +36,16 @@
fragment.setExitTransition((Transition)transition);
}
+ public static void setSharedElementEnterTransition(android.app.Fragment fragment,
+ Object transition) {
+ fragment.setSharedElementEnterTransition((Transition)transition);
+ }
+
+ public static void addSharedElement(android.app.FragmentTransaction ft,
+ View view, String transitionName) {
+ ft.addSharedElement(view, transitionName);
+ }
+
public static Object getSharedElementEnterTransition(Window window) {
return window.getSharedElementEnterTransition();
}
diff --git a/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java b/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
index c836e77..2cc35452 100644
--- a/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
+++ b/v17/leanback/api21/android/support/v17/leanback/transition/TranslationAnimationCreator.java
@@ -48,9 +48,10 @@
if (startX == endX) {
return null;
}
+ float y = view.getTranslationY();
Path path = new Path();
- path.moveTo(startX, 0);
- path.lineTo(endX, 0);
+ path.moveTo(startX, y);
+ path.lineTo(endX, y);
ObjectAnimator anim =
ObjectAnimator.ofFloat(view, View.TRANSLATION_X, View.TRANSLATION_Y, path);
diff --git a/v17/leanback/project.properties b/v17/leanback/project.properties
index 91d2b02..b2ef7dc 100644
--- a/v17/leanback/project.properties
+++ b/v17/leanback/project.properties
@@ -11,5 +11,5 @@
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
-target=android-19
+target=android-23
android.library=true
diff --git a/v17/leanback/res/animator/lb_guidedactions_item_unchecked.xml b/v17/leanback/res/animator/lb_guidedactions_item_unchecked.xml
deleted file mode 100644
index 86525c8..0000000
--- a/v17/leanback/res/animator/lb_guidedactions_item_unchecked.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="@integer/lb_guidedactions_item_animation_duration"
- android:propertyName="alpha"
- android:valueFrom="1.0"
- android:valueTo="0.0"
- android:valueType="floatType" />
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml b/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
index f829eb3..e5dafb0 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
+++ b/v17/leanback/res/animator/lb_guidedactions_selector_hide.xml
@@ -17,7 +17,6 @@
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="@integer/lb_guidedactions_animation_duration"
android:propertyName="alpha"
- android:valueFrom="1.0"
android:valueTo="0.0"
android:interpolator="@animator/lb_decelerator_2"
android:valueType="floatType" />
diff --git a/v17/leanback/res/animator/lb_guidedactions_selector_show.xml b/v17/leanback/res/animator/lb_guidedactions_selector_show.xml
index e8d69e5..fcfd9fa 100644
--- a/v17/leanback/res/animator/lb_guidedactions_selector_show.xml
+++ b/v17/leanback/res/animator/lb_guidedactions_selector_show.xml
@@ -20,7 +20,6 @@
<objectAnimator
android:duration="@integer/lb_guidedactions_animation_duration"
android:propertyName="alpha"
- android:valueFrom="0"
android:valueTo="1.0"
android:interpolator="@animator/lb_decelerator_2"
android:valueType="floatType" />
diff --git a/v17/leanback/res/drawable/lb_guidedactions_item_checkmark.xml b/v17/leanback/res/drawable/lb_guidedactions_item_checkmark.xml
deleted file mode 100644
index ec7903b..0000000
--- a/v17/leanback/res/drawable/lb_guidedactions_item_checkmark.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2015 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<shape xmlns:android="http://schemas.android.com/apk/res/android"
- android:shape="oval" >
-
- <size
- android:height="@dimen/lb_guidedactions_item_checkmark_diameter"
- android:width="@dimen/lb_guidedactions_item_checkmark_diameter" />
-
- <solid android:color="@color/lb_tv_white" />
-
-</shape>
diff --git a/v17/leanback/res/drawable/lb_headers_right_fading.xml b/v17/leanback/res/drawable/lb_headers_right_fading.xml
index 96794db..b20c4e8 100644
--- a/v17/leanback/res/drawable/lb_headers_right_fading.xml
+++ b/v17/leanback/res/drawable/lb_headers_right_fading.xml
@@ -20,6 +20,6 @@
<gradient
android:angle="0"
android:startColor="#00000000"
- android:endColor="@color/lb_default_brand_color"
+ android:endColor="?attr/defaultBrandColor"
/>
</shape>
diff --git a/v17/leanback/res/layout/lb_fullwidth_details_overview.xml b/v17/leanback/res/layout/lb_fullwidth_details_overview.xml
index 8dbb630..415bd82 100644
--- a/v17/leanback/res/layout/lb_fullwidth_details_overview.xml
+++ b/v17/leanback/res/layout/lb_fullwidth_details_overview.xml
@@ -34,7 +34,7 @@
android:layout_height="@dimen/lb_details_v2_card_height"
android:layout_marginTop="@dimen/lb_details_v2_blank_height"
android:clipToPadding="false"
- android:foreground="#ffffff"
+ android:background="?attr/defaultBrandColor"
android:elevation="@dimen/lb_details_overview_z"
>
@@ -48,6 +48,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/details_overview_actions_background"
+ android:background="?attr/defaultBrandColorDark"
android:orientation="vertical" >
<android.support.v17.leanback.widget.HorizontalGridView
diff --git a/v17/leanback/res/layout/lb_guidedactions.xml b/v17/leanback/res/layout/lb_guidedactions.xml
index f1a4d2a..f2926d3 100644
--- a/v17/leanback/res/layout/lb_guidedactions.xml
+++ b/v17/leanback/res/layout/lb_guidedactions.xml
@@ -16,22 +16,36 @@
-->
<!-- Layout for the settings list fragment -->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
+ android:id="@+id/guidedactions_root"
+ android:transitionName="guidedactions_root"
+ android:transitionGroup="false"
+ android:layout_width="0dp"
+ android:layout_weight="1"
android:layout_height="match_parent">
- <android.support.v17.leanback.widget.NonOverlappingRelativeLayout
- android:id="@+id/guidedactions_background"
- android:transitionGroup="true"
- style="?attr/guidedActionsContainerStyle" />
+ <android.support.v17.leanback.widget.NonOverlappingView
+ android:id="@+id/guidedactions_list_background"
+ android:transitionName="guidedactions_list_background"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:visibility="gone"
+ android:background="?attr/guidedActionsBackgroundDark" />
<android.support.v17.leanback.widget.NonOverlappingFrameLayout
- android:id="@+id/guidedactions_selector"
- android:transitionGroup="true"
- style="?attr/guidedActionsSelectorStyle" />
+ android:id="@+id/guidedactions_content"
+ android:transitionName="guidedactions_content"
+ android:transitionGroup="false"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+ <android.support.v17.leanback.widget.VerticalGridView
+ android:transitionGroup="true"
+ android:id="@+id/guidedactions_list"
+ style="?attr/guidedActionsListStyle" />
- <android.support.v17.leanback.widget.VerticalGridView
- android:transitionGroup="true"
- android:id="@+id/guidedactions_list"
- style="?attr/guidedActionsListStyle" />
+ <android.support.v17.leanback.widget.NonOverlappingView
+ android:id="@+id/guidedactions_selector"
+ android:transitionName="guidedactions_selector"
+ style="?attr/guidedActionsSelectorStyle" />
+ </android.support.v17.leanback.widget.NonOverlappingFrameLayout>
</RelativeLayout>
diff --git a/v17/leanback/res/layout/lb_guidedactions_item.xml b/v17/leanback/res/layout/lb_guidedactions_item.xml
index 8f5fcb7..831c355 100644
--- a/v17/leanback/res/layout/lb_guidedactions_item.xml
+++ b/v17/leanback/res/layout/lb_guidedactions_item.xml
@@ -20,7 +20,7 @@
xmlns:tools="http://schemas.android.com/tools"
style="?attr/guidedActionItemContainerStyle" >
- <ImageView
+ <android.support.v17.leanback.widget.CheckableImageView
android:id="@+id/guidedactions_item_checkmark"
style="?attr/guidedActionItemCheckmarkStyle"
tools:ignore="ContentDescription" />
diff --git a/v17/leanback/res/layout/lb_guidedstep_background.xml b/v17/leanback/res/layout/lb_guidedstep_background.xml
index 66b68c4..08ea47d 100644
--- a/v17/leanback/res/layout/lb_guidedstep_background.xml
+++ b/v17/leanback/res/layout/lb_guidedstep_background.xml
@@ -17,6 +17,7 @@
<android.support.v17.leanback.widget.NonOverlappingView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/guidedstep_background"
+ android:transitionName="guidedstep_background"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="?attr/guidedStepBackground" />
diff --git a/v17/leanback/res/layout/lb_guidedstep_fragment.xml b/v17/leanback/res/layout/lb_guidedstep_fragment.xml
index 15b3081..a41d47d 100644
--- a/v17/leanback/res/layout/lb_guidedstep_fragment.xml
+++ b/v17/leanback/res/layout/lb_guidedstep_fragment.xml
@@ -15,25 +15,57 @@
limitations under the License.
-->
<!-- Layout for the frame of a 2 pane actions fragment. -->
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/content_frame"
+<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@+id/guidedstep_root"
+ android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent" >
-
- <android.support.v17.leanback.widget.NonOverlappingFrameLayout
- android:id="@+id/content_fragment"
- android:layout_width="@dimen/lb_guidedstep_guidance_section_width"
- android:layout_height="match_parent"
- android:layout_alignParentStart="true" />
-
- <FrameLayout
- android:id="@+id/action_fragment"
- android:layout_toEndOf="@+id/content_fragment"
- android:clipToPadding="false"
- android:clipChildren="false"
- android:paddingLeft="@dimen/lb_guidedactions_section_shadow_width"
+ <LinearLayout
+ android:id="@+id/content_frame"
+ android:orientation="horizontal"
android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_alignParentEnd="true" />
+ android:layout_height="match_parent" >
-</RelativeLayout>
\ No newline at end of file
+ <android.support.v17.leanback.widget.NonOverlappingFrameLayout
+ android:id="@+id/content_fragment"
+ android:layout_toStartOf="@+id/action_fragment"
+ android:layout_width="0dp"
+ android:layout_weight="1"
+ android:layout_height="match_parent"
+ android:layout_alignParentStart="true" />
+
+ <android.support.v17.leanback.widget.NonOverlappingFrameLayout
+ android:id="@+id/action_fragment_root"
+ android:transitionName="action_fragment_root"
+ android:transitionGroup="false"
+ android:orientation="horizontal"
+ android:clipToPadding="false"
+ android:clipChildren="false"
+ android:paddingStart="@dimen/lb_guidedactions_section_shadow_width"
+ android:layout_width="0dp"
+ android:layout_weight="?attr/guidedActionContentWidthWeight"
+ android:layout_height="match_parent"
+ android:layout_alignParentEnd="true">
+
+ <android.support.v17.leanback.widget.NonOverlappingView
+ android:id="@+id/action_fragment_background"
+ android:transitionName="action_fragment_background"
+ android:orientation="horizontal"
+ android:outlineProvider="paddedBounds"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="?attr/guidedActionsBackground"
+ android:elevation="?attr/guidedActionsElevation" />
+
+ <android.support.v17.leanback.widget.NonOverlappingLinearLayout
+ android:id="@+id/action_fragment"
+ android:transitionName="action_fragment"
+ android:transitionGroup="false"
+ android:orientation="horizontal"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:elevation="?attr/guidedActionsElevation" />
+ </android.support.v17.leanback.widget.NonOverlappingFrameLayout>
+
+ </LinearLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/v17/leanback/res/transition-v21/lb_browse_entrance_transition.xml b/v17/leanback/res/transition-v21/lb_browse_entrance_transition.xml
index e26204b..9dd440b 100644
--- a/v17/leanback/res/transition-v21/lb_browse_entrance_transition.xml
+++ b/v17/leanback/res/transition-v21/lb_browse_entrance_transition.xml
@@ -23,6 +23,6 @@
<slide
android:duration="350"
android:interpolator="@android:interpolator/linear_out_slow_in"
- android:slideEdge="right">
+ android:slideEdge="@integer/slideEdgeEnd">
</slide>
</transitionSet>
\ No newline at end of file
diff --git a/v17/leanback/res/transition-v21/lb_browse_return_transition.xml b/v17/leanback/res/transition-v21/lb_browse_return_transition.xml
index 84ae993..6d341b5 100644
--- a/v17/leanback/res/transition-v21/lb_browse_return_transition.xml
+++ b/v17/leanback/res/transition-v21/lb_browse_return_transition.xml
@@ -18,7 +18,7 @@
<slide
android:interpolator="@android:interpolator/fast_out_linear_in"
android:duration="350"
- android:slideEdge="left">
+ android:slideEdge="@integer/slideEdgeStart">
<targets>
<target android:targetId="@id/browse_headers_root" />
<target android:targetId="@id/title_orb" />
@@ -27,7 +27,7 @@
<slide
android:interpolator="@android:interpolator/fast_out_linear_in"
android:duration="350"
- android:slideEdge="right">
+ android:slideEdge="@integer/slideEdgeEnd">
<targets>
<target android:excludeId="@+id/browse_headers_root" />
<target android:excludeId="@+id/title_orb" />
diff --git a/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml b/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
index d2d7afa..5ee74ee 100644
--- a/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
+++ b/v17/leanback/res/transition-v21/lb_guidedstep_activity_enter.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
- Copyright (C) 2014 The Android Open Source Project
+ Copyright (C) 2015 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -16,10 +16,17 @@
-->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" >
+ <fade
+ android:interpolator="@android:interpolator/fast_out_linear_in"
+ android:duration="@integer/lb_guidedstep_activity_background_fade_duration_ms">
+ <targets>
+ <target android:targetId="@id/guidedstep_background" />
+ </targets>
+ </fade>
<slide
android:interpolator="@android:interpolator/fast_out_linear_in"
android:duration="350"
- android:slideEdge="left">
+ android:slideEdge="@integer/slideEdgeStart">
<targets>
<target android:targetId="@id/guidance_icon" />
<target android:targetId="@id/guidance_title" />
@@ -30,11 +37,17 @@
<slide
android:interpolator="@android:interpolator/fast_out_linear_in"
android:duration="350"
- android:slideEdge="right">
+ android:slideEdge="@integer/slideEdgeEnd">
<targets>
- <target android:targetId="@id/guidedactions_background" />
- <target android:targetId="@id/guidedactions_selector" />
+ <target android:targetId="@id/action_fragment_background" />
+ <target android:targetId="@id/guidedactions_list_background" />
+ <target android:targetId="@id/guidedactions_content" />
<target android:targetId="@id/guidedactions_list" />
+ <target android:targetId="@id/guidedactions_selector" />
+ <target android:targetId="@id/guidedactions_list_background2" />
+ <target android:targetId="@id/guidedactions_content2" />
+ <target android:targetId="@id/guidedactions_list2" />
+ <target android:targetId="@id/guidedactions_selector2" />
</targets>
</slide>
</transitionSet>
\ No newline at end of file
diff --git a/v17/leanback/res/transition-v22/lb_browse_entrance_transition.xml b/v17/leanback/res/transition-v22/lb_browse_entrance_transition.xml
deleted file mode 100644
index 2068c64..0000000
--- a/v17/leanback/res/transition-v22/lb_browse_entrance_transition.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" >
- <changeBounds
- android:duration="350"
- android:interpolator="@android:interpolator/linear_out_slow_in">
- </changeBounds>
- <slide
- android:duration="350"
- android:interpolator="@android:interpolator/linear_out_slow_in"
- android:slideEdge="end">
- </slide>
-</transitionSet>
\ No newline at end of file
diff --git a/v17/leanback/res/transition-v22/lb_browse_return_transition.xml b/v17/leanback/res/transition-v22/lb_browse_return_transition.xml
deleted file mode 100644
index e8dbee0..0000000
--- a/v17/leanback/res/transition-v22/lb_browse_return_transition.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
- Copyright (C) 2014 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-<transitionSet xmlns:android="http://schemas.android.com/apk/res/android" >
- <slide
- android:interpolator="@android:interpolator/fast_out_linear_in"
- android:duration="350"
- android:slideEdge="start">
- <targets>
- <target android:targetId="@id/browse_headers_root" />
- <target android:targetId="@id/title_orb" />
- </targets>
- </slide>
- <slide
- android:interpolator="@android:interpolator/fast_out_linear_in"
- android:duration="350"
- android:slideEdge="end">
- <targets>
- <target android:excludeId="@+id/browse_headers_root" />
- <target android:excludeId="@+id/title_orb" />
- </targets>
- </slide>
- <fade
- android:interpolator="@android:interpolator/fast_out_linear_in"
- android:duration="350">
- <targets>
- <target android:excludeId="@+id/browse_headers_root" />
- </targets>
- </fade>
-</transitionSet>
\ No newline at end of file
diff --git a/v17/leanback/res/values-af/strings.xml b/v17/leanback/res/values-af/strings.xml
index 0310403..c7109bb 100644
--- a/v17/leanback/res/values-af/strings.xml
+++ b/v17/leanback/res/values-af/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiveer hoë gehalte"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktiveer onderskrifte"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiveer onderskrifte"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooi"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Gaan voort"</string>
</resources>
diff --git a/v17/leanback/res/values-am/strings.xml b/v17/leanback/res/values-am/strings.xml
index 77d2993..d5bf0f5 100644
--- a/v17/leanback/res/values-am/strings.xml
+++ b/v17/leanback/res/values-am/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ከፍተኛ ጥራትን አሰናክል"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ዝግ የምስል ስር ጽሑፍ አጻጻፍን አንቃ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ዝግ የምስል ስር ጽሑፍ አጻጻፍን አሰናክል"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ጨርስ"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ቀጥል"</string>
</resources>
diff --git a/v17/leanback/res/values-ar/strings.xml b/v17/leanback/res/values-ar/strings.xml
index c52be7f..31f4d1a 100644
--- a/v17/leanback/res/values-ar/strings.xml
+++ b/v17/leanback/res/values-ar/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"تعطيل الجودة العالية"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"تمكين الترجمة المصاحبة"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"تعطيل الترجمة المصاحبة"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"إنهاء"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"متابعة"</string>
</resources>
diff --git a/v17/leanback/res/values-bg/strings.xml b/v17/leanback/res/values-bg/strings.xml
index 6b16775..de0b6f8 100644
--- a/v17/leanback/res/values-bg/strings.xml
+++ b/v17/leanback/res/values-bg/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Търсете"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Говорете, за да търсите"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Търсете в/ъв <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Говорете, за да търсите във: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Говорете, за да търсите в/ъв <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Пускане"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Деактивиране на високото качество"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Активиране на субтитрите"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Деактивиране на субтитрите"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Край"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Напред"</string>
</resources>
diff --git a/v17/leanback/res/values-bn-rBD/strings.xml b/v17/leanback/res/values-bn-rBD/strings.xml
index 04669bd..4f0526c 100644
--- a/v17/leanback/res/values-bn-rBD/strings.xml
+++ b/v17/leanback/res/values-bn-rBD/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"উচ্চ গুণমান অক্ষম করুন"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"সাবটাইটেল সক্ষম করুন"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"সাবটাইটেল অক্ষম করুন"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"শেষ করুন"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"চালিয়ে যান"</string>
</resources>
diff --git a/v17/leanback/res/values-ca/strings.xml b/v17/leanback/res/values-ca/strings.xml
index 6578f3b..187f5af 100644
--- a/v17/leanback/res/values-ca/strings.xml
+++ b/v17/leanback/res/values-ca/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Cerca."</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Parla per fer una cerca."</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Cerca a <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>."</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Parla per cercar a <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Parla per cercar a <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>."</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Reprodueix"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desactiva l\'alta qualitat"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activa els subtítols tancats"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desactiva els subtítols tancats"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalitza"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
</resources>
diff --git a/v17/leanback/res/values-cs/strings.xml b/v17/leanback/res/values-cs/strings.xml
index 8ffb4f3..1a608283 100644
--- a/v17/leanback/res/values-cs/strings.xml
+++ b/v17/leanback/res/values-cs/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Vyhledávání"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Vyhledávejte hlasem"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Hledat <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Vyhledávejte v kategorii „<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>“ hlasem"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Vyhledávejte v kategorii „<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>“ hlasem"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d×"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d×"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Přehrát"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Vypnout vysokou kvalitu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnout titulky"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnout titulky"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončit"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovat"</string>
</resources>
diff --git a/v17/leanback/res/values-da/strings.xml b/v17/leanback/res/values-da/strings.xml
index 87c507b..e3e0f9f 100644
--- a/v17/leanback/res/values-da/strings.xml
+++ b/v17/leanback/res/values-da/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Søg"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tal for at søge"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Søg efter <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Sig noget for at søge i <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Tal for at søge efter <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Afspil"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiver høj kvalitet"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivér undertekster"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiver undertekster"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Afslut"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsæt"</string>
</resources>
diff --git a/v17/leanback/res/values-de/strings.xml b/v17/leanback/res/values-de/strings.xml
index 9d018c6..d729f7c 100644
--- a/v17/leanback/res/values-de/strings.xml
+++ b/v17/leanback/res/values-de/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Suchen"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Zum Suchen sprechen"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"In <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> suchen"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Sprechen, um in \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\" zu suchen"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Zum Suchen in der Kategorie \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\" sprechen"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dx"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dx"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Wiedergabe"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hohe Qualität deaktivieren"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Untertitel aktivieren"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Untertitel deaktivieren"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fertigstellen"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Weiter"</string>
</resources>
diff --git a/v17/leanback/res/values-el/strings.xml b/v17/leanback/res/values-el/strings.xml
index 310b6a9..9b93dcf 100644
--- a/v17/leanback/res/values-el/strings.xml
+++ b/v17/leanback/res/values-el/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Αναζήτηση"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Μιλήστε για να κάνετε αναζήτηση"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Αναζήτηση <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Μιλήστε για αναζήτηση: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Μιλήστε για αναζήτηση <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Αναπαραγωγή"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Απενεργοποίηση Υψηλής ποιότητας"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ενεργοποίηση υποτίτλων"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Απενεργοποίηση υποτίτλων"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Τέλος"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Συνέχεια"</string>
</resources>
diff --git a/v17/leanback/res/values-en-rAU/strings.xml b/v17/leanback/res/values-en-rAU/strings.xml
index 0097135..ed22ccd 100644
--- a/v17/leanback/res/values-en-rAU/strings.xml
+++ b/v17/leanback/res/values-en-rAU/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disable High Quality"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Enable Closed Captioning"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disable Closed Captioning"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
</resources>
diff --git a/v17/leanback/res/values-en-rGB/strings.xml b/v17/leanback/res/values-en-rGB/strings.xml
index 0097135..ed22ccd 100644
--- a/v17/leanback/res/values-en-rGB/strings.xml
+++ b/v17/leanback/res/values-en-rGB/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disable High Quality"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Enable Closed Captioning"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disable Closed Captioning"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
</resources>
diff --git a/v17/leanback/res/values-en-rIN/strings.xml b/v17/leanback/res/values-en-rIN/strings.xml
index 0097135..ed22ccd 100644
--- a/v17/leanback/res/values-en-rIN/strings.xml
+++ b/v17/leanback/res/values-en-rIN/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disable High Quality"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Enable Closed Captioning"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disable Closed Captioning"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finish"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continue"</string>
</resources>
diff --git a/v17/leanback/res/values-es-rUS/strings.xml b/v17/leanback/res/values-es-rUS/strings.xml
index 8341a4d..ab05f83 100644
--- a/v17/leanback/res/values-es-rUS/strings.xml
+++ b/v17/leanback/res/values-es-rUS/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Inhabilitar calidad alta"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Habilitar subtítulos"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Inhabilitar subtítulos"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
</resources>
diff --git a/v17/leanback/res/values-es/strings.xml b/v17/leanback/res/values-es/strings.xml
index 9f308c0..0cff1c9 100644
--- a/v17/leanback/res/values-es/strings.xml
+++ b/v17/leanback/res/values-es/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Buscar"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Habla para buscar"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Buscar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Habla para buscar en <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Habla para buscar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Reproducir"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Inhabilitar alta calidad"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Habilitar subtítulos"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Inhabilitar subtítulos"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
</resources>
diff --git a/v17/leanback/res/values-et-rEE/strings.xml b/v17/leanback/res/values-et-rEE/strings.xml
index a97c385..32fff96 100644
--- a/v17/leanback/res/values-et-rEE/strings.xml
+++ b/v17/leanback/res/values-et-rEE/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Otsing"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Öelge otsimiseks"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Otsige teenusest <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Häälotsing: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Kõnelge teenusest <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> otsimiseks"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Esita"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Keela kõrgkvaliteetne taasesitus"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Luba subtiitrid"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Keela subtiitrid"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Lõpeta"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jätka"</string>
</resources>
diff --git a/v17/leanback/res/values-eu-rES/strings.xml b/v17/leanback/res/values-eu-rES/strings.xml
index c22f172..d9f9bf7 100644
--- a/v17/leanback/res/values-eu-rES/strings.xml
+++ b/v17/leanback/res/values-eu-rES/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desgaitu kalitate handiko erreprodukzioa"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Gaitu azpitituluak"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desgaitu azpitituluak"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Amaitu"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jarraitu"</string>
</resources>
diff --git a/v17/leanback/res/values-fa/strings.xml b/v17/leanback/res/values-fa/strings.xml
index 58e823f..bb615fc 100644
--- a/v17/leanback/res/values-fa/strings.xml
+++ b/v17/leanback/res/values-fa/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"غیرفعال کردن کیفیت بالا"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"فعال کردن زیرنویس"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"غیرفعال کردن زیرنویس"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"پایان"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ادامه"</string>
</resources>
diff --git a/v17/leanback/res/values-fi/strings.xml b/v17/leanback/res/values-fi/strings.xml
index 0c55e6f..9d38d3c 100644
--- a/v17/leanback/res/values-fi/strings.xml
+++ b/v17/leanback/res/values-fi/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Haku"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tee haku puhumalla"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Haku: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Hae <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> puhehaulla"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Puhehaku: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Toista"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Poista korkea laatu käytöstä"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ota tekstitys käyttöön"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Poista tekstitys käytöstä"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Valmis"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Jatka"</string>
</resources>
diff --git a/v17/leanback/res/values-fr-rCA/strings.xml b/v17/leanback/res/values-fr-rCA/strings.xml
index b28beae..bbd3eea 100644
--- a/v17/leanback/res/values-fr-rCA/strings.xml
+++ b/v17/leanback/res/values-fr-rCA/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Désactiver la lecture haute qualité"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activer le sous-titrage"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Désactiver le sous-titrage"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
</resources>
diff --git a/v17/leanback/res/values-fr/strings.xml b/v17/leanback/res/values-fr/strings.xml
index 914bf08..e9c051c 100644
--- a/v17/leanback/res/values-fr/strings.xml
+++ b/v17/leanback/res/values-fr/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Rechercher"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Énoncer la recherche"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Rechercher \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\""</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Énoncez votre recherche sur \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\""</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Énoncer la recherche \"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>\""</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Lecture"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Désactiver la haute qualité"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activer les sous-titres"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Désactiver les sous-titres"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Terminer"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuer"</string>
</resources>
diff --git a/v17/leanback/res/values-gl-rES/strings.xml b/v17/leanback/res/values-gl-rES/strings.xml
index 62b3a2b..717b994 100644
--- a/v17/leanback/res/values-gl-rES/strings.xml
+++ b/v17/leanback/res/values-gl-rES/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desactivar alta calidade"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activar subtítulos"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desactivar subtítulos"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizar"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
</resources>
diff --git a/v17/leanback/res/values-hi/strings.xml b/v17/leanback/res/values-hi/strings.xml
index c243c17..a926396 100644
--- a/v17/leanback/res/values-hi/strings.xml
+++ b/v17/leanback/res/values-hi/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणवत्ता अक्षम करें"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षक सक्षम करें"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"उपशीर्षक अक्षम करें"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त करें"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी रखें"</string>
</resources>
diff --git a/v17/leanback/res/values-hr/strings.xml b/v17/leanback/res/values-hr/strings.xml
index bb6ebcc..166369f 100644
--- a/v17/leanback/res/values-hr/strings.xml
+++ b/v17/leanback/res/values-hr/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Pretražite"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite upit za pretraživanje"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tražite <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite upit da pretražite <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite upit za pretraživanje <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduciraj"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Onemogući visoku kvalitetu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Omogući titlove"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Onemogući titlove"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Završi"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Nastavi"</string>
</resources>
diff --git a/v17/leanback/res/values-hu/strings.xml b/v17/leanback/res/values-hu/strings.xml
index cfeb2ad..427f1cd 100644
--- a/v17/leanback/res/values-hu/strings.xml
+++ b/v17/leanback/res/values-hu/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Jó minőségű lejátszás letiltása"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Feliratok engedélyezése"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Feliratok letiltása"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Befejezés"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Folytatás"</string>
</resources>
diff --git a/v17/leanback/res/values-hy-rAM/strings.xml b/v17/leanback/res/values-hy-rAM/strings.xml
index 1ac5dd8..7e8112e 100644
--- a/v17/leanback/res/values-hy-rAM/strings.xml
+++ b/v17/leanback/res/values-hy-rAM/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Անջատել բարձր որակը"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Միացնել խորագրերը"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Անջատել խորագրերը"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Վերջ"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Շարունակել"</string>
</resources>
diff --git a/v17/leanback/res/values-in/strings.xml b/v17/leanback/res/values-in/strings.xml
index 6569825..2dca7d3 100644
--- a/v17/leanback/res/values-in/strings.xml
+++ b/v17/leanback/res/values-in/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Nonaktifkan Kualitas Tinggi"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktifkan Pembuatan Teks"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Nonaktifkan Pembuatan Teks"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Lanjutkan"</string>
</resources>
diff --git a/v17/leanback/res/values-is-rIS/strings.xml b/v17/leanback/res/values-is-rIS/strings.xml
index 830b11e..c84a4c6 100644
--- a/v17/leanback/res/values-is-rIS/strings.xml
+++ b/v17/leanback/res/values-is-rIS/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Slökkva á miklum gæðum"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Kveikja á skjátextum"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Slökkva á skjátextum"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Ljúka"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Halda áfram"</string>
</resources>
diff --git a/v17/leanback/res/values-it/strings.xml b/v17/leanback/res/values-it/strings.xml
index 2f0ca47..1b58e0c 100644
--- a/v17/leanback/res/values-it/strings.xml
+++ b/v17/leanback/res/values-it/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Disattiva alta qualità"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Attiva sottotitoli"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Disattiva sottotitoli"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fine"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continua"</string>
</resources>
diff --git a/v17/leanback/res/values-iw/strings.xml b/v17/leanback/res/values-iw/strings.xml
index f2bda58..f102498 100644
--- a/v17/leanback/res/values-iw/strings.xml
+++ b/v17/leanback/res/values-iw/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"השבת איכות גבוהה"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"הפעל כתוביות"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"השבת כתוביות"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"סיום"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"המשך"</string>
</resources>
diff --git a/v17/leanback/res/values-ja/strings.xml b/v17/leanback/res/values-ja/strings.xml
index 09faa8b..802631c 100644
--- a/v17/leanback/res/values-ja/strings.xml
+++ b/v17/leanback/res/values-ja/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"高品質を無効にする"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"字幕を有効にする"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"字幕を無効にする"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完了"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"続行"</string>
</resources>
diff --git a/v17/leanback/res/values-ka-rGE/strings.xml b/v17/leanback/res/values-ka-rGE/strings.xml
index ac9f4cd..70aeada 100644
--- a/v17/leanback/res/values-ka-rGE/strings.xml
+++ b/v17/leanback/res/values-ka-rGE/strings.xml
@@ -50,6 +50,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"მაღალი ხარისხის გამორთვა"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"დახურული წარწერების ჩართვა"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"დახურული წარწერების გაუქმება"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"დასრულება"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"გაგრძელება"</string>
</resources>
diff --git a/v17/leanback/res/values-kk-rKZ/strings.xml b/v17/leanback/res/values-kk-rKZ/strings.xml
index 380695b..9ed6ce2 100644
--- a/v17/leanback/res/values-kk-rKZ/strings.xml
+++ b/v17/leanback/res/values-kk-rKZ/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Жоғары сапаны өшіру"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Жасырын титрлерді қосу"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Жасырын титрлерді өшіру"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Аяқтау"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Жалғастыру"</string>
</resources>
diff --git a/v17/leanback/res/values-km-rKH/strings.xml b/v17/leanback/res/values-km-rKH/strings.xml
index 60f90e5..7874af2 100644
--- a/v17/leanback/res/values-km-rKH/strings.xml
+++ b/v17/leanback/res/values-km-rKH/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"បិទគុណភាពខ្ពស់"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"បើកការដាក់ចំណងដែលបានបិទ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"បិទការដាក់ចំណងដែលបានបិទ"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"បញ្ចប់"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"បន្ត"</string>
</resources>
diff --git a/v17/leanback/res/values-kn-rIN/strings.xml b/v17/leanback/res/values-kn-rIN/strings.xml
index 18206ed..196b154 100644
--- a/v17/leanback/res/values-kn-rIN/strings.xml
+++ b/v17/leanback/res/values-kn-rIN/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ಹೆಚ್ಚು ಗುಣಮಟ್ಟವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ಮುಚ್ಚಿದ ಶೀರ್ಷಿಕೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ಪೂರ್ಣಗೊಳಿಸು"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ಮುಂದುವರಿಸು"</string>
</resources>
diff --git a/v17/leanback/res/values-ko/strings.xml b/v17/leanback/res/values-ko/strings.xml
index e262b1c..c244dbf 100644
--- a/v17/leanback/res/values-ko/strings.xml
+++ b/v17/leanback/res/values-ko/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"고화질 사용 중지"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"자막 사용 설정"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"자막 사용 중지"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"완료"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"계속"</string>
</resources>
diff --git a/v17/leanback/res/values-ky-rKG/strings.xml b/v17/leanback/res/values-ky-rKG/strings.xml
index 74cc841..4ddb284 100644
--- a/v17/leanback/res/values-ky-rKG/strings.xml
+++ b/v17/leanback/res/values-ky-rKG/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Жогорку сапатты өчүрүү"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Жабык субтитрлерди иштетүү"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Жабык субтитрлерди өчүрүү"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Бүтүрүү"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Улантуу"</string>
</resources>
diff --git a/v17/leanback/res/animator/lb_guidedactions_item_checked.xml b/v17/leanback/res/values-ldrtl/integers.xml
similarity index 70%
rename from v17/leanback/res/animator/lb_guidedactions_item_checked.xml
rename to v17/leanback/res/values-ldrtl/integers.xml
index 463b9f7..250523d 100644
--- a/v17/leanback/res/animator/lb_guidedactions_item_checked.xml
+++ b/v17/leanback/res/values-ldrtl/integers.xml
@@ -14,9 +14,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="@integer/lb_guidedactions_item_animation_duration"
- android:propertyName="alpha"
- android:valueFrom="0.0"
- android:valueTo="1.0"
- android:valueType="floatType" />
+<resources>
+
+ <!-- Gravity.RIGHT -->
+ <integer name="slideEdgeStart">5</integer>
+ <!-- Gravity.LEFT -->
+ <integer name="slideEdgeEnd">3</integer>
+
+</resources>
\ No newline at end of file
diff --git a/v17/leanback/res/values-lo-rLA/strings.xml b/v17/leanback/res/values-lo-rLA/strings.xml
index d919e93..35f519b 100644
--- a/v17/leanback/res/values-lo-rLA/strings.xml
+++ b/v17/leanback/res/values-lo-rLA/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ປິດນຳໃຊ້ການຫຼິ້ນດ້ວຍຄຸນນະພາບສູງ"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"ເປີດນຳໃຊ້ຄຳບັນຍາຍແບບປິດ"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ປິດນຳໃຊ້ຄຳບັນຍາຍແບບປິດ"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ສໍາເລັດ"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ສືບຕໍ່"</string>
</resources>
diff --git a/v17/leanback/res/values-lt/strings.xml b/v17/leanback/res/values-lt/strings.xml
index 415fc25..6ca2bab 100644
--- a/v17/leanback/res/values-lt/strings.xml
+++ b/v17/leanback/res/values-lt/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Išjungti aukštą kokybę"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Įgalinti subtitrus"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Išjungti subtitrus"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Baigti"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tęsti"</string>
</resources>
diff --git a/v17/leanback/res/values-lv/strings.xml b/v17/leanback/res/values-lv/strings.xml
index 3979e43..7d3bc2b 100644
--- a/v17/leanback/res/values-lv/strings.xml
+++ b/v17/leanback/res/values-lv/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Atspējot augstas kvalitātes vienumu atskaņošanu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Iespējot slēgtos parakstus"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Atspējot slēgtos parakstus"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Pabeigt"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Turpināt"</string>
</resources>
diff --git a/v17/leanback/res/values-mk-rMK/strings.xml b/v17/leanback/res/values-mk-rMK/strings.xml
index ccf6d62..75666e0 100644
--- a/v17/leanback/res/values-mk-rMK/strings.xml
+++ b/v17/leanback/res/values-mk-rMK/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Оневозможи висок квалитет"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Овозможи затворено објаснување"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Оневозможи затворено објаснување"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Заврши"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продолжи"</string>
</resources>
diff --git a/v17/leanback/res/values-ml-rIN/strings.xml b/v17/leanback/res/values-ml-rIN/strings.xml
index 356b0e9..b900f09 100644
--- a/v17/leanback/res/values-ml-rIN/strings.xml
+++ b/v17/leanback/res/values-ml-rIN/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ഉയർന്ന നിലവാരം പ്രവർത്തനരഹിതമാക്കുക"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനക്ഷമമാക്കുക"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"അടച്ച അടിക്കുറിപ്പ് നൽകൽ പ്രവർത്തനരഹിതമാക്കുക"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"പൂര്ത്തിയാക്കുക"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"തുടരുക"</string>
</resources>
diff --git a/v17/leanback/res/values-mn-rMN/strings.xml b/v17/leanback/res/values-mn-rMN/strings.xml
index a7a640f..e4a8fcd 100644
--- a/v17/leanback/res/values-mn-rMN/strings.xml
+++ b/v17/leanback/res/values-mn-rMN/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Өндөр чанарыг идэвхгүйжүүлэх"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Текст тайлбарыг идэвхжүүлэх"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Текст тайлбарыг идэвхгүйжүүлэх"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Дуусгах"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Үргэлжлүүлэх"</string>
</resources>
diff --git a/v17/leanback/res/values-mr-rIN/strings.xml b/v17/leanback/res/values-mr-rIN/strings.xml
index b9b568a..11748ec 100644
--- a/v17/leanback/res/values-mr-rIN/strings.xml
+++ b/v17/leanback/res/values-mr-rIN/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणवत्ता अक्षम करा"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"उपशीर्षके सक्षम करा"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"उपशीर्षके अक्षम करा"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"सुरू ठेवा"</string>
</resources>
diff --git a/v17/leanback/res/values-ms-rMY/strings.xml b/v17/leanback/res/values-ms-rMY/strings.xml
index 0a5f8bd..c073e43 100644
--- a/v17/leanback/res/values-ms-rMY/strings.xml
+++ b/v17/leanback/res/values-ms-rMY/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Lumpuhkan Kualiti Tinggi"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Dayakan Kapsyen Tertutup"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Lumpuhkan Kapsyen Tertutup"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Selesai"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Teruskan"</string>
</resources>
diff --git a/v17/leanback/res/values-my-rMM/strings.xml b/v17/leanback/res/values-my-rMM/strings.xml
index 1b3cdee..2efaf7f 100644
--- a/v17/leanback/res/values-my-rMM/strings.xml
+++ b/v17/leanback/res/values-my-rMM/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"အရည်အသွေးကောင်းအား ပိတ်ထားရန်"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"စာတမ်းထိုး ဖွင့်ရန်"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"စာတမ်းထိုးအား ပိတ်ထားရန်"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ပြီးပြီ"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ဆက်လုပ်ရန်"</string>
</resources>
diff --git a/v17/leanback/res/values-nb/strings.xml b/v17/leanback/res/values-nb/strings.xml
index c58544d..f5ab2e1 100644
--- a/v17/leanback/res/values-nb/strings.xml
+++ b/v17/leanback/res/values-nb/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Deaktiver høy kvalitet"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivér teksting"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Deaktiver teksting"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Fullfør"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsett"</string>
</resources>
diff --git a/v17/leanback/res/values-ne-rNP/strings.xml b/v17/leanback/res/values-ne-rNP/strings.xml
index 54c92856..c399985 100644
--- a/v17/leanback/res/values-ne-rNP/strings.xml
+++ b/v17/leanback/res/values-ne-rNP/strings.xml
@@ -48,6 +48,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"उच्च गुणस्तर असक्षम"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"बन्द क्याप्सनहरु सक्षम"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"बन्द क्याप्सनहरु असक्षम"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"समाप्त गर्नुहोस्"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"जारी राख्नुहोस्"</string>
</resources>
diff --git a/v17/leanback/res/values-nl/strings.xml b/v17/leanback/res/values-nl/strings.xml
index 941aa79..fe73141 100644
--- a/v17/leanback/res/values-nl/strings.xml
+++ b/v17/leanback/res/values-nl/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Zoeken"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Spreek om te zoeken"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> zoeken"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Spreek om in <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> te zoeken"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Spreek om <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> te zoeken"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Afspelen"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Hoge kwaliteit uitschakelen"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ondertiteling inschakelen"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Ondertiteling uitschakelen"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Voltooien"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Doorgaan"</string>
</resources>
diff --git a/v17/leanback/res/values-pl/strings.xml b/v17/leanback/res/values-pl/strings.xml
index 7598c73..f6280a3 100644
--- a/v17/leanback/res/values-pl/strings.xml
+++ b/v17/leanback/res/values-pl/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Szukaj"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Powiedz, aby wyszukać"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Szukaj <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Powiedz, by wyszukać <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Powiedz, by wyszukać w aplikacji <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Odtwórz"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Wyłącz wysoką jakość"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Włącz napisy"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Wyłącz napisy"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Zakończ"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Dalej"</string>
</resources>
diff --git a/v17/leanback/res/values-pt-rBR/strings.xml b/v17/leanback/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 12c9533..0000000
--- a/v17/leanback/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright (C) 2014 The Android Open Source Project
-
-Licensed under the Apache License, Version 2.0 (the "License");
-you may not use this file except in compliance with the License.
-You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing, software
-distributed under the License is distributed on an "AS IS" BASIS,
-WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-See the License for the specific language governing permissions and
-limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="orb_search_action" msgid="5651268540267663887">"Ação de pesquisa"</string>
- <string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
- <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
- <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar no <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
- <string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
- <string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduzir"</string>
- <string name="lb_playback_controls_pause" msgid="6189521112079849518">"Pausar"</string>
- <string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"Avançar"</string>
- <string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"Avançar %1$dX"</string>
- <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Retroceder"</string>
- <string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"Retroceder %1$dX"</string>
- <string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Pular próxima"</string>
- <string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Pular anterior"</string>
- <string name="lb_playback_controls_more_actions" msgid="2330770008796987655">"Mais ações"</string>
- <string name="lb_playback_controls_thumb_up" msgid="6530420347129222601">"Desmarcar gostei"</string>
- <string name="lb_playback_controls_thumb_up_outline" msgid="1577637924003500946">"Marcar gostei"</string>
- <string name="lb_playback_controls_thumb_down" msgid="4498041193172964797">"Desmarcar não gostei"</string>
- <string name="lb_playback_controls_thumb_down_outline" msgid="2936020280629424365">"Marcar não gostei"</string>
- <string name="lb_playback_controls_repeat_none" msgid="87476947476529036">"Não repetir"</string>
- <string name="lb_playback_controls_repeat_all" msgid="6730354406289599000">"Repetir tudo"</string>
- <string name="lb_playback_controls_repeat_one" msgid="3285202316452203619">"Repetir uma"</string>
- <string name="lb_playback_controls_shuffle_enable" msgid="1099874107835264529">"Ativar reprodução aleatória"</string>
- <string name="lb_playback_controls_shuffle_disable" msgid="8388150597335115226">"Desativar reprodução aleatória"</string>
- <string name="lb_playback_controls_high_quality_enable" msgid="202415780019335254">"Ativar alta qualidade"</string>
- <string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
- <string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar closed captioning"</string>
- <string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar closed captioning"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
-</resources>
diff --git a/v17/leanback/res/values-pt-rPT/strings.xml b/v17/leanback/res/values-pt-rPT/strings.xml
index 7b12f5e..f3bf4aa 100644
--- a/v17/leanback/res/values-pt-rPT/strings.xml
+++ b/v17/leanback/res/values-pt-rPT/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar no(a) <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduzir"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar legendas"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar legendas"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
</resources>
diff --git a/v17/leanback/res/values-pt/strings.xml b/v17/leanback/res/values-pt/strings.xml
index 12c9533..13d01a5 100644
--- a/v17/leanback/res/values-pt/strings.xml
+++ b/v17/leanback/res/values-pt/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Pesquisar"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Fale para pesquisar"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar no <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Fale para pesquisar <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Reproduzir"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Desativar alta qualidade"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Ativar closed captioning"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Desativar closed captioning"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Concluir"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuar"</string>
</resources>
diff --git a/v17/leanback/res/values-ro/strings.xml b/v17/leanback/res/values-ro/strings.xml
index b4f9ee3..cb6aa4a 100644
--- a/v17/leanback/res/values-ro/strings.xml
+++ b/v17/leanback/res/values-ro/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Dezactivează calitatea înaltă"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Activează subtitrările"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Dezactivează subtitrările"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Finalizați"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Continuați"</string>
</resources>
diff --git a/v17/leanback/res/values-ru/strings.xml b/v17/leanback/res/values-ru/strings.xml
index 864054a..fb03f9d 100644
--- a/v17/leanback/res/values-ru/strings.xml
+++ b/v17/leanback/res/values-ru/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Поиск"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Произнесите запрос"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Поиск здесь: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Скажите, что вы хотите найти – <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Произнесите запрос, чтобы найти <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Воспроизвести."</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Отключить высокое качество."</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Включить субтитры."</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Отключить субтитры."</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Готово"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Далее"</string>
</resources>
diff --git a/v17/leanback/res/values-si-rLK/strings.xml b/v17/leanback/res/values-si-rLK/strings.xml
index 3db1293..e5c0cf4 100644
--- a/v17/leanback/res/values-si-rLK/strings.xml
+++ b/v17/leanback/res/values-si-rLK/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"උපරිම ගුණත්වය අබල කරන ලදි"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"වැසුණු ශිර්ෂ කිරීම සබල කරන ලදි"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"වැසුණු ශිර්ෂ කිරීම අබල කරන ලදි"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"අවසානය"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"දිගටම කර ගෙන යන්න"</string>
</resources>
diff --git a/v17/leanback/res/values-sk/strings.xml b/v17/leanback/res/values-sk/strings.xml
index a317d18..74a9044 100644
--- a/v17/leanback/res/values-sk/strings.xml
+++ b/v17/leanback/res/values-sk/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zakázať médiá vo vysokej kvalite"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Zapnúť skryté titulky"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Vypnúť skryté titulky"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončiť"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Pokračovať"</string>
</resources>
diff --git a/v17/leanback/res/values-sl/strings.xml b/v17/leanback/res/values-sl/strings.xml
index 7b16952..1af639b 100644
--- a/v17/leanback/res/values-sl/strings.xml
+++ b/v17/leanback/res/values-sl/strings.xml
@@ -19,9 +19,9 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="orb_search_action" msgid="5651268540267663887">"Dejanje iskanja"</string>
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Iskanje"</string>
- <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite iskalno poizvedbo"</string>
+ <string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Izgovorite, če želite iskati"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Iskanje: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Izgovorite poizvedbo za iskanje v <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Govorite, če želite iskati: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d-kratno"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d-kratno"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Predvajaj"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Onemogoči visoko kakovost"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Omogoči podnapise"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Onemogoči podnapise"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Dokončaj"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Naprej"</string>
</resources>
diff --git a/v17/leanback/res/values-sr/strings.xml b/v17/leanback/res/values-sr/strings.xml
index df6c6b1..bb5c32d 100644
--- a/v17/leanback/res/values-sr/strings.xml
+++ b/v17/leanback/res/values-sr/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Онемогући висок квалитет"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Омогући титлове"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Онемогући титлове"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Доврши"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Настави"</string>
</resources>
diff --git a/v17/leanback/res/values-sv/strings.xml b/v17/leanback/res/values-sv/strings.xml
index 9b874ca..1a8e757 100644
--- a/v17/leanback/res/values-sv/strings.xml
+++ b/v17/leanback/res/values-sv/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Inaktivera hög kvalitet"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Aktivera textning"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Inaktivera textning"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Slutför"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Fortsätt"</string>
</resources>
diff --git a/v17/leanback/res/values-sw/strings.xml b/v17/leanback/res/values-sw/strings.xml
index 53ef95a..17c7480 100644
--- a/v17/leanback/res/values-sw/strings.xml
+++ b/v17/leanback/res/values-sw/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Utafutaji"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Tamka ili utafute"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tafuta <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Tamka ili utafute kwenye <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Tamka ili utafute <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Google Play"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Zima Ubora wa Juu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Washa manukuu"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Zima manukuu"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Kamilisha"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Endelea"</string>
</resources>
diff --git a/v17/leanback/res/values-ta-rIN/strings.xml b/v17/leanback/res/values-ta-rIN/strings.xml
index 1cc2eea..9472522 100644
--- a/v17/leanback/res/values-ta-rIN/strings.xml
+++ b/v17/leanback/res/values-ta-rIN/strings.xml
@@ -20,7 +20,7 @@
<string name="orb_search_action" msgid="5651268540267663887">"செயலைத் தேடுக"</string>
<string name="lb_search_bar_hint" msgid="8325490927970116252">"தேடு"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"தேட, பேசவும்"</string>
- <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> இல் தேடுக"</string>
+ <string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ஐத் தேடுக"</string>
<string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> ஐத் தேட, பேசவும்"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"உயர் தரத்தை முடக்கு"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"விரிவான வசனங்களை இயக்கு"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"விரிவான வசனங்களை முடக்கு"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"முடி"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"தொடர்க"</string>
</resources>
diff --git a/v17/leanback/res/values-te-rIN/strings.xml b/v17/leanback/res/values-te-rIN/strings.xml
index 32d311d..f71e8cb 100644
--- a/v17/leanback/res/values-te-rIN/strings.xml
+++ b/v17/leanback/res/values-te-rIN/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"అధిక నాణ్యతను నిలిపివేయి"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"సంవృత శీర్షికలను ప్రారంభించు"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"సంవృత శీర్షికలను నిలిపివేయి"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"ముగించు"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"కొనసాగించు"</string>
</resources>
diff --git a/v17/leanback/res/values-th/strings.xml b/v17/leanback/res/values-th/strings.xml
index d3eb2a3..581bac0 100644
--- a/v17/leanback/res/values-th/strings.xml
+++ b/v17/leanback/res/values-th/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"ค้นหา"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"พูดเพื่อค้นหา"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"ค้นหา <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"พูดเพื่อทำการค้นหาใน <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"พูดเพื่อค้นหา <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"เล่น"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"ปิดใช้คุณภาพสูง"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"เปิดใช้คำบรรยาย"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"ปิดใช้คำบรรยาย"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"เสร็จสิ้น"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"ต่อไป"</string>
</resources>
diff --git a/v17/leanback/res/values-tl/strings.xml b/v17/leanback/res/values-tl/strings.xml
index f50b4d1..c4e15ec 100644
--- a/v17/leanback/res/values-tl/strings.xml
+++ b/v17/leanback/res/values-tl/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Maghanap"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Magsalita upang maghanap"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Hanapin ang <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Magsalita upang maghanap sa <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Magsalita upang hanapin ang <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"I-play"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"I-disable ang Mataas na Kalidad"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"I-enable ang Paglalagay ng Subtitle"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"I-disable ang Paglalagay ng Subtitle"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tapusin"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Magpatuloy"</string>
</resources>
diff --git a/v17/leanback/res/values-tr/strings.xml b/v17/leanback/res/values-tr/strings.xml
index 814cb29..4671058 100644
--- a/v17/leanback/res/values-tr/strings.xml
+++ b/v17/leanback/res/values-tr/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Ara"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Arama yapmak için konuşun"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Ara: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Konuşarak <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> araması yapın"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Aramak için konuşun: <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Oynat"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yüksek Kalitede Oynatmayı Devre Dışı Bırak"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Altyazıları Etkinleştir"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Altyazıları Devre Dışı Bırak"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Son"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Devam"</string>
</resources>
diff --git a/v17/leanback/res/values-uk/strings.xml b/v17/leanback/res/values-uk/strings.xml
index a38db30..79b2782 100644
--- a/v17/leanback/res/values-uk/strings.xml
+++ b/v17/leanback/res/values-uk/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Вимкнути високу якість"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Увімкнути субтитри"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Вимкнути субтитри"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Закінчити"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Продовжити"</string>
</resources>
diff --git a/v17/leanback/res/values-ur-rPK/strings.xml b/v17/leanback/res/values-ur-rPK/strings.xml
index 666cf71..b670251 100644
--- a/v17/leanback/res/values-ur-rPK/strings.xml
+++ b/v17/leanback/res/values-ur-rPK/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"اعلی معیار کو غیر فعال کریں"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"سب ٹائٹلز کو فعال کریں"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"سب ٹائٹلز کو غیر فعال کریں"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"مکمل کریں"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"جاری رکھیں"</string>
</resources>
diff --git a/v17/leanback/res/values-uz-rUZ/strings.xml b/v17/leanback/res/values-uz-rUZ/strings.xml
index d81d8de..235d88f 100644
--- a/v17/leanback/res/values-uz-rUZ/strings.xml
+++ b/v17/leanback/res/values-uz-rUZ/strings.xml
@@ -28,7 +28,7 @@
<string name="lb_playback_controls_pause" msgid="6189521112079849518">"To‘xtatib turish"</string>
<string name="lb_playback_controls_fast_forward" msgid="8569951318244687220">"Oldinga o‘tkazish"</string>
<string name="lb_playback_controls_fast_forward_multiplier" msgid="1058753672110224526">"%1$dX tezlikda oldinga o‘tkazish"</string>
- <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Orqaga o‘tkazish"</string>
+ <string name="lb_playback_controls_rewind" msgid="2227196334132350684">"Orqaga qaytarish"</string>
<string name="lb_playback_controls_rewind_multiplier" msgid="1640629531440849942">"%1$dX tezlikda orqaga qaytarish"</string>
<string name="lb_playback_controls_skip_next" msgid="2946499493161095772">"Keyingisiga o‘tish"</string>
<string name="lb_playback_controls_skip_previous" msgid="2326801832933178348">"Avvalgisiga qaytish"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Yuqori sifatni o‘chirib qo‘yish"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Taglavhalarni yoqish"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Taglavhalarni o‘chirib qo‘yish"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Tugatish"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Davom etish"</string>
</resources>
diff --git a/v17/leanback/res/values-v19/themes.xml b/v17/leanback/res/values-v19/themes.xml
index 53befec..74e0e2e9 100644
--- a/v17/leanback/res/values-v19/themes.xml
+++ b/v17/leanback/res/values-v19/themes.xml
@@ -20,6 +20,7 @@
<item name="playbackProgressPrimaryColor">@color/lb_playback_progress_color_no_theme</item>
<item name="playbackControlsIconHighlightColor">@color/lb_playback_icon_highlight_no_theme</item>
<item name="defaultBrandColor">@color/lb_default_brand_color</item>
+ <item name="defaultBrandColorDark">@color/lb_default_brand_color_dark</item>
<item name="android:windowOverscan">true</item>
<item name="guidedStepTheme">@style/Theme.Leanback.GuidedStep</item>
diff --git a/v17/leanback/res/values-v21/themes.xml b/v17/leanback/res/values-v21/themes.xml
index 3b48dae..1072b2b 100644
--- a/v17/leanback/res/values-v21/themes.xml
+++ b/v17/leanback/res/values-v21/themes.xml
@@ -21,6 +21,8 @@
<item name="playbackControlsIconHighlightColor">?android:attr/colorAccent</item>
<item name="defaultBrandColor">?android:attr/colorPrimary</item>
<item name="android:colorPrimary">@color/lb_default_brand_color</item>
+ <item name="defaultBrandColorDark">?android:attr/colorPrimaryDark</item>
+ <item name="android:colorPrimaryDark">@color/lb_default_brand_color_dark</item>
<item name="android:windowOverscan">true</item>
<item name="guidedStepTheme">@style/Theme.Leanback.GuidedStep</item>
diff --git a/v17/leanback/res/animator/lb_guidedactions_item_checked.xml b/v17/leanback/res/values-v22/integers.xml
similarity index 70%
copy from v17/leanback/res/animator/lb_guidedactions_item_checked.xml
copy to v17/leanback/res/values-v22/integers.xml
index 463b9f7..fdd7792 100644
--- a/v17/leanback/res/animator/lb_guidedactions_item_checked.xml
+++ b/v17/leanback/res/values-v22/integers.xml
@@ -14,9 +14,11 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:duration="@integer/lb_guidedactions_item_animation_duration"
- android:propertyName="alpha"
- android:valueFrom="0.0"
- android:valueTo="1.0"
- android:valueType="floatType" />
+<resources>
+
+ <!-- Gravity.START -->
+ <integer name="slideEdgeStart">0x800003</integer>
+ <!-- Gravity.END -->
+ <integer name="slideEdgeEnd">0x800005</integer>
+
+</resources>
\ No newline at end of file
diff --git a/v17/leanback/res/values-vi/strings.xml b/v17/leanback/res/values-vi/strings.xml
index 881734b..201d137 100644
--- a/v17/leanback/res/values-vi/strings.xml
+++ b/v17/leanback/res/values-vi/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"Tìm kiếm"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"Nói để tìm kiếm"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"Tìm kiếm <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Nói để tìm kiếm trên <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"Nói để tìm kiếm <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"Phát"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Tắt chế độ chất lượng cao"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Bật phụ đề"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Tắt phụ đề"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Hoàn tất"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Tiếp tục"</string>
</resources>
diff --git a/v17/leanback/res/values-zh-rCN/strings.xml b/v17/leanback/res/values-zh-rCN/strings.xml
index fc3fa10..276e7bb 100644
--- a/v17/leanback/res/values-zh-rCN/strings.xml
+++ b/v17/leanback/res/values-zh-rCN/strings.xml
@@ -21,7 +21,7 @@
<string name="lb_search_bar_hint" msgid="8325490927970116252">"搜索"</string>
<string name="lb_search_bar_hint_speech" msgid="5511270823320183816">"说话即可开始搜索"</string>
<string name="lb_search_bar_hint_with_title" msgid="1627103380996590035">"搜索<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"说出搜索条件,在<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>中进行搜索"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="2712734639766312034">"说话即可在<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>中搜索"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4541442045214207774">"%1$d 倍速"</string>
<string name="lb_control_display_rewind_multiplier" msgid="3097220783222910245">"%1$d 倍速"</string>
<string name="lb_playback_controls_play" msgid="731953341987346903">"播放"</string>
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"关闭高画质模式"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"开启字幕"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"关闭字幕"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"继续"</string>
</resources>
diff --git a/v17/leanback/res/values-zh-rHK/strings.xml b/v17/leanback/res/values-zh-rHK/strings.xml
index 7cba4b5..5e87989 100644
--- a/v17/leanback/res/values-zh-rHK/strings.xml
+++ b/v17/leanback/res/values-zh-rHK/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"停用高畫質"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
</resources>
diff --git a/v17/leanback/res/values-zh-rTW/strings.xml b/v17/leanback/res/values-zh-rTW/strings.xml
index dcca2db..67efc40 100644
--- a/v17/leanback/res/values-zh-rTW/strings.xml
+++ b/v17/leanback/res/values-zh-rTW/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"停用高品質播放"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"啟用字幕"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"停用字幕"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"完成"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"繼續"</string>
</resources>
diff --git a/v17/leanback/res/values-zu/strings.xml b/v17/leanback/res/values-zu/strings.xml
index f4c589d..f17455d 100644
--- a/v17/leanback/res/values-zu/strings.xml
+++ b/v17/leanback/res/values-zu/strings.xml
@@ -46,6 +46,4 @@
<string name="lb_playback_controls_high_quality_disable" msgid="8637371582779057866">"Khubaza ikhwalithi ephezulu"</string>
<string name="lb_playback_controls_closed_captioning_enable" msgid="2429655367176440226">"Nika amandla imibhalo engezansi"</string>
<string name="lb_playback_controls_closed_captioning_disable" msgid="6133362019475930048">"Khubaza imihbalo engezansi"</string>
- <string name="lb_guidedaction_finish_title" msgid="4015190340667946245">"Qeda"</string>
- <string name="lb_guidedaction_continue_title" msgid="8842094924543063706">"Qhubeka"</string>
</resources>
diff --git a/v17/leanback/res/values/attrs.xml b/v17/leanback/res/values/attrs.xml
index 551e3f4..90f010a 100644
--- a/v17/leanback/res/values/attrs.xml
+++ b/v17/leanback/res/values/attrs.xml
@@ -278,6 +278,12 @@
b) SDK < 21: set the brand color explicitly via defaultBrandColor, or programatically.
-->
<attr name="defaultBrandColor" format="reference|color" />
+ <!-- Default dark brand color used for the background of certain leanback visual elements
+ such as the actions background. If your app runs on:
+ a) SDK 21+: set colorPrimaryDark, used by the leanback launcher and elsewhere, and defaultBrandColorDark will inherit it.
+ b) SDK < 21: set the brand color explicitly via defaultBrandColorDark, or programatically.
+ -->
+ <attr name="defaultBrandColorDark" format="reference|color" />
<!-- Default colors -->
<attr name="defaultSearchColor" format="reference|color" />
@@ -348,12 +354,22 @@
selector is animated in at activity start. Default is {@link
android.support.v17.leanback.R.animator#lb_guidedactions_selector_hide}. -->
<attr name="guidedActionsSelectorHideAnimation" format="reference" />
- <!-- Theme attribute for the style of the container in a GuidedActionsPresenter. Default is
- {@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedActionsContainerStyle}. -->
- <attr name="guidedActionsContainerStyle" format="reference" />
<!-- Theme attribute for the style of the item selector in a GuidedActionsPresenter. Default is
{@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedActionsSelectorStyle}. -->
<attr name="guidedActionsSelectorStyle" format="reference" />
+
+ <!-- Theme attribute for the shadow elevation of GuidedActions. Default is
+ {@link android.support.v17.leanback.R.dimen#lb_guidedactions_elevation}.-->
+ <attr name="guidedActionsElevation" format="dimension|reference" />
+
+ <!-- Theme attribute for the background of GuidedActions. Default is
+ {@link android.support.v17.leanback.R.color#lb_guidedactions_background}.-->
+ <attr name="guidedActionsBackground" format="reference" />
+
+ <!-- Theme attribute for the dark version background of GuidedActions. Default is
+ {@link android.support.v17.leanback.R.color#lb_guidedactions_background_dark}.-->
+ <attr name="guidedActionsBackgroundDark" format="reference" />
+
<!-- Theme attribute for the style of the list in a GuidedActionsPresenter. Default is
{@link android.support.v17.leanback.R.style#Widget_Leanback_GuidedActionsListStyle}.-->
<attr name="guidedActionsListStyle" format="reference" />
@@ -388,14 +404,6 @@
<attr name="guidedActionItemChevronStyle" format="reference" />
<!-- Theme attribute for the animation used in a GuidedActionsPresenter when an action
- is checked. Default is {@link
- android.support.v17.leanback.R.animator#lb_guidedactions_item_checked}. -->
- <attr name="guidedActionCheckedAnimation" format="reference" />
- <!-- Theme attribute for the animation used in a GuidedActionsPresenter when an action
- is unchecked. Default is {@link
- android.support.v17.leanback.R.animator#lb_guidedactions_item_unchecked}. -->
- <attr name="guidedActionUncheckedAnimation" format="reference" />
- <!-- Theme attribute for the animation used in a GuidedActionsPresenter when an action
is pressed. Default is {@link
android.support.v17.leanback.R.animator#lb_guidedactions_item_pressed}. -->
<attr name="guidedActionPressedAnimation" format="reference" />
@@ -411,14 +419,12 @@
decoration when its action is disabled. Default is {@link
android.support.v17.leanback.R.string#lb_guidedactions_item_disabled_chevron_alpha}. -->
<attr name="guidedActionDisabledChevronAlpha" format="reference" />
- <!-- Theme attribute used in a GuidedActionsPresenter for the width of the text area of
- a single action when there is an icon present. Default is {@link
- android.support.v17.leanback.R.dimen#lb_guidedactions_item_text_width}. -->
- <attr name="guidedActionContentWidth" format="reference" />
- <!-- Theme attribute used in a GuidedActionsPresenter for the width of the text area of
- a single action when there is no icon present. Default is {@link
- android.support.v17.leanback.R.dimen#lb_guidedactions_item_text_width_no_icon}. -->
- <attr name="guidedActionContentWidthNoIcon" format="reference" />
+ <!-- Theme attribute used for the weight of actions. Default is {@link
+ android.support.v17.leanback.R.string#lb_guidedactions_width_weight}. -->
+ <attr name="guidedActionContentWidthWeight" format="reference" />
+ <!-- Theme attribute used for the weight of actions when there are two panels. Default is {@link
+ android.support.v17.leanback.R.string#lb_guidedactions_width_weight_two_panels}. -->
+ <attr name="guidedActionContentWidthWeightTwoPanels" format="reference" />
<!-- Theme attribute used in a GuidedActionsPresenter for the max lines of the title text
view when the action's isMultilineDescription is set to false. Default is {@link
android.support.v17.leanback.R.integer#lb_guidedactions_item_title_min_lines}. -->
diff --git a/v17/leanback/res/values/colors.xml b/v17/leanback/res/values/colors.xml
index e63c58b..858ace5 100644
--- a/v17/leanback/res/values/colors.xml
+++ b/v17/leanback/res/values/colors.xml
@@ -52,6 +52,7 @@
<color name="lb_basic_card_content_text_color">#B3EEEEEE</color>
<color name="lb_default_brand_color">#FF455A64</color>
+ <color name="lb_default_brand_color_dark">#FF222D32</color>
<color name="lb_default_search_color">#FFFFAA3F</color>
<color name="lb_control_button_color">#66EEEEEE</color>
@@ -71,6 +72,7 @@
<!-- refactor naming here -->
<color name="lb_guidedactions_background">#FF111111</color>
+ <color name="lb_guidedactions_background_dark">#FF080808</color>
<color name="lb_guidedactions_selector_color">#26FFFFFF</color>
<color name="lb_guidedactions_item_unselected_text_color">#FFF1F1F1</color>
<!-- end refactor naming -->
diff --git a/v17/leanback/res/values/dimens.xml b/v17/leanback/res/values/dimens.xml
index 7f15fd2..053c7e0 100644
--- a/v17/leanback/res/values/dimens.xml
+++ b/v17/leanback/res/values/dimens.xml
@@ -224,7 +224,6 @@
<dimen name="lb_rounded_rect_corner_radius">2dp</dimen>
<!-- GuidedStepFragment -->
- <dimen name="lb_guidedstep_guidance_section_width">576dp</dimen>
<dimen name="lb_guidedstep_slide_start_distance">-200dp</dimen>
<dimen name="lb_guidedstep_slide_end_distance">200dp</dimen>
<dimen name="lb_guidedstep_slide_ime_distance">-100dp</dimen>
@@ -232,7 +231,8 @@
<dimen name="lb_guidance_entry_translationX">-120dp</dimen>
<dimen name="lb_guidedactions_entry_translationX">384dp</dimen>
- <dimen name="lb_guidedactions_section_width">384dp</dimen>
+ <item name="lb_guidedactions_width_weight" format="float" type="string">0.666666667</item>
+ <item name="lb_guidedactions_width_weight_two_panels" format="float" type="string">1</item>
<dimen name="lb_guidedactions_section_shadow_width">16dp</dimen>
<dimen name="lb_guidedactions_elevation">12dp</dimen>
<dimen name="lb_guidedactions_selector_min_height">8dp</dimen>
@@ -248,10 +248,10 @@
<dimen name="lb_guidedactions_item_text_width">248dp</dimen>
<dimen name="lb_guidedactions_item_text_width_no_icon">284dp</dimen>
<dimen name="lb_guidedactions_item_min_height">64dp</dimen>
- <dimen name="lb_guidedactions_item_start_padding">20dp</dimen>
+ <dimen name="lb_guidedactions_item_start_padding">28dp</dimen>
<dimen name="lb_guidedactions_item_end_padding">28dp</dimen>
<dimen name="lb_guidedactions_item_delimiter_padding">4dp</dimen>
- <dimen name="lb_guidedactions_item_checkmark_diameter">8dp</dimen>
+ <dimen name="lb_guidedactions_item_checkmark_diameter">16dp</dimen>
<dimen name="lb_guidedactions_item_icon_width">32dp</dimen>
<dimen name="lb_guidedactions_item_icon_height">32dp</dimen>
<dimen name="lb_guidedactions_item_title_font_size">18sp</dimen>
diff --git a/v17/leanback/res/values/ids.xml b/v17/leanback/res/values/ids.xml
index b9da732..ca84efc8 100644
--- a/v17/leanback/res/values/ids.xml
+++ b/v17/leanback/res/values/ids.xml
@@ -34,4 +34,11 @@
<item type="id" name="lb_control_shuffle" />
<item type="id" name="lb_control_high_quality" />
<item type="id" name="lb_control_closed_captioning" />
- </resources>
+
+ <item type="id" name="guidedactions_root2" />
+ <item type="id" name="guidedactions_list_background2" />
+ <item type="id" name="guidedactions_list2" />
+ <item type="id" name="guidedactions_selector2" />
+ <item type="id" name="guidedactions_content2" />
+
+</resources>
diff --git a/v17/leanback/res/values/integers.xml b/v17/leanback/res/values/integers.xml
index 8547e22..c9f3384 100644
--- a/v17/leanback/res/values/integers.xml
+++ b/v17/leanback/res/values/integers.xml
@@ -29,4 +29,11 @@
<integer name="lb_playback_rows_fade_out_ms">250</integer>
<integer name="lb_playback_rows_fade_delay_ms">100</integer>
<integer name="lb_playback_controls_show_time_ms">3000</integer>
+
+ <!-- Gravity.LEFT -->
+ <integer name="slideEdgeStart">3</integer>
+ <!-- Gravity.RIGHT -->
+ <integer name="slideEdgeEnd">5</integer>
+
+ <integer name="lb_guidedstep_activity_background_fade_duration_ms">350</integer>
</resources>
diff --git a/v17/leanback/res/values/styles.xml b/v17/leanback/res/values/styles.xml
index e5182b3..3904467 100644
--- a/v17/leanback/res/values/styles.xml
+++ b/v17/leanback/res/values/styles.xml
@@ -195,6 +195,7 @@
<style name="Widget.Leanback.GridItems" />
<style name="Widget.Leanback.Headers.VerticalGridView" >
+ <item name="android:background">?attr/defaultBrandColor</item>
<item name="android:paddingStart">?attr/browsePaddingStart</item>
<item name="focusOutFront">true</item>
<item name="focusOutEnd">true</item>
@@ -422,28 +423,16 @@
<item name="android:scaleType">fitCenter</item>
</style>
- <!-- Style for the container view in a GuidedActionsStylist's default layout. -->
- <style name="Widget.Leanback.GuidedActionsContainerStyle">
- <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
- <item name="android:layout_width">@dimen/lb_guidedactions_section_width</item>
- <item name="android:layout_height">match_parent</item>
- <item name="android:layout_alignParentEnd">true</item>
- <item name="android:background">@color/lb_guidedactions_background</item>
- </style>
-
<!-- Style for the selector view in a GuidedActionsStylist's default layout. -->
<style name="Widget.Leanback.GuidedActionsSelectorStyle">
- <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">@dimen/lb_guidedactions_selector_min_height</item>
<item name="android:layout_centerVertical">true</item>
- <item name="android:alpha">0</item>
<item name="android:background">@color/lb_guidedactions_selector_color</item>
</style>
<!-- Style for the vertical grid of actions in a GuidedActionsStylist's default layout. -->
<style name="Widget.Leanback.GuidedActionsListStyle">
- <item name="android:elevation">@dimen/lb_guidedactions_elevation</item>
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">match_parent</item>
<item name="android:focusable">true</item>
@@ -468,9 +457,8 @@
<item name="android:layout_height">@dimen/lb_guidedactions_item_checkmark_diameter</item>
<item name="android:layout_gravity">center</item>
<item name="android:layout_marginEnd">@dimen/lb_guidedactions_item_delimiter_padding</item>
- <item name="android:scaleType">center</item>
- <item name="android:src">@drawable/lb_guidedactions_item_checkmark</item>
- <item name="android:visibility">invisible</item>
+ <item name="android:scaleType">centerInside</item>
+ <item name="android:visibility">gone</item>
</style>
<!-- Style for an action's icon in a GuidedActionsStylist's default item layout. -->
@@ -485,7 +473,7 @@
<!-- Style for an action's text content in a GuidedActionsStylist's default item layout. -->
<style name="Widget.Leanback.GuidedActionItemContentStyle">
- <item name="android:layout_width">0dp</item>
+ <item name="android:layout_width">match_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">start|center_vertical</item>
<item name="android:layout_weight">1</item>
diff --git a/v17/leanback/res/values/themes.xml b/v17/leanback/res/values/themes.xml
index 2e47e56..36362dd 100644
--- a/v17/leanback/res/values/themes.xml
+++ b/v17/leanback/res/values/themes.xml
@@ -15,13 +15,14 @@
limitations under the License.
-->
-<resources>
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
<!-- LeanbackBase may be overridden for specific api levels -->
<style name="Theme.LeanbackBase" parent="android:Theme.Holo.NoActionBar">
<item name="playbackProgressPrimaryColor">@color/lb_playback_progress_color_no_theme</item>
<item name="playbackControlsIconHighlightColor">@color/lb_playback_icon_highlight_no_theme</item>
<item name="defaultBrandColor">@color/lb_default_brand_color</item>
+ <item name="defaultBrandColorDark">@color/lb_default_brand_color_dark</item>
<item name="android:windowOverscan">true</item>
<item name="guidedStepTheme">@style/Theme.Leanback.GuidedStep</item>
@@ -118,7 +119,13 @@
<item name="android:windowEnterTransition">@transition/lb_guidedstep_activity_enter</item>
- <item name="guidedStepBackground">?android:attr/windowBackground</item>
+ <!-- background applied to each GuidedStepFragment by default-->
+ <item name="guidedStepBackground">?android:attr/colorBackground</item>
+ <!-- Each GuidedStepFragment has a background so activity does not need a background.
+ But We still need a dumb background to keep the temporary translucent state last
+ as long as the background view fade-in transition -->
+ <item name="android:windowBackground">@android:color/transparent</item>
+ <item name="android:windowTransitionBackgroundFadeDuration">@integer/lb_guidedstep_activity_background_fade_duration_ms</item>
<item name="guidedStepImeAppearingAnimation">@animator/lb_guidedstep_slide_up</item>
<item name="guidedStepImeDisappearingAnimation">@animator/lb_guidedstep_slide_down</item>
@@ -129,7 +136,9 @@
<item name="guidanceBreadcrumbStyle">@style/Widget.Leanback.GuidanceBreadcrumbStyle</item>
<item name="guidanceDescriptionStyle">@style/Widget.Leanback.GuidanceDescriptionStyle</item>
- <item name="guidedActionsContainerStyle">@style/Widget.Leanback.GuidedActionsContainerStyle</item>
+ <item name="guidedActionsElevation">@dimen/lb_guidedactions_elevation</item>
+ <item name="guidedActionsBackground">@color/lb_guidedactions_background</item>
+ <item name="guidedActionsBackgroundDark">@color/lb_guidedactions_background_dark</item>
<item name="guidedActionsSelectorStyle">@style/Widget.Leanback.GuidedActionsSelectorStyle</item>
<item name="guidedActionsListStyle">@style/Widget.Leanback.GuidedActionsListStyle</item>
<item name="guidedActionsSelectorShowAnimation">@animator/lb_guidedactions_selector_show</item>
@@ -143,14 +152,12 @@
<item name="guidedActionItemDescriptionStyle">@style/Widget.Leanback.GuidedActionItemDescriptionStyle</item>
<item name="guidedActionItemChevronStyle">@style/Widget.Leanback.GuidedActionItemChevronStyle</item>
- <item name="guidedActionCheckedAnimation">@animator/lb_guidedactions_item_checked</item>
- <item name="guidedActionUncheckedAnimation">@animator/lb_guidedactions_item_unchecked</item>
<item name="guidedActionPressedAnimation">@animator/lb_guidedactions_item_pressed</item>
<item name="guidedActionUnpressedAnimation">@animator/lb_guidedactions_item_unpressed</item>
<item name="guidedActionEnabledChevronAlpha">@string/lb_guidedactions_item_enabled_chevron_alpha</item>
<item name="guidedActionDisabledChevronAlpha">@string/lb_guidedactions_item_disabled_chevron_alpha</item>
- <item name="guidedActionContentWidth">@dimen/lb_guidedactions_item_text_width</item>
- <item name="guidedActionContentWidthNoIcon">@dimen/lb_guidedactions_item_text_width_no_icon</item>
+ <item name="guidedActionContentWidthWeight">@string/lb_guidedactions_width_weight</item>
+ <item name="guidedActionContentWidthWeightTwoPanels">@string/lb_guidedactions_width_weight_two_panels</item>
<item name="guidedActionTitleMinLines">@integer/lb_guidedactions_item_title_min_lines</item>
<item name="guidedActionTitleMaxLines">@integer/lb_guidedactions_item_title_max_lines</item>
<item name="guidedActionDescriptionMinLines">@integer/lb_guidedactions_item_description_min_lines</item>
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java
index 66d6225..142e971 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapter.java
@@ -98,9 +98,9 @@
/**
* View holder containing a {@link GuidedAction}.
*/
- private static class ActionViewHolder extends ViewHolder {
+ static class ActionViewHolder extends ViewHolder {
- private final GuidedActionsStylist.ViewHolder mStylistViewHolder;
+ final GuidedActionsStylist.ViewHolder mStylistViewHolder;
private GuidedAction mAction;
/**
@@ -128,45 +128,48 @@
}
}
- private RecyclerView mRecyclerView;
private final ActionOnKeyListener mActionOnKeyListener;
private final ActionOnFocusListener mActionOnFocusListener;
private final ActionEditListener mActionEditListener;
private final List<GuidedAction> mActions;
private ClickListener mClickListener;
- private GuidedActionsStylist mStylist;
+ private final GuidedActionsStylist mStylist;
private final View.OnClickListener mOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
- if (v != null && v.getWindowToken() != null && mClickListener != null) {
- ActionViewHolder avh = (ActionViewHolder)mRecyclerView.getChildViewHolder(v);
+ if (v != null && v.getWindowToken() != null && getRecyclerView() != null) {
+ ActionViewHolder avh = (ActionViewHolder)getRecyclerView().getChildViewHolder(v);
GuidedAction action = avh.getAction();
- if (action.isEnabled() && !action.infoOnly()) {
- mClickListener.onGuidedActionClicked(action);
+ if (action.isEditable() || action.isDescriptionEditable()) {
+ if (DEBUG_EDIT) Log.v(TAG_EDIT, "openIme by click");
+ mGroup.openIme(GuidedActionAdapter.this, avh);
+ } else {
+ handleCheckedActions(avh);
+ if (action.isEnabled() && !action.infoOnly()) {
+ performOnActionClick(avh);
+ }
}
}
}
};
- private boolean mImeOpened;
+ GuidedActionAdapterGroup mGroup;
/**
* Constructs a GuidedActionAdapter with the given list of guided actions, the given click and
* focus listeners, and the given presenter.
* @param actions The list of guided actions this adapter will manage.
- * @param clickListener The click listener for items in this adapter.
* @param focusListener The focus listener for items in this adapter.
* @param presenter The presenter that will manage the display of items in this adapter.
*/
public GuidedActionAdapter(List<GuidedAction> actions, ClickListener clickListener,
- FocusListener focusListener, EditListener editListener,
- GuidedActionsStylist presenter) {
+ FocusListener focusListener, GuidedActionsStylist presenter) {
super();
mActions = new ArrayList<GuidedAction>(actions);
mClickListener = clickListener;
mStylist = presenter;
mActionOnKeyListener = new ActionOnKeyListener();
mActionOnFocusListener = new ActionOnFocusListener(focusListener);
- mActionEditListener = new ActionEditListener(editListener);
+ mActionEditListener = new ActionEditListener();
}
/**
@@ -198,6 +201,22 @@
}
/**
+ * Return index of action in array
+ * @param action Action to search index.
+ * @return Index of Action in array.
+ */
+ public int indexOf(GuidedAction action) {
+ return mActions.indexOf(action);
+ }
+
+ /**
+ * @return GuidedActionsStylist used to build the actions list UI.
+ */
+ public GuidedActionsStylist getGuidedActionsStylist() {
+ return mStylist;
+ }
+
+ /**
* Sets the click listener for items managed by this adapter.
* @param clickListener The click listener for this adapter.
*/
@@ -225,16 +244,12 @@
* {@inheritDoc}
*/
@Override
- public void onAttachedToRecyclerView(RecyclerView recyclerView) {
- mRecyclerView = recyclerView;
+ public int getItemViewType(int position) {
+ return mStylist.getItemViewType(mActions.get(position));
}
- /**
- * {@inheritDoc}
- */
- @Override
- public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
- mRecyclerView = null;
+ private RecyclerView getRecyclerView() {
+ return mStylist.getActionsGridView();
}
/**
@@ -242,7 +257,7 @@
*/
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
- GuidedActionsStylist.ViewHolder vh = mStylist.onCreateViewHolder(parent);
+ GuidedActionsStylist.ViewHolder vh = mStylist.onCreateViewHolder(parent, viewType);
View v = vh.view;
v.setOnKeyListener(mActionOnKeyListener);
v.setOnClickListener(mOnClickListener);
@@ -277,15 +292,6 @@
GuidedAction action = mActions.get(position);
avh.setAction(action);
mStylist.onBindViewHolder(avh.mStylistViewHolder, action);
-
- setupNextImeOptions(avh.mStylistViewHolder.getEditableTitleView());
- setupNextImeOptions(avh.mStylistViewHolder.getEditableDescriptionView());
- }
-
- private void setupNextImeOptions(EditText edit) {
- if (edit != null) {
- edit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
- }
}
/**
@@ -296,31 +302,6 @@
return mActions.size();
}
- private int getNextActionIndex(GuidedAction action, long nextActionId) {
- if (nextActionId == GuidedAction.ACTION_ID_NEXT) {
- int i, size = mActions.size();
- for (i = 0; i < size; i++) {
- GuidedAction a = mActions.get(i);
- if (mActions.get(i) == action) {
- break;
- }
- }
- if (nextActionId == GuidedAction.ACTION_ID_NEXT) {
- i++;
- }
- return (i == size) ? -1 : i;
- } else {
- int i, size = mActions.size();
- for (i = 0; i < size; i++) {
- GuidedAction a = mActions.get(i);
- if (mActions.get(i).getId() == nextActionId) {
- break;
- }
- }
- return (i == size) ? -1 : i;
- }
- }
-
private class ActionOnFocusListener implements View.OnFocusChangeListener {
private FocusListener mFocusListener;
@@ -335,8 +316,8 @@
}
public void unFocus() {
- if (mSelectedView != null) {
- ViewHolder vh = mRecyclerView.getChildViewHolder(mSelectedView);
+ if (mSelectedView != null && getRecyclerView() != null) {
+ ViewHolder vh = getRecyclerView().getChildViewHolder(mSelectedView);
if (vh != null) {
ActionViewHolder avh = (ActionViewHolder)vh;
mStylist.onAnimateItemFocused(avh.mStylistViewHolder, false);
@@ -349,8 +330,10 @@
@Override
public void onFocusChange(View v, boolean hasFocus) {
- ActionViewHolder avh = (ActionViewHolder)mRecyclerView.getChildViewHolder(v);
- mStylist.onAnimateItemFocused(avh.mStylistViewHolder, hasFocus);
+ if (getRecyclerView() == null) {
+ return;
+ }
+ ActionViewHolder avh = (ActionViewHolder) getRecyclerView().getChildViewHolder(v);
if (hasFocus) {
mSelectedView = v;
if (mFocusListener != null) {
@@ -360,17 +343,69 @@
}
} else {
if (mSelectedView == v) {
- mStylist.onAnimateItemPressed(avh.mStylistViewHolder, false);
+ mStylist.onAnimateItemPressedCancelled(avh.mStylistViewHolder);
mSelectedView = null;
}
}
+ mStylist.onAnimateItemFocused(avh.mStylistViewHolder, hasFocus);
+ }
+ }
+
+ public ActionViewHolder findSubChildViewHolder(View v) {
+ // Needed because RecyclerView.getChildViewHolder does not traverse the hierarchy
+ if (getRecyclerView() == null) {
+ return null;
+ }
+ ActionViewHolder result = null;
+ ViewParent parent = v.getParent();
+ while (parent != getRecyclerView() && parent != null && v != null) {
+ v = (View)parent;
+ parent = parent.getParent();
+ }
+ if (parent != null && v != null) {
+ result = (ActionViewHolder)getRecyclerView().getChildViewHolder(v);
+ }
+ return result;
+ }
+
+ public void handleCheckedActions(ActionViewHolder avh) {
+ GuidedAction action = avh.getAction();
+ int actionCheckSetId = action.getCheckSetId();
+ if (getRecyclerView() != null && actionCheckSetId != GuidedAction.NO_CHECK_SET) {
+ // Find any actions that are checked and are in the same group
+ // as the selected action. Fade their checkmarks out.
+ if (actionCheckSetId != GuidedAction.CHECKBOX_CHECK_SET_ID) {
+ for (int i = 0, size = mActions.size(); i < size; i++) {
+ GuidedAction a = mActions.get(i);
+ if (a != action && a.getCheckSetId() == actionCheckSetId && a.isChecked()) {
+ a.setChecked(false);
+ ViewHolder vh = getRecyclerView().findViewHolderForPosition(i);
+ if (vh != null) {
+ GuidedActionsStylist.ViewHolder subViewHolder =
+ ((ActionViewHolder)vh).mStylistViewHolder;
+ mStylist.onAnimateItemChecked(subViewHolder, false);
+ }
+ }
+ }
+ }
+
+ // If we we'ren't already checked, fade our checkmark in.
+ if (!action.isChecked()) {
+ action.setChecked(true);
+ mStylist.onAnimateItemChecked(avh.mStylistViewHolder, true);
+ } else {
+ if (actionCheckSetId == GuidedAction.CHECKBOX_CHECK_SET_ID) {
+ action.setChecked(false);
+ mStylist.onAnimateItemChecked(avh.mStylistViewHolder, false);
+ }
+ }
}
}
- public void openIme(ActionViewHolder avh) {
- mStylist.setEditingMode(avh.mStylistViewHolder,
- avh.getAction(), true);
- mActionEditListener.openIme(avh);
+ public void performOnActionClick(ActionViewHolder avh) {
+ if (mClickListener != null) {
+ mClickListener.onGuidedActionClicked(avh.getAction());
+ }
}
private class ActionOnKeyListener implements View.OnKeyListener {
@@ -390,7 +425,7 @@
*/
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
- if (v == null || event == null) {
+ if (v == null || event == null || getRecyclerView() == null) {
return false;
}
boolean handled = false;
@@ -401,7 +436,8 @@
case KeyEvent.KEYCODE_BUTTON_Y:
case KeyEvent.KEYCODE_ENTER:
- ActionViewHolder avh = (ActionViewHolder)mRecyclerView.getChildViewHolder(v);
+ ActionViewHolder avh = (ActionViewHolder) getRecyclerView()
+ .getChildViewHolder(v);
GuidedAction action = avh.getAction();
if (!action.isEnabled() || action.infoOnly()) {
@@ -414,37 +450,25 @@
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN:
+ if (DEBUG) {
+ Log.d(TAG, "Enter Key down");
+ }
if (!mKeyPressed) {
mKeyPressed = true;
-
playSound(v, AudioManager.FX_KEY_CLICK);
-
- if (DEBUG) {
- Log.d(TAG, "Enter Key down");
- }
-
mStylist.onAnimateItemPressed(avh.mStylistViewHolder,
mKeyPressed);
- handled = true;
}
break;
case KeyEvent.ACTION_UP:
+ if (DEBUG) {
+ Log.d(TAG, "Enter Key up");
+ }
+ // Sometimes we are losing ACTION_DOWN for the first ENTER after pressed
+ // Escape in IME.
if (mKeyPressed) {
mKeyPressed = false;
-
- if (DEBUG) {
- Log.d(TAG, "Enter Key up");
- }
-
mStylist.onAnimateItemPressed(avh.mStylistViewHolder, mKeyPressed);
- if (action.isEditable() || action.isDescriptionEditable()) {
- if (DEBUG_EDIT) Log.v(TAG_EDIT, "openIme click");
- openIme(avh);
- } else {
- handleCheckedActions(avh, action);
- mClickListener.onGuidedActionClicked(action);
- }
- handled = true;
}
break;
default:
@@ -457,171 +481,40 @@
return handled;
}
- private void handleCheckedActions(ActionViewHolder avh, GuidedAction action) {
- int actionCheckSetId = action.getCheckSetId();
- if (actionCheckSetId != GuidedAction.NO_CHECK_SET) {
- // Find any actions that are checked and are in the same group
- // as the selected action. Fade their checkmarks out.
- for (int i = 0, size = mActions.size(); i < size; i++) {
- GuidedAction a = mActions.get(i);
- if (a != action && a.getCheckSetId() == actionCheckSetId && a.isChecked()) {
- a.setChecked(false);
- ViewHolder vh = mRecyclerView.findViewHolderForPosition(i);
- if (vh != null) {
- GuidedActionsStylist.ViewHolder subViewHolder =
- ((ActionViewHolder)vh).mStylistViewHolder;
- mStylist.onAnimateItemChecked(subViewHolder, false);
- }
- }
- }
-
- // If we we'ren't already checked, fade our checkmark in.
- if (!action.isChecked()) {
- action.setChecked(true);
- mStylist.onAnimateItemChecked(avh.mStylistViewHolder, true);
- }
- }
- }
}
private class ActionEditListener implements OnEditorActionListener,
ImeKeyMonitor.ImeKeyListener {
- private EditListener mEditListener;
-
- public ActionEditListener(EditListener listener) {
- mEditListener = listener;
- }
-
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if (DEBUG_EDIT) Log.v(TAG_EDIT, "IME action: " + actionId);
boolean handled = false;
if (actionId == EditorInfo.IME_ACTION_NEXT ||
actionId == EditorInfo.IME_ACTION_DONE) {
-
- ActionViewHolder avh = findSubChildViewHolder(v);
- updateTextIntoAction(avh, v);
- mClickListener.onGuidedActionClicked(avh.getAction());
- long nextActionId = finishEditing(avh);
- if (nextActionId != GuidedAction.ACTION_ID_CURRENT
- && nextActionId != avh.getAction().getId()) {
- int next = getNextActionIndex(avh.getAction(), nextActionId);
- if (next != -1) {
- ActionViewHolder vh = (ActionViewHolder) mRecyclerView
- .findViewHolderForPosition(next);
- if (vh != null) {
- handled = true;
- if (vh.getAction().isEditable() ||
- vh.getAction().isDescriptionEditable()) {
- if (DEBUG_EDIT) Log.v(TAG_EDIT, "openIme next/done");
- mStylist.setEditingMode(vh.mStylistViewHolder,
- vh.getAction(), true);
- // open Ime on next action.
- openIme(vh);
- } else {
- // close IME and focus to next (not editable) action
- closeIme(v);
- vh.mStylistViewHolder.view.requestFocus();
- }
- }
- }
- }
- if (!handled) {
- if (DEBUG_EDIT) Log.v(TAG_EDIT, "closeIme no next action");
- handled = true;
- closeIme(v);
- // requestFocus() otherwise the focus might be stolen by other fragments.
- avh.mStylistViewHolder.view.requestFocus();
- }
+ mGroup.fillAndGoNext(GuidedActionAdapter.this, v);
+ handled = true;
} else if (actionId == EditorInfo.IME_ACTION_NONE) {
if (DEBUG_EDIT) Log.v(TAG_EDIT, "closeIme escape north");
// Escape north handling: stay on current item, but close editor
handled = true;
- ActionViewHolder avh = findSubChildViewHolder(v);
- finishEditing(avh);
- avh.mStylistViewHolder.view.requestFocus();
- closeIme(v);
+ mGroup.fillAndStay(GuidedActionAdapter.this, v);
}
return handled;
}
- private void updateTextIntoAction(ActionViewHolder avh, TextView v) {
- GuidedAction action = avh.getAction();
- if (v == avh.mStylistViewHolder.getDescriptionView()) {
- if (action.getEditDescription() != null) {
- action.setEditDescription(v.getText());
- } else {
- action.setDescription(v.getText());
- }
- } else if (v == avh.mStylistViewHolder.getTitleView()) {
- if (action.getEditTitle() != null) {
- action.setEditTitle(v.getText());
- } else {
- action.setTitle(v.getText());
- }
- }
- }
-
@Override
public boolean onKeyPreIme(EditText editText, int keyCode, KeyEvent event) {
if (DEBUG_EDIT) Log.v(TAG_EDIT, "IME key: " + keyCode);
if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) {
- ActionViewHolder avh = findSubChildViewHolder(editText);
- updateTextIntoAction(avh, editText);
- editText.clearFocus();
- finishEditing(avh);
- avh.mStylistViewHolder.view.requestFocus();
- if (mImeOpened) {
- mImeOpened = false;
- mEditListener.onImeClose();
- }
+ mGroup.fillAndStay(GuidedActionAdapter.this, editText);
+ } else if (keyCode == KeyEvent.KEYCODE_ENTER && event.getAction() ==
+ KeyEvent.ACTION_UP) {
+ mGroup.fillAndGoNext(GuidedActionAdapter.this, editText);
}
return false;
}
- public void openIme(ActionViewHolder avh) {
- View v = avh.mStylistViewHolder.getEditingView();
- InputMethodManager mgr = (InputMethodManager)
- v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
- v.requestFocus();
- mgr.showSoftInput(v, 0);
- if (!mImeOpened) {
- mImeOpened = true;
- mEditListener.onImeOpen();
- }
- }
-
- public long finishEditing(ActionViewHolder avh) {
- long nextActionId = mEditListener.onGuidedActionEdited(avh.getAction());
- mStylist.setEditingMode(avh.mStylistViewHolder, avh.getAction(), false);
- return nextActionId;
- }
-
- public void closeIme(View v) {
- if (mImeOpened) {
- mImeOpened = false;
- InputMethodManager mgr = (InputMethodManager)
- v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
- v.clearFocus();
- mgr.hideSoftInputFromWindow(v.getWindowToken(), 0);
- mEditListener.onImeClose();
- }
- }
-
- private ActionViewHolder findSubChildViewHolder(View v) {
- // Needed because RecyclerView.getChildViewHolder does not traverse the hierarchy
- ActionViewHolder result = null;
- ViewParent parent = v.getParent();
- while (parent != mRecyclerView && parent != null && v != null) {
- v = (View)parent;
- parent = parent.getParent();
- }
- if (parent != null && v != null) {
- result = (ActionViewHolder)mRecyclerView.getChildViewHolder(v);
- }
- return result;
- }
}
}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapterGroup.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapterGroup.java
new file mode 100644
index 0000000..8f8951c
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedActionAdapterGroup.java
@@ -0,0 +1,188 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package android.support.v17.leanback.app;
+
+import android.content.Context;
+import android.support.v17.leanback.app.GuidedActionAdapter.ActionViewHolder;
+import android.support.v17.leanback.app.GuidedActionAdapter.ClickListener;
+import android.support.v17.leanback.app.GuidedActionAdapter.EditListener;
+import android.support.v17.leanback.widget.GuidedAction;
+import android.support.v17.leanback.widget.ImeKeyMonitor;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.view.ViewParent;
+import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
+import android.widget.TextView;
+import android.widget.TextView.OnEditorActionListener;
+
+import java.util.ArrayList;
+
+/**
+ * Internal implementation manages a group of GuidedActionAdapters, control the next action after
+ * editing finished, maintain the Ime open/close status.
+ */
+class GuidedActionAdapterGroup {
+
+ private static final String TAG_EDIT = "EditableAction";
+ private static final boolean DEBUG_EDIT = false;
+
+ ArrayList<GuidedActionAdapter> mAdapters = new ArrayList<GuidedActionAdapter>();
+ private boolean mImeOpened;
+ private EditListener mEditListener;
+
+ GuidedActionAdapterGroup() {
+ }
+
+ public void addAdpter(GuidedActionAdapter adapter) {
+ mAdapters.add(adapter);
+ adapter.mGroup = this;
+ }
+
+ public void setEditListener(EditListener listener) {
+ mEditListener = listener;
+ }
+
+ boolean focusToNextAction(GuidedActionAdapter adapter, GuidedAction action, long nextActionId) {
+ // for ACTION_ID_NEXT, we first find out the matching index in Actions list.
+ int index = 0;
+ if (nextActionId == GuidedAction.ACTION_ID_NEXT) {
+ index = adapter.indexOf(action);
+ if (index < 0) {
+ return false;
+ }
+ // start from next, if reach end, will go next Adapter below
+ index++;
+ }
+
+ int adapterIndex = mAdapters.indexOf(adapter);
+ do {
+ int size = adapter.getCount();
+ if (nextActionId == GuidedAction.ACTION_ID_NEXT) {
+ while (index < size && !adapter.getItem(index).isFocusable()) {
+ index++;
+ }
+ } else {
+ while (index < size && adapter.getItem(index).getId() != nextActionId) {
+ index++;
+ }
+ }
+ if (index < size) {
+ ActionViewHolder vh = (ActionViewHolder) adapter.getGuidedActionsStylist()
+ .getActionsGridView().findViewHolderForPosition(index);
+ if (vh != null) {
+ if (vh.getAction().isEditable() || vh.getAction().isDescriptionEditable()) {
+ if (DEBUG_EDIT) Log.v(TAG_EDIT, "openIme of next Action");
+ // open Ime on next action.
+ openIme(adapter, vh);
+ } else {
+ if (DEBUG_EDIT) Log.v(TAG_EDIT, "closeIme and focus to next Action");
+ // close IME and focus to next (not editable) action
+ closeIme(vh.mStylistViewHolder.view);
+ vh.mStylistViewHolder.view.requestFocus();
+ }
+ return true;
+ }
+ return false;
+ }
+ // search from index 0 of next Adapter
+ adapterIndex++;
+ if (adapterIndex >= mAdapters.size()) {
+ break;
+ }
+ adapter = mAdapters.get(adapterIndex);
+ index = 0;
+ } while (true);
+ return false;
+ }
+
+ public void openIme(GuidedActionAdapter adapter, ActionViewHolder avh) {
+ adapter.getGuidedActionsStylist().setEditingMode(avh.mStylistViewHolder, avh.getAction(),
+ true);
+ View v = avh.mStylistViewHolder.getEditingView();
+ if (v == null) {
+ return;
+ }
+ InputMethodManager mgr = (InputMethodManager)
+ v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ v.requestFocus();
+ mgr.showSoftInput(v, 0);
+ if (!mImeOpened) {
+ mImeOpened = true;
+ mEditListener.onImeOpen();
+ }
+ }
+
+ public void closeIme(View v) {
+ if (mImeOpened) {
+ mImeOpened = false;
+ InputMethodManager mgr = (InputMethodManager)
+ v.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+ mgr.hideSoftInputFromWindow(v.getWindowToken(), 0);
+ mEditListener.onImeClose();
+ }
+ }
+
+ private long finishEditing(GuidedActionAdapter adapter, ActionViewHolder avh) {
+ long nextActionId = mEditListener.onGuidedActionEdited(avh.getAction());
+ adapter.getGuidedActionsStylist().setEditingMode(avh.mStylistViewHolder, avh.getAction(),
+ false);
+ return nextActionId;
+ }
+
+ public void fillAndStay(GuidedActionAdapter adapter, TextView v) {
+ ActionViewHolder avh = adapter.findSubChildViewHolder(v);
+ updateTextIntoAction(avh, v);
+ finishEditing(adapter, avh);
+ closeIme(v);
+ avh.mStylistViewHolder.view.requestFocus();
+ }
+
+ public void fillAndGoNext(GuidedActionAdapter adapter, TextView v) {
+ boolean handled = false;
+ ActionViewHolder avh = adapter.findSubChildViewHolder(v);
+ updateTextIntoAction(avh, v);
+ adapter.performOnActionClick(avh);
+ long nextActionId = finishEditing(adapter, avh);
+ if (nextActionId != GuidedAction.ACTION_ID_CURRENT
+ && nextActionId != avh.getAction().getId()) {
+ handled = focusToNextAction(adapter, avh.getAction(), nextActionId);
+ }
+ if (!handled) {
+ if (DEBUG_EDIT) Log.v(TAG_EDIT, "closeIme no next action");
+ handled = true;
+ closeIme(v);
+ avh.mStylistViewHolder.view.requestFocus();
+ }
+ }
+
+ private void updateTextIntoAction(ActionViewHolder avh, TextView v) {
+ GuidedAction action = avh.getAction();
+ if (v == avh.mStylistViewHolder.getDescriptionView()) {
+ if (action.getEditDescription() != null) {
+ action.setEditDescription(v.getText());
+ } else {
+ action.setDescription(v.getText());
+ }
+ } else if (v == avh.mStylistViewHolder.getTitleView()) {
+ if (action.getEditTitle() != null) {
+ action.setEditTitle(v.getText());
+ } else {
+ action.setTitle(v.getText());
+ }
+ }
+ }
+
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
index d10af53..8be8f24 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepFragment.java
@@ -33,6 +33,7 @@
import android.support.v17.leanback.widget.GuidedActionsStylist;
import android.support.v17.leanback.widget.VerticalGridView;
import android.support.v4.app.ActivityCompat;
+import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
@@ -44,6 +45,7 @@
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
@@ -72,6 +74,11 @@
* <li>{@link #add(FragmentManager, GuidedStepFragment)} or {@link #add(FragmentManager,
* GuidedStepFragment, int)}, to add GuidedStepFragment on top of existing Fragments or
* replacing existing GuidedStepFragment when moving forward to next step.</li>
+ * <li>{@link #finishGuidedStepFragments()} can either finish the activity or pop all
+ * GuidedStepFragment from stack.
+ * <li>If app chooses not to use the helper function, it is the app's responsibility to call
+ * {@link #setUiStyle(int)} to select fragment transition and remember the stack entry where it
+ * need pops to.
* </ul>
* <h3>Theming and Stylists</h3>
* <p>
@@ -121,6 +128,11 @@
*
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepTheme
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepBackground
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionContentWidthWeight
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionContentWidthWeightTwoPanels
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsBackground
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsBackgroundDark
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsElevation
* @see GuidanceStylist
* @see GuidanceStylist.Guidance
* @see GuidedAction
@@ -132,15 +144,13 @@
private static final String TAG_LEAN_BACK_ACTIONS_FRAGMENT = "leanBackGuidedStepFragment";
private static final String EXTRA_ACTION_SELECTED_INDEX = "selectedIndex";
- private static final String ENTRY_NAME_DEFAULT = "GuidedStepDefault";
+ private static final String ENTRY_NAME_REPLACE = "GuidedStepDefault";
private static final String ENTRY_NAME_ENTRANCE = "GuidedStepEntrance";
- private static final boolean IS_FRAMEWORK_FRAGMENT = true;
-
/**
* Fragment argument name for UI style. The argument value is persisted in fragment state.
- * The value is initially {@link #UI_STYLE_DEFAULT} and might be changed in one of the three
+ * The value is initially {@link #UI_STYLE_ENTRANCE} and might be changed in one of the three
* helper functions:
* <ul>
* <li>{@link #addAsRoot(Activity, GuidedStepFragment, int)}</li>
@@ -150,7 +160,7 @@
* <p>
* Argument value can be either:
* <ul>
- * <li>{@link #UI_STYLE_DEFAULT}</li>
+ * <li>{@link #UI_STYLE_REPLACE}</li>
* <li>{@link #UI_STYLE_ENTRANCE}</li>
* <li>{@link #UI_STYLE_ACTIVITY_ROOT}</li>
* </ul>
@@ -158,42 +168,37 @@
public static final String EXTRA_UI_STYLE = "uiStyle";
/**
- * Default value for argument {@link #EXTRA_UI_STYLE}. The default value is assigned
- * in GuidedStepFragment constructor. This is the case that we use GuidedStepFragment to
- * replace another existing GuidedStepFragment when moving forward to next step. Default
- * behavior of this style is:
+ * This is the case that we use GuidedStepFragment to replace another existing
+ * GuidedStepFragment when moving forward to next step. Default behavior of this style is:
* <ul>
- * <li> Enter transition slides in from END(right), exit transition slide out to START(left).
+ * <li>Enter transition slides in from END(right), exit transition same as
+ * {@link #UI_STYLE_ENTRANCE}.
* </li>
- * <li> No background, see {@link #onProvideBackgroundFragment()}.</li>
* </ul>
*/
- public static final int UI_STYLE_DEFAULT = 0;
+ public static final int UI_STYLE_REPLACE = 0;
/**
- * One possible value of argument {@link #EXTRA_UI_STYLE}. This is the case that we show
- * GuidedStepFragment on top of other content. The default behavior of this style:
+ * Default value for argument {@link #EXTRA_UI_STYLE}. The default value is assigned in
+ * GuidedStepFragment constructor. This is the case that we show GuidedStepFragment on top of
+ * other content. The default behavior of this style:
* <ul>
- * <li>Enter transition slides in from two sides, exit transition is inherited from
- * {@link #UI_STYLE_DEFAULT}. Note: Changing exit transition by UI style is not working because
- * fragment transition asks for exit transition before UI style is restored in Fragment
+ * <li>Enter transition slides in from two sides, exit transition slide out to START(left).
+ * Background will be faded in. Note: Changing exit transition by UI style is not working
+ * because fragment transition asks for exit transition before UI style is restored in Fragment
* .onCreate().</li>
- * <li> {@link #onProvideBackgroundFragment()} will create {@link GuidedStepBackgroundFragment}
- * to covering underneath content. The activity must provide a container to host background
- * fragment and override {@link #getContainerIdForBackground()}</li>
* </ul>
*/
public static final int UI_STYLE_ENTRANCE = 1;
/**
- * One possible value of argument {@link #EXTRA_UI_STYLE}. This is the case that we show first
- * GuidedStepFragment in a separate activity. The default behavior of this style:
+ * One possible value of argument {@link #EXTRA_UI_STYLE}. This is the case that we show first
+ * GuidedStepFragment in a separate activity. The default behavior of this style:
* <ul>
- * <li> Enter transition is assigned null (will rely on activity transition), exit transition is
- * same as {@link #UI_STYLE_DEFAULT}. Note: Changing exit transition by UI style is not working
+ * <li>Enter transition is assigned null (will rely on activity transition), exit transition is
+ * same as {@link #UI_STYLE_ENTRANCE}. Note: Changing exit transition by UI style is not working
* because fragment transition asks for exit transition before UI style is restored in
* Fragment.onCreate().</li>
- * <li> No background, see {@link #onProvideBackgroundFragment()}.
* </ul>
*/
public static final int UI_STYLE_ACTIVITY_ROOT = 2;
@@ -205,10 +210,14 @@
private ContextThemeWrapper mThemeWrapper;
private GuidanceStylist mGuidanceStylist;
private GuidedActionsStylist mActionsStylist;
+ private GuidedActionsStylist mButtonActionsStylist;
private GuidedActionAdapter mAdapter;
- private VerticalGridView mListView;
+ private GuidedActionAdapter mButtonAdapter;
+ private GuidedActionAdapterGroup mAdapterGroup;
private List<GuidedAction> mActions = new ArrayList<GuidedAction>();
+ private List<GuidedAction> mButtonActions = new ArrayList<GuidedAction>();
private int mSelectedIndex = -1;
+ private int mButtonSelectedIndex = -1;
public GuidedStepFragment() {
// We need to supply the theme before any potential call to onInflate in order
@@ -216,6 +225,7 @@
mTheme = onProvideTheme();
mGuidanceStylist = onCreateGuidanceStylist();
mActionsStylist = onCreateActionsStylist();
+ mButtonActionsStylist = onCreateButtonActionsStylist();
onProvideFragmentTransitions();
}
@@ -238,6 +248,15 @@
}
/**
+ * Creates the presenter used to style a sided actions panel for button only.
+ * The default implementation returns a basic GuidedActionsStylist.
+ * @return The GuidedActionsStylist used in this fragment.
+ */
+ public GuidedActionsStylist onCreateButtonActionsStylist() {
+ return new GuidedActionsStylist();
+ }
+
+ /**
* Returns the theme used for styling the fragment. The default returns -1, indicating that the
* host Activity's theme should be used.
* @return The theme resource ID of the theme to use in this fragment, or -1 to use the
@@ -269,6 +288,16 @@
}
/**
+ * Fills out the set of actions shown at right available to the user. This hook is called during
+ * {@link #onCreate}. The default leaves the list of actions empty; subclasses may override.
+ * @param actions A non-null, empty list ready to be populated.
+ * @param savedInstanceState The saved instance state from onCreate.
+ */
+ public void onCreateButtonActions(@NonNull List<GuidedAction> actions,
+ Bundle savedInstanceState) {
+ }
+
+ /**
* Callback invoked when an action is taken by the user. Subclasses should override in
* order to act on the user's decisions.
* @param action The chosen action.
@@ -311,7 +340,7 @@
* GuidedStepFragments in the stack, and configuring the fragment-to-fragment custom
* transitions. A backstack entry is added, so the fragment will be dismissed when BACK key
* is pressed.
- * <li>If current fragment on stack is GuidedStepFragment: assign {@link #UI_STYLE_DEFAULT}
+ * <li>If current fragment on stack is GuidedStepFragment: assign {@link #UI_STYLE_REPLACE}
* <li>If current fragment on stack is not GuidedStepFragment: assign {@link #UI_STYLE_ENTRANCE}
* <p>
* Note: currently fragments added using this method must be created programmatically rather
@@ -329,7 +358,9 @@
* GuidedStepFragments in the stack, and configuring the fragment-to-fragment custom
* transitions. A backstack entry is added, so the fragment will be dismissed when BACK key
* is pressed.
- * <li>If current fragment on stack is GuidedStepFragment: assign {@link #UI_STYLE_DEFAULT}
+ * <li>If current fragment on stack is GuidedStepFragment: assign {@link #UI_STYLE_REPLACE} and
+ * {@link #onAddSharedElementTransition(FragmentTransaction, GuidedStepFragment)} will be called
+ * to perform shared element transition between GuidedStepFragments.
* <li>If current fragment on stack is not GuidedStepFragment: assign {@link #UI_STYLE_ENTRANCE}
* <p>
* Note: currently fragments added using this method must be created programmatically rather
@@ -340,24 +371,58 @@
* @return The ID returned by the call FragmentTransaction.replace.
*/
public static int add(FragmentManager fragmentManager, GuidedStepFragment fragment, int id) {
- boolean inGuidedStep = getCurrentGuidedStepFragment(fragmentManager) != null;
- if (IS_FRAMEWORK_FRAGMENT && Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23
- && !inGuidedStep && fragment.getContainerIdForBackground() != View.NO_ID) {
- // workaround b/22631964 for framework fragment
- fragmentManager.beginTransaction()
- .replace(id, new DummyFragment(), TAG_LEAN_BACK_ACTIONS_FRAGMENT)
- .replace(fragment.getContainerIdForBackground(), new DummyFragment())
- .commit();
- }
+ GuidedStepFragment current = getCurrentGuidedStepFragment(fragmentManager);
+ boolean inGuidedStep = current != null;
FragmentTransaction ft = fragmentManager.beginTransaction();
- fragment.setUiStyle(inGuidedStep ? UI_STYLE_DEFAULT : UI_STYLE_ENTRANCE);
+ fragment.setUiStyle(inGuidedStep ? UI_STYLE_REPLACE : UI_STYLE_ENTRANCE);
ft.addToBackStack(fragment.generateStackEntryName());
- initialBackground(fragment, id, ft);
+ if (current != null) {
+ fragment.onAddSharedElementTransition(ft, current);
+ }
return ft.replace(id, fragment, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
}
/**
+ * Called when this fragment is added to FragmentTransaction with {@link #UI_STYLE_REPLACE} (aka
+ * when the GuidedStepFragment replacing an existing GuidedStepFragment). Default implementation
+ * establishes connections between action background views to morph action background bounds
+ * change from disappearing GuidedStepFragment into this GuidedStepFragment. The default
+ * implementation heavily relies on {@link GuidedActionsStylist}'s layout, app may override this
+ * method when modifying the default layout of {@link GuidedActionsStylist}.
+ *
+ * @see GuidedActionsStylist
+ * @see #onProvideFragmentTransitions()
+ * @param ft The FragmentTransaction to add shared element.
+ * @param disappearing The disappearing fragment.
+ */
+ protected void onAddSharedElementTransition(FragmentTransaction ft, GuidedStepFragment
+ disappearing) {
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.action_fragment_root), "action_fragment_root");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.action_fragment_background), "action_fragment_background");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.action_fragment), "action_fragment");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_root), "guidedactions_root");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_selector), "guidedactions_selector");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_content), "guidedactions_content");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_list_background), "guidedactions_list_background");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_root2), "guidedactions_root2");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_selector2), "guidedactions_selector2");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_content2), "guidedactions_content2");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_list_background2), "guidedactions_list_background2");
+ }
+
+ /**
* Returns BackStackEntry name for the GuidedStepFragment or empty String if no entry is
* associated. Note {@link #UI_STYLE_ACTIVITY_ROOT} will return empty String. The method
* returns undefined value if the fragment is not in FragmentManager.
@@ -371,7 +436,7 @@
/**
* Generates BackStackEntry name for GuidedStepFragment class or empty String if no entry is
* associated. Note {@link #UI_STYLE_ACTIVITY_ROOT} is not allowed and returns empty String.
- * @param uiStyle {@link #UI_STYLE_DEFAULT} or {@link #UI_STYLE_ENTRANCE}
+ * @param uiStyle {@link #UI_STYLE_REPLACE} or {@link #UI_STYLE_ENTRANCE}
* @return BackStackEntry name for the GuidedStepFragment or empty String if no entry is
* associated.
*/
@@ -380,8 +445,8 @@
return "";
}
switch (uiStyle) {
- case UI_STYLE_DEFAULT:
- return ENTRY_NAME_DEFAULT + guidedStepFragmentClass.getName();
+ case UI_STYLE_REPLACE:
+ return ENTRY_NAME_REPLACE + guidedStepFragmentClass.getName();
case UI_STYLE_ENTRANCE:
return ENTRY_NAME_ENTRANCE + guidedStepFragmentClass.getName();
case UI_STYLE_ACTIVITY_ROOT:
@@ -402,14 +467,14 @@
}
/**
- * Returns true if the backstack represents GuidedStepFragment with {@link #UI_STYLE_DEFAULT};
+ * Returns true if the backstack represents GuidedStepFragment with {@link #UI_STYLE_REPLACE};
* false otherwise.
* @param backStackEntryName Name of BackStackEntry.
- * @return True if the backstack represents GuidedStepFragment with {@link #UI_STYLE_DEFAULT};
+ * @return True if the backstack represents GuidedStepFragment with {@link #UI_STYLE_REPLACE};
* false otherwise.
*/
public static boolean isUiStyleDefault(String backStackEntryName) {
- return backStackEntryName != null && backStackEntryName.startsWith(ENTRY_NAME_DEFAULT);
+ return backStackEntryName != null && backStackEntryName.startsWith(ENTRY_NAME_REPLACE);
}
/**
@@ -418,8 +483,8 @@
* @return Class name of GuidedStepFragment.
*/
public static String getGuidedStepFragmentClassName(String backStackEntryName) {
- if (backStackEntryName.startsWith(ENTRY_NAME_DEFAULT)) {
- return backStackEntryName.substring(ENTRY_NAME_DEFAULT.length());
+ if (backStackEntryName.startsWith(ENTRY_NAME_REPLACE)) {
+ return backStackEntryName.substring(ENTRY_NAME_REPLACE.length());
} else if (backStackEntryName.startsWith(ENTRY_NAME_ENTRANCE)) {
return backStackEntryName.substring(ENTRY_NAME_ENTRANCE.length());
} else {
@@ -446,19 +511,9 @@
FragmentManager fragmentManager = activity.getFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
fragment.setUiStyle(UI_STYLE_ACTIVITY_ROOT);
- initialBackground(fragment, id, ft);
return ft.replace(id, fragment, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
}
- static void initialBackground(GuidedStepFragment fragment, int id, FragmentTransaction ft) {
- if (fragment.getContainerIdForBackground() != View.NO_ID) {
- Fragment backgroundFragment = fragment.onProvideBackgroundFragment();
- if (backgroundFragment != null) {
- ft.replace(fragment.getContainerIdForBackground(), backgroundFragment);
- }
- }
- }
-
/**
* Returns the current GuidedStepFragment on the fragment transaction stack.
* @return The current GuidedStepFragment, if any, on the fragment transaction stack.
@@ -472,20 +527,6 @@
}
/**
- * @hide
- */
- public static class DummyFragment extends Fragment {
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- final View v = new View(inflater.getContext());
- v.setVisibility(View.GONE);
- return v;
- }
- }
-
- /**
* Returns the GuidanceStylist that displays guidance information for the user.
* @return The GuidanceStylist for this fragment.
*/
@@ -502,6 +543,99 @@
}
/**
+ * Returns the list of button GuidedActions that the user may take in this fragment.
+ * @return The list of button GuidedActions for this fragment.
+ */
+ public List<GuidedAction> getButtonActions() {
+ return mButtonActions;
+ }
+
+ /**
+ * Find button GuidedAction by Id.
+ * @param id Id of the button action to search.
+ * @return GuidedAction object or null if not found.
+ */
+ public GuidedAction findButtonActionById(long id) {
+ int index = findButtonActionPositionById(id);
+ return index >= 0 ? mButtonActions.get(index) : null;
+ }
+
+ /**
+ * Find button GuidedAction position in array by Id.
+ * @param id Id of the button action to search.
+ * @return position of GuidedAction object in array or -1 if not found.
+ */
+ public int findButtonActionPositionById(long id) {
+ if (mButtonActions != null) {
+ for (int i = 0; i < mButtonActions.size(); i++) {
+ GuidedAction action = mButtonActions.get(i);
+ if (mButtonActions.get(i).getId() == id) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Returns the GuidedActionsStylist that displays the button actions the user may take.
+ * @return The GuidedActionsStylist for this fragment.
+ */
+ public GuidedActionsStylist getGuidedButtonActionsStylist() {
+ return mButtonActionsStylist;
+ }
+
+ /**
+ * Sets the list of button GuidedActions that the user may take in this fragment.
+ * @param actions The list of button GuidedActions for this fragment.
+ */
+ public void setButtonActions(List<GuidedAction> actions) {
+ mButtonActions = actions;
+ if (mButtonAdapter != null) {
+ mButtonAdapter.setActions(mButtonActions);
+ }
+ }
+
+ /**
+ * Notify an button action has changed and update its UI.
+ * @param position Position of the button GuidedAction in array.
+ */
+ public void notifyButtonActionChanged(int position) {
+ if (mButtonAdapter != null) {
+ mButtonAdapter.notifyItemChanged(position);
+ }
+ }
+
+ /**
+ * Returns the view corresponding to the button action at the indicated position in the list of
+ * actions for this fragment.
+ * @param position The integer position of the button action of interest.
+ * @return The View corresponding to the button action at the indicated position, or null if
+ * that action is not currently onscreen.
+ */
+ public View getButtonActionItemView(int position) {
+ final RecyclerView.ViewHolder holder = mButtonActionsStylist.getActionsGridView()
+ .findViewHolderForPosition(position);
+ return holder == null ? null : holder.itemView;
+ }
+
+ /**
+ * Scrolls the action list to the position indicated, selecting that button action's view.
+ * @param position The integer position of the button action of interest.
+ */
+ public void setSelectedButtonActionPosition(int position) {
+ mButtonActionsStylist.getActionsGridView().setSelectedPosition(position);
+ }
+
+ /**
+ * Returns the position if the currently selected button GuidedAction.
+ * @return position The integer position of the currently selected button action.
+ */
+ public int getSelectedButtonActionPosition() {
+ return mButtonActionsStylist.getActionsGridView().getSelectedPosition();
+ }
+
+ /**
* Returns the list of GuidedActions that the user may take in this fragment.
* @return The list of GuidedActions for this fragment.
*/
@@ -565,7 +699,9 @@
* action is not currently onscreen.
*/
public View getActionItemView(int position) {
- return mListView.findViewHolderForPosition(position).itemView;
+ final RecyclerView.ViewHolder holder = mActionsStylist.getActionsGridView()
+ .findViewHolderForPosition(position);
+ return holder == null ? null : holder.itemView;
}
/**
@@ -573,7 +709,7 @@
* @param position The integer position of the action of interest.
*/
public void setSelectedActionPosition(int position) {
- mListView.setSelectedPosition(position);
+ mActionsStylist.getActionsGridView().setSelectedPosition(position);
}
/**
@@ -581,157 +717,126 @@
* @return position The integer position of the currently selected action.
*/
public int getSelectedActionPosition() {
- return mListView.getSelectedPosition();
+ return mActionsStylist.getActionsGridView().getSelectedPosition();
}
/**
- * Called by Constructor to provide fragment transitions. Default implementation creates
- * a short slide and fade transition in code for {@link #UI_STYLE_DEFAULT} for both enter and
- * exit transition. When using style {@link #UI_STYLE_ENTRANCE}, enter transition is set
- * to slide from both sides. When using style {@link #UI_STYLE_ACTIVITY_ROOT}, enter
- * transition is set to null and you should rely on activity transition.
+ * Called by Constructor to provide fragment transitions. The default implementation assigns
+ * transitions based on {@link #getUiStyle()}:
+ * <ul>
+ * <li> {@link #UI_STYLE_REPLACE} Slide from/to end(right) for enter transition, slide from/to
+ * start(left) for exit transition, shared element enter transition is set to ChangeBounds.
+ * <li> {@link #UI_STYLE_ENTRANCE} Enter transition is set to slide from both sides, exit
+ * transition is same as {@link #UI_STYLE_REPLACE}, no shared element enter transition.
+ * <li> {@link #UI_STYLE_ACTIVITY_ROOT} Enter transition is set to null and app should rely on
+ * activity transition, exit transition is same as {@link #UI_STYLE_REPLACE}, no shared element
+ * enter transition.
+ * </ul>
* <p>
- * Subclass may override and set its own fragment transition. Note that because Context is not
- * available when onProvideFragmentTransitions() is called, subclass will need use a cached
- * static application context to load transition from xml. Because the fragment view is
- * removed during fragment transition, in general app cannot use two Visibility transition
- * together. Workaround is to create your own Visibility transition that controls multiple
- * animators (e.g. slide and fade animation in one Transition class).
+ * The default implementation heavily relies on {@link GuidedActionsStylist} and
+ * {@link GuidanceStylist} layout, app may override this method when modifying the default
+ * layout of {@link GuidedActionsStylist} or {@link GuidanceStylist}.
+ * <p>
+ * TIP: because the fragment view is removed during fragment transition, in general app cannot
+ * use two Visibility transition together. Workaround is to create your own Visibility
+ * transition that controls multiple animators (e.g. slide and fade animation in one Transition
+ * class).
*/
protected void onProvideFragmentTransitions() {
if (Build.VERSION.SDK_INT >= 21) {
- if (getUiStyle() == UI_STYLE_DEFAULT) {
+ final int uiStyle = getUiStyle();
+ if (uiStyle == UI_STYLE_REPLACE) {
Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END);
- TransitionHelper.exclude(enterTransition, R.id.guidedactions_background, true);
- TransitionHelper.exclude(enterTransition, R.id.guidedactions_selector, true);
+ TransitionHelper.exclude(enterTransition, R.id.guidedstep_background, true);
TransitionHelper.setEnterTransition(this, enterTransition);
- Object exitTransition = TransitionHelper.createFadeAndShortSlide(Gravity.START);
- TransitionHelper.exclude(exitTransition, R.id.guidedactions_background, true);
- TransitionHelper.exclude(exitTransition, R.id.guidedactions_selector, true);
- TransitionHelper.setExitTransition(this, exitTransition);
- } else if (getUiStyle() == UI_STYLE_ENTRANCE) {
- Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END |
+
+ Object changeBounds = TransitionHelper.createChangeBounds(false);
+ TransitionHelper.setSharedElementEnterTransition(this, changeBounds);
+ } else if (uiStyle == UI_STYLE_ENTRANCE) {
+ Object fade = TransitionHelper.createFadeTransition(TransitionHelper.FADE_IN |
+ TransitionHelper.FADE_OUT);
+ TransitionHelper.include(fade, R.id.guidedstep_background);
+ Object slide = TransitionHelper.createFadeAndShortSlide(Gravity.END |
Gravity.START);
- TransitionHelper.include(enterTransition, R.id.content_fragment);
- TransitionHelper.include(enterTransition, R.id.action_fragment);
+ TransitionHelper.include(slide, R.id.content_fragment);
+ TransitionHelper.include(slide, R.id.action_fragment_root);
+ Object enterTransition = TransitionHelper.createTransitionSet(false);
+ TransitionHelper.addTransition(enterTransition, fade);
+ TransitionHelper.addTransition(enterTransition, slide);
TransitionHelper.setEnterTransition(this, enterTransition);
- // exit transition is unchanged, same as UI_STYLE_DEFAULT
- } else if (getUiStyle() == UI_STYLE_ACTIVITY_ROOT) {
+
+ // No shared element transition
+ TransitionHelper.setSharedElementEnterTransition(this, null);
+ } else if (uiStyle == UI_STYLE_ACTIVITY_ROOT) {
// for Activity root, we dont need enter transition, use activity transition
TransitionHelper.setEnterTransition(this, null);
- // exit transition is unchanged, same as UI_STYLE_DEFAULT
+ // No shared element transition
+ TransitionHelper.setSharedElementEnterTransition(this, null);
}
+ // exitTransition is same for all style
+ Object exitTransition = TransitionHelper.createFadeAndShortSlide(Gravity.START);
+ TransitionHelper.exclude(exitTransition, R.id.guidedstep_background, true);
+ TransitionHelper.setExitTransition(this, exitTransition);
}
}
/**
- * Default implementation of background for covering content below GuidedStepFragment.
- * It uses current theme attribute guidedStepBackground which by default is read from
- * android:windowBackground.
+ * Called by onCreateView to inflate background view. Default implementation loads view
+ * from {@link R.layout#lb_guidedstep_background} which holds a reference to
+ * guidedStepBackground.
+ * @param inflater LayoutInflater to load background view.
+ * @param container Parent view of background view.
+ * @param savedInstanceState
+ * @return Created background view or null if no background.
*/
- public static class GuidedStepBackgroundFragment extends Fragment {
- public GuidedStepBackgroundFragment() {
- onProvideFragmentTransitions();
- }
-
- /**
- * Sets fragment transitions for GuidedStepBackgroundFragment. Can be overridden.
- */
- protected void onProvideFragmentTransitions() {
- if (Build.VERSION.SDK_INT >= 21) {
- Object enterTransition = TransitionHelper.createFadeTransition(
- TransitionHelper.FADE_IN|TransitionHelper.FADE_OUT);
- TransitionHelper.setEnterTransition(this, enterTransition);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- Activity activity = getActivity();
- Context themedContext = null;
- if (!isGuidedStepTheme(activity)) {
- // Look up the guidedStepTheme in the activity's currently specified theme. If it
- // exists, replace the theme with its value.
- int resId = R.attr.guidedStepTheme;
- TypedValue typedValue = new TypedValue();
- boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
- if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);
- if (found) {
- ContextThemeWrapper themeWrapper =
- new ContextThemeWrapper(activity, typedValue.resourceId);
- if (isGuidedStepTheme(themeWrapper)) {
- themedContext = themeWrapper;
- }
- }
- if (!found) {
- Log.e(TAG, "GuidedStepFragment does not have an appropriate theme set.");
- }
- }
-
- if (themedContext != null) {
- inflater = inflater.cloneInContext(themedContext);
- }
-
- return inflater.inflate(R.layout.lb_guidedstep_background, container, false);
- }
+ public View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.lb_guidedstep_background, container, false);
}
/**
- * Creates a background fragment for {@link #UI_STYLE_ENTRANCE}, returns null for other cases.
- * Subclass may override the default behavior, e.g. provide different backgrounds
- * for {@link #UI_STYLE_DEFAULT}. Background fragment will be inserted in {@link
- * #getContainerIdForBackground()}.
+ * Set UI style to fragment arguments. Default value is {@link #UI_STYLE_ENTRANCE} when fragment
+ * is first initialized. UI style is used to choose different fragment transition animations and
+ * determine if this is the first GuidedStepFragment on backstack. In most cases app does not
+ * directly call this method, app calls helper function
+ * {@link #add(FragmentManager, GuidedStepFragment, int)}. However if the app creates Fragment
+ * transaction and controls backstack by itself, it would need call setUiStyle() to select the
+ * fragment transition to use.
*
- * @return fragment that will be inserted below GuidedStepFragment.
- */
- protected Fragment onProvideBackgroundFragment() {
- if (getUiStyle() == UI_STYLE_ENTRANCE) {
- return new GuidedStepBackgroundFragment();
- }
- return null;
- }
-
- /**
- * Returns container id for inserting {@link #onProvideBackgroundFragment()}. The id should be
- * different than container id for inserting GuidedStepFragment.
- * Default value is {@link View#NO_ID}. Subclass must override to host background fragment.
- * @return container id for inserting {@link #onProvideBackgroundFragment()}
- */
- protected int getContainerIdForBackground() {
- return View.NO_ID;
- }
-
-
- /**
- * Set UI style to fragment arguments, UI style cannot be changed after initialization.
- * @param style {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_DEFAULT} or
- * {@link #UI_STYLE_ENTRANCE}.
+ * @param style {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_REPLACE} or
+ * {@link #UI_STYLE_ENTRANCE}.
*/
public void setUiStyle(int style) {
int oldStyle = getUiStyle();
Bundle arguments = getArguments();
+ boolean isNew = false;
if (arguments == null) {
arguments = new Bundle();
+ isNew = true;
}
arguments.putInt(EXTRA_UI_STYLE, style);
// call setArgument() will validate if the fragment is already added.
- setArguments(arguments);
+ if (isNew) {
+ setArguments(arguments);
+ }
if (style != oldStyle) {
onProvideFragmentTransitions();
}
}
/**
- * Read UI style from fragment arguments.
+ * Read UI style from fragment arguments. Default value is {@link #UI_STYLE_ENTRANCE} when
+ * fragment is first initialized. UI style is used to choose different fragment transition
+ * animations and determine if this is the first GuidedStepFragment on backstack.
*
- * @return {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_DEFAULT} or
+ * @return {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_REPLACE} or
* {@link #UI_STYLE_ENTRANCE}.
+ * @see #onProvideFragmentTransitions()
*/
public int getUiStyle() {
Bundle b = getArguments();
- if (b == null) return UI_STYLE_DEFAULT;
- return b.getInt(EXTRA_UI_STYLE, UI_STYLE_DEFAULT);
+ if (b == null) return UI_STYLE_ENTRANCE;
+ return b.getInt(EXTRA_UI_STYLE, UI_STYLE_ENTRANCE);
}
/**
@@ -749,8 +854,26 @@
mSelectedIndex = state.getInt(EXTRA_ACTION_SELECTED_INDEX, -1);
}
}
- mActions.clear();
- onCreateActions(mActions, savedInstanceState);
+ ArrayList<GuidedAction> actions = new ArrayList<GuidedAction>();
+ onCreateActions(actions, savedInstanceState);
+ setActions(actions);
+ ArrayList<GuidedAction> buttonActions = new ArrayList<GuidedAction>();
+ onCreateButtonActions(buttonActions, savedInstanceState);
+ setButtonActions(buttonActions);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onDestroyView() {
+ mGuidanceStylist.onDestroyView();
+ mActionsStylist.onDestroyView();
+ mButtonActionsStylist.onDestroyView();
+ mAdapter = null;
+ mButtonAdapter = null;
+ mAdapterGroup = null;
+ super.onDestroyView();
}
/**
@@ -764,9 +887,10 @@
resolveTheme();
inflater = getThemeInflater(inflater);
- View v = inflater.inflate(R.layout.lb_guidedstep_fragment, container, false);
- ViewGroup guidanceContainer = (ViewGroup) v.findViewById(R.id.content_fragment);
- ViewGroup actionContainer = (ViewGroup) v.findViewById(R.id.action_fragment);
+ ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_guidedstep_fragment,
+ container, false);
+ ViewGroup guidanceContainer = (ViewGroup) root.findViewById(R.id.content_fragment);
+ ViewGroup actionContainer = (ViewGroup) root.findViewById(R.id.action_fragment);
Guidance guidance = onCreateGuidance(savedInstanceState);
View guidanceView = mGuidanceStylist.onCreateView(inflater, guidanceContainer, guidance);
@@ -775,6 +899,10 @@
View actionsView = mActionsStylist.onCreateView(inflater, actionContainer);
actionContainer.addView(actionsView);
+ View buttonActionsView = mButtonActionsStylist.onCreateView(inflater, actionContainer);
+ mButtonActionsStylist.setAsButtonActions();
+ actionContainer.addView(buttonActionsView);
+
GuidedActionAdapter.EditListener editListener = new GuidedActionAdapter.EditListener() {
@Override
@@ -793,15 +921,55 @@
}
};
- mAdapter = new GuidedActionAdapter(mActions, this, this, editListener, mActionsStylist);
+ mAdapter = new GuidedActionAdapter(mActions, this, this, mActionsStylist);
+ mButtonAdapter = new GuidedActionAdapter(mButtonActions, this, this, mButtonActionsStylist);
+ mAdapterGroup = new GuidedActionAdapterGroup();
+ mAdapterGroup.addAdpter(mAdapter);
+ mAdapterGroup.addAdpter(mButtonAdapter);
+ mAdapterGroup.setEditListener(editListener);
- mListView = mActionsStylist.getActionsGridView();
- mListView.setAdapter(mAdapter);
+ mActionsStylist.getActionsGridView().setAdapter(mAdapter);
+ mButtonActionsStylist.getActionsGridView().setAdapter(mButtonAdapter);
+ if (mButtonActions.size() == 0) {
+ // when there is no button actions, we dont need show the second panel, but keep
+ // the width zero to run ChangeBounds transition.
+ LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)
+ buttonActionsView.getLayoutParams();
+ lp.weight = 0;
+ buttonActionsView.setLayoutParams(lp);
+ } else {
+ // when there are two actions panel, we need adjust the weight of action to
+ // guidedActionContentWidthWeightTwoPanels.
+ Context ctx = mThemeWrapper != null ? mThemeWrapper : getActivity();
+ TypedValue typedValue = new TypedValue();
+ if (ctx.getTheme().resolveAttribute(R.attr.guidedActionContentWidthWeightTwoPanels,
+ typedValue, true)) {
+ View actionsRoot = root.findViewById(R.id.action_fragment_root);
+ float weight = typedValue.getFloat();
+ LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) actionsRoot
+ .getLayoutParams();
+ lp.weight = weight;
+ actionsRoot.setLayoutParams(lp);
+ }
+ }
+
int pos = (mSelectedIndex >= 0 && mSelectedIndex < mActions.size()) ?
mSelectedIndex : getFirstCheckedAction();
- mListView.setSelectedPosition(pos);
+ setSelectedActionPosition(pos);
- return v;
+ setSelectedButtonActionPosition(0);
+
+ View backgroundView = onCreateBackgroundView(inflater, root, savedInstanceState);
+ if (backgroundView != null) {
+ root.addView(backgroundView, 0);
+ }
+ return root;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mActionsStylist.getActionsGridView().requestFocus();
}
/**
@@ -811,7 +979,8 @@
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_ACTION_SELECTED_INDEX,
- (mListView != null) ? getSelectedActionPosition() : mSelectedIndex);
+ (mActionsStylist.getActionsGridView() != null) ?
+ getSelectedActionPosition() : mSelectedIndex);
}
private static boolean isGuidedStepTheme(Context context) {
@@ -826,6 +995,8 @@
* Convenient method to close GuidedStepFragments on top of other content or finish Activity if
* GuidedStepFragments were started in a separate activity. Pops all stack entries including
* {@link #UI_STYLE_ENTRANCE}; if {@link #UI_STYLE_ENTRANCE} is not found, finish the activity.
+ * Note that this method must be paired with {@link #add(FragmentManager, GuidedStepFragment,
+ * int)} which sets up the stack entry name for finding which fragment we need to pop back to.
*/
public void finishGuidedStepFragments() {
final FragmentManager fragmentManager = getFragmentManager();
@@ -834,6 +1005,10 @@
for (int i = entryCount - 1; i >= 0; i--) {
BackStackEntry entry = fragmentManager.getBackStackEntryAt(i);
if (isUiStyleEntrance(entry.getName())) {
+ GuidedStepFragment top = getCurrentGuidedStepFragment(fragmentManager);
+ if (top != null) {
+ top.setUiStyle(UI_STYLE_ENTRANCE);
+ }
fragmentManager.popBackStack(entry.getId(),
FragmentManager.POP_BACK_STACK_INCLUSIVE);
return;
@@ -919,9 +1094,11 @@
if (entering) {
mGuidanceStylist.onImeAppearing(animators);
mActionsStylist.onImeAppearing(animators);
+ mButtonActionsStylist.onImeAppearing(animators);
} else {
mGuidanceStylist.onImeDisappearing(animators);
mActionsStylist.onImeDisappearing(animators);
+ mButtonActionsStylist.onImeDisappearing(animators);
}
AnimatorSet set = new AnimatorSet();
set.playTogether(animators);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
index dee9c19..ad186ff 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/GuidedStepSupportFragment.java
@@ -35,6 +35,7 @@
import android.support.v17.leanback.widget.GuidedActionsStylist;
import android.support.v17.leanback.widget.VerticalGridView;
import android.support.v4.app.ActivityCompat;
+import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.util.TypedValue;
@@ -46,6 +47,7 @@
import android.view.ViewTreeObserver;
import android.widget.ImageView;
import android.widget.RelativeLayout;
+import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
@@ -74,6 +76,11 @@
* <li>{@link #add(FragmentManager, GuidedStepSupportFragment)} or {@link #add(FragmentManager,
* GuidedStepSupportFragment, int)}, to add GuidedStepSupportFragment on top of existing Fragments or
* replacing existing GuidedStepSupportFragment when moving forward to next step.</li>
+ * <li>{@link #finishGuidedStepSupportFragments()} can either finish the activity or pop all
+ * GuidedStepSupportFragment from stack.
+ * <li>If app chooses not to use the helper function, it is the app's responsibility to call
+ * {@link #setUiStyle(int)} to select fragment transition and remember the stack entry where it
+ * need pops to.
* </ul>
* <h3>Theming and Stylists</h3>
* <p>
@@ -123,6 +130,11 @@
*
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepTheme
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepBackground
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionContentWidthWeight
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionContentWidthWeightTwoPanels
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsBackground
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsBackgroundDark
+ * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsElevation
* @see GuidanceStylist
* @see GuidanceStylist.Guidance
* @see GuidedAction
@@ -134,15 +146,13 @@
private static final String TAG_LEAN_BACK_ACTIONS_FRAGMENT = "leanBackGuidedStepSupportFragment";
private static final String EXTRA_ACTION_SELECTED_INDEX = "selectedIndex";
- private static final String ENTRY_NAME_DEFAULT = "GuidedStepDefault";
+ private static final String ENTRY_NAME_REPLACE = "GuidedStepDefault";
private static final String ENTRY_NAME_ENTRANCE = "GuidedStepEntrance";
- private static final boolean IS_FRAMEWORK_FRAGMENT = false;
-
/**
* Fragment argument name for UI style. The argument value is persisted in fragment state.
- * The value is initially {@link #UI_STYLE_DEFAULT} and might be changed in one of the three
+ * The value is initially {@link #UI_STYLE_ENTRANCE} and might be changed in one of the three
* helper functions:
* <ul>
* <li>{@link #addAsRoot(FragmentActivity, GuidedStepSupportFragment, int)}</li>
@@ -152,7 +162,7 @@
* <p>
* Argument value can be either:
* <ul>
- * <li>{@link #UI_STYLE_DEFAULT}</li>
+ * <li>{@link #UI_STYLE_REPLACE}</li>
* <li>{@link #UI_STYLE_ENTRANCE}</li>
* <li>{@link #UI_STYLE_ACTIVITY_ROOT}</li>
* </ul>
@@ -160,42 +170,37 @@
public static final String EXTRA_UI_STYLE = "uiStyle";
/**
- * Default value for argument {@link #EXTRA_UI_STYLE}. The default value is assigned
- * in GuidedStepSupportFragment constructor. This is the case that we use GuidedStepSupportFragment to
- * replace another existing GuidedStepSupportFragment when moving forward to next step. Default
- * behavior of this style is:
+ * This is the case that we use GuidedStepSupportFragment to replace another existing
+ * GuidedStepSupportFragment when moving forward to next step. Default behavior of this style is:
* <ul>
- * <li> Enter transition slides in from END(right), exit transition slide out to START(left).
+ * <li>Enter transition slides in from END(right), exit transition same as
+ * {@link #UI_STYLE_ENTRANCE}.
* </li>
- * <li> No background, see {@link #onProvideBackgroundSupportFragment()}.</li>
* </ul>
*/
- public static final int UI_STYLE_DEFAULT = 0;
+ public static final int UI_STYLE_REPLACE = 0;
/**
- * One possible value of argument {@link #EXTRA_UI_STYLE}. This is the case that we show
- * GuidedStepSupportFragment on top of other content. The default behavior of this style:
+ * Default value for argument {@link #EXTRA_UI_STYLE}. The default value is assigned in
+ * GuidedStepSupportFragment constructor. This is the case that we show GuidedStepSupportFragment on top of
+ * other content. The default behavior of this style:
* <ul>
- * <li>Enter transition slides in from two sides, exit transition is inherited from
- * {@link #UI_STYLE_DEFAULT}. Note: Changing exit transition by UI style is not working because
- * fragment transition asks for exit transition before UI style is restored in Fragment
+ * <li>Enter transition slides in from two sides, exit transition slide out to START(left).
+ * Background will be faded in. Note: Changing exit transition by UI style is not working
+ * because fragment transition asks for exit transition before UI style is restored in Fragment
* .onCreate().</li>
- * <li> {@link #onProvideBackgroundSupportFragment()} will create {@link GuidedStepBackgroundSupportFragment}
- * to covering underneath content. The activity must provide a container to host background
- * fragment and override {@link #getContainerIdForBackground()}</li>
* </ul>
*/
public static final int UI_STYLE_ENTRANCE = 1;
/**
- * One possible value of argument {@link #EXTRA_UI_STYLE}. This is the case that we show first
- * GuidedStepSupportFragment in a separate activity. The default behavior of this style:
+ * One possible value of argument {@link #EXTRA_UI_STYLE}. This is the case that we show first
+ * GuidedStepSupportFragment in a separate activity. The default behavior of this style:
* <ul>
- * <li> Enter transition is assigned null (will rely on activity transition), exit transition is
- * same as {@link #UI_STYLE_DEFAULT}. Note: Changing exit transition by UI style is not working
+ * <li>Enter transition is assigned null (will rely on activity transition), exit transition is
+ * same as {@link #UI_STYLE_ENTRANCE}. Note: Changing exit transition by UI style is not working
* because fragment transition asks for exit transition before UI style is restored in
* Fragment.onCreate().</li>
- * <li> No background, see {@link #onProvideBackgroundSupportFragment()}.
* </ul>
*/
public static final int UI_STYLE_ACTIVITY_ROOT = 2;
@@ -207,10 +212,14 @@
private ContextThemeWrapper mThemeWrapper;
private GuidanceStylist mGuidanceStylist;
private GuidedActionsStylist mActionsStylist;
+ private GuidedActionsStylist mButtonActionsStylist;
private GuidedActionAdapter mAdapter;
- private VerticalGridView mListView;
+ private GuidedActionAdapter mButtonAdapter;
+ private GuidedActionAdapterGroup mAdapterGroup;
private List<GuidedAction> mActions = new ArrayList<GuidedAction>();
+ private List<GuidedAction> mButtonActions = new ArrayList<GuidedAction>();
private int mSelectedIndex = -1;
+ private int mButtonSelectedIndex = -1;
public GuidedStepSupportFragment() {
// We need to supply the theme before any potential call to onInflate in order
@@ -218,6 +227,7 @@
mTheme = onProvideTheme();
mGuidanceStylist = onCreateGuidanceStylist();
mActionsStylist = onCreateActionsStylist();
+ mButtonActionsStylist = onCreateButtonActionsStylist();
onProvideFragmentTransitions();
}
@@ -240,6 +250,15 @@
}
/**
+ * Creates the presenter used to style a sided actions panel for button only.
+ * The default implementation returns a basic GuidedActionsStylist.
+ * @return The GuidedActionsStylist used in this fragment.
+ */
+ public GuidedActionsStylist onCreateButtonActionsStylist() {
+ return new GuidedActionsStylist();
+ }
+
+ /**
* Returns the theme used for styling the fragment. The default returns -1, indicating that the
* host Activity's theme should be used.
* @return The theme resource ID of the theme to use in this fragment, or -1 to use the
@@ -271,6 +290,16 @@
}
/**
+ * Fills out the set of actions shown at right available to the user. This hook is called during
+ * {@link #onCreate}. The default leaves the list of actions empty; subclasses may override.
+ * @param actions A non-null, empty list ready to be populated.
+ * @param savedInstanceState The saved instance state from onCreate.
+ */
+ public void onCreateButtonActions(@NonNull List<GuidedAction> actions,
+ Bundle savedInstanceState) {
+ }
+
+ /**
* Callback invoked when an action is taken by the user. Subclasses should override in
* order to act on the user's decisions.
* @param action The chosen action.
@@ -313,7 +342,7 @@
* GuidedStepSupportFragments in the stack, and configuring the fragment-to-fragment custom
* transitions. A backstack entry is added, so the fragment will be dismissed when BACK key
* is pressed.
- * <li>If current fragment on stack is GuidedStepSupportFragment: assign {@link #UI_STYLE_DEFAULT}
+ * <li>If current fragment on stack is GuidedStepSupportFragment: assign {@link #UI_STYLE_REPLACE}
* <li>If current fragment on stack is not GuidedStepSupportFragment: assign {@link #UI_STYLE_ENTRANCE}
* <p>
* Note: currently fragments added using this method must be created programmatically rather
@@ -331,7 +360,9 @@
* GuidedStepSupportFragments in the stack, and configuring the fragment-to-fragment custom
* transitions. A backstack entry is added, so the fragment will be dismissed when BACK key
* is pressed.
- * <li>If current fragment on stack is GuidedStepSupportFragment: assign {@link #UI_STYLE_DEFAULT}
+ * <li>If current fragment on stack is GuidedStepSupportFragment: assign {@link #UI_STYLE_REPLACE} and
+ * {@link #onAddSharedElementTransition(FragmentTransaction, GuidedStepSupportFragment)} will be called
+ * to perform shared element transition between GuidedStepSupportFragments.
* <li>If current fragment on stack is not GuidedStepSupportFragment: assign {@link #UI_STYLE_ENTRANCE}
* <p>
* Note: currently fragments added using this method must be created programmatically rather
@@ -342,24 +373,58 @@
* @return The ID returned by the call FragmentTransaction.replace.
*/
public static int add(FragmentManager fragmentManager, GuidedStepSupportFragment fragment, int id) {
- boolean inGuidedStep = getCurrentGuidedStepSupportFragment(fragmentManager) != null;
- if (IS_FRAMEWORK_FRAGMENT && Build.VERSION.SDK_INT >= 21 && Build.VERSION.SDK_INT < 23
- && !inGuidedStep && fragment.getContainerIdForBackground() != View.NO_ID) {
- // workaround b/22631964 for framework fragment
- fragmentManager.beginTransaction()
- .replace(id, new DummyFragment(), TAG_LEAN_BACK_ACTIONS_FRAGMENT)
- .replace(fragment.getContainerIdForBackground(), new DummyFragment())
- .commit();
- }
+ GuidedStepSupportFragment current = getCurrentGuidedStepSupportFragment(fragmentManager);
+ boolean inGuidedStep = current != null;
FragmentTransaction ft = fragmentManager.beginTransaction();
- fragment.setUiStyle(inGuidedStep ? UI_STYLE_DEFAULT : UI_STYLE_ENTRANCE);
+ fragment.setUiStyle(inGuidedStep ? UI_STYLE_REPLACE : UI_STYLE_ENTRANCE);
ft.addToBackStack(fragment.generateStackEntryName());
- initialBackground(fragment, id, ft);
+ if (current != null) {
+ fragment.onAddSharedElementTransition(ft, current);
+ }
return ft.replace(id, fragment, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
}
/**
+ * Called when this fragment is added to FragmentTransaction with {@link #UI_STYLE_REPLACE} (aka
+ * when the GuidedStepSupportFragment replacing an existing GuidedStepSupportFragment). Default implementation
+ * establishes connections between action background views to morph action background bounds
+ * change from disappearing GuidedStepSupportFragment into this GuidedStepSupportFragment. The default
+ * implementation heavily relies on {@link GuidedActionsStylist}'s layout, app may override this
+ * method when modifying the default layout of {@link GuidedActionsStylist}.
+ *
+ * @see GuidedActionsStylist
+ * @see #onProvideFragmentTransitions()
+ * @param ft The FragmentTransaction to add shared element.
+ * @param disappearing The disappearing fragment.
+ */
+ protected void onAddSharedElementTransition(FragmentTransaction ft, GuidedStepSupportFragment
+ disappearing) {
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.action_fragment_root), "action_fragment_root");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.action_fragment_background), "action_fragment_background");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.action_fragment), "action_fragment");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_root), "guidedactions_root");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_selector), "guidedactions_selector");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_content), "guidedactions_content");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_list_background), "guidedactions_list_background");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_root2), "guidedactions_root2");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_selector2), "guidedactions_selector2");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_content2), "guidedactions_content2");
+ TransitionHelper.addSharedElement(ft, disappearing.getView().findViewById(
+ R.id.guidedactions_list_background2), "guidedactions_list_background2");
+ }
+
+ /**
* Returns BackStackEntry name for the GuidedStepSupportFragment or empty String if no entry is
* associated. Note {@link #UI_STYLE_ACTIVITY_ROOT} will return empty String. The method
* returns undefined value if the fragment is not in FragmentManager.
@@ -373,7 +438,7 @@
/**
* Generates BackStackEntry name for GuidedStepSupportFragment class or empty String if no entry is
* associated. Note {@link #UI_STYLE_ACTIVITY_ROOT} is not allowed and returns empty String.
- * @param uiStyle {@link #UI_STYLE_DEFAULT} or {@link #UI_STYLE_ENTRANCE}
+ * @param uiStyle {@link #UI_STYLE_REPLACE} or {@link #UI_STYLE_ENTRANCE}
* @return BackStackEntry name for the GuidedStepSupportFragment or empty String if no entry is
* associated.
*/
@@ -382,8 +447,8 @@
return "";
}
switch (uiStyle) {
- case UI_STYLE_DEFAULT:
- return ENTRY_NAME_DEFAULT + guidedStepFragmentClass.getName();
+ case UI_STYLE_REPLACE:
+ return ENTRY_NAME_REPLACE + guidedStepFragmentClass.getName();
case UI_STYLE_ENTRANCE:
return ENTRY_NAME_ENTRANCE + guidedStepFragmentClass.getName();
case UI_STYLE_ACTIVITY_ROOT:
@@ -404,14 +469,14 @@
}
/**
- * Returns true if the backstack represents GuidedStepSupportFragment with {@link #UI_STYLE_DEFAULT};
+ * Returns true if the backstack represents GuidedStepSupportFragment with {@link #UI_STYLE_REPLACE};
* false otherwise.
* @param backStackEntryName Name of BackStackEntry.
- * @return True if the backstack represents GuidedStepSupportFragment with {@link #UI_STYLE_DEFAULT};
+ * @return True if the backstack represents GuidedStepSupportFragment with {@link #UI_STYLE_REPLACE};
* false otherwise.
*/
public static boolean isUiStyleDefault(String backStackEntryName) {
- return backStackEntryName != null && backStackEntryName.startsWith(ENTRY_NAME_DEFAULT);
+ return backStackEntryName != null && backStackEntryName.startsWith(ENTRY_NAME_REPLACE);
}
/**
@@ -420,8 +485,8 @@
* @return Class name of GuidedStepSupportFragment.
*/
public static String getGuidedStepSupportFragmentClassName(String backStackEntryName) {
- if (backStackEntryName.startsWith(ENTRY_NAME_DEFAULT)) {
- return backStackEntryName.substring(ENTRY_NAME_DEFAULT.length());
+ if (backStackEntryName.startsWith(ENTRY_NAME_REPLACE)) {
+ return backStackEntryName.substring(ENTRY_NAME_REPLACE.length());
} else if (backStackEntryName.startsWith(ENTRY_NAME_ENTRANCE)) {
return backStackEntryName.substring(ENTRY_NAME_ENTRANCE.length());
} else {
@@ -448,19 +513,9 @@
FragmentManager fragmentManager = activity.getSupportFragmentManager();
FragmentTransaction ft = fragmentManager.beginTransaction();
fragment.setUiStyle(UI_STYLE_ACTIVITY_ROOT);
- initialBackground(fragment, id, ft);
return ft.replace(id, fragment, TAG_LEAN_BACK_ACTIONS_FRAGMENT).commit();
}
- static void initialBackground(GuidedStepSupportFragment fragment, int id, FragmentTransaction ft) {
- if (fragment.getContainerIdForBackground() != View.NO_ID) {
- Fragment backgroundFragment = fragment.onProvideBackgroundSupportFragment();
- if (backgroundFragment != null) {
- ft.replace(fragment.getContainerIdForBackground(), backgroundFragment);
- }
- }
- }
-
/**
* Returns the current GuidedStepSupportFragment on the fragment transaction stack.
* @return The current GuidedStepSupportFragment, if any, on the fragment transaction stack.
@@ -474,20 +529,6 @@
}
/**
- * @hide
- */
- public static class DummyFragment extends Fragment {
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- final View v = new View(inflater.getContext());
- v.setVisibility(View.GONE);
- return v;
- }
- }
-
- /**
* Returns the GuidanceStylist that displays guidance information for the user.
* @return The GuidanceStylist for this fragment.
*/
@@ -504,6 +545,99 @@
}
/**
+ * Returns the list of button GuidedActions that the user may take in this fragment.
+ * @return The list of button GuidedActions for this fragment.
+ */
+ public List<GuidedAction> getButtonActions() {
+ return mButtonActions;
+ }
+
+ /**
+ * Find button GuidedAction by Id.
+ * @param id Id of the button action to search.
+ * @return GuidedAction object or null if not found.
+ */
+ public GuidedAction findButtonActionById(long id) {
+ int index = findButtonActionPositionById(id);
+ return index >= 0 ? mButtonActions.get(index) : null;
+ }
+
+ /**
+ * Find button GuidedAction position in array by Id.
+ * @param id Id of the button action to search.
+ * @return position of GuidedAction object in array or -1 if not found.
+ */
+ public int findButtonActionPositionById(long id) {
+ if (mButtonActions != null) {
+ for (int i = 0; i < mButtonActions.size(); i++) {
+ GuidedAction action = mButtonActions.get(i);
+ if (mButtonActions.get(i).getId() == id) {
+ return i;
+ }
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * Returns the GuidedActionsStylist that displays the button actions the user may take.
+ * @return The GuidedActionsStylist for this fragment.
+ */
+ public GuidedActionsStylist getGuidedButtonActionsStylist() {
+ return mButtonActionsStylist;
+ }
+
+ /**
+ * Sets the list of button GuidedActions that the user may take in this fragment.
+ * @param actions The list of button GuidedActions for this fragment.
+ */
+ public void setButtonActions(List<GuidedAction> actions) {
+ mButtonActions = actions;
+ if (mButtonAdapter != null) {
+ mButtonAdapter.setActions(mButtonActions);
+ }
+ }
+
+ /**
+ * Notify an button action has changed and update its UI.
+ * @param position Position of the button GuidedAction in array.
+ */
+ public void notifyButtonActionChanged(int position) {
+ if (mButtonAdapter != null) {
+ mButtonAdapter.notifyItemChanged(position);
+ }
+ }
+
+ /**
+ * Returns the view corresponding to the button action at the indicated position in the list of
+ * actions for this fragment.
+ * @param position The integer position of the button action of interest.
+ * @return The View corresponding to the button action at the indicated position, or null if
+ * that action is not currently onscreen.
+ */
+ public View getButtonActionItemView(int position) {
+ final RecyclerView.ViewHolder holder = mButtonActionsStylist.getActionsGridView()
+ .findViewHolderForPosition(position);
+ return holder == null ? null : holder.itemView;
+ }
+
+ /**
+ * Scrolls the action list to the position indicated, selecting that button action's view.
+ * @param position The integer position of the button action of interest.
+ */
+ public void setSelectedButtonActionPosition(int position) {
+ mButtonActionsStylist.getActionsGridView().setSelectedPosition(position);
+ }
+
+ /**
+ * Returns the position if the currently selected button GuidedAction.
+ * @return position The integer position of the currently selected button action.
+ */
+ public int getSelectedButtonActionPosition() {
+ return mButtonActionsStylist.getActionsGridView().getSelectedPosition();
+ }
+
+ /**
* Returns the list of GuidedActions that the user may take in this fragment.
* @return The list of GuidedActions for this fragment.
*/
@@ -567,7 +701,9 @@
* action is not currently onscreen.
*/
public View getActionItemView(int position) {
- return mListView.findViewHolderForPosition(position).itemView;
+ final RecyclerView.ViewHolder holder = mActionsStylist.getActionsGridView()
+ .findViewHolderForPosition(position);
+ return holder == null ? null : holder.itemView;
}
/**
@@ -575,7 +711,7 @@
* @param position The integer position of the action of interest.
*/
public void setSelectedActionPosition(int position) {
- mListView.setSelectedPosition(position);
+ mActionsStylist.getActionsGridView().setSelectedPosition(position);
}
/**
@@ -583,157 +719,126 @@
* @return position The integer position of the currently selected action.
*/
public int getSelectedActionPosition() {
- return mListView.getSelectedPosition();
+ return mActionsStylist.getActionsGridView().getSelectedPosition();
}
/**
- * Called by Constructor to provide fragment transitions. Default implementation creates
- * a short slide and fade transition in code for {@link #UI_STYLE_DEFAULT} for both enter and
- * exit transition. When using style {@link #UI_STYLE_ENTRANCE}, enter transition is set
- * to slide from both sides. When using style {@link #UI_STYLE_ACTIVITY_ROOT}, enter
- * transition is set to null and you should rely on activity transition.
+ * Called by Constructor to provide fragment transitions. The default implementation assigns
+ * transitions based on {@link #getUiStyle()}:
+ * <ul>
+ * <li> {@link #UI_STYLE_REPLACE} Slide from/to end(right) for enter transition, slide from/to
+ * start(left) for exit transition, shared element enter transition is set to ChangeBounds.
+ * <li> {@link #UI_STYLE_ENTRANCE} Enter transition is set to slide from both sides, exit
+ * transition is same as {@link #UI_STYLE_REPLACE}, no shared element enter transition.
+ * <li> {@link #UI_STYLE_ACTIVITY_ROOT} Enter transition is set to null and app should rely on
+ * activity transition, exit transition is same as {@link #UI_STYLE_REPLACE}, no shared element
+ * enter transition.
+ * </ul>
* <p>
- * Subclass may override and set its own fragment transition. Note that because Context is not
- * available when onProvideFragmentTransitions() is called, subclass will need use a cached
- * static application context to load transition from xml. Because the fragment view is
- * removed during fragment transition, in general app cannot use two Visibility transition
- * together. Workaround is to create your own Visibility transition that controls multiple
- * animators (e.g. slide and fade animation in one Transition class).
+ * The default implementation heavily relies on {@link GuidedActionsStylist} and
+ * {@link GuidanceStylist} layout, app may override this method when modifying the default
+ * layout of {@link GuidedActionsStylist} or {@link GuidanceStylist}.
+ * <p>
+ * TIP: because the fragment view is removed during fragment transition, in general app cannot
+ * use two Visibility transition together. Workaround is to create your own Visibility
+ * transition that controls multiple animators (e.g. slide and fade animation in one Transition
+ * class).
*/
protected void onProvideFragmentTransitions() {
if (Build.VERSION.SDK_INT >= 21) {
- if (getUiStyle() == UI_STYLE_DEFAULT) {
+ final int uiStyle = getUiStyle();
+ if (uiStyle == UI_STYLE_REPLACE) {
Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END);
- TransitionHelper.exclude(enterTransition, R.id.guidedactions_background, true);
- TransitionHelper.exclude(enterTransition, R.id.guidedactions_selector, true);
+ TransitionHelper.exclude(enterTransition, R.id.guidedstep_background, true);
TransitionHelper.setEnterTransition(this, enterTransition);
- Object exitTransition = TransitionHelper.createFadeAndShortSlide(Gravity.START);
- TransitionHelper.exclude(exitTransition, R.id.guidedactions_background, true);
- TransitionHelper.exclude(exitTransition, R.id.guidedactions_selector, true);
- TransitionHelper.setExitTransition(this, exitTransition);
- } else if (getUiStyle() == UI_STYLE_ENTRANCE) {
- Object enterTransition = TransitionHelper.createFadeAndShortSlide(Gravity.END |
+
+ Object changeBounds = TransitionHelper.createChangeBounds(false);
+ TransitionHelper.setSharedElementEnterTransition(this, changeBounds);
+ } else if (uiStyle == UI_STYLE_ENTRANCE) {
+ Object fade = TransitionHelper.createFadeTransition(TransitionHelper.FADE_IN |
+ TransitionHelper.FADE_OUT);
+ TransitionHelper.include(fade, R.id.guidedstep_background);
+ Object slide = TransitionHelper.createFadeAndShortSlide(Gravity.END |
Gravity.START);
- TransitionHelper.include(enterTransition, R.id.content_fragment);
- TransitionHelper.include(enterTransition, R.id.action_fragment);
+ TransitionHelper.include(slide, R.id.content_fragment);
+ TransitionHelper.include(slide, R.id.action_fragment_root);
+ Object enterTransition = TransitionHelper.createTransitionSet(false);
+ TransitionHelper.addTransition(enterTransition, fade);
+ TransitionHelper.addTransition(enterTransition, slide);
TransitionHelper.setEnterTransition(this, enterTransition);
- // exit transition is unchanged, same as UI_STYLE_DEFAULT
- } else if (getUiStyle() == UI_STYLE_ACTIVITY_ROOT) {
+
+ // No shared element transition
+ TransitionHelper.setSharedElementEnterTransition(this, null);
+ } else if (uiStyle == UI_STYLE_ACTIVITY_ROOT) {
// for Activity root, we dont need enter transition, use activity transition
TransitionHelper.setEnterTransition(this, null);
- // exit transition is unchanged, same as UI_STYLE_DEFAULT
+ // No shared element transition
+ TransitionHelper.setSharedElementEnterTransition(this, null);
}
+ // exitTransition is same for all style
+ Object exitTransition = TransitionHelper.createFadeAndShortSlide(Gravity.START);
+ TransitionHelper.exclude(exitTransition, R.id.guidedstep_background, true);
+ TransitionHelper.setExitTransition(this, exitTransition);
}
}
/**
- * Default implementation of background for covering content below GuidedStepSupportFragment.
- * It uses current theme attribute guidedStepBackground which by default is read from
- * android:windowBackground.
+ * Called by onCreateView to inflate background view. Default implementation loads view
+ * from {@link R.layout#lb_guidedstep_background} which holds a reference to
+ * guidedStepBackground.
+ * @param inflater LayoutInflater to load background view.
+ * @param container Parent view of background view.
+ * @param savedInstanceState
+ * @return Created background view or null if no background.
*/
- public static class GuidedStepBackgroundSupportFragment extends Fragment {
- public GuidedStepBackgroundSupportFragment() {
- onProvideFragmentTransitions();
- }
-
- /**
- * Sets fragment transitions for GuidedStepBackgroundSupportFragment. Can be overridden.
- */
- protected void onProvideFragmentTransitions() {
- if (Build.VERSION.SDK_INT >= 21) {
- Object enterTransition = TransitionHelper.createFadeTransition(
- TransitionHelper.FADE_IN|TransitionHelper.FADE_OUT);
- TransitionHelper.setEnterTransition(this, enterTransition);
- }
- }
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container,
- Bundle savedInstanceState) {
- FragmentActivity activity = getActivity();
- Context themedContext = null;
- if (!isGuidedStepTheme(activity)) {
- // Look up the guidedStepTheme in the activity's currently specified theme. If it
- // exists, replace the theme with its value.
- int resId = R.attr.guidedStepTheme;
- TypedValue typedValue = new TypedValue();
- boolean found = activity.getTheme().resolveAttribute(resId, typedValue, true);
- if (DEBUG) Log.v(TAG, "Found guided step theme reference? " + found);
- if (found) {
- ContextThemeWrapper themeWrapper =
- new ContextThemeWrapper(activity, typedValue.resourceId);
- if (isGuidedStepTheme(themeWrapper)) {
- themedContext = themeWrapper;
- }
- }
- if (!found) {
- Log.e(TAG, "GuidedStepSupportFragment does not have an appropriate theme set.");
- }
- }
-
- if (themedContext != null) {
- inflater = inflater.cloneInContext(themedContext);
- }
-
- return inflater.inflate(R.layout.lb_guidedstep_background, container, false);
- }
+ public View onCreateBackgroundView(LayoutInflater inflater, ViewGroup container,
+ Bundle savedInstanceState) {
+ return inflater.inflate(R.layout.lb_guidedstep_background, container, false);
}
/**
- * Creates a background fragment for {@link #UI_STYLE_ENTRANCE}, returns null for other cases.
- * Subclass may override the default behavior, e.g. provide different backgrounds
- * for {@link #UI_STYLE_DEFAULT}. Background fragment will be inserted in {@link
- * #getContainerIdForBackground()}.
+ * Set UI style to fragment arguments. Default value is {@link #UI_STYLE_ENTRANCE} when fragment
+ * is first initialized. UI style is used to choose different fragment transition animations and
+ * determine if this is the first GuidedStepSupportFragment on backstack. In most cases app does not
+ * directly call this method, app calls helper function
+ * {@link #add(FragmentManager, GuidedStepSupportFragment, int)}. However if the app creates Fragment
+ * transaction and controls backstack by itself, it would need call setUiStyle() to select the
+ * fragment transition to use.
*
- * @return fragment that will be inserted below GuidedStepSupportFragment.
- */
- protected Fragment onProvideBackgroundSupportFragment() {
- if (getUiStyle() == UI_STYLE_ENTRANCE) {
- return new GuidedStepBackgroundSupportFragment();
- }
- return null;
- }
-
- /**
- * Returns container id for inserting {@link #onProvideBackgroundSupportFragment()}. The id should be
- * different than container id for inserting GuidedStepSupportFragment.
- * Default value is {@link View#NO_ID}. Subclass must override to host background fragment.
- * @return container id for inserting {@link #onProvideBackgroundSupportFragment()}
- */
- protected int getContainerIdForBackground() {
- return View.NO_ID;
- }
-
-
- /**
- * Set UI style to fragment arguments, UI style cannot be changed after initialization.
- * @param style {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_DEFAULT} or
- * {@link #UI_STYLE_ENTRANCE}.
+ * @param style {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_REPLACE} or
+ * {@link #UI_STYLE_ENTRANCE}.
*/
public void setUiStyle(int style) {
int oldStyle = getUiStyle();
Bundle arguments = getArguments();
+ boolean isNew = false;
if (arguments == null) {
arguments = new Bundle();
+ isNew = true;
}
arguments.putInt(EXTRA_UI_STYLE, style);
// call setArgument() will validate if the fragment is already added.
- setArguments(arguments);
+ if (isNew) {
+ setArguments(arguments);
+ }
if (style != oldStyle) {
onProvideFragmentTransitions();
}
}
/**
- * Read UI style from fragment arguments.
+ * Read UI style from fragment arguments. Default value is {@link #UI_STYLE_ENTRANCE} when
+ * fragment is first initialized. UI style is used to choose different fragment transition
+ * animations and determine if this is the first GuidedStepSupportFragment on backstack.
*
- * @return {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_DEFAULT} or
+ * @return {@link #UI_STYLE_ACTIVITY_ROOT} {@link #UI_STYLE_REPLACE} or
* {@link #UI_STYLE_ENTRANCE}.
+ * @see #onProvideFragmentTransitions()
*/
public int getUiStyle() {
Bundle b = getArguments();
- if (b == null) return UI_STYLE_DEFAULT;
- return b.getInt(EXTRA_UI_STYLE, UI_STYLE_DEFAULT);
+ if (b == null) return UI_STYLE_ENTRANCE;
+ return b.getInt(EXTRA_UI_STYLE, UI_STYLE_ENTRANCE);
}
/**
@@ -751,8 +856,26 @@
mSelectedIndex = state.getInt(EXTRA_ACTION_SELECTED_INDEX, -1);
}
}
- mActions.clear();
- onCreateActions(mActions, savedInstanceState);
+ ArrayList<GuidedAction> actions = new ArrayList<GuidedAction>();
+ onCreateActions(actions, savedInstanceState);
+ setActions(actions);
+ ArrayList<GuidedAction> buttonActions = new ArrayList<GuidedAction>();
+ onCreateButtonActions(buttonActions, savedInstanceState);
+ setButtonActions(buttonActions);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public void onDestroyView() {
+ mGuidanceStylist.onDestroyView();
+ mActionsStylist.onDestroyView();
+ mButtonActionsStylist.onDestroyView();
+ mAdapter = null;
+ mButtonAdapter = null;
+ mAdapterGroup = null;
+ super.onDestroyView();
}
/**
@@ -766,9 +889,10 @@
resolveTheme();
inflater = getThemeInflater(inflater);
- View v = inflater.inflate(R.layout.lb_guidedstep_fragment, container, false);
- ViewGroup guidanceContainer = (ViewGroup) v.findViewById(R.id.content_fragment);
- ViewGroup actionContainer = (ViewGroup) v.findViewById(R.id.action_fragment);
+ ViewGroup root = (ViewGroup) inflater.inflate(R.layout.lb_guidedstep_fragment,
+ container, false);
+ ViewGroup guidanceContainer = (ViewGroup) root.findViewById(R.id.content_fragment);
+ ViewGroup actionContainer = (ViewGroup) root.findViewById(R.id.action_fragment);
Guidance guidance = onCreateGuidance(savedInstanceState);
View guidanceView = mGuidanceStylist.onCreateView(inflater, guidanceContainer, guidance);
@@ -777,6 +901,10 @@
View actionsView = mActionsStylist.onCreateView(inflater, actionContainer);
actionContainer.addView(actionsView);
+ View buttonActionsView = mButtonActionsStylist.onCreateView(inflater, actionContainer);
+ mButtonActionsStylist.setAsButtonActions();
+ actionContainer.addView(buttonActionsView);
+
GuidedActionAdapter.EditListener editListener = new GuidedActionAdapter.EditListener() {
@Override
@@ -795,15 +923,55 @@
}
};
- mAdapter = new GuidedActionAdapter(mActions, this, this, editListener, mActionsStylist);
+ mAdapter = new GuidedActionAdapter(mActions, this, this, mActionsStylist);
+ mButtonAdapter = new GuidedActionAdapter(mButtonActions, this, this, mButtonActionsStylist);
+ mAdapterGroup = new GuidedActionAdapterGroup();
+ mAdapterGroup.addAdpter(mAdapter);
+ mAdapterGroup.addAdpter(mButtonAdapter);
+ mAdapterGroup.setEditListener(editListener);
- mListView = mActionsStylist.getActionsGridView();
- mListView.setAdapter(mAdapter);
+ mActionsStylist.getActionsGridView().setAdapter(mAdapter);
+ mButtonActionsStylist.getActionsGridView().setAdapter(mButtonAdapter);
+ if (mButtonActions.size() == 0) {
+ // when there is no button actions, we dont need show the second panel, but keep
+ // the width zero to run ChangeBounds transition.
+ LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)
+ buttonActionsView.getLayoutParams();
+ lp.weight = 0;
+ buttonActionsView.setLayoutParams(lp);
+ } else {
+ // when there are two actions panel, we need adjust the weight of action to
+ // guidedActionContentWidthWeightTwoPanels.
+ Context ctx = mThemeWrapper != null ? mThemeWrapper : getActivity();
+ TypedValue typedValue = new TypedValue();
+ if (ctx.getTheme().resolveAttribute(R.attr.guidedActionContentWidthWeightTwoPanels,
+ typedValue, true)) {
+ View actionsRoot = root.findViewById(R.id.action_fragment_root);
+ float weight = typedValue.getFloat();
+ LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) actionsRoot
+ .getLayoutParams();
+ lp.weight = weight;
+ actionsRoot.setLayoutParams(lp);
+ }
+ }
+
int pos = (mSelectedIndex >= 0 && mSelectedIndex < mActions.size()) ?
mSelectedIndex : getFirstCheckedAction();
- mListView.setSelectedPosition(pos);
+ setSelectedActionPosition(pos);
- return v;
+ setSelectedButtonActionPosition(0);
+
+ View backgroundView = onCreateBackgroundView(inflater, root, savedInstanceState);
+ if (backgroundView != null) {
+ root.addView(backgroundView, 0);
+ }
+ return root;
+ }
+
+ @Override
+ public void onResume() {
+ super.onResume();
+ mActionsStylist.getActionsGridView().requestFocus();
}
/**
@@ -813,7 +981,8 @@
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(EXTRA_ACTION_SELECTED_INDEX,
- (mListView != null) ? getSelectedActionPosition() : mSelectedIndex);
+ (mActionsStylist.getActionsGridView() != null) ?
+ getSelectedActionPosition() : mSelectedIndex);
}
private static boolean isGuidedStepTheme(Context context) {
@@ -828,6 +997,8 @@
* Convenient method to close GuidedStepSupportFragments on top of other content or finish Activity if
* GuidedStepSupportFragments were started in a separate activity. Pops all stack entries including
* {@link #UI_STYLE_ENTRANCE}; if {@link #UI_STYLE_ENTRANCE} is not found, finish the activity.
+ * Note that this method must be paired with {@link #add(FragmentManager, GuidedStepSupportFragment,
+ * int)} which sets up the stack entry name for finding which fragment we need to pop back to.
*/
public void finishGuidedStepSupportFragments() {
final FragmentManager fragmentManager = getFragmentManager();
@@ -836,6 +1007,10 @@
for (int i = entryCount - 1; i >= 0; i--) {
BackStackEntry entry = fragmentManager.getBackStackEntryAt(i);
if (isUiStyleEntrance(entry.getName())) {
+ GuidedStepSupportFragment top = getCurrentGuidedStepSupportFragment(fragmentManager);
+ if (top != null) {
+ top.setUiStyle(UI_STYLE_ENTRANCE);
+ }
fragmentManager.popBackStack(entry.getId(),
FragmentManager.POP_BACK_STACK_INCLUSIVE);
return;
@@ -921,9 +1096,11 @@
if (entering) {
mGuidanceStylist.onImeAppearing(animators);
mActionsStylist.onImeAppearing(animators);
+ mButtonActionsStylist.onImeAppearing(animators);
} else {
mGuidanceStylist.onImeDisappearing(animators);
mActionsStylist.onImeDisappearing(animators);
+ mButtonActionsStylist.onImeDisappearing(animators);
}
AnimatorSet set = new AnimatorSet();
set.playTogether(animators);
diff --git a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
index b2c9b1c..219bb98 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersFragment.java
@@ -138,8 +138,10 @@
if (getBridgeAdapter() != null) {
FocusHighlightHelper.setupHeaderItemFocusHighlight(listView);
}
- view.setBackgroundColor(getBackgroundColor());
- updateFadingEdgeToBrandColor(getBackgroundColor());
+ if (mBackgroundColorSet) {
+ view.setBackgroundColor(mBackgroundColor);
+ updateFadingEdgeToBrandColor(mBackgroundColor);
+ }
updateListViewVisibility();
}
@@ -228,22 +230,6 @@
}
}
- int getBackgroundColor() {
- if (getActivity() == null) {
- throw new IllegalStateException("Activity must be attached");
- }
-
- if (mBackgroundColorSet) {
- return mBackgroundColor;
- }
-
- TypedValue outValue = new TypedValue();
- if (getActivity().getTheme().resolveAttribute(R.attr.defaultBrandColor, outValue, true)) {
- return getResources().getColor(outValue.resourceId);
- }
- return getResources().getColor(R.color.lb_default_brand_color);
- }
-
@Override
void onTransitionStart() {
super.onTransitionStart();
diff --git a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
index 9c66714..ecf04d8 100644
--- a/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
+++ b/v17/leanback/src/android/support/v17/leanback/app/HeadersSupportFragment.java
@@ -140,8 +140,10 @@
if (getBridgeAdapter() != null) {
FocusHighlightHelper.setupHeaderItemFocusHighlight(listView);
}
- view.setBackgroundColor(getBackgroundColor());
- updateFadingEdgeToBrandColor(getBackgroundColor());
+ if (mBackgroundColorSet) {
+ view.setBackgroundColor(mBackgroundColor);
+ updateFadingEdgeToBrandColor(mBackgroundColor);
+ }
updateListViewVisibility();
}
@@ -230,22 +232,6 @@
}
}
- int getBackgroundColor() {
- if (getActivity() == null) {
- throw new IllegalStateException("Activity must be attached");
- }
-
- if (mBackgroundColorSet) {
- return mBackgroundColor;
- }
-
- TypedValue outValue = new TypedValue();
- if (getActivity().getTheme().resolveAttribute(R.attr.defaultBrandColor, outValue, true)) {
- return getResources().getColor(outValue.resourceId);
- }
- return getResources().getColor(R.color.lb_default_brand_color);
- }
-
@Override
void onTransitionStart() {
super.onTransitionStart();
diff --git a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
index 98fb06f..9420154 100644
--- a/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
+++ b/v17/leanback/src/android/support/v17/leanback/transition/TransitionHelper.java
@@ -67,6 +67,12 @@
public void setExitTransition(android.app.Fragment fragment, Object transition);
+ public void setSharedElementEnterTransition(android.app.Fragment fragment,
+ Object transition);
+
+ public void addSharedElement(android.app.FragmentTransaction ft,
+ View view, String transitionName);
+
public Object getSharedElementEnterTransition(Window window);
public Object getSharedElementReturnTransition(Window window);
@@ -158,6 +164,14 @@
public void setExitTransition(android.app.Fragment fragment, Object transition) {
}
+ public void setSharedElementEnterTransition(android.app.Fragment fragment,
+ Object transition) {
+ }
+
+ public void addSharedElement(android.app.FragmentTransaction ft,
+ View view, String transitionName) {
+ }
+
@Override
public Object getSharedElementEnterTransition(Window window) {
return null;
@@ -502,6 +516,16 @@
TransitionHelperApi21.setExitTransition(fragment, transition);
}
+ public void setSharedElementEnterTransition(android.app.Fragment fragment,
+ Object transition) {
+ TransitionHelperApi21.setSharedElementEnterTransition(fragment, transition);
+ }
+
+ public void addSharedElement(android.app.FragmentTransaction ft,
+ View view, String transitionName) {
+ TransitionHelperApi21.addSharedElement(ft, view, transitionName);
+ }
+
@Override
public Object getSharedElementEnterTransition(Window window) {
return TransitionHelperApi21.getSharedElementEnterTransition(window);
@@ -722,6 +746,16 @@
sImpl.setExitTransition(fragment, transition);
}
+ public static void setSharedElementEnterTransition(android.app.Fragment fragment,
+ Object transition) {
+ sImpl.setSharedElementEnterTransition(fragment, transition);
+ }
+
+ public static void addSharedElement(android.app.FragmentTransaction ft,
+ View view, String transitionName) {
+ sImpl.addSharedElement(ft, view, transitionName);
+ }
+
public static void setEnterTransition(android.support.v4.app.Fragment fragment,
Object transition) {
fragment.setEnterTransition(transition);
@@ -732,6 +766,16 @@
fragment.setExitTransition(transition);
}
+ public static void setSharedElementEnterTransition(android.support.v4.app.Fragment fragment,
+ Object transition) {
+ fragment.setSharedElementEnterTransition(transition);
+ }
+
+ public static void addSharedElement(android.support.v4.app.FragmentTransaction ft,
+ View view, String transitionName) {
+ ft.addSharedElement(view, transitionName);
+ }
+
public static Object createFadeAndShortSlide(int edge) {
return sImpl.createFadeAndShortSlide(edge);
}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/CheckableImageView.java b/v17/leanback/src/android/support/v17/leanback/widget/CheckableImageView.java
new file mode 100644
index 0000000..627bbd4
--- /dev/null
+++ b/v17/leanback/src/android/support/v17/leanback/widget/CheckableImageView.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package android.support.v17.leanback.widget;
+
+import android.content.Context;
+import android.util.AttributeSet;
+import android.widget.Checkable;
+import android.widget.ImageView;
+
+/**
+ * ImageView that supports Checkable states.
+ */
+class CheckableImageView extends ImageView implements Checkable {
+
+ private boolean mChecked;
+
+ private static final int[] CHECKED_STATE_SET = { android.R.attr.state_checked };
+
+ public CheckableImageView(Context context) {
+ this(context, null);
+ }
+
+ public CheckableImageView(Context context, AttributeSet attrs) {
+ this(context, attrs, 0);
+ }
+
+ public CheckableImageView(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ }
+
+ @Override
+ public int[] onCreateDrawableState(final int extraSpace) {
+ final int[] drawableState = super.onCreateDrawableState(extraSpace + 1);
+ if (isChecked()) {
+ mergeDrawableStates(drawableState, CHECKED_STATE_SET);
+ }
+ return drawableState;
+ }
+
+ @Override
+ public void toggle() {
+ setChecked(!mChecked);
+ }
+
+ @Override
+ public boolean isChecked() {
+ return mChecked;
+ }
+
+ @Override
+ public void setChecked(final boolean checked) {
+ if (mChecked != checked) {
+ mChecked = checked;
+ refreshDrawableState();
+ }
+ }
+
+}
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter.java b/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter.java
index c4418c1..7c9d5db 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/FullWidthDetailsOverviewRowPresenter.java
@@ -528,19 +528,6 @@
mListener = listener;
}
- private int getDefaultBackgroundColor(Context context) {
- TypedValue outValue = new TypedValue();
- if (context.getTheme().resolveAttribute(R.attr.defaultBrandColor, outValue, true)) {
- return context.getResources().getColor(outValue.resourceId);
- }
- return context.getResources().getColor(R.color.lb_default_brand_color);
- }
-
- private int getDefaultActionsBackgroundColor(Context context) {
- int c = getDefaultBackgroundColor(context);
- return Color.argb(Color.alpha(c), Color.red(c) / 2, Color.green(c) / 2, Color.blue(c) / 2);
- }
-
/**
* Get resource id to inflate the layout. The layout must match {@link #STATE_HALF}
*/
@@ -558,13 +545,13 @@
vh.mActionBridgeAdapter = new ActionsItemBridgeAdapter(vh);
final View overview = vh.mOverviewFrame;
- final int bgColor = mBackgroundColorSet ? mBackgroundColor :
- getDefaultBackgroundColor(overview.getContext());
- overview.setBackgroundColor(bgColor);
- final int actionBgColor = mActionsBackgroundColorSet ? mActionsBackgroundColor :
- getDefaultActionsBackgroundColor(overview.getContext());
- overview.findViewById(R.id.details_overview_actions_background)
- .setBackgroundColor(actionBgColor);
+ if (mBackgroundColorSet) {
+ overview.setBackgroundColor(mBackgroundColor);
+ }
+ if (mActionsBackgroundColorSet) {
+ overview.findViewById(R.id.details_overview_actions_background)
+ .setBackgroundColor(mActionsBackgroundColor);
+ }
RoundedRectHelper.getInstance().setClipToRoundedOutline(overview, true);
if (!getSelectEffectEnabled()) {
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
index 3444cbf..20d54e2 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GridLayoutManager.java
@@ -1287,14 +1287,8 @@
} else {
switch (modeSecondary) {
case MeasureSpec.UNSPECIFIED:
- if (mRowSizeSecondaryRequested == 0) {
- if (mOrientation == HORIZONTAL) {
- throw new IllegalStateException("Must specify rowHeight or view height");
- } else {
- throw new IllegalStateException("Must specify columnWidth or view width");
- }
- }
- mFixedRowSizeSecondary = mRowSizeSecondaryRequested;
+ mFixedRowSizeSecondary = mRowSizeSecondaryRequested == 0 ?
+ sizeSecondary - paddingSecondary: mRowSizeSecondaryRequested;
mNumRows = mNumRowsRequested == 0 ? 1 : mNumRowsRequested;
measuredSizeSecondary = mFixedRowSizeSecondary * mNumRows + mMarginSecondary
* (mNumRows - 1) + paddingSecondary;
@@ -1779,6 +1773,11 @@
mFocusPositionOffset = 0;
saveContext(recycler, state);
+ View savedFocusView = findViewByPosition(mFocusPosition);
+ int savedFocusPos = mFocusPosition;
+ int savedSubFocusPos = mSubFocusPosition;
+ boolean hadFocus = mBaseGridView.hasFocus();
+
// Track the old focus view so we can adjust our system scroll position
// so that any scroll animations happening now will remain valid.
// We must use same delta in Pre Layout (if prelayout exists) and second layout.
@@ -1787,17 +1786,14 @@
if (mFocusPosition != NO_POSITION && scrollToFocus
&& mBaseGridView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
// FIXME: we should get the remaining scroll animation offset from RecyclerView
- View focusView = findViewByPosition(mFocusPosition);
- if (focusView != null) {
- if (getScrollPosition(focusView, focusView.findFocus(), sTwoInts)) {
+ if (savedFocusView != null) {
+ if (getScrollPosition(savedFocusView, savedFocusView.findFocus(), sTwoInts)) {
delta = sTwoInts[0];
deltaSecondary = sTwoInts[1];
}
}
}
- boolean hadFocus = mBaseGridView.hasFocus();
- int savedFocusPos = mFocusPosition;
if (mInFastRelayout = layoutInit()) {
fastRelayout();
// appends items till focus position.
@@ -1865,7 +1861,8 @@
}
// For fastRelayout, only dispatch event when focus position changes.
- if (mInFastRelayout && mFocusPosition != savedFocusPos) {
+ if (mInFastRelayout && (mFocusPosition != savedFocusPos || mSubFocusPosition !=
+ savedFocusPos || findViewByPosition(mFocusPosition) != savedFocusView)) {
dispatchChildSelected();
} else if (!mInFastRelayout && mInLayoutSearchFocus) {
// For full layout we dispatchChildSelected() in createItem() unless searched all
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java
index fd05b8e..3fcdbba 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidanceStylist.java
@@ -173,6 +173,16 @@
}
/**
+ * Called when destroy the View created by GuidanceStylist.
+ */
+ public void onDestroyView() {
+ mBreadcrumbView = null;
+ mDescriptionView = null;
+ mIconView = null;
+ mTitleView = null;
+ }
+
+ /**
* Provides the resource ID of the layout defining the guidance view. Subclasses may override
* to provide their own customized layouts. The base implementation returns
* {@link android.support.v17.leanback.R.layout#lb_guidance}. If overridden, the substituted
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
index c690b40..21986d5 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedAction.java
@@ -37,8 +37,18 @@
private static final String TAG = "GuidedAction";
+ /**
+ * Special check set Id that is neither checkbox nor radio.
+ */
public static final int NO_CHECK_SET = 0;
+ /**
+ * Default checkset Id for radio.
+ */
public static final int DEFAULT_CHECK_SET_ID = 1;
+ /**
+ * Checkset Id for checkbox.
+ */
+ public static final int CHECKBOX_CHECK_SET_ID = -1;
/**
* When finishing editing, goes to next action.
@@ -80,7 +90,8 @@
public static final long ACTION_ID_NO = -9;
/**
- * Builds a {@link GuidedAction} object.
+ * Builds a {@link GuidedAction} object. When subclass GuidedAction, you may override this
+ * Builder class and call {@link #applyValues(GuidedAction)}.
*/
public static class Builder {
private long mId;
@@ -101,14 +112,24 @@
private int mDescriptionEditInputType = InputType.TYPE_CLASS_TEXT;
private int mCheckSetId = NO_CHECK_SET;
private boolean mEnabled = true;
+ private boolean mFocusable = true;
private Intent mIntent;
/**
* Builds the GuidedAction corresponding to this Builder.
* @return the GuidedAction as configured through this Builder.
*/
- public GuidedAction build() {
+ public final GuidedAction build() {
GuidedAction action = new GuidedAction();
+ applyValues(action);
+ return action;
+ }
+
+ /**
+ * Subclass Builder may call this function to apply values.
+ * @param action GuidedAction to apply Builder values.
+ */
+ protected final void applyValues(GuidedAction action) {
// Base Action values
action.setId(mId);
action.setLabel1(mTitle);
@@ -131,7 +152,7 @@
action.mHasNext = mHasNext;
action.mInfoOnly = mInfoOnly;
action.mEnabled = mEnabled;
- return action;
+ action.mFocusable = mFocusable;
}
/**
@@ -281,7 +302,7 @@
}
/**
- * Indicates whether this action is editable. Note: Editable actions cannot also be
+ * Indicates whether this action title is editable. Note: Editable actions cannot also be
* checked, or belong to a check set.
* @param editable Whether this action is editable.
*/
@@ -360,10 +381,11 @@
}
/**
- * Indicates whether this action is part of a single-select group similar to radio buttons.
- * When one item in a check set is checked, all others with the same check set ID will be
- * unchecked automatically.
- * @param checkSetId The check set ID, or {@link #NO_CHECK_SET) to indicate no check set.
+ * Indicates whether this action is part of a single-select group similar to radio buttons
+ * or this action is a checkbox. When one item in a check set is checked, all others with
+ * the same check set ID will be nchecked automatically.
+ * @param checkSetId The check set ID, or {@link GuidedAction#NO_CHECK_SET} to indicate not
+ * radio or checkbox, or {@link GuidedAction#CHECKBOX_CHECK_SET_ID} to indicate a checkbox.
*/
public Builder checkSetId(int checkSetId) {
mCheckSetId = checkSetId;
@@ -409,6 +431,16 @@
mEnabled = enabled;
return this;
}
+
+ /**
+ * Indicates whether this action can take focus.
+ * @param focusable
+ * @return The same Builder object.
+ */
+ public Builder focusable(boolean focusable) {
+ mFocusable = focusable;
+ return this;
+ }
}
private CharSequence mEditTitle;
@@ -425,10 +457,11 @@
private boolean mInfoOnly;
private int mCheckSetId;
private boolean mEnabled;
+ private boolean mFocusable;
private Intent mIntent;
- private GuidedAction() {
+ protected GuidedAction() {
super(0);
}
@@ -517,8 +550,8 @@
}
/**
- * Returns whether this action is editable.
- * @return true if the action is editable, false otherwise.
+ * Returns whether this action title is editable.
+ * @return true if the action title is editable, false otherwise.
*/
public boolean isEditable() {
return mEditable;
@@ -582,13 +615,13 @@
}
/**
- * Returns the check set id this action is a part of. All actions in the
- * same list with the same check set id are considered linked. When one
- * of the actions within that set is selected, that action becomes
- * checked, while all the other actions become unchecked.
+ * Returns the check set id this action is a part of. All actions in the same list with the same
+ * check set id are considered linked. When one of the actions within that set is selected, that
+ * action becomes checked, while all the other actions become unchecked.
*
* @return an integer representing the check set this action is a part of, or
- * {@link #NO_CHECK_SET} if this action isn't a part of a check set.
+ * {@link #CHECKBOX_CHECK_SET_ID} if this is a checkbox, or {@link #NO_CHECK_SET} if
+ * this action is not a checkbox or radiobutton.
*/
public int getCheckSetId() {
return mCheckSetId;
@@ -620,6 +653,22 @@
}
/**
+ * Returns whether this action is focusable.
+ * @return true if the action is currently focusable, false otherwise.
+ */
+ public boolean isFocusable() {
+ return mFocusable;
+ }
+
+ /**
+ * Sets whether this action is focusable.
+ * @param focusable Whether this action should be focusable.
+ */
+ public void setFocusable(boolean focusable) {
+ mFocusable = focusable;
+ }
+
+ /**
* Returns whether this action will request further user input when selected, such as showing
* another GuidedStepFragment or launching a new activity. Configured during construction.
* @return true if the action will request further user input when selected, false otherwise.
diff --git a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
index de42527..6e5d506 100644
--- a/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
+++ b/v17/leanback/src/android/support/v17/leanback/widget/GuidedActionsStylist.java
@@ -22,17 +22,21 @@
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.content.res.TypedArray;
+import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.support.v17.leanback.R;
import android.support.v17.leanback.widget.VerticalGridView;
+import android.support.v4.content.ContextCompat;
+import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.RecyclerView.ViewHolder;
import android.text.TextUtils;
import android.util.Log;
import android.util.TypedValue;
import android.view.animation.DecelerateInterpolator;
+import android.view.inputmethod.EditorInfo;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -40,6 +44,7 @@
import android.view.ViewPropertyAnimator;
import android.view.ViewTreeObserver;
import android.view.WindowManager;
+import android.widget.Checkable;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
@@ -91,7 +96,6 @@
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedStepImeDisappearingAnimation
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorShowAnimation
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorHideAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsContainerStyle
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsSelectorStyle
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionsListStyle
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemContainerStyle
@@ -101,24 +105,30 @@
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemTitleStyle
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemDescriptionStyle
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionItemChevronStyle
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionCheckedAnimation
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionUncheckedAnimation
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionPressedAnimation
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionUnpressedAnimation
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionEnabledChevronAlpha
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionDisabledChevronAlpha
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionContentWidth
- * @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionContentWidthNoIcon
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionTitleMinLines
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionTitleMaxLines
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionDescriptionMinLines
* @attr ref android.support.v17.leanback.R.styleable#LeanbackGuidedStepTheme_guidedActionVerticalPadding
+ * @see android.R.styleable#Theme_listChoiceIndicatorSingle
+ * @see android.R.styleable#Theme_listChoiceIndicatorMultiple
* @see android.support.v17.leanback.app.GuidedStepFragment
* @see GuidedAction
*/
public class GuidedActionsStylist implements FragmentAnimationProvider {
/**
+ * Default viewType that associated with default layout Id for the action item.
+ * @see #getItemViewType(GuidedAction)
+ * @see #onProvideItemLayoutId(int)
+ * @see #onCreateViewHolder(ViewGroup, int)
+ */
+ public static final int VIEW_TYPE_DEFAULT = 0;
+
+ /**
* ViewHolder caches information about the action item layouts' subviews. Subclasses of {@link
* GuidedActionsStylist} may also wish to subclass this in order to add fields.
* @see GuidedAction
@@ -234,9 +244,14 @@
private static String TAG = "GuidedActionsStylist";
- protected View mMainView;
- protected VerticalGridView mActionsGridView;
- protected View mSelectorView;
+ private ViewGroup mMainView;
+ private VerticalGridView mActionsGridView;
+ private View mBgView;
+ private View mSelectorView;
+ private View mContentView;
+ private boolean mButtonActions;
+
+ private Animator mSelectorAnimator;
// Cached values from resources
private float mEnabledTextAlpha;
@@ -245,8 +260,6 @@
private float mDisabledDescriptionAlpha;
private float mEnabledChevronAlpha;
private float mDisabledChevronAlpha;
- private int mContentWidth;
- private int mContentWidthNoIcon;
private int mTitleMinLines;
private int mTitleMaxLines;
private int mDescriptionMinLines;
@@ -265,8 +278,17 @@
* @return The view to be added to the caller's view hierarchy.
*/
public View onCreateView(LayoutInflater inflater, ViewGroup container) {
- mMainView = inflater.inflate(onProvideLayoutId(), container, false);
+ mMainView = (ViewGroup) inflater.inflate(onProvideLayoutId(), container, false);
+ mContentView = mMainView.findViewById(R.id.guidedactions_content);
mSelectorView = mMainView.findViewById(R.id.guidedactions_selector);
+ mSelectorView.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) {
+ updateSelectorView(false);
+ }
+ });
+ mBgView = mMainView.findViewById(R.id.guidedactions_list_background);
if (mMainView instanceof VerticalGridView) {
mActionsGridView = (VerticalGridView) mMainView;
} else {
@@ -278,32 +300,23 @@
mActionsGridView.setWindowAlignmentOffsetPercent(50f);
mActionsGridView.setWindowAlignment(VerticalGridView.WINDOW_ALIGN_NO_EDGE);
if (mSelectorView != null) {
- mActionsGridView.setOnScrollListener(new
- SelectorAnimator(mSelectorView, mActionsGridView));
+ mActionsGridView.setOnScrollListener(new RecyclerView.OnScrollListener() {
+ @Override
+ public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
+ if (newState == RecyclerView.SCROLL_STATE_IDLE) {
+ if (mSelectorView.getAlpha() != 1f) {
+ updateSelectorView(true);
+ }
+ }
+ }
+ });
}
}
- mActionsGridView.requestFocusFromTouch();
-
if (mSelectorView != null) {
// ALlow focus to move to other views
mActionsGridView.getViewTreeObserver().addOnGlobalFocusChangeListener(
- new ViewTreeObserver.OnGlobalFocusChangeListener() {
- private boolean mChildFocused;
-
- @Override
- public void onGlobalFocusChanged(View oldFocus, View newFocus) {
- View focusedChild = mActionsGridView.getFocusedChild();
- if (focusedChild == null) {
- mSelectorView.setVisibility(View.INVISIBLE);
- mChildFocused = false;
- } else if (!mChildFocused) {
- mChildFocused = true;
- mSelectorView.setVisibility(View.VISIBLE);
- updateSelectorView(focusedChild);
- }
- }
- });
+ mGlobalFocusChangeListener);
}
// Cache widths, chevron alpha values, max and min text lines, etc
@@ -311,8 +324,6 @@
TypedValue val = new TypedValue();
mEnabledChevronAlpha = getFloat(ctx, val, R.attr.guidedActionEnabledChevronAlpha);
mDisabledChevronAlpha = getFloat(ctx, val, R.attr.guidedActionDisabledChevronAlpha);
- mContentWidth = getDimension(ctx, val, R.attr.guidedActionContentWidth);
- mContentWidthNoIcon = getDimension(ctx, val, R.attr.guidedActionContentWidthNoIcon);
mTitleMinLines = getInteger(ctx, val, R.attr.guidedActionTitleMinLines);
mTitleMaxLines = getInteger(ctx, val, R.attr.guidedActionTitleMaxLines);
mDescriptionMinLines = getInteger(ctx, val, R.attr.guidedActionDescriptionMinLines);
@@ -332,6 +343,67 @@
}
/**
+ * Default implementation turns on background for actions and applies different Ids to views so
+ * that GuidedStepFragment could run transitions against two action lists. The method is called
+ * by GuidedStepFragment, app may override this function when replacing default layout file
+ * provided by {@link #onProvideLayoutId()}
+ */
+ public void setAsButtonActions() {
+ mButtonActions = true;
+ mMainView.setId(R.id.guidedactions_root2);
+ ViewCompat.setTransitionName(mMainView, "guidedactions_root2");
+ if (mActionsGridView != null) {
+ mActionsGridView.setId(R.id.guidedactions_list2);
+ }
+ if (mSelectorView != null) {
+ mSelectorView.setId(R.id.guidedactions_selector2);
+ ViewCompat.setTransitionName(mSelectorView, "guidedactions_selector2");
+ }
+ if (mContentView != null) {
+ mContentView.setId(R.id.guidedactions_content2);
+ ViewCompat.setTransitionName(mContentView, "guidedactions_content2");
+ }
+ if (mBgView != null) {
+ mBgView.setId(R.id.guidedactions_list_background2);
+ ViewCompat.setTransitionName(mBgView, "guidedactions_list_background2");
+ mBgView.setVisibility(View.VISIBLE);
+ }
+ }
+
+ /**
+ * Returns true if {@link #setAsButtonActions()} was called, false otherwise.
+ * @return True if {@link #setAsButtonActions()} was called, false otherwise.
+ */
+ public boolean isButtonActions() {
+ return mButtonActions;
+ }
+
+ final ViewTreeObserver.OnGlobalFocusChangeListener mGlobalFocusChangeListener =
+ new ViewTreeObserver.OnGlobalFocusChangeListener() {
+
+ @Override
+ public void onGlobalFocusChanged(View oldFocus, View newFocus) {
+ updateSelectorView(false);
+ }
+ };
+
+ /**
+ * Called when destroy the View created by GuidedActionsStylist.
+ */
+ public void onDestroyView() {
+ if (mSelectorView != null) {
+ mActionsGridView.getViewTreeObserver().removeOnGlobalFocusChangeListener(
+ mGlobalFocusChangeListener);
+ }
+ endSelectorAnimator();
+ mActionsGridView = null;
+ mSelectorView = null;
+ mContentView = null;
+ mBgView = null;
+ mMainView = null;
+ }
+
+ /**
* Returns the VerticalGridView that displays the list of GuidedActions.
* @return The VerticalGridView for this presenter.
*/
@@ -353,6 +425,16 @@
}
/**
+ * Return view type of action, each different type can have differently associated layout Id.
+ * Default implementation returns {@link #VIEW_TYPE_DEFAULT}.
+ * @param action The action object.
+ * @return View type that used in {@link #onProvideItemLayoutId(int)}.
+ */
+ public int getItemViewType(GuidedAction action) {
+ return VIEW_TYPE_DEFAULT;
+ }
+
+ /**
* Provides the resource ID of the layout defining the view for an individual guided actions.
* Subclasses may override to provide their own customized layouts. The base implementation
* returns {@link android.support.v17.leanback.R.layout#lb_guidedactions_item}. If overridden,
@@ -360,7 +442,8 @@
* the base class; this can be achieved by starting with a copy of the base layout file. Note
* that in order for the item to support editing, the title view should both subclass {@link
* android.widget.EditText} and implement {@link ImeKeyMonitor}; see {@link
- * GuidedActionEditText}.
+ * GuidedActionEditText}. To support different types of Layouts, override {@link
+ * #onProvideItemLayoutId(int)}.
* @return The resource ID of the layout to be inflated to define the view to display an
* individual GuidedAction.
*/
@@ -369,8 +452,31 @@
}
/**
+ * Provides the resource ID of the layout defining the view for an individual guided actions.
+ * Subclasses may override to provide their own customized layouts. The base implementation
+ * returns {@link android.support.v17.leanback.R.layout#lb_guidedactions_item}. If overridden,
+ * the substituted layout should contain matching IDs for any views that should be managed by
+ * the base class; this can be achieved by starting with a copy of the base layout file. Note
+ * that in order for the item to support editing, the title view should both subclass {@link
+ * android.widget.EditText} and implement {@link ImeKeyMonitor}; see {@link
+ * GuidedActionEditText}.
+ * @param viewType View type returned by {@link #getItemViewType(GuidedAction)}
+ * @return The resource ID of the layout to be inflated to define the view to display an
+ * individual GuidedAction.
+ */
+ public int onProvideItemLayoutId(int viewType) {
+ if (viewType == VIEW_TYPE_DEFAULT) {
+ return onProvideItemLayoutId();
+ } else {
+ throw new RuntimeException("ViewType " + viewType +
+ " not supported in GuidedActionsStylist");
+ }
+ }
+
+ /**
* Constructs a {@link ViewHolder} capable of representing {@link GuidedAction}s. Subclasses
- * may choose to return a subclass of ViewHolder.
+ * may choose to return a subclass of ViewHolder. To support different view types, override
+ * {@link #onCreateViewHolder(ViewGroup, int)}
* <p>
* <i>Note: Should not actually add the created view to the parent; the caller will do
* this.</i>
@@ -384,6 +490,25 @@
}
/**
+ * Constructs a {@link ViewHolder} capable of representing {@link GuidedAction}s. Subclasses
+ * may choose to return a subclass of ViewHolder.
+ * <p>
+ * <i>Note: Should not actually add the created view to the parent; the caller will do
+ * this.</i>
+ * @param parent The view group to be used as the parent of the new view.
+ * @param viewType The viewType returned by {@link #getItemViewType(GuidedAction)}
+ * @return The view to be added to the caller's view hierarchy.
+ */
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ if (viewType == VIEW_TYPE_DEFAULT) {
+ return onCreateViewHolder(parent);
+ }
+ LayoutInflater inflater = LayoutInflater.from(parent.getContext());
+ View v = inflater.inflate(onProvideItemLayoutId(viewType), parent, false);
+ return new ViewHolder(v);
+ }
+
+ /**
* Binds a {@link ViewHolder} to a particular {@link GuidedAction}.
* @param vh The view holder to be associated with the given action.
* @param action The guided action to be displayed by the view holder's view.
@@ -394,6 +519,7 @@
if (vh.mTitleView != null) {
vh.mTitleView.setText(action.getTitle());
vh.mTitleView.setAlpha(action.isEnabled() ? mEnabledTextAlpha : mDisabledTextAlpha);
+ vh.mTitleView.setFocusable(action.isEditable());
}
if (vh.mDescriptionView != null) {
vh.mDescriptionView.setText(action.getDescription());
@@ -401,26 +527,15 @@
View.GONE : View.VISIBLE);
vh.mDescriptionView.setAlpha(action.isEnabled() ? mEnabledDescriptionAlpha :
mDisabledDescriptionAlpha);
+ vh.mDescriptionView.setFocusable(action.isDescriptionEditable());
}
// Clients might want the check mark view to be gone entirely, in which case, ignore it.
- if (vh.mCheckmarkView != null && vh.mCheckmarkView.getVisibility() != View.GONE) {
- vh.mCheckmarkView.setVisibility(action.isChecked() ? View.VISIBLE : View.INVISIBLE);
- }
-
- if (vh.mContentView != null) {
- ViewGroup.LayoutParams contentLp = vh.mContentView.getLayoutParams();
- if (setIcon(vh.mIconView, action)) {
- contentLp.width = mContentWidth;
- } else {
- contentLp.width = mContentWidthNoIcon;
- }
- vh.mContentView.setLayoutParams(contentLp);
+ if (vh.mCheckmarkView != null) {
+ onBindCheckMarkView(vh, action);
}
if (vh.mChevronView != null) {
- vh.mChevronView.setVisibility(action.hasNext() ? View.VISIBLE : View.INVISIBLE);
- vh.mChevronView.setAlpha(action.isEnabled() ? mEnabledChevronAlpha :
- mDisabledChevronAlpha);
+ onBindChevronView(vh, action);
}
if (action.hasMultilineDescription()) {
@@ -440,6 +555,35 @@
}
}
setEditingMode(vh, action, false);
+ if (action.isFocusable()) {
+ vh.view.setFocusable(true);
+ if (vh.view instanceof ViewGroup) {
+ ((ViewGroup) vh.view).setDescendantFocusability(ViewGroup.FOCUS_BEFORE_DESCENDANTS);
+ }
+ } else {
+ vh.view.setFocusable(false);
+ if (vh.view instanceof ViewGroup) {
+ ((ViewGroup) vh.view).setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
+ }
+ }
+ setupImeOptions(vh, action);
+ }
+
+ /**
+ * Called by {@link #onBindViewHolder(ViewHolder, GuidedAction)} to setup IME options. Default
+ * implementation assigns {@link EditorInfo#IME_ACTION_DONE}. Subclass may override.
+ * @param vh The view holder to be associated with the given action.
+ * @param action The guided action to be displayed by the view holder's view.
+ */
+ protected void setupImeOptions(ViewHolder vh, GuidedAction action) {
+ setupNextImeOptions(vh.getEditableTitleView());
+ setupNextImeOptions(vh.getEditableDescriptionView());
+ }
+
+ private void setupNextImeOptions(EditText edit) {
+ if (edit != null) {
+ edit.setImeOptions(EditorInfo.IME_ACTION_NEXT);
+ }
}
public void setEditingMode(ViewHolder vh, GuidedAction action, boolean editing) {
@@ -519,31 +663,77 @@
}
/**
- * Animates the view holder's view (or subviews thereof) when the action has had its check
- * state changed.
+ * Resets the view holder's view to unpressed state.
+ * @param vh The view holder associated with the relevant action.
+ */
+ public void onAnimateItemPressedCancelled(ViewHolder vh) {
+ createAnimator(vh.view, R.attr.guidedActionUnpressedAnimation).end();
+ }
+
+ /**
+ * Animates the view holder's view (or subviews thereof) when the action has had its check state
+ * changed. Default implementation calls setChecked() if {@link ViewHolder#getCheckmarkView()}
+ * is instance of {@link Checkable}.
+ *
* @param vh The view holder associated with the relevant action.
* @param checked True if the action has become checked, false if it has become unchecked.
+ * @see #onBindCheckMarkView(ViewHolder, GuidedAction)
*/
public void onAnimateItemChecked(ViewHolder vh, boolean checked) {
- final View checkView = vh.mCheckmarkView;
- if (checkView != null) {
- if (checked) {
- checkView.setVisibility(View.VISIBLE);
- createAnimator(checkView, R.attr.guidedActionCheckedAnimation).start();
- } else {
- Animator animator = createAnimator(checkView,
- R.attr.guidedActionUncheckedAnimation);
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- checkView.setVisibility(View.INVISIBLE);
- }
- });
- animator.start();
- }
+ if (vh.mCheckmarkView instanceof Checkable) {
+ ((Checkable) vh.mCheckmarkView).setChecked(checked);
}
}
+ /**
+ * Sets states of check mark view, called by {@link #onBindViewHolder(ViewHolder, GuidedAction)}
+ * when action's checkset Id is other than {@link GuidedAction#NO_CHECK_SET}. Default
+ * implementation assigns drawable loaded from theme attribute
+ * {@link android.R.attr#listChoiceIndicatorMultiple} for checkbox or
+ * {@link android.R.attr#listChoiceIndicatorSingle} for radio button. Subclass rarely needs
+ * override the method, instead app can provide its own drawable that supports transition
+ * animations, change theme attributes {@link android.R.attr#listChoiceIndicatorMultiple} and
+ * {@link android.R.attr#listChoiceIndicatorSingle} in {android.support.v17.leanback.R.
+ * styleable#LeanbackGuidedStepTheme}.
+ *
+ * @param vh The view holder associated with the relevant action.
+ * @param action The GuidedAction object to bind to.
+ * @see #onAnimateItemChecked(ViewHolder, boolean)
+ */
+ public void onBindCheckMarkView(ViewHolder vh, GuidedAction action) {
+ if (action.getCheckSetId() != GuidedAction.NO_CHECK_SET) {
+ vh.mCheckmarkView.setVisibility(View.VISIBLE);
+ int attrId = action.getCheckSetId() == GuidedAction.CHECKBOX_CHECK_SET_ID ?
+ android.R.attr.listChoiceIndicatorMultiple :
+ android.R.attr.listChoiceIndicatorSingle;
+ final Context context = vh.mCheckmarkView.getContext();
+ Drawable drawable = null;
+ TypedValue typedValue = new TypedValue();
+ if (context.getTheme().resolveAttribute(attrId, typedValue, true)) {
+ drawable = ContextCompat.getDrawable(context, typedValue.resourceId);
+ }
+ vh.mCheckmarkView.setImageDrawable(drawable);
+ if (vh.mCheckmarkView instanceof Checkable) {
+ ((Checkable) vh.mCheckmarkView).setChecked(action.isChecked());
+ }
+ } else {
+ vh.mCheckmarkView.setVisibility(View.GONE);
+ }
+ }
+
+ /**
+ * Sets states of chevron view, called by {@link #onBindViewHolder(ViewHolder, GuidedAction)}.
+ * Subclass may override.
+ *
+ * @param vh The view holder associated with the relevant action.
+ * @param action The GuidedAction object to bind to.
+ */
+ public void onBindChevronView(ViewHolder vh, GuidedAction action) {
+ vh.mChevronView.setVisibility(action.hasNext() ? View.VISIBLE : View.GONE);
+ vh.mChevronView.setAlpha(action.isEnabled() ? mEnabledChevronAlpha :
+ mDisabledChevronAlpha);
+ }
+
/*
* ==========================================
* FragmentAnimationProvider overrides
@@ -555,8 +745,7 @@
*/
@Override
public void onImeAppearing(@NonNull List<Animator> animators) {
- animators.add(createAnimator(mActionsGridView, R.attr.guidedStepImeAppearingAnimation));
- animators.add(createAnimator(mSelectorView, R.attr.guidedStepImeAppearingAnimation));
+ animators.add(createAnimator(mContentView, R.attr.guidedStepImeAppearingAnimation));
}
/**
@@ -564,8 +753,7 @@
*/
@Override
public void onImeDisappearing(@NonNull List<Animator> animators) {
- animators.add(createAnimator(mActionsGridView, R.attr.guidedStepImeDisappearingAnimation));
- animators.add(createAnimator(mSelectorView, R.attr.guidedStepImeDisappearingAnimation));
+ animators.add(createAnimator(mContentView, R.attr.guidedStepImeDisappearingAnimation));
}
/*
@@ -574,15 +762,6 @@
* ==========================================
*/
- private void updateSelectorView(View focusedChild) {
- // Display the selector view.
- int height = focusedChild.getHeight();
- LayoutParams lp = mSelectorView.getLayoutParams();
- lp.height = height;
- mSelectorView.setLayoutParams(lp);
- mSelectorView.setAlpha(1f);
- }
-
private float getFloat(Context ctx, TypedValue typedValue, int attrId) {
ctx.getTheme().resolveAttribute(attrId, typedValue, true);
// Android resources don't have a native float type, so we have to use strings.
@@ -636,96 +815,43 @@
return (int)(mDisplayHeight - 2*mVerticalPadding - 2*mTitleMaxLines*title.getLineHeight());
}
- /**
- * SelectorAnimator
- * Controls animation for selected item backgrounds
- * TODO: Move into focus animation override?
- */
- private static class SelectorAnimator extends RecyclerView.OnScrollListener {
-
- private final View mSelectorView;
- private final ViewGroup mParentView;
- private volatile boolean mFadedOut = true;
-
- SelectorAnimator(View selectorView, ViewGroup parentView) {
- mSelectorView = selectorView;
- mParentView = parentView;
+ private void endSelectorAnimator() {
+ if (mSelectorAnimator != null) {
+ mSelectorAnimator.end();
+ mSelectorAnimator = null;
}
+ }
- // We want to fade in the selector if we've stopped scrolling on it. If
- // we're scrolling, we want to ensure to dim the selector if we haven't
- // already. We dim the last highlighted view so that while a user is
- // scrolling, nothing is highlighted.
- @Override
- public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
- Animator animator = null;
- boolean fadingOut = false;
- if (newState == RecyclerView.SCROLL_STATE_IDLE) {
- // The selector starts with a height of 0. In order to scale up from
- // 0, we first need the set the height to 1 and scale from there.
- View focusedChild = mParentView.getFocusedChild();
- if (focusedChild != null) {
- int selectorHeight = mSelectorView.getHeight();
- float scaleY = (float) focusedChild.getHeight() / selectorHeight;
- AnimatorSet animators = (AnimatorSet)createAnimator(mSelectorView,
- R.attr.guidedActionsSelectorShowAnimation);
- if (mFadedOut) {
- // selector is completely faded out, so we can just scale before fading in.
- mSelectorView.setScaleY(scaleY);
- animator = animators.getChildAnimations().get(0);
- } else {
- // selector is not faded out, so we must animate the scale as we fade in.
- ((ObjectAnimator)animators.getChildAnimations().get(1))
- .setFloatValues(scaleY);
- animator = animators;
- }
- }
+ private void updateSelectorView(boolean animate) {
+ if (mActionsGridView == null || mSelectorView == null || mSelectorView.getHeight() <= 0) {
+ return;
+ }
+ final View focusedChild = mActionsGridView.getFocusedChild();
+ endSelectorAnimator();
+ if (focusedChild == null || !mActionsGridView.hasFocus()
+ || mActionsGridView.getScrollState() != RecyclerView.SCROLL_STATE_IDLE) {
+ if (animate) {
+ mSelectorAnimator = createAnimator(mSelectorView,
+ R.attr.guidedActionsSelectorHideAnimation);
+ mSelectorAnimator.start();
} else {
- animator = createAnimator(mSelectorView, R.attr.guidedActionsSelectorHideAnimation);
- fadingOut = true;
+ mSelectorView.setAlpha(0f);
}
- if (animator != null) {
- animator.addListener(new Listener(fadingOut));
- animator.start();
- }
- }
-
- /**
- * Sets {@link BaseScrollAdapterFragment#mFadedOut}
- * {@link BaseScrollAdapterFragment#mFadedOut} is true, iff
- * {@link BaseScrollAdapterFragment#mSelectorView} has an alpha of 0
- * (faded out). If false the view either has an alpha of 1 (visible) or
- * is in the process of animating.
- */
- private class Listener implements Animator.AnimatorListener {
- private boolean mFadingOut;
- private boolean mCanceled;
-
- public Listener(boolean fadingOut) {
- mFadingOut = fadingOut;
- }
-
- @Override
- public void onAnimationStart(Animator animation) {
- if (!mFadingOut) {
- mFadedOut = false;
- }
- }
-
- @Override
- public void onAnimationEnd(Animator animation) {
- if (!mCanceled && mFadingOut) {
- mFadedOut = true;
- }
- }
-
- @Override
- public void onAnimationCancel(Animator animation) {
- mCanceled = true;
- }
-
- @Override
- public void onAnimationRepeat(Animator animation) {
+ } else {
+ final float scaleY = (float) focusedChild.getHeight() / mSelectorView.getHeight();
+ Rect r = new Rect(0, 0, focusedChild.getWidth(), focusedChild.getHeight());
+ mMainView.offsetDescendantRectToMyCoords(focusedChild, r);
+ mMainView.offsetRectIntoDescendantCoords(mSelectorView, r);
+ mSelectorView.setTranslationY(r.exactCenterY() - mSelectorView.getHeight() * 0.5f);
+ if (animate) {
+ mSelectorAnimator = createAnimator(mSelectorView,
+ R.attr.guidedActionsSelectorShowAnimation);
+ ((ObjectAnimator) ((AnimatorSet) mSelectorAnimator).getChildAnimations().get(1))
+ .setFloatValues(scaleY);
+ mSelectorAnimator.start();
+ } else {
+ mSelectorView.setAlpha(1f);
+ mSelectorView.setScaleY(scaleY);
}
}
}
diff --git a/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml b/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml
index 2a4218b..f073f3e 100644
--- a/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml
+++ b/v17/preference-leanback/res/layout/leanback_list_preference_fragment.xml
@@ -20,6 +20,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/lb_preference_decor_list_background"
+ android:elevation="@dimen/lb_preference_decor_elevation"
android:orientation="vertical"
android:transitionGroup="false"
>
@@ -29,6 +30,7 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?attr/defaultBrandColor"
+ android:elevation="@dimen/lb_preference_decor_title_container_elevation"
android:transitionGroup="false"
>
<TextView
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java b/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
index 145ae48..902a665 100644
--- a/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
+++ b/v17/tests/src/android/support/v17/leanback/widget/GridActivity.java
@@ -360,7 +360,8 @@
holder.mItemAlignment = null;
}
if (mChildLayout == -1) {
- ((TextView) holder.itemView).setText("Item "+mItemLengths[position]);
+ ((TextView) holder.itemView).setText("Item "+mItemLengths[position]
+ + " type=" + getItemViewType(position));
boolean focusable = true;
if (mItemFocusables != null) {
focusable = mItemFocusables[position];
@@ -370,7 +371,8 @@
holder.itemView.setBackgroundColor(Color.LTGRAY);
} else {
if (holder.itemView instanceof TextView) {
- ((TextView) holder.itemView).setText("Item "+mItemLengths[position]);
+ ((TextView) holder.itemView).setText("Item "+mItemLengths[position]
+ + " type=" + getItemViewType(position));
}
}
updateSize(holder.itemView, position);
@@ -380,6 +382,7 @@
public int getItemCount() {
return mNumItems;
}
+
}
void updateSize(View view, int position) {
diff --git a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java b/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
index a24e1f6..335f449 100644
--- a/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
+++ b/v17/tests/src/android/support/v17/leanback/widget/GridWidgetTest.java
@@ -21,6 +21,7 @@
import android.text.Spannable;
import android.util.Log;
import android.util.SparseArray;
+import android.util.SparseIntArray;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
@@ -1886,6 +1887,20 @@
}
}
+ static class ChangeableViewTypesProvider implements ViewTypeProvider {
+ static SparseIntArray sViewTypes = new SparseIntArray();
+ @Override
+ public int getViewType(int position) {
+ return sViewTypes.get(position);
+ }
+ public static void clear() {
+ sViewTypes.clear();
+ }
+ public static void setViewType(int position, int type) {
+ sViewTypes.put(position, type);
+ }
+ }
+
static class PositionItemAlignmentFacetProviderForRelativeLayout1
implements ItemAlignmentFacetProvider {
ItemAlignmentFacet mMultipleFacet;
@@ -2101,6 +2116,38 @@
assertEquals(0, mGridView.getSelectedPosition());
}
+ public void testNotifyItemTypeChangedSelectionEvent() throws Throwable {
+ mInstrumentation = getInstrumentation();
+ Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
+ intent.putExtra(GridActivity.EXTRA_LAYOUT_RESOURCE_ID,
+ R.layout.vertical_linear);
+ intent.putExtra(GridActivity.EXTRA_NUM_ITEMS, 10);
+ intent.putExtra(GridActivity.EXTRA_VIEWTYPEPROVIDER_CLASS,
+ ChangeableViewTypesProvider.class.getName());
+ ChangeableViewTypesProvider.clear();
+ initActivity(intent);
+ mOrientation = BaseGridView.HORIZONTAL;
+ mNumRows = 1;
+
+ final ArrayList<Integer> selectedLog = new ArrayList<Integer>();
+ mGridView.setOnChildSelectedListener(new OnChildSelectedListener() {
+ public void onChildSelected(ViewGroup parent, View view, int position, long id) {
+ selectedLog.add(position);
+ }
+ });
+
+ runTestOnUiThread(new Runnable() {
+ public void run() {
+ ChangeableViewTypesProvider.setViewType(0, 1);
+ mGridView.getAdapter().notifyItemChanged(0, 1);
+ }
+ });
+ waitForTransientStateGone(null);
+ assertEquals(0, mGridView.getSelectedPosition());
+ assertEquals(selectedLog.size(), 1);
+ assertEquals((int) selectedLog.get(0), 0);
+ }
+
public void testSelectionSmoothAndAddItemInOneCycle() throws Throwable {
mInstrumentation = getInstrumentation();
Intent intent = new Intent(mInstrumentation.getContext(), GridActivity.class);
diff --git a/v4/Android.mk b/v4/Android.mk
index d6fb925..4336e40 100644
--- a/v4/Android.mk
+++ b/v4/Android.mk
@@ -195,13 +195,25 @@
# -----------------------------------------------------------------------
+# A helper sub-library that allows to use Lollipop internal APIs.
+include $(CLEAR_VARS)
+LOCAL_MODULE := android-support-v4-api21-internal
+LOCAL_SDK_VERSION := 21
+LOCAL_SRC_FILES := \
+ $(call all-java-files-under, api21/android/content/pm) \
+ $(call all-java-files-under, api21/android/service/media)
+LOCAL_MODULE_TAGS := optional
+include $(BUILD_JAVA_LIBRARY)
+
+# -----------------------------------------------------------------------
+
# A helper sub-library that makes direct use of Lollipop APIs.
include $(CLEAR_VARS)
LOCAL_MODULE := android-support-v4-api21
LOCAL_SDK_VERSION := 21
-LOCAL_SRC_FILES := $(call all-java-files-under, api21)
+LOCAL_SRC_FILES := $(call all-java-files-under, api21/android/support)
+LOCAL_JAVA_LIBRARIES := android-support-v4-api21-internal
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api20
-LOCAL_JARJAR_RULES := $(LOCAL_PATH)/jarjar-rules.txt
include $(BUILD_STATIC_JAVA_LIBRARY)
support_module_src_files += $(LOCAL_SRC_FILES)
@@ -225,6 +237,7 @@
LOCAL_MODULE := android-support-v4-api23
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := $(call all-java-files-under, api23)
+LOCAL_JAVA_LIBRARIES := android-support-v4-api21-internal
LOCAL_STATIC_JAVA_LIBRARIES := android-support-v4-api22
include $(BUILD_STATIC_JAVA_LIBRARY)
diff --git a/v4/api/current.txt b/v4/api/current.txt
index 74ed0f0..9f50a24 100644
--- a/v4/api/current.txt
+++ b/v4/api/current.txt
@@ -1208,6 +1208,77 @@
package android.support.v4.media {
+ public final class MediaBrowserCompat {
+ ctor public MediaBrowserCompat(android.content.Context, android.content.ComponentName, android.support.v4.media.MediaBrowserCompat.ConnectionCallback, android.os.Bundle);
+ method public void connect();
+ method public void disconnect();
+ method public android.os.Bundle getExtras();
+ method public void getItem(java.lang.String, android.support.v4.media.MediaBrowserCompat.ItemCallback);
+ method public java.lang.String getRoot();
+ method public android.content.ComponentName getServiceComponent();
+ method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+ method public boolean isConnected();
+ method public void subscribe(java.lang.String, android.support.v4.media.MediaBrowserCompat.SubscriptionCallback);
+ method public void unsubscribe(java.lang.String);
+ }
+
+ public static class MediaBrowserCompat.ConnectionCallback {
+ ctor public MediaBrowserCompat.ConnectionCallback();
+ method public void onConnected();
+ method public void onConnectionFailed();
+ method public void onConnectionSuspended();
+ }
+
+ public static abstract class MediaBrowserCompat.ItemCallback {
+ ctor public MediaBrowserCompat.ItemCallback();
+ method public void onError(java.lang.String);
+ method public void onItemLoaded(android.support.v4.media.MediaBrowserCompat.MediaItem);
+ }
+
+ public static class MediaBrowserCompat.MediaItem implements android.os.Parcelable {
+ ctor public MediaBrowserCompat.MediaItem(android.support.v4.media.MediaDescriptionCompat, int);
+ method public int describeContents();
+ method public android.support.v4.media.MediaDescriptionCompat getDescription();
+ method public int getFlags();
+ method public java.lang.String getMediaId();
+ method public boolean isBrowsable();
+ method public boolean isPlayable();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.media.MediaBrowserCompat.MediaItem> CREATOR;
+ field public static final int FLAG_BROWSABLE = 1; // 0x1
+ field public static final int FLAG_PLAYABLE = 2; // 0x2
+ }
+
+ public static abstract class MediaBrowserCompat.SubscriptionCallback {
+ ctor public MediaBrowserCompat.SubscriptionCallback();
+ method public void onChildrenLoaded(java.lang.String, java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+ method public void onError(java.lang.String);
+ }
+
+ public abstract class MediaBrowserServiceCompat extends android.app.Service {
+ ctor public MediaBrowserServiceCompat();
+ method public void dump(java.io.FileDescriptor, java.io.PrintWriter, java.lang.String[]);
+ method public android.support.v4.media.session.MediaSessionCompat.Token getSessionToken();
+ method public void notifyChildrenChanged(java.lang.String);
+ method public android.os.IBinder onBind(android.content.Intent);
+ method public abstract android.support.v4.media.MediaBrowserServiceCompat.BrowserRoot onGetRoot(java.lang.String, int, android.os.Bundle);
+ method public abstract void onLoadChildren(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<java.util.List<android.support.v4.media.MediaBrowserCompat.MediaItem>>);
+ method public void onLoadItem(java.lang.String, android.support.v4.media.MediaBrowserServiceCompat.Result<android.support.v4.media.MediaBrowserCompat.MediaItem>);
+ method public void setSessionToken(android.support.v4.media.session.MediaSessionCompat.Token);
+ field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
+ }
+
+ public static final class MediaBrowserServiceCompat.BrowserRoot {
+ ctor public MediaBrowserServiceCompat.BrowserRoot(java.lang.String, android.os.Bundle);
+ method public android.os.Bundle getExtras();
+ method public java.lang.String getRootId();
+ }
+
+ public static class MediaBrowserServiceCompat.Result {
+ method public void detach();
+ method public void sendResult(T);
+ }
+
public final class MediaDescriptionCompat implements android.os.Parcelable {
method public int describeContents();
method public static android.support.v4.media.MediaDescriptionCompat fromMediaDescription(java.lang.Object);
@@ -3124,6 +3195,7 @@
method public void setStatusBarBackgroundColor(int);
field public static final int LOCK_MODE_LOCKED_CLOSED = 1; // 0x1
field public static final int LOCK_MODE_LOCKED_OPEN = 2; // 0x2
+ field public static final int LOCK_MODE_UNDEFINED = 3; // 0x3
field public static final int LOCK_MODE_UNLOCKED = 0; // 0x0
field public static final int STATE_DRAGGING = 1; // 0x1
field public static final int STATE_IDLE = 0; // 0x0
@@ -3414,6 +3486,7 @@
method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable);
method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, int, int, int, int);
+ method public static void setTextAppearance(android.widget.TextView, int);
}
public abstract interface TintableCompoundButton {
diff --git a/v4/api21/android/service/media/IMediaBrowserServiceCallbacks.java b/v4/api21/android/service/media/IMediaBrowserServiceCallbacks.java
index 4bea5d9..fe988fe 100644
--- a/v4/api21/android/service/media/IMediaBrowserServiceCallbacks.java
+++ b/v4/api21/android/service/media/IMediaBrowserServiceCallbacks.java
@@ -18,8 +18,11 @@
import android.content.pm.ParceledListSlice;
import android.media.session.MediaSession;
+import android.os.Binder;
import android.os.Bundle;
+import android.os.IBinder;
import android.os.IInterface;
+import android.os.Parcel;
import android.os.RemoteException;
/**
@@ -30,6 +33,56 @@
* @hide
*/
public interface IMediaBrowserServiceCallbacks extends IInterface {
+ public static abstract class Stub extends Binder implements IMediaBrowserServiceCallbacks
+ {
+ public Stub() {
+ }
+
+ public static IMediaBrowserServiceCallbacks asInterface(IBinder obj) {
+ return null;
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+
+ @Override
+ public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
+ throws RemoteException {
+ return false;
+ }
+
+ private static class Proxy implements IMediaBrowserServiceCallbacks
+ {
+ Proxy(IBinder remote) {
+ }
+
+ @Override
+ public IBinder asBinder() {
+ return null;
+ }
+
+ public String getInterfaceDescriptor() {
+ return null;
+ }
+
+ @Override
+ public void onConnect(String root, MediaSession.Token session, Bundle extras)
+ throws RemoteException {
+ }
+
+ @Override
+ public void onConnectFailed() throws RemoteException {
+ }
+
+ @Override
+ public void onLoadChildren(String mediaId, ParceledListSlice list)
+ throws RemoteException {
+ }
+ }
+ }
+
public void onConnect(String root, MediaSession.Token session, Bundle extras)
throws RemoteException;
public void onConnectFailed() throws RemoteException;
diff --git a/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java b/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
index 93990b4..2f3b45a 100644
--- a/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
+++ b/v4/api21/android/support/v4/graphics/drawable/DrawableCompatLollipop.java
@@ -37,46 +37,28 @@
}
public static void setTint(Drawable drawable, int tint) {
- if (drawable instanceof DrawableWrapperLollipop) {
- // GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
- // functionality instead
- DrawableCompatBase.setTint(drawable, tint);
- } else {
- // Else, we'll use the framework API
- drawable.setTint(tint);
- }
+ drawable.setTint(tint);
}
public static void setTintList(Drawable drawable, ColorStateList tint) {
- if (drawable instanceof DrawableWrapperLollipop) {
- // GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
- // functionality instead
- DrawableCompatBase.setTintList(drawable, tint);
- } else {
- // Else, we'll use the framework API
- drawable.setTintList(tint);
- }
+ drawable.setTintList(tint);
}
public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
- if (drawable instanceof DrawableWrapperLollipop) {
- // GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
- // functionality instead
- DrawableCompatBase.setTintMode(drawable, tintMode);
- } else {
- // Else, we'll use the framework API
- drawable.setTintMode(tintMode);
- }
+ drawable.setTintMode(tintMode);
}
- public static Drawable wrapForTinting(Drawable drawable) {
- if (drawable instanceof GradientDrawable || drawable instanceof DrawableContainer) {
- // GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
- // functionality instead. We also do the same for DrawableContainers since they may
- // contain GradientDrawable instances.
- return new DrawableWrapperLollipop(drawable);
+ public static Drawable wrapForTinting(final Drawable drawable) {
+ if (!(drawable instanceof DrawableWrapperLollipop)) {
+ return new DrawableWrapperLollipop(drawable, shouldForceCompatTinting(drawable));
}
return drawable;
}
+ private static boolean shouldForceCompatTinting(Drawable drawable) {
+ // GradientDrawable on Lollipop does not support tinting, so we'll use our compatible
+ // functionality instead. We also do the same for DrawableContainers since they may
+ // contain GradientDrawable instances.
+ return drawable instanceof GradientDrawable || drawable instanceof DrawableContainer;
+ }
}
diff --git a/v4/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java b/v4/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java
index 1f15040..9533afd 100644
--- a/v4/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java
+++ b/v4/api21/android/support/v4/graphics/drawable/DrawableWrapperLollipop.java
@@ -16,15 +16,24 @@
package android.support.v4.graphics.drawable;
+import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Outline;
+import android.graphics.PorterDuff;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
class DrawableWrapperLollipop extends DrawableWrapperKitKat {
+ private final boolean mUseCompatTinting;
+
DrawableWrapperLollipop(Drawable drawable) {
+ this(drawable, false);
+ }
+
+ DrawableWrapperLollipop(Drawable drawable, boolean useCompatTinting) {
super(drawable);
+ mUseCompatTinting = useCompatTinting;
}
@Override
@@ -56,4 +65,47 @@
public Rect getDirtyBounds() {
return mDrawable.getDirtyBounds();
}
+
+ @Override
+ public void setTintList(ColorStateList tint) {
+ if (mUseCompatTinting) {
+ setCompatTintList(tint);
+ } else {
+ mDrawable.setTintList(tint);
+ }
+ }
+
+ @Override
+ public void setTint(int tintColor) {
+ if (mUseCompatTinting) {
+ setCompatTint(tintColor);
+ } else {
+ mDrawable.setTint(tintColor);
+ }
+ }
+
+ @Override
+ public void setTintMode(PorterDuff.Mode tintMode) {
+ if (mUseCompatTinting) {
+ setCompatTintMode(tintMode);
+ } else {
+ mDrawable.setTintMode(tintMode);
+ }
+ }
+
+ @Override
+ public boolean setState(int[] stateSet) {
+ if (super.setState(stateSet)) {
+ // Manually invalidate because the framework doesn't currently force an invalidation
+ // on a state change
+ invalidateSelf();
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ protected boolean isCompatTintEnabled() {
+ return mUseCompatTinting;
+ }
}
diff --git a/v4/api21/android/support/v4/media/MediaBrowserCompatApi21.java b/v4/api21/android/support/v4/media/MediaBrowserCompatApi21.java
index c9ca69e..c6ccb14 100644
--- a/v4/api21/android/support/v4/media/MediaBrowserCompatApi21.java
+++ b/v4/api21/android/support/v4/media/MediaBrowserCompatApi21.java
@@ -27,6 +27,8 @@
import java.util.List;
class MediaBrowserCompatApi21 {
+ static final String NULL_MEDIA_ITEM_ID =
+ "android.support.v4.media.MediaBrowserCompat.NULL_MEDIA_ITEM";
public static Object createConnectionCallback(ConnectionCallback callback) {
return new ConnectionCallbackProxy<>(callback);
@@ -112,7 +114,7 @@
}
interface SubscriptionCallback {
- void onChildrenLoaded(@NonNull String parentId, @NonNull List<Parcel> children);
+ void onChildrenLoaded(@NonNull String parentId, List<Parcel> children);
void onError(@NonNull String parentId);
}
@@ -126,8 +128,12 @@
@Override
public void onChildrenLoaded(@NonNull String parentId,
- @NonNull List<MediaBrowser.MediaItem> children) {
+ List<MediaBrowser.MediaItem> children) {
List<Parcel> parcelList = null;
+ if (children != null && children.size() == 1
+ && children.get(0).getMediaId().equals(NULL_MEDIA_ITEM_ID)) {
+ children = null;
+ }
if (children != null) {
parcelList = new ArrayList<>();
for (MediaBrowser.MediaItem item : children) {
@@ -144,14 +150,4 @@
mSubscriptionCallback.onError(parentId);
}
}
-
- static class MediaItem {
- public static Object getDescription(Object mediaItem) {
- return ((MediaBrowser.MediaItem) mediaItem).getDescription();
- }
-
- public static int getFlags(Object mediaItem) {
- return ((MediaBrowser.MediaItem) mediaItem).getFlags();
- }
- }
}
diff --git a/v4/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java b/v4/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
index b8363af..a1506d3 100644
--- a/v4/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
+++ b/v4/api21/android/support/v4/media/MediaBrowserServiceCompatApi21.java
@@ -18,8 +18,10 @@
import android.content.Intent;
import android.content.pm.ParceledListSlice;
+import android.media.MediaDescription;
import android.media.browse.MediaBrowser;
import android.media.session.MediaSession;
+import android.os.Build;
import android.os.Bundle;
import android.os.IBinder;
import android.os.Parcel;
@@ -35,23 +37,22 @@
class MediaBrowserServiceCompatApi21 {
public static Object createService() {
- return new MediaBrowserServiceAdaptor();
+ return new MediaBrowserServiceAdaptorApi21();
}
- public static void onCreate(Object serviceObj, ServiceImpl serviceImpl) {
- ((MediaBrowserServiceAdaptor) serviceObj).onCreate(serviceImpl);
+ public static void onCreate(Object serviceObj, ServiceImplApi21 serviceImpl) {
+ ((MediaBrowserServiceAdaptorApi21) serviceObj).onCreate(serviceImpl);
}
public static IBinder onBind(Object serviceObj, Intent intent) {
- return ((MediaBrowserServiceAdaptor) serviceObj).onBind(intent);
+ return ((MediaBrowserServiceAdaptorApi21) serviceObj).onBind(intent);
}
- public interface ServiceImpl {
+ public interface ServiceImplApi21 {
void connect(final String pkg, final Bundle rootHints, final ServiceCallbacks callbacks);
void disconnect(final ServiceCallbacks callbacks);
void addSubscription(final String id, final ServiceCallbacks callbacks);
void removeSubscription(final String id, final ServiceCallbacks callbacks);
- void getMediaItem(final String mediaId, final ResultReceiver receiver);
}
public interface ServiceCallbacks {
@@ -62,6 +63,16 @@
}
public static class ServiceCallbacksApi21 implements ServiceCallbacks {
+ private static final ParceledListSlice sNullParceledListSlice;
+ static {
+ MediaDescription nullDescription = new MediaDescription.Builder().setMediaId(
+ MediaBrowserCompatApi21.NULL_MEDIA_ITEM_ID).build();
+ MediaBrowser.MediaItem nullMediaItem = new MediaBrowser.MediaItem(nullDescription, 0);
+ List<MediaBrowser.MediaItem> nullMediaItemList = new ArrayList<>();
+ nullMediaItemList.add(nullMediaItem);
+ sNullParceledListSlice = new ParceledListSlice(nullMediaItemList);
+ }
+
private final IMediaBrowserServiceCallbacks mCallbacks;
ServiceCallbacksApi21(IMediaBrowserServiceCallbacks callbacks) {
@@ -90,16 +101,21 @@
parcel.recycle();
}
}
- final ParceledListSlice<MediaBrowser.MediaItem> pls = new ParceledListSlice(itemList);
+ ParceledListSlice<MediaBrowser.MediaItem> pls;
+ if (Build.VERSION.SDK_INT > 23) {
+ pls = itemList == null ? null : new ParceledListSlice(itemList);
+ } else {
+ pls = itemList == null ? sNullParceledListSlice : new ParceledListSlice(itemList);
+ }
mCallbacks.onLoadChildren(mediaId, pls);
}
}
- private static class MediaBrowserServiceAdaptor {
- ServiceBinderProxy mBinder;
+ static class MediaBrowserServiceAdaptorApi21 {
+ ServiceBinderProxyApi21 mBinder;
- public void onCreate(ServiceImpl serviceImpl) {
- mBinder = new ServiceBinderProxy(serviceImpl);
+ public void onCreate(ServiceImplApi21 serviceImpl) {
+ mBinder = new ServiceBinderProxyApi21(serviceImpl);
}
public IBinder onBind(Intent intent) {
@@ -109,10 +125,10 @@
return null;
}
- private static class ServiceBinderProxy extends IMediaBrowserService.Stub {
- private final ServiceImpl mServiceImpl;
+ static class ServiceBinderProxyApi21 extends IMediaBrowserService.Stub {
+ final ServiceImplApi21 mServiceImpl;
- ServiceBinderProxy(ServiceImpl serviceImpl) {
+ ServiceBinderProxyApi21(ServiceImplApi21 serviceImpl) {
mServiceImpl = serviceImpl;
}
@@ -142,7 +158,7 @@
@Override
public void getMediaItem(final String mediaId, final ResultReceiver receiver) {
- mServiceImpl.getMediaItem(mediaId, receiver);
+ // No operation since this method is added in API 23.
}
}
}
diff --git a/v4/api21/android/support/v4/media/MediaMetadataCompatApi21.java b/v4/api21/android/support/v4/media/MediaMetadataCompatApi21.java
index eddcf76..fd51f78 100644
--- a/v4/api21/android/support/v4/media/MediaMetadataCompatApi21.java
+++ b/v4/api21/android/support/v4/media/MediaMetadataCompatApi21.java
@@ -19,6 +19,7 @@
import android.graphics.Bitmap;
import android.media.MediaMetadata;
import android.media.Rating;
+import android.os.Parcel;
import java.util.Set;
@@ -43,6 +44,14 @@
return ((MediaMetadata) metadataObj).getText(key);
}
+ public static void writeToParcel(Object metadataObj, Parcel dest, int flags) {
+ ((MediaMetadata) metadataObj).writeToParcel(dest, flags);
+ }
+
+ public static Object createFromParcel(Parcel in) {
+ return MediaMetadata.CREATOR.createFromParcel(in);
+ }
+
public static class Builder {
public static Object newInstance() {
return new MediaMetadata.Builder();
diff --git a/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java b/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java
index bfd2bea..50f2657 100644
--- a/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java
+++ b/v4/api22/android/support/v4/graphics/drawable/DrawableCompatApi22.java
@@ -24,8 +24,8 @@
class DrawableCompatApi22 {
public static Drawable wrapForTinting(Drawable drawable) {
- // We don't need to wrap anything in Lollipop-MR1
- return drawable;
+ // We need to wrap to force an invalidation on any state change
+ return new DrawableWrapperLollipop(drawable);
}
}
diff --git a/v4/api23/android/support/v4/media/MediaBrowserCompatApi23.java b/v4/api23/android/support/v4/media/MediaBrowserCompatApi23.java
new file mode 100644
index 0000000..1e9df1a
--- /dev/null
+++ b/v4/api23/android/support/v4/media/MediaBrowserCompatApi23.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.media;
+
+import android.media.browse.MediaBrowser;
+import android.os.Parcel;
+import android.support.annotation.NonNull;
+
+class MediaBrowserCompatApi23 {
+
+ public static Object createItemCallback(ItemCallback callback) {
+ return new ItemCallbackProxy<>(callback);
+ }
+
+ public static void getItem(Object browserObj, String mediaId, Object itemCallbackObj) {
+ ((MediaBrowser) browserObj).getItem(mediaId, ((MediaBrowser.ItemCallback) itemCallbackObj));
+ }
+
+ interface ItemCallback {
+ void onItemLoaded(Parcel itemParcel);
+ void onError(@NonNull String itemId);
+ }
+
+ static class ItemCallbackProxy<T extends ItemCallback> extends MediaBrowser.ItemCallback {
+ protected final T mItemCallback;
+
+ public ItemCallbackProxy(T callback) {
+ mItemCallback = callback;
+ }
+
+ @Override
+ public void onItemLoaded(MediaBrowser.MediaItem item) {
+ Parcel parcel = Parcel.obtain();
+ item.writeToParcel(parcel, 0);
+ mItemCallback.onItemLoaded(parcel);
+ }
+
+ @Override
+ public void onError(@NonNull String itemId) {
+ mItemCallback.onError(itemId);
+ }
+ }
+}
diff --git a/v4/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java b/v4/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java
new file mode 100644
index 0000000..fcaea40
--- /dev/null
+++ b/v4/api23/android/support/v4/media/MediaBrowserServiceCompatApi23.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.media;
+
+import android.media.browse.MediaBrowser;
+import android.os.Bundle;
+import android.os.Parcel;
+import android.os.ResultReceiver;
+import android.service.media.MediaBrowserService;
+import android.util.Log;
+
+class MediaBrowserServiceCompatApi23 extends MediaBrowserServiceCompatApi21 {
+ private static final String TAG = "MediaBrowserServiceCompatApi21";
+
+ public static Object createService() {
+ return new MediaBrowserServiceAdaptorApi23();
+ }
+
+ public static void onCreate(Object serviceObj, ServiceImplApi23 serviceImpl) {
+ ((MediaBrowserServiceAdaptorApi23) serviceObj).onCreate(serviceImpl);
+ }
+
+ public interface ServiceImplApi23 extends ServiceImplApi21 {
+ void getMediaItem(final String mediaId, final ItemCallback cb);
+ }
+
+ public interface ItemCallback {
+ void onItemLoaded(int resultCode, Bundle resultData, Parcel itemParcel);
+ }
+
+ static class MediaBrowserServiceAdaptorApi23 extends MediaBrowserServiceAdaptorApi21 {
+
+ public void onCreate(ServiceImplApi23 serviceImpl) {
+ mBinder = new ServiceBinderProxyApi23(serviceImpl);
+ }
+
+ private static class ServiceBinderProxyApi23 extends ServiceBinderProxyApi21 {
+ ServiceImplApi23 mServiceImpl;
+
+ ServiceBinderProxyApi23(ServiceImplApi23 serviceImpl) {
+ super(serviceImpl);
+ mServiceImpl = serviceImpl;
+ }
+
+ @Override
+ public void getMediaItem(final String mediaId, final ResultReceiver receiver) {
+ final String KEY_MEDIA_ITEM;
+ try {
+ KEY_MEDIA_ITEM = (String) MediaBrowserService.class.getDeclaredField(
+ "KEY_MEDIA_ITEM").get(null);
+ } catch (IllegalAccessException | NoSuchFieldException e) {
+ Log.i(TAG, "Failed to get KEY_MEDIA_ITEM via reflection", e);
+ return;
+ }
+
+ mServiceImpl.getMediaItem(mediaId, new ItemCallback() {
+ @Override
+ public void onItemLoaded(int resultCode, Bundle resultData, Parcel itemParcel) {
+ if (itemParcel != null) {
+ itemParcel.setDataPosition(0);
+ MediaBrowser.MediaItem item =
+ MediaBrowser.MediaItem.CREATOR.createFromParcel(itemParcel);
+ resultData.putParcelable(KEY_MEDIA_ITEM, item);
+ itemParcel.recycle();
+ }
+ receiver.send(resultCode, resultData);
+ }
+ });
+ }
+ }
+ }
+}
diff --git a/v4/api23/android/support/v4/widget/TextViewCompatApi23.java b/v4/api23/android/support/v4/widget/TextViewCompatApi23.java
new file mode 100644
index 0000000..8370bfc
--- /dev/null
+++ b/v4/api23/android/support/v4/widget/TextViewCompatApi23.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.widget;
+
+import android.support.annotation.IdRes;
+import android.support.annotation.NonNull;
+import android.widget.TextView;
+
+class TextViewCompatApi23 {
+ public static void setTextAppearance(@NonNull TextView textView, @IdRes int resId) {
+ textView.setTextAppearance(resId);
+ }
+}
diff --git a/v4/build.gradle b/v4/build.gradle
index 727ef33..ba65cab 100644
--- a/v4/build.gradle
+++ b/v4/build.gradle
@@ -64,6 +64,10 @@
// depend on the generation of this jar. This is done below
// when manipulating the libraryVariants.
compile files(internalJar.archivePath)
+
+ androidTestCompile 'com.android.support.test:testing-support-lib:0.1'
+ androidTestCompile 'com.android.support.test.espresso:espresso-core:2.0'
+ testCompile 'junit:junit:4.12'
}
android {
@@ -73,6 +77,8 @@
minSdkVersion 4
// TODO: get target from branch
//targetSdkVersion 19
+
+ testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
sourceSets {
@@ -82,6 +88,8 @@
androidTest.setRoot('tests')
androidTest.java.srcDir 'tests/java'
+ androidTest.res.srcDir 'tests/res'
+ androidTest.manifest.srcFile 'tests/AndroidManifest.xml'
}
lintOptions {
@@ -93,6 +101,10 @@
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
+
+ testOptions {
+ unitTests.returnDefaultValues = true
+ }
}
android.libraryVariants.all { variant ->
@@ -137,6 +149,17 @@
artifacts.add('archives', sourcesJarTask);
}
+// TODO make this generic for all projects
+afterEvaluate {
+ def originalTask = tasks['packageDebugAndroidTest']
+ tasks['assembleDebugAndroidTest'].doLast {
+ copy {
+ from(originalTask.outputFile)
+ into(rootProject.ext.testApkDistOut)
+ }
+ }
+}
+
uploadArchives {
repositories {
mavenDeployer {
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java b/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java
index 4809618..fe0163d 100644
--- a/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java
+++ b/v4/donut/android/support/v4/graphics/drawable/DrawableCompatBase.java
@@ -27,19 +27,19 @@
public static void setTint(Drawable drawable, int tint) {
if (drawable instanceof DrawableWrapper) {
- ((DrawableWrapper) drawable).setTint(tint);
+ ((DrawableWrapper) drawable).setCompatTint(tint);
}
}
public static void setTintList(Drawable drawable, ColorStateList tint) {
if (drawable instanceof DrawableWrapper) {
- ((DrawableWrapper) drawable).setTintList(tint);
+ ((DrawableWrapper) drawable).setCompatTintList(tint);
}
}
public static void setTintMode(Drawable drawable, PorterDuff.Mode tintMode) {
if (drawable instanceof DrawableWrapper) {
- ((DrawableWrapper) drawable).setTintMode(tintMode);
+ ((DrawableWrapper) drawable).setCompatTintMode(tintMode);
}
}
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapper.java b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapper.java
index 1073f34..edbe5ad 100644
--- a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapper.java
+++ b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapper.java
@@ -28,11 +28,11 @@
*/
public interface DrawableWrapper {
- void setTint(int tint);
+ void setCompatTint(int tint);
- void setTintList(ColorStateList tint);
+ void setCompatTintList(ColorStateList tint);
- void setTintMode(PorterDuff.Mode tintMode);
+ void setCompatTintMode(PorterDuff.Mode tintMode);
Drawable getWrappedDrawable();
diff --git a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
index 9293520..300e2e8 100644
--- a/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
+++ b/v4/donut/android/support/v4/graphics/drawable/DrawableWrapperDonut.java
@@ -89,7 +89,8 @@
@Override
public boolean isStateful() {
- return (mTintList != null && mTintList.isStateful()) || mDrawable.isStateful();
+ final ColorStateList tintList = isCompatTintEnabled() ? mTintList : null;
+ return (tintList != null && tintList.isStateful()) || mDrawable.isStateful();
}
@Override
@@ -188,30 +189,38 @@
}
@Override
- public void setTint(int tint) {
- setTintList(ColorStateList.valueOf(tint));
+ public void setCompatTint(int tint) {
+ setCompatTintList(ColorStateList.valueOf(tint));
}
@Override
- public void setTintList(ColorStateList tint) {
- mTintList = tint;
- updateTint(getState());
+ public void setCompatTintList(ColorStateList tint) {
+ if (mTintList != tint) {
+ mTintList = tint;
+ updateTint(getState());
+ }
}
@Override
- public void setTintMode(PorterDuff.Mode tintMode) {
- mTintMode = tintMode;
- updateTint(getState());
+ public void setCompatTintMode(PorterDuff.Mode tintMode) {
+ if (mTintMode != tintMode) {
+ mTintMode = tintMode;
+ updateTint(getState());
+ }
}
private boolean updateTint(int[] state) {
+ if (!isCompatTintEnabled()) {
+ // If compat tinting is not enabled, fail fast
+ return false;
+ }
+
if (mTintList != null && mTintMode != null) {
final int color = mTintList.getColorForState(state, mTintList.getDefaultColor());
- final PorterDuff.Mode mode = mTintMode;
- if (!mColorFilterSet || color != mCurrentColor || mode != mCurrentMode) {
- setColorFilter(color, mode);
+ if (!mColorFilterSet || color != mCurrentColor || mTintMode != mCurrentMode) {
+ setColorFilter(color, mTintMode);
mCurrentColor = color;
- mCurrentMode = mode;
+ mCurrentMode = mTintMode;
mColorFilterSet = true;
return true;
}
@@ -236,13 +245,26 @@
if (mDrawable != null) {
mDrawable.setCallback(null);
}
+ mDrawable = null;
+
+ if (drawable != null) {
+ // Copy over the bounds from the drawable
+ setBounds(drawable.getBounds());
+ // Set ourselves as the callback for invalidations
+ drawable.setCallback(this);
+ } else {
+ // Clear our bounds
+ setBounds(0, 0, 0, 0);
+ }
mDrawable = drawable;
- if (drawable != null) {
- drawable.setCallback(this);
- }
// Invalidate ourselves
invalidateSelf();
}
+
+ protected boolean isCompatTintEnabled() {
+ // It's enabled by default on Donut
+ return true;
+ }
}
diff --git a/v4/jarjar-rules.txt b/v4/jarjar-rules.txt
deleted file mode 100644
index 51761d4..0000000
--- a/v4/jarjar-rules.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-# Exclude the duplicated classes that are already present
-# in the Android frameworks.
-zap android.content.pm.**
-zap android.service.media.**
diff --git a/v4/java/android/support/v4/media/MediaBrowserCompat.java b/v4/java/android/support/v4/media/MediaBrowserCompat.java
index 4884cf2..dcce7f5 100644
--- a/v4/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/v4/java/android/support/v4/media/MediaBrowserCompat.java
@@ -31,6 +31,8 @@
import android.support.annotation.IntDef;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.BundleCompat;
+import android.support.v4.media.session.MediaControllerCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.os.ResultReceiver;
import android.support.v4.util.ArrayMap;
@@ -40,25 +42,19 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
+import static android.support.v4.media.MediaBrowserProtocol.*;
+
/**
* Browses media content offered by a {@link MediaBrowserServiceCompat}.
* <p>
* This object is not thread-safe. All calls should happen on the thread on which the browser
* was constructed.
* </p>
- * @hide
*/
public final class MediaBrowserCompat {
- public static final String DATA_RESULT_RECEIVER = "data_result_receiver";
-
- // TODO: Consider introducing version numbers for MediaBrowserCompat and
- // MediaBrowserServiceCompat.
- public static final int MSG_ON_CONNECT = 1;
- public static final int MSG_ON_CONNECT_FAILED = 2;
- public static final int MSG_ON_LOAD_CHILDREN = 3;
+ private static final String TAG = "MediaBrowserCompat";
private final MediaBrowserImpl mImpl;
@@ -75,8 +71,9 @@
*/
public MediaBrowserCompat(Context context, ComponentName serviceComponent,
ConnectionCallback callback, Bundle rootHints) {
- // TODO: Implement MediaBrowserImplApi23.
- if (android.os.Build.VERSION.SDK_INT >= 21) {
+ if (android.os.Build.VERSION.SDK_INT >= 23) {
+ mImpl = new MediaBrowserImplApi23(context, serviceComponent, callback, rootHints);
+ } else if (android.os.Build.VERSION.SDK_INT >= 21) {
mImpl = new MediaBrowserImplApi21(context, serviceComponent, callback, rootHints);
} else {
mImpl = new MediaBrowserImplBase(context, serviceComponent, callback, rootHints);
@@ -221,7 +218,7 @@
* Flag: Indicates that the item is playable.
* <p>
* The id of this item may be passed to
- * {@link MediaController.TransportControls#playFromMediaId(String, Bundle)}
+ * {@link MediaControllerCompat.TransportControls#playFromMediaId(String, Bundle)}
* to start playing it.
* </p>
*/
@@ -396,10 +393,9 @@
* Called when the list of children is loaded or updated.
*
* @param parentId The media id of the parent media item.
- * @param children The children which were loaded.
+ * @param children The children which were loaded, or null if the id is invalid.
*/
- public void onChildrenLoaded(@NonNull String parentId,
- @NonNull List<MediaItem> children) {
+ public void onChildrenLoaded(@NonNull String parentId, List<MediaItem> children) {
}
/**
@@ -442,6 +438,16 @@
* Callback for receiving the result of {@link #getItem}.
*/
public static abstract class ItemCallback {
+ final Object mItemCallbackObj;
+
+ public ItemCallback() {
+ if (android.os.Build.VERSION.SDK_INT >= 23) {
+ mItemCallbackObj = MediaBrowserCompatApi23.createItemCallback(new StubApi23());
+ } else {
+ mItemCallbackObj = null;
+ }
+ }
+
/**
* Called when the item has been returned by the browser service.
*
@@ -457,6 +463,21 @@
*/
public void onError(@NonNull String itemId) {
}
+
+ private class StubApi23 implements MediaBrowserCompatApi23.ItemCallback {
+ @Override
+ public void onItemLoaded(Parcel itemParcel) {
+ itemParcel.setDataPosition(0);
+ MediaItem item = MediaBrowserCompat.MediaItem.CREATOR.createFromParcel(itemParcel);
+ itemParcel.recycle();
+ ItemCallback.this.onItemLoaded(item);
+ }
+
+ @Override
+ public void onError(@NonNull String itemId) {
+ ItemCallback.this.onError(itemId);
+ }
+ }
}
interface MediaBrowserImpl {
@@ -473,7 +494,6 @@
}
static class MediaBrowserImplBase implements MediaBrowserImpl {
- private static final String TAG = "MediaBrowserCompat";
private static final boolean DBG = false;
private static final int CONNECT_STATE_DISCONNECTED = 0;
@@ -831,30 +851,27 @@
private final void onLoadChildren(final Messenger callback, final String parentId,
final List list) {
- // Check that there hasn't been a disconnect or a different ServiceConnection.
- if (!isCurrent(callback, "onLoadChildren")) {
- return;
- }
-
- List<MediaItem> data = list;
- if (DBG) {
- Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId);
- }
- if (data == null) {
- data = Collections.emptyList();
- }
-
- // Check that the subscription is still subscribed.
- final Subscription subscription = mSubscriptions.get(parentId);
- if (subscription == null) {
- if (DBG) {
- Log.d(TAG, "onLoadChildren for id that isn't subscribed id=" + parentId);
+ // Check that there hasn't been a disconnect or a different ServiceConnection.
+ if (!isCurrent(callback, "onLoadChildren")) {
+ return;
}
- return;
- }
- // Tell the app.
- subscription.callback.onChildrenLoaded(parentId, data);
+ List<MediaItem> data = list;
+ if (DBG) {
+ Log.d(TAG, "onLoadChildren for " + mServiceComponent + " id=" + parentId);
+ }
+
+ // Check that the subscription is still subscribed.
+ final Subscription subscription = mSubscriptions.get(parentId);
+ if (subscription == null) {
+ if (DBG) {
+ Log.d(TAG, "onLoadChildren for id that isn't subscribed id=" + parentId);
+ }
+ return;
+ }
+
+ // Tell the app.
+ subscription.callback.onChildrenLoaded(parentId, data);
}
/**
@@ -896,35 +913,33 @@
}
void connect() throws RemoteException {
- sendRequest(MediaBrowserServiceCompat.MSG_CONNECT, mContext.getPackageName(),
- mRootHints, mCallbacksMessenger);
+ sendRequest(CLIENT_MSG_CONNECT, mContext.getPackageName(), mRootHints,
+ mCallbacksMessenger);
}
void disconnect() throws RemoteException {
- sendRequest(MediaBrowserServiceCompat.MSG_DISCONNECT, null, null,
- mCallbacksMessenger);
+ sendRequest(CLIENT_MSG_DISCONNECT, null, null, mCallbacksMessenger);
}
void addSubscription(String parentId) throws RemoteException {
- sendRequest(MediaBrowserServiceCompat.MSG_ADD_SUBSCRIPTION, parentId, null,
- mCallbacksMessenger);
+ sendRequest(CLIENT_MSG_ADD_SUBSCRIPTION, parentId, null, mCallbacksMessenger);
}
void removeSubscription(String parentId) throws RemoteException {
- sendRequest(MediaBrowserServiceCompat.MSG_REMOVE_SUBSCRIPTION, parentId, null,
- mCallbacksMessenger);
+ sendRequest(CLIENT_MSG_REMOVE_SUBSCRIPTION, parentId, null, mCallbacksMessenger);
}
void getMediaItem(String mediaId, ResultReceiver receiver) throws RemoteException {
Bundle data = new Bundle();
- data.putParcelable(DATA_RESULT_RECEIVER, receiver);
- sendRequest(MediaBrowserServiceCompat.MSG_GET_MEDIA_ITEM, mediaId, data, null);
+ data.putParcelable(SERVICE_DATA_RESULT_RECEIVER, receiver);
+ sendRequest(CLIENT_MSG_GET_MEDIA_ITEM, mediaId, data, null);
}
private void sendRequest(int what, Object obj, Bundle data, Messenger cbMessenger)
throws RemoteException {
Message msg = Message.obtain();
msg.what = what;
+ msg.arg1 = CLIENT_VERSION_CURRENT;
msg.obj = obj;
msg.setData(data);
msg.replyTo = cbMessenger;
@@ -937,69 +952,89 @@
*/
private class MediaServiceConnection implements ServiceConnection {
@Override
- public void onServiceConnected(ComponentName name, IBinder binder) {
- if (DBG) {
- Log.d(TAG, "MediaServiceConnection.onServiceConnected name=" + name
- + " binder=" + binder);
- dump();
- }
+ public void onServiceConnected(final ComponentName name, final IBinder binder) {
+ postOrRun(new Runnable() {
+ @Override
+ public void run() {
+ if (DBG) {
+ Log.d(TAG, "MediaServiceConnection.onServiceConnected name=" + name
+ + " binder=" + binder);
+ dump();
+ }
- // Make sure we are still the current connection, and that they haven't called
- // disconnect().
- if (!isCurrent("onServiceConnected")) {
- return;
- }
+ // Make sure we are still the current connection, and that they haven't
+ // called disconnect().
+ if (!isCurrent("onServiceConnected")) {
+ return;
+ }
- // Save their binder
- mServiceBinderWrapper = new ServiceBinderWrapper(binder);
+ // Save their binder
+ mServiceBinderWrapper = new ServiceBinderWrapper(binder);
- // We make a new mServiceCallbacks each time we connect so that we can drop
- // responses from previous connections.
- mCallbacksMessenger = new Messenger(mHandler);
+ // We make a new mServiceCallbacks each time we connect so that we can drop
+ // responses from previous connections.
+ mCallbacksMessenger = new Messenger(mHandler);
- mState = CONNECT_STATE_CONNECTING;
+ mState = CONNECT_STATE_CONNECTING;
- // Call connect, which is async. When we get a response from that we will
- // say that we're connected.
- try {
- if (DBG) {
- Log.d(TAG, "ServiceCallbacks.onConnect...");
- dump();
+ // Call connect, which is async. When we get a response from that we will
+ // say that we're connected.
+ try {
+ if (DBG) {
+ Log.d(TAG, "ServiceCallbacks.onConnect...");
+ dump();
+ }
+ mServiceBinderWrapper.connect();
+ } catch (RemoteException ex) {
+ // Connect failed, which isn't good. But the auto-reconnect on the
+ // service will take over and we will come back. We will also get the
+ // onServiceDisconnected, which has all the cleanup code. So let that
+ // do it.
+ Log.w(TAG, "RemoteException during connect for " + mServiceComponent);
+ if (DBG) {
+ Log.d(TAG, "ServiceCallbacks.onConnect...");
+ dump();
+ }
+ }
}
- mServiceBinderWrapper.connect();
- } catch (RemoteException ex) {
- // Connect failed, which isn't good. But the auto-reconnect on the service
- // will take over and we will come back. We will also get the
- // onServiceDisconnected, which has all the cleanup code. So let that do it.
- Log.w(TAG, "RemoteException during connect for " + mServiceComponent);
- if (DBG) {
- Log.d(TAG, "ServiceCallbacks.onConnect...");
- dump();
- }
- }
+ });
}
@Override
- public void onServiceDisconnected(ComponentName name) {
- if (DBG) {
- Log.d(TAG, "MediaServiceConnection.onServiceDisconnected name=" + name
- + " this=" + this + " mServiceConnection=" + mServiceConnection);
- dump();
+ public void onServiceDisconnected(final ComponentName name) {
+ postOrRun(new Runnable() {
+ @Override
+ public void run() {
+ if (DBG) {
+ Log.d(TAG, "MediaServiceConnection.onServiceDisconnected name=" + name
+ + " this=" + this + " mServiceConnection=" +
+ mServiceConnection);
+ dump();
+ }
+
+ // Make sure we are still the current connection, and that they haven't
+ // called disconnect().
+ if (!isCurrent("onServiceDisconnected")) {
+ return;
+ }
+
+ // Clear out what we set in onServiceConnected
+ mServiceBinderWrapper = null;
+ mCallbacksMessenger = null;
+
+ // And tell the app that it's suspended.
+ mState = CONNECT_STATE_SUSPENDED;
+ mCallback.onConnectionSuspended();
+ }
+ });
+ }
+
+ private void postOrRun(Runnable r) {
+ if (Thread.currentThread() == mHandler.getLooper().getThread()) {
+ r.run();
+ } else {
+ mHandler.post(r);
}
-
- // Make sure we are still the current connection, and that they haven't called
- // disconnect().
- if (!isCurrent("onServiceDisconnected")) {
- return;
- }
-
- // Clear out what we set in onServiceConnected
- mServiceBinderWrapper = null;
- mCallbacksMessenger = null;
-
- // And tell the app that it's suspended.
- mState = CONNECT_STATE_SUSPENDED;
- mCallback.onConnectionSuspended();
}
/**
@@ -1023,22 +1058,23 @@
public void handleMessage(Message msg) {
Bundle data = msg.getData();
switch (msg.what) {
- case MSG_ON_CONNECT:
+ case SERVICE_MSG_ON_CONNECT:
onServiceConnected(mCallbacksMessenger, (String) msg.obj,
(MediaSessionCompat.Token) data.getParcelable(
- MediaBrowserServiceCompat.DATA_MEDIA_SESSION_TOKEN),
- data.getBundle(MediaBrowserServiceCompat.DATA_EXTRAS));
+ SERVICE_DATA_MEDIA_SESSION_TOKEN),
+ data.getBundle(SERVICE_DATA_EXTRAS));
break;
- case MSG_ON_CONNECT_FAILED:
+ case SERVICE_MSG_ON_CONNECT_FAILED:
onConnectionFailed(mCallbacksMessenger);
break;
- case MSG_ON_LOAD_CHILDREN:
+ case SERVICE_MSG_ON_LOAD_CHILDREN:
onLoadChildren(mCallbacksMessenger, (String) msg.obj,
- data.getParcelableArrayList(
- MediaBrowserServiceCompat.DATA_MEDIA_ITEM_LIST));
+ data.getParcelableArrayList(SERVICE_DATA_MEDIA_ITEM_LIST));
break;
default:
- super.handleMessage(msg);
+ Log.w(TAG, "Unhandled message: " + msg
+ + "\n Client version: " + CLIENT_VERSION_CURRENT
+ + "\n Service version: " + msg.arg1);
}
}
}
@@ -1054,7 +1090,9 @@
}
static class MediaBrowserImplApi21 implements MediaBrowserImpl {
- Object mBrowserObj;
+ protected Object mBrowserObj;
+ protected Messenger mMessenger;
+ protected Handler mHandler = new Handler();
public MediaBrowserImplApi21(Context context, ComponentName serviceComponent,
ConnectionCallback callback, Bundle rootHints) {
@@ -1113,9 +1151,93 @@
}
@Override
+ public void getItem(@NonNull final String mediaId, @NonNull final ItemCallback cb) {
+ if (TextUtils.isEmpty(mediaId)) {
+ throw new IllegalArgumentException("mediaId is empty.");
+ }
+ if (cb == null) {
+ throw new IllegalArgumentException("cb is null.");
+ }
+ if (!MediaBrowserCompatApi21.isConnected(mBrowserObj)) {
+ Log.i(TAG, "Not connected, unable to retrieve the MediaItem.");
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ cb.onError(mediaId);
+ }
+ });
+ return;
+ }
+ if (mMessenger == null) {
+ Bundle extras = MediaBrowserCompatApi21.getExtras(mBrowserObj);
+ IBinder serviceBinder = BundleCompat.getBinder(extras, EXTRA_MESSENGER_BINDER);
+ if (serviceBinder != null) {
+ mMessenger = new Messenger(serviceBinder);
+ }
+ }
+ if (mMessenger == null) {
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ // Default framework implementation.
+ cb.onItemLoaded(null);
+ }
+ });
+ return;
+ }
+ ResultReceiver receiver = new ResultReceiver(mHandler) {
+ @Override
+ protected void onReceiveResult(int resultCode, Bundle resultData) {
+ if (resultCode != 0 || resultData == null
+ || !resultData.containsKey(MediaBrowserServiceCompat.KEY_MEDIA_ITEM)) {
+ cb.onError(mediaId);
+ return;
+ }
+ Parcelable item =
+ resultData.getParcelable(MediaBrowserServiceCompat.KEY_MEDIA_ITEM);
+ if (!(item instanceof MediaItem)) {
+ cb.onError(mediaId);
+ return;
+ }
+ cb.onItemLoaded((MediaItem)item);
+ }
+ };
+ try {
+ Bundle data = new Bundle();
+ data.putParcelable(SERVICE_DATA_RESULT_RECEIVER, receiver);
+ sendRequest(CLIENT_MSG_GET_MEDIA_ITEM, mediaId, data, null);
+ } catch (RemoteException e) {
+ Log.i(TAG, "Remote error getting media item.");
+ mHandler.post(new Runnable() {
+ @Override
+ public void run() {
+ cb.onError(mediaId);
+ }
+ });
+ }
+ }
+
+ private void sendRequest(int what, Object obj, Bundle data, Messenger cbMessenger)
+ throws RemoteException {
+ Message msg = Message.obtain();
+ msg.what = what;
+ msg.arg1 = CLIENT_VERSION_CURRENT;
+ msg.obj = obj;
+ msg.setData(data);
+ msg.replyTo = cbMessenger;
+ mMessenger.send(msg);
+ }
+ }
+
+ static class MediaBrowserImplApi23 extends MediaBrowserImplApi21 {
+ public MediaBrowserImplApi23(Context context, ComponentName serviceComponent,
+ ConnectionCallback callback, Bundle rootHints) {
+ super(context, serviceComponent, callback, rootHints);
+ }
+
+ @Override
public void getItem(@NonNull String mediaId, @NonNull ItemCallback cb) {
- // TODO Implement individual item loading on API 21-22 devices
- cb.onItemLoaded(null);
+ MediaBrowserCompatApi23.getItem(mBrowserObj, mediaId, cb.mItemCallbackObj);
}
}
}
diff --git a/v4/java/android/support/v4/media/MediaBrowserProtocol.java b/v4/java/android/support/v4/media/MediaBrowserProtocol.java
new file mode 100644
index 0000000..7c8feb3
--- /dev/null
+++ b/v4/java/android/support/v4/media/MediaBrowserProtocol.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.support.v4.media;
+
+/***
+ * Defines the communication protocol for media browsers and media browser services.
+ * @hide
+ */
+class MediaBrowserProtocol {
+
+ /**
+ * MediaBrowserCompat will check the version of the connected MediaBrowserServiceCompat,
+ * and it will not send messages if they are introduced in the higher version of the
+ * MediaBrowserServiceCompat.
+ */
+ public static final int SERVICE_VERSION_1 = 1;
+ public static final int SERVICE_VERSION_CURRENT = SERVICE_VERSION_1;
+
+ /*
+ * Messages sent from the media browser service compat to the media browser compat.
+ * (Compat implementation for IMediaBrowserServiceCallbacks)
+ * DO NOT RENUMBER THESE!
+ */
+
+ /** (service v1)
+ * Sent after {@link MediaBrowserCompat#connect()} when the request has successfully
+ * completed.
+ * - arg1 : The service version
+ * - obj : The root media item id
+ * - data
+ * SERVICE_DATA_MEDIA_SESSION_TOKEN : Media session token
+ * SERVICE_DATA_EXTRAS : An extras bundle which contains EXTRA_SERVICE_VERSION
+ */
+ public static final int SERVICE_MSG_ON_CONNECT = 1;
+
+ /** (service v1)
+ * Sent after {@link MediaBrowserCompat#connect()} when the connection to the media browser
+ * failed.
+ * - arg1 : service version
+ */
+ public static final int SERVICE_MSG_ON_CONNECT_FAILED = 2;
+
+ /** (service v1)
+ * Sent when the list of children is loaded or updated.
+ * - arg1 : The service version
+ * - obj : The parent media item id
+ * - data
+ * SERVICE_DATA_MEDIA_ITEM_LIST : An array list for the media item children
+ */
+ public static final int SERVICE_MSG_ON_LOAD_CHILDREN = 3;
+
+ public static final String SERVICE_DATA_MEDIA_SESSION_TOKEN = "data_media_session_token";
+ public static final String SERVICE_DATA_EXTRAS = "data_extras";
+ public static final String SERVICE_DATA_MEDIA_ITEM_LIST = "data_media_item_list";
+ public static final String SERVICE_DATA_RESULT_RECEIVER = "data_result_receiver";
+
+ public static final String EXTRA_SERVICE_VERSION = "extra_service_version";
+ public static final String EXTRA_MESSENGER_BINDER = "extra_messenger";
+
+ /**
+ * MediaBrowserServiceCompat will check the version of the MediaBrowserCompat, and it will not
+ * send messages if they are introduced in the higher version of the MediaBrowserCompat.
+ */
+ public static final int CLIENT_VERSION_1 = 1;
+ public static final int CLIENT_VERSION_CURRENT = CLIENT_VERSION_1;
+
+ /*
+ * Messages sent from the media browser compat to the media browser service compat.
+ * (Compat implementation for IMediaBrowserService)
+ * DO NOT RENUMBER THESE!
+ */
+
+ /** (client v1)
+ * Sent to connect to the media browse service compat.
+ * - arg1 : The client version
+ * - obj : The package name
+ * - data : An optional root hints bundle of service-specific arguments
+ * - replayTo : Client messenger
+ */
+ public static final int CLIENT_MSG_CONNECT = 1;
+
+ /** (client v1)
+ * Sent to disconnect from the media browse service compat.
+ * - arg1 : The client version
+ * - replayTo : Client messenger
+ */
+ public static final int CLIENT_MSG_DISCONNECT = 2;
+
+ /** (client v1)
+ * Sent to subscribe for changes to the children of the specified media id.
+ * - arg1 : The client version
+ * - obj : The media item id
+ * - replayTo : Client messenger
+ */
+ public static final int CLIENT_MSG_ADD_SUBSCRIPTION = 3;
+
+ /** (client v1)
+ * Sent to unsubscribe for changes to the children of the specified media id.
+ * - arg1 : The client version
+ * - obj : The media item id
+ * - replayTo : Client messenger
+ */
+ public static final int CLIENT_MSG_REMOVE_SUBSCRIPTION = 4;
+
+ /** (client v1)
+ * Sent to retrieves a specific media item from the connected service.
+ * - arg1 : The client version
+ * - obj : The media item id
+ * - data
+ * SERVICE_DATA_RESULT_RECEIVER : Result receiver to get the result
+ */
+ public static final int CLIENT_MSG_GET_MEDIA_ITEM = 5;
+}
diff --git a/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java b/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java
index ded7e7e..205e789 100644
--- a/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java
+++ b/v4/java/android/support/v4/media/MediaBrowserServiceCompat.java
@@ -30,6 +30,7 @@
import android.os.RemoteException;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.v4.app.BundleCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.os.ResultReceiver;
import android.support.v4.util.ArrayMap;
@@ -42,6 +43,8 @@
import java.util.HashSet;
import java.util.List;
+import static android.support.v4.media.MediaBrowserProtocol.*;
+
/**
* Base class for media browse services.
* <p>
@@ -62,22 +65,11 @@
* </intent-filter>
* </service>
* </pre>
- * @hide
*/
public abstract class MediaBrowserServiceCompat extends Service {
private static final String TAG = "MediaBrowserServiceCompat";
private static final boolean DBG = false;
- public static final String DATA_MEDIA_SESSION_TOKEN = "data_media_session_token";
- public static final String DATA_EXTRAS = "data_extras";
- public static final String DATA_MEDIA_ITEM_LIST = "data_media_item_list";
-
- public static final int MSG_CONNECT = 1;
- public static final int MSG_DISCONNECT = 2;
- public static final int MSG_ADD_SUBSCRIPTION = 3;
- public static final int MSG_REMOVE_SUBSCRIPTION = 4;
- public static final int MSG_GET_MEDIA_ITEM = 5;
-
private MediaBrowserServiceImpl mImpl;
/**
@@ -124,8 +116,7 @@
@Override
public void onCreate() {
mServiceObj = MediaBrowserServiceCompatApi21.createService();
- MediaBrowserServiceCompatApi21.onCreate(mServiceObj,
- new ServiceImplApi21(mHandler.getServiceImpl()));
+ MediaBrowserServiceCompatApi21.onCreate(mServiceObj, new ServiceImplApi21());
}
@Override
@@ -134,33 +125,50 @@
}
}
+ class MediaBrowserServiceImplApi23 implements MediaBrowserServiceImpl {
+ private Object mServiceObj;
+
+ @Override
+ public void onCreate() {
+ mServiceObj = MediaBrowserServiceCompatApi23.createService();
+ MediaBrowserServiceCompatApi23.onCreate(mServiceObj, new ServiceImplApi23());
+ }
+
+ @Override
+ public IBinder onBind(Intent intent) {
+ return MediaBrowserServiceCompatApi23.onBind(mServiceObj, intent);
+ }
+ }
+
private final class ServiceHandler extends Handler {
private final ServiceImpl mServiceImpl = new ServiceImpl();
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
- case MSG_CONNECT:
+ case CLIENT_MSG_CONNECT:
mServiceImpl.connect((String) msg.obj, msg.getData(),
new ServiceCallbacksCompat(msg.replyTo));
break;
- case MSG_DISCONNECT:
+ case CLIENT_MSG_DISCONNECT:
mServiceImpl.disconnect(new ServiceCallbacksCompat(msg.replyTo));
break;
- case MSG_ADD_SUBSCRIPTION:
+ case CLIENT_MSG_ADD_SUBSCRIPTION:
mServiceImpl.addSubscription((String) msg.obj,
new ServiceCallbacksCompat(msg.replyTo));
break;
- case MSG_REMOVE_SUBSCRIPTION:
+ case CLIENT_MSG_REMOVE_SUBSCRIPTION:
mServiceImpl.removeSubscription((String) msg.obj,
new ServiceCallbacksCompat(msg.replyTo));
break;
- case MSG_GET_MEDIA_ITEM:
+ case CLIENT_MSG_GET_MEDIA_ITEM:
mServiceImpl.getMediaItem((String) msg.obj, (ResultReceiver) msg.getData()
- .getParcelable(MediaBrowserCompat.DATA_RESULT_RECEIVER));
+ .getParcelable(SERVICE_DATA_RESULT_RECEIVER));
break;
default:
- super.handleMessage(msg);
+ Log.w(TAG, "Unhandled message: " + msg
+ + "\n Service version: " + SERVICE_VERSION_CURRENT
+ + "\n Client version: " + msg.arg1);
}
}
@@ -371,11 +379,11 @@
}
}
- private class ServiceImplApi21 implements MediaBrowserServiceCompatApi21.ServiceImpl {
+ private class ServiceImplApi21 implements MediaBrowserServiceCompatApi21.ServiceImplApi21 {
final ServiceImpl mServiceImpl;
- ServiceImplApi21(ServiceImpl serviceImpl) {
- mServiceImpl = serviceImpl;
+ ServiceImplApi21() {
+ mServiceImpl = mHandler.getServiceImpl();
}
@Override
@@ -401,13 +409,23 @@
final MediaBrowserServiceCompatApi21.ServiceCallbacks callbacks) {
mServiceImpl.removeSubscription(id, new ServiceCallbacksApi21(callbacks));
}
+ }
+ private class ServiceImplApi23 extends ServiceImplApi21
+ implements MediaBrowserServiceCompatApi23.ServiceImplApi23 {
@Override
- public void getMediaItem(final String mediaId, final android.os.ResultReceiver receiver) {
+ public void getMediaItem(final String mediaId,
+ final MediaBrowserServiceCompatApi23.ItemCallback cb) {
ResultReceiver receiverCompat = new ResultReceiver(mHandler) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
- receiver.send(resultCode, resultData);
+ MediaBrowserCompat.MediaItem item = resultData.getParcelable(KEY_MEDIA_ITEM);
+ Parcel itemParcel = null;
+ if (item != null) {
+ itemParcel = Parcel.obtain();
+ item.writeToParcel(itemParcel, 0);
+ }
+ cb.onItemLoaded(resultCode, resultData, itemParcel);
}
};
mServiceImpl.getMediaItem(mediaId, receiverCompat);
@@ -436,27 +454,36 @@
public void onConnect(String root, MediaSessionCompat.Token session, Bundle extras)
throws RemoteException {
+ if (extras == null) {
+ extras = new Bundle();
+ }
+ extras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT);
Bundle data = new Bundle();
- data.putParcelable(DATA_MEDIA_SESSION_TOKEN, session);
- data.putBundle(DATA_EXTRAS, extras);
- sendRequest(MediaBrowserCompat.MSG_ON_CONNECT, root, data);
+ data.putParcelable(SERVICE_DATA_MEDIA_SESSION_TOKEN, session);
+ data.putBundle(SERVICE_DATA_EXTRAS, extras);
+ sendRequest(SERVICE_MSG_ON_CONNECT, root, data);
}
public void onConnectFailed() throws RemoteException {
- sendRequest(MediaBrowserCompat.MSG_ON_CONNECT_FAILED, null, null);
+ sendRequest(SERVICE_MSG_ON_CONNECT_FAILED, null, null);
}
public void onLoadChildren(String mediaId, List<MediaBrowserCompat.MediaItem> list)
throws RemoteException {
- Bundle data = new Bundle();
- data.putParcelableArrayList(DATA_MEDIA_ITEM_LIST,
- list instanceof ArrayList ? (ArrayList) list : new ArrayList<>(list));
- sendRequest(MediaBrowserCompat.MSG_ON_LOAD_CHILDREN, mediaId, data);
+ Bundle data = null;
+ if (list != null) {
+ data = new Bundle();
+ data.putParcelableArrayList(SERVICE_DATA_MEDIA_ITEM_LIST,
+ list instanceof ArrayList ? (ArrayList) list : new ArrayList<>(list));
+ }
+ sendRequest(SERVICE_MSG_ON_LOAD_CHILDREN, mediaId, data);
}
- private void sendRequest(int what, Object obj, Bundle data) throws RemoteException {
+ private void sendRequest(int what, Object obj, Bundle data)
+ throws RemoteException {
Message msg = Message.obtain();
msg.what = what;
+ msg.arg1 = SERVICE_VERSION_CURRENT;
msg.obj = obj;
msg.setData(data);
mCallbacks.send(msg);
@@ -465,6 +492,7 @@
private class ServiceCallbacksApi21 implements ServiceCallbacks {
final MediaBrowserServiceCompatApi21.ServiceCallbacks mCallbacks;
+ Messenger mMessenger;
ServiceCallbacksApi21(MediaBrowserServiceCompatApi21.ServiceCallbacks callbacks) {
mCallbacks = callbacks;
@@ -476,6 +504,12 @@
public void onConnect(String root, MediaSessionCompat.Token session, Bundle extras)
throws RemoteException {
+ if (extras == null) {
+ extras = new Bundle();
+ }
+ mMessenger = new Messenger(mHandler);
+ BundleCompat.putBinder(extras, EXTRA_MESSENGER_BINDER, mMessenger.getBinder());
+ extras.putInt(EXTRA_SERVICE_VERSION, SERVICE_VERSION_CURRENT);
mCallbacks.onConnect(root, session.getToken(), extras);
}
@@ -501,7 +535,9 @@
@Override
public void onCreate() {
super.onCreate();
- if (Build.VERSION.SDK_INT >= 21) {
+ if (Build.VERSION.SDK_INT >= 23) {
+ mImpl = new MediaBrowserServiceImplApi23();
+ } else if (Build.VERSION.SDK_INT >= 21) {
mImpl = new MediaBrowserServiceImplApi21();
} else {
mImpl = new MediaBrowserServiceImplBase();
@@ -683,10 +719,6 @@
= new Result<List<MediaBrowserCompat.MediaItem>>(parentId) {
@Override
void onResultSent(List<MediaBrowserCompat.MediaItem> list) {
- if (list == null) {
- throw new IllegalStateException("onLoadChildren sent null list for id "
- + parentId);
- }
if (mConnections.get(connection.callbacks.asBinder()) != connection) {
if (DBG) {
Log.d(TAG, "Not sending onLoadChildren result for connection that has"
diff --git a/v4/java/android/support/v4/media/MediaMetadataCompat.java b/v4/java/android/support/v4/media/MediaMetadataCompat.java
index d6ebfa4..0d07826 100644
--- a/v4/java/android/support/v4/media/MediaMetadataCompat.java
+++ b/v4/java/android/support/v4/media/MediaMetadataCompat.java
@@ -361,7 +361,13 @@
public RatingCompat getRating(@RatingKey String key) {
RatingCompat rating = null;
try {
- rating = mBundle.getParcelable(key);
+ if (Build.VERSION.SDK_INT >= 21) {
+ // On platform version 21 or higher, mBundle stores a Rating object. Convert it to
+ // RatingCompat.
+ rating = RatingCompat.fromRating(mBundle.getParcelable(key));
+ } else {
+ rating = mBundle.getParcelable(key);
+ }
} catch (Exception e) {
// ignore, value was not a bitmap
Log.w(TAG, "Failed to retrieve a key as Rating.", e);
@@ -510,31 +516,11 @@
return null;
}
- Builder builder = new Builder();
- for (String key : MediaMetadataCompatApi21.keySet(metadataObj)) {
- Integer type = METADATA_KEYS_TYPE.get(key);
- if (type != null) {
- switch (type) {
- case METADATA_TYPE_BITMAP:
- builder.putBitmap(key,
- MediaMetadataCompatApi21.getBitmap(metadataObj, key));
- break;
- case METADATA_TYPE_LONG:
- builder.putLong(key,
- MediaMetadataCompatApi21.getLong(metadataObj, key));
- break;
- case METADATA_TYPE_RATING:
- builder.putRating(key, RatingCompat.fromRating(
- MediaMetadataCompatApi21.getRating(metadataObj, key)));
- break;
- case METADATA_TYPE_TEXT:
- builder.putText(key,
- MediaMetadataCompatApi21.getText(metadataObj, key));
- break;
- }
- }
- }
- MediaMetadataCompat metadata = builder.build();
+ Parcel p = Parcel.obtain();
+ MediaMetadataCompatApi21.writeToParcel(metadataObj, p, 0);
+ p.setDataPosition(0);
+ MediaMetadataCompat metadata = MediaMetadataCompat.CREATOR.createFromParcel(p);
+ p.recycle();
metadata.mMetadataObj = metadataObj;
return metadata;
}
@@ -554,31 +540,11 @@
return mMetadataObj;
}
- Object builderObj = MediaMetadataCompatApi21.Builder.newInstance();
- for (String key : keySet()) {
- Integer type = METADATA_KEYS_TYPE.get(key);
- if (type != null) {
- switch (type) {
- case METADATA_TYPE_BITMAP:
- MediaMetadataCompatApi21.Builder.putBitmap(builderObj, key,
- getBitmap(key));
- break;
- case METADATA_TYPE_LONG:
- MediaMetadataCompatApi21.Builder.putLong(builderObj, key,
- getLong(key));
- break;
- case METADATA_TYPE_RATING:
- MediaMetadataCompatApi21.Builder.putRating(builderObj, key,
- getRating(key).getRating());
- break;
- case METADATA_TYPE_TEXT:
- MediaMetadataCompatApi21.Builder.putText(builderObj, key,
- getText(key));
- break;
- }
- }
- }
- mMetadataObj = MediaMetadataCompatApi21.Builder.build(builderObj);
+ Parcel p = Parcel.obtain();
+ writeToParcel(p, 0);
+ p.setDataPosition(0);
+ mMetadataObj = MediaMetadataCompatApi21.createFromParcel(p);
+ p.recycle();
return mMetadataObj;
}
@@ -742,7 +708,13 @@
+ " key cannot be used to put a Rating");
}
}
- mBundle.putParcelable(key, value);
+ if (Build.VERSION.SDK_INT >= 21) {
+ // On platform version 21 or higher, use Rating instead of RatingCompat so mBundle
+ // can be unmarshalled.
+ mBundle.putParcelable(key, (Parcelable) value.getRating());
+ } else {
+ mBundle.putParcelable(key, value);
+ }
return this;
}
diff --git a/v4/java/android/support/v4/media/session/MediaControllerCompat.java b/v4/java/android/support/v4/media/session/MediaControllerCompat.java
index aa523bb..a6a5c88 100644
--- a/v4/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/v4/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -557,7 +557,9 @@
}
public void post(int what, Object obj, Bundle data) {
- obtainMessage(what, obj).sendToTarget();
+ Message msg = obtainMessage(what, obj);
+ msg.setData(data);
+ msg.sendToTarget();
}
}
}
@@ -1330,6 +1332,14 @@
@Override
public void playFromUri(Uri uri, Bundle extras) {
+ if (uri == null || Uri.EMPTY.equals(uri)) {
+ throw new IllegalArgumentException(
+ "You must specify a non-empty Uri for playFromUri.");
+ }
+ Bundle bundle = new Bundle();
+ bundle.putParcelable(MediaSessionCompat.ACTION_ARGUMENT_URI, uri);
+ bundle.putParcelable(MediaSessionCompat.ACTION_ARGUMENT_EXTRAS, extras);
+ sendCustomAction(MediaSessionCompat.ACTION_PLAY_FROM_URI, bundle);
}
@Override
diff --git a/v4/java/android/support/v4/media/session/MediaSessionCompat.java b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
index 69a4180..d35ada6 100644
--- a/v4/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/v4/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -107,6 +107,30 @@
public static final int FLAG_HANDLES_TRANSPORT_CONTROLS = 1 << 1;
/**
+ * Custom action to invoke playFromUri() for the forward compatibility.
+ *
+ * @hide
+ */
+ public static final String ACTION_PLAY_FROM_URI =
+ "android.support.v4.media.session.action.PLAY_FROM_URI";
+
+ /**
+ * Argument for use with {@link #ACTION_PLAY_FROM_URI} indicating URI to play.
+ *
+ * @hide
+ */
+ public static final String ACTION_ARGUMENT_URI =
+ "android.support.v4.media.session.action.ARGUMENT_URI";
+
+ /**
+ * Argument for use with {@link #ACTION_PLAY_FROM_URI} indicating extra bundle.
+ *
+ * @hide
+ */
+ public static final String ACTION_ARGUMENT_EXTRAS =
+ "android.support.v4.media.session.action.ARGUMENT_EXTRAS";
+
+ /**
* Creates a new session using a media button receiver from your manifest.
* Note that a media button receiver is required to support platform versions
* earlier than {@link android.os.Build.VERSION_CODES#LOLLIPOP}.
@@ -288,8 +312,8 @@
* <p>
* On platforms earlier than
* {@link android.os.Build.VERSION_CODES#LOLLIPOP},
- * {@link #setMediaButtonReceiver(PendingIntent)} must be called before
- * setting this to true.
+ * a media button event receiver should be set via the constructor to
+ * receive media button events.
*
* @param active Whether this session is active or not.
*/
@@ -713,7 +737,13 @@
@Override
public void onCustomAction(String action, Bundle extras) {
- Callback.this.onCustomAction(action, extras);
+ if (action.equals(ACTION_PLAY_FROM_URI)) {
+ Uri uri = (Uri) extras.getParcelable(ACTION_ARGUMENT_URI);
+ Bundle bundle = (Bundle) extras.getParcelable(ACTION_ARGUMENT_EXTRAS);
+ Callback.this.onPlayFromUri(uri, bundle);
+ } else {
+ Callback.this.onCustomAction(action, extras);
+ }
}
}
diff --git a/v4/java/android/support/v4/view/PagerAdapter.java b/v4/java/android/support/v4/view/PagerAdapter.java
index ef52404..55fb9c1 100644
--- a/v4/java/android/support/v4/view/PagerAdapter.java
+++ b/v4/java/android/support/v4/view/PagerAdapter.java
@@ -76,7 +76,8 @@
* the method {@link #getItemPosition(Object)}.</p>
*/
public abstract class PagerAdapter {
- private DataSetObservable mObservable = new DataSetObservable();
+ private final DataSetObservable mObservable = new DataSetObservable();
+ private DataSetObserver mViewPagerObserver;
public static final int POSITION_UNCHANGED = -1;
public static final int POSITION_NONE = -2;
@@ -273,6 +274,11 @@
* and associated views should update.
*/
public void notifyDataSetChanged() {
+ synchronized (this) {
+ if (mViewPagerObserver != null) {
+ mViewPagerObserver.onChanged();
+ }
+ }
mObservable.notifyChanged();
}
@@ -294,6 +300,12 @@
mObservable.unregisterObserver(observer);
}
+ void setViewPagerObserver(DataSetObserver observer) {
+ synchronized (this) {
+ mViewPagerObserver = observer;
+ }
+ }
+
/**
* This method may be called by the ViewPager to obtain a title string
* to describe the specified page. This method may return null
diff --git a/v4/java/android/support/v4/view/ViewPager.java b/v4/java/android/support/v4/view/ViewPager.java
index 454ac62..c6f3648 100644
--- a/v4/java/android/support/v4/view/ViewPager.java
+++ b/v4/java/android/support/v4/view/ViewPager.java
@@ -418,7 +418,7 @@
*/
public void setAdapter(PagerAdapter adapter) {
if (mAdapter != null) {
- mAdapter.unregisterDataSetObserver(mObserver);
+ mAdapter.setViewPagerObserver(null);
mAdapter.startUpdate(this);
for (int i = 0; i < mItems.size(); i++) {
final ItemInfo ii = mItems.get(i);
@@ -439,7 +439,7 @@
if (mObserver == null) {
mObserver = new PagerObserver();
}
- mAdapter.registerDataSetObserver(mObserver);
+ mAdapter.setViewPagerObserver(mObserver);
mPopulatePending = false;
final boolean wasFirstLayout = mFirstLayout;
mFirstLayout = true;
diff --git a/v4/java/android/support/v4/widget/DrawerLayout.java b/v4/java/android/support/v4/widget/DrawerLayout.java
index b8c682f..549b8ea 100644
--- a/v4/java/android/support/v4/widget/DrawerLayout.java
+++ b/v4/java/android/support/v4/widget/DrawerLayout.java
@@ -113,7 +113,8 @@
public static final int STATE_SETTLING = ViewDragHelper.STATE_SETTLING;
/** @hide */
- @IntDef({LOCK_MODE_UNLOCKED, LOCK_MODE_LOCKED_CLOSED, LOCK_MODE_LOCKED_OPEN})
+ @IntDef({LOCK_MODE_UNLOCKED, LOCK_MODE_LOCKED_CLOSED, LOCK_MODE_LOCKED_OPEN,
+ LOCK_MODE_UNDEFINED})
@Retention(RetentionPolicy.SOURCE)
private @interface LockMode {}
@@ -134,6 +135,11 @@
*/
public static final int LOCK_MODE_LOCKED_OPEN = 2;
+ /**
+ * The drawer's lock state is reset to default.
+ */
+ public static final int LOCK_MODE_UNDEFINED = 3;
+
/** @hide */
@IntDef({Gravity.LEFT, Gravity.RIGHT, GravityCompat.START, GravityCompat.END})
@Retention(RetentionPolicy.SOURCE)
@@ -192,8 +198,12 @@
private int mDrawerState;
private boolean mInLayout;
private boolean mFirstLayout = true;
- private int mLockModeLeft;
- private int mLockModeRight;
+
+ private @LockMode int mLockModeLeft = LOCK_MODE_UNDEFINED;
+ private @LockMode int mLockModeRight = LOCK_MODE_UNDEFINED;
+ private @LockMode int mLockModeStart = LOCK_MODE_UNDEFINED;
+ private @LockMode int mLockModeEnd = LOCK_MODE_UNDEFINED;
+
private boolean mDisallowInterceptRequested;
private boolean mChildrenCanceledTouch;
@@ -547,11 +557,22 @@
public void setDrawerLockMode(@LockMode int lockMode, @EdgeGravity int edgeGravity) {
final int absGravity = GravityCompat.getAbsoluteGravity(edgeGravity,
ViewCompat.getLayoutDirection(this));
- if (absGravity == Gravity.LEFT) {
- mLockModeLeft = lockMode;
- } else if (absGravity == Gravity.RIGHT) {
- mLockModeRight = lockMode;
+
+ switch (edgeGravity) {
+ case Gravity.LEFT:
+ mLockModeLeft = lockMode;
+ break;
+ case Gravity.RIGHT:
+ mLockModeRight = lockMode;
+ break;
+ case GravityCompat.START:
+ mLockModeStart = lockMode;
+ break;
+ case GravityCompat.END:
+ mLockModeEnd = lockMode;
+ break;
}
+
if (lockMode != LOCK_MODE_UNLOCKED) {
// Cancel interaction in progress
final ViewDragHelper helper = absGravity == Gravity.LEFT ? mLeftDragger : mRightDragger;
@@ -569,8 +590,8 @@
if (toClose != null) {
closeDrawer(toClose);
}
- break;
- // default: do nothing
+ break;
+ // default: do nothing
}
}
@@ -610,13 +631,51 @@
*/
@LockMode
public int getDrawerLockMode(@EdgeGravity int edgeGravity) {
- final int absGravity = GravityCompat.getAbsoluteGravity(
- edgeGravity, ViewCompat.getLayoutDirection(this));
- if (absGravity == Gravity.LEFT) {
- return mLockModeLeft;
- } else if (absGravity == Gravity.RIGHT) {
- return mLockModeRight;
+ int layoutDirection = ViewCompat.getLayoutDirection(this);
+
+ switch (edgeGravity) {
+ case Gravity.LEFT:
+ if (mLockModeLeft != LOCK_MODE_UNDEFINED) {
+ return mLockModeLeft;
+ }
+ int leftLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+ mLockModeStart : mLockModeEnd;
+ if (leftLockMode != LOCK_MODE_UNDEFINED) {
+ return leftLockMode;
+ }
+ break;
+ case Gravity.RIGHT:
+ if (mLockModeRight != LOCK_MODE_UNDEFINED) {
+ return mLockModeRight;
+ }
+ int rightLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+ mLockModeEnd : mLockModeStart;
+ if (rightLockMode != LOCK_MODE_UNDEFINED) {
+ return rightLockMode;
+ }
+ break;
+ case GravityCompat.START:
+ if (mLockModeStart != LOCK_MODE_UNDEFINED) {
+ return mLockModeStart;
+ }
+ int startLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+ mLockModeLeft : mLockModeRight;
+ if (startLockMode != LOCK_MODE_UNDEFINED) {
+ return startLockMode;
+ }
+ break;
+ case GravityCompat.END:
+ if (mLockModeEnd != LOCK_MODE_UNDEFINED) {
+ return mLockModeEnd;
+ }
+ int endLockMode = (layoutDirection == ViewCompat.LAYOUT_DIRECTION_LTR) ?
+ mLockModeRight : mLockModeLeft;
+ if (endLockMode != LOCK_MODE_UNDEFINED) {
+ return endLockMode;
+ }
+ break;
}
+
return LOCK_MODE_UNLOCKED;
}
@@ -629,13 +688,8 @@
*/
@LockMode
public int getDrawerLockMode(View drawerView) {
- final int absGravity = getDrawerViewAbsoluteGravity(drawerView);
- if (absGravity == Gravity.LEFT) {
- return mLockModeLeft;
- } else if (absGravity == Gravity.RIGHT) {
- return mLockModeRight;
- }
- return LOCK_MODE_UNLOCKED;
+ final int drawerGravity = ((LayoutParams) drawerView.getLayoutParams()).gravity;
+ return getDrawerLockMode(drawerGravity);
}
/**
@@ -715,8 +769,8 @@
void dispatchOnDrawerClosed(View drawerView) {
final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
- if (lp.knownOpen) {
- lp.knownOpen = false;
+ if ((lp.openState & LayoutParams.FLAG_IS_OPENED) == 1) {
+ lp.openState = 0;
if (mListener != null) {
mListener.onDrawerClosed(drawerView);
}
@@ -737,8 +791,8 @@
void dispatchOnDrawerOpened(View drawerView) {
final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
- if (!lp.knownOpen) {
- lp.knownOpen = true;
+ if ((lp.openState & LayoutParams.FLAG_IS_OPENED) == 0) {
+ lp.openState = LayoutParams.FLAG_IS_OPENED;
if (mListener != null) {
mListener.onDrawerOpened(drawerView);
}
@@ -809,7 +863,8 @@
final int childCount = getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = getChildAt(i);
- if (((LayoutParams) child.getLayoutParams()).knownOpen) {
+ final LayoutParams childLp = (LayoutParams) child.getLayoutParams();
+ if ((childLp.openState & LayoutParams.FLAG_IS_OPENED) == 1) {
return child;
}
}
@@ -1439,13 +1494,15 @@
throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
}
+ final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
if (mFirstLayout) {
- final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
lp.onScreen = 1.f;
- lp.knownOpen = true;
+ lp.openState = LayoutParams.FLAG_IS_OPENED;
updateChildrenImportantForAccessibility(drawerView, true);
} else {
+ lp.openState |= LayoutParams.FLAG_IS_OPENING;
+
if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
mLeftDragger.smoothSlideViewTo(drawerView, 0, drawerView.getTop());
} else {
@@ -1481,11 +1538,13 @@
throw new IllegalArgumentException("View " + drawerView + " is not a sliding drawer");
}
+ final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
if (mFirstLayout) {
- final LayoutParams lp = (LayoutParams) drawerView.getLayoutParams();
lp.onScreen = 0.f;
- lp.knownOpen = false;
+ lp.openState = 0;
} else {
+ lp.openState |= LayoutParams.FLAG_IS_CLOSING;
+
if (checkDrawerViewAbsoluteGravity(drawerView, Gravity.LEFT)) {
mLeftDragger.smoothSlideViewTo(drawerView, -drawerView.getWidth(),
drawerView.getTop());
@@ -1525,7 +1584,8 @@
if (!isDrawerView(drawer)) {
throw new IllegalArgumentException("View " + drawer + " is not a drawer");
}
- return ((LayoutParams) drawer.getLayoutParams()).knownOpen;
+ LayoutParams drawerLp = (LayoutParams) drawer.getLayoutParams();
+ return (drawerLp.openState & LayoutParams.FLAG_IS_OPENED) == 1;
}
/**
@@ -1709,8 +1769,18 @@
}
}
- setDrawerLockMode(ss.lockModeLeft, Gravity.LEFT);
- setDrawerLockMode(ss.lockModeRight, Gravity.RIGHT);
+ if (ss.lockModeLeft != LOCK_MODE_UNDEFINED) {
+ setDrawerLockMode(ss.lockModeLeft, Gravity.LEFT);
+ }
+ if (ss.lockModeRight != LOCK_MODE_UNDEFINED) {
+ setDrawerLockMode(ss.lockModeRight, Gravity.RIGHT);
+ }
+ if (ss.lockModeStart != LOCK_MODE_UNDEFINED) {
+ setDrawerLockMode(ss.lockModeStart, GravityCompat.START);
+ }
+ if (ss.lockModeEnd != LOCK_MODE_UNDEFINED) {
+ setDrawerLockMode(ss.lockModeEnd, GravityCompat.END);
+ }
}
@Override
@@ -1718,13 +1788,26 @@
final Parcelable superState = super.onSaveInstanceState();
final SavedState ss = new SavedState(superState);
- final View openDrawer = findOpenDrawer();
- if (openDrawer != null) {
- ss.openDrawerGravity = ((LayoutParams) openDrawer.getLayoutParams()).gravity;
+ final int childCount = getChildCount();
+ for (int i = 0; i < childCount; i++) {
+ final View child = getChildAt(i);
+ LayoutParams lp = (LayoutParams) child.getLayoutParams();
+ // Is the current child fully opened (that is, not closing)?
+ boolean isOpenedAndNotClosing = (lp.openState == LayoutParams.FLAG_IS_OPENED);
+ // Is the current child opening?
+ boolean isClosedAndOpening = (lp.openState == LayoutParams.FLAG_IS_OPENING);
+ if (isOpenedAndNotClosing || isClosedAndOpening) {
+ // If one of the conditions above holds, save the child's gravity
+ // so that we open that child during state restore.
+ ss.openDrawerGravity = lp.gravity;
+ break;
+ }
}
ss.lockModeLeft = mLockModeLeft;
ss.lockModeRight = mLockModeRight;
+ ss.lockModeStart = mLockModeStart;
+ ss.lockModeEnd = mLockModeEnd;
return ss;
}
@@ -1770,12 +1853,18 @@
*/
protected static class SavedState extends BaseSavedState {
int openDrawerGravity = Gravity.NO_GRAVITY;
- int lockModeLeft = LOCK_MODE_UNLOCKED;
- int lockModeRight = LOCK_MODE_UNLOCKED;
+ @LockMode int lockModeLeft;
+ @LockMode int lockModeRight;
+ @LockMode int lockModeStart;
+ @LockMode int lockModeEnd;
public SavedState(Parcel in) {
super(in);
openDrawerGravity = in.readInt();
+ lockModeLeft = in.readInt();
+ lockModeRight = in.readInt();
+ lockModeStart = in.readInt();
+ lockModeEnd = in.readInt();
}
public SavedState(Parcelable superState) {
@@ -1786,6 +1875,10 @@
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeInt(openDrawerGravity);
+ dest.writeInt(lockModeLeft);
+ dest.writeInt(lockModeRight);
+ dest.writeInt(lockModeStart);
+ dest.writeInt(lockModeEnd);
}
public static final Parcelable.Creator<SavedState> CREATOR =
@@ -1969,11 +2062,14 @@
}
public static class LayoutParams extends ViewGroup.MarginLayoutParams {
+ private static final int FLAG_IS_OPENED = 0x1;
+ private static final int FLAG_IS_OPENING = 0x2;
+ private static final int FLAG_IS_CLOSING = 0x4;
public int gravity = Gravity.NO_GRAVITY;
- float onScreen;
- boolean isPeeking;
- boolean knownOpen;
+ private float onScreen;
+ private boolean isPeeking;
+ private int openState;
public LayoutParams(Context c, AttributeSet attrs) {
super(c, attrs);
diff --git a/v4/java/android/support/v4/widget/NestedScrollView.java b/v4/java/android/support/v4/widget/NestedScrollView.java
index 40fd257..27e4307 100644
--- a/v4/java/android/support/v4/widget/NestedScrollView.java
+++ b/v4/java/android/support/v4/widget/NestedScrollView.java
@@ -270,6 +270,7 @@
@Override
public void onStopNestedScroll(View target) {
+ mParentHelper.onStopNestedScroll(target);
stopNestedScroll();
}
diff --git a/v4/java/android/support/v4/widget/SwipeRefreshLayout.java b/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
index e1386ab..06db6f2 100644
--- a/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
+++ b/v4/java/android/support/v4/widget/SwipeRefreshLayout.java
@@ -185,22 +185,34 @@
mListener.onRefresh();
}
}
+ mCurrentTargetOffsetTop = mCircleView.getTop();
} else {
- mProgress.stop();
- mCircleView.setVisibility(View.GONE);
- setColorViewAlpha(MAX_ALPHA);
- // Return the circle to its start position
- if (mScale) {
- setAnimationProgress(0 /* animation complete and view is hidden */);
- } else {
- setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCurrentTargetOffsetTop,
- true /* requires update */);
- }
+ reset();
}
- mCurrentTargetOffsetTop = mCircleView.getTop();
}
};
+ private void reset() {
+ mCircleView.clearAnimation();
+ mProgress.stop();
+ mCircleView.setVisibility(View.GONE);
+ setColorViewAlpha(MAX_ALPHA);
+ // Return the circle to its start position
+ if (mScale) {
+ setAnimationProgress(0 /* animation complete and view is hidden */);
+ } else {
+ setTargetOffsetTopAndBottom(mOriginalOffsetTop - mCurrentTargetOffsetTop,
+ true /* requires update */);
+ }
+ mCurrentTargetOffsetTop = mCircleView.getTop();
+ }
+
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ reset();
+ }
+
private void setColorViewAlpha(int targetAlpha) {
mCircleView.getBackground().setAlpha(targetAlpha);
mProgress.setAlpha(targetAlpha);
@@ -732,7 +744,7 @@
@Override
public boolean onStartNestedScroll(View child, View target, int nestedScrollAxes) {
- return isEnabled() && !mReturningToStart && !mRefreshing
+ return isEnabled() && canChildScrollUp() && !mReturningToStart && !mRefreshing
&& (nestedScrollAxes & ViewCompat.SCROLL_AXIS_VERTICAL) != 0;
}
diff --git a/v4/java/android/support/v4/widget/TextViewCompat.java b/v4/java/android/support/v4/widget/TextViewCompat.java
index d8c5385..621ee66 100644
--- a/v4/java/android/support/v4/widget/TextViewCompat.java
+++ b/v4/java/android/support/v4/widget/TextViewCompat.java
@@ -18,6 +18,7 @@
import android.graphics.drawable.Drawable;
import android.os.Build;
+import android.support.annotation.IdRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.widget.TextView;
@@ -42,6 +43,7 @@
int start, int top, int end, int bottom);
int getMaxLines(TextView textView);
int getMinLines(TextView textView);
+ void setTextAppearance(@NonNull TextView textView, @IdRes int resId);
}
static class BaseTextViewCompatImpl implements TextViewCompatImpl {
@@ -74,6 +76,11 @@
public int getMinLines(TextView textView) {
return TextViewCompatDonut.getMinLines(textView);
}
+
+ @Override
+ public void setTextAppearance(TextView textView, int resId) {
+ TextViewCompatDonut.setTextAppearance(textView, resId);
+ }
}
static class JbTextViewCompatImpl extends BaseTextViewCompatImpl {
@@ -137,11 +144,20 @@
}
}
+ static class Api23TextViewCompatImpl extends JbMr2TextViewCompatImpl {
+ @Override
+ public void setTextAppearance(@NonNull TextView textView, @IdRes int resId) {
+ TextViewCompatApi23.setTextAppearance(textView, resId);
+ }
+ }
+
static final TextViewCompatImpl IMPL;
static {
final int version = Build.VERSION.SDK_INT;
- if (version >= 18) {
+ if (version >= 23) {
+ IMPL = new Api23TextViewCompatImpl();
+ } else if (version >= 18) {
IMPL = new JbMr2TextViewCompatImpl();
} else if (version >= 17) {
IMPL = new JbMr1TextViewCompatImpl();
@@ -231,4 +247,19 @@
public static int getMinLines(@NonNull TextView textView) {
return IMPL.getMinLines(textView);
}
+
+ /**
+ * Sets the text appearance from the specified style resource.
+ * <p>
+ * Use a framework-defined {@code TextAppearance} style like
+ * {@link android.R.style#TextAppearance_Material_Body1 @android:style/TextAppearance.Material.Body1}
+ * or see {@link android.R.styleable#TextAppearance TextAppearance} for the
+ * set of attributes that can be used in a custom style.
+ *
+ * @param textView The TextView against which to invoke the method.
+ * @param resId The resource identifier of the style to apply.
+ */
+ public static void setTextAppearance(@NonNull TextView textView, @IdRes int resId) {
+ IMPL.setTextAppearance(textView, resId);
+ }
}
diff --git a/v4/java/android/support/v4/widget/TextViewCompatDonut.java b/v4/java/android/support/v4/widget/TextViewCompatDonut.java
index 9a36e82..ba155fe 100644
--- a/v4/java/android/support/v4/widget/TextViewCompatDonut.java
+++ b/v4/java/android/support/v4/widget/TextViewCompatDonut.java
@@ -91,4 +91,8 @@
}
return -1;
}
+
+ static void setTextAppearance(TextView textView, int resId) {
+ textView.setTextAppearance(textView.getContext(), resId);
+ }
}
diff --git a/v4/tests/AndroidManifest.xml b/v4/tests/AndroidManifest.xml
new file mode 100644
index 0000000..556c885
--- /dev/null
+++ b/v4/tests/AndroidManifest.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ package="android.support.v4.test">
+ <uses-sdk android:minSdkVersion="4" tools:overrideLibrary="android.support.test,
+ android.support.test.espresso, android.support.test.espresso.idling"/>
+
+ <application>
+ <uses-library android:name="android.test.runner" />
+ <activity android:name="android.support.v4.widget.test.TextViewTestActivity"/>
+ <activity android:name="android.support.v4.widget.TestActivity"/>
+ </application>
+
+ <instrumentation android:name="android.test.InstrumentationTestRunner"
+ android:targetPackage="android.support.v4.test"
+ />
+</manifest>
diff --git a/v4/tests/java/android/support/v4/widget/TestActivity.java b/v4/tests/java/android/support/v4/widget/TestActivity.java
new file mode 100644
index 0000000..9ab5188
--- /dev/null
+++ b/v4/tests/java/android/support/v4/widget/TestActivity.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.widget;
+
+import android.app.Activity;
+import android.os.Bundle;
+import android.view.WindowManager;
+import android.widget.FrameLayout;
+
+public class TestActivity extends Activity {
+ FrameLayout mContainer;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ mContainer = new FrameLayout(this);
+
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
+ setContentView(mContainer);
+ }
+}
diff --git a/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java b/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
new file mode 100644
index 0000000..a7d2339
--- /dev/null
+++ b/v4/tests/java/android/support/v4/widget/TextViewCompatTest.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+package android.support.v4.widget;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import android.app.Instrumentation;
+import android.test.ActivityInstrumentationTestCase2;
+import android.support.test.InstrumentationRegistry;
+import android.support.v4.widget.TextViewCompat;
+import android.util.Log;
+import android.widget.TextView;
+
+import android.support.test.runner.AndroidJUnit4;
+
+@RunWith(AndroidJUnit4.class)
+public class TextViewCompatTest extends ActivityInstrumentationTestCase2<TestActivity> {
+ private boolean mDebug;
+
+ Throwable mainThreadException;
+
+ Thread mInstrumentationThread;
+
+ public TextViewCompatTest() {
+ super("android.support.v4.widget", TestActivity.class);
+ mDebug = false;
+ }
+
+ @Before
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ mInstrumentationThread = Thread.currentThread();
+
+ // Note that injectInstrumentation was added in v5. Since this is v4 we have to use
+ // the misspelled (and deprecated) inject API.
+ injectInsrumentation(InstrumentationRegistry.getInstrumentation());
+ }
+
+ @After
+ @Override
+ public void tearDown() throws Exception {
+ getInstrumentation().waitForIdleSync();
+ super.tearDown();
+ }
+
+ @Test
+ public void testMaxLines() throws Throwable {
+ final TextView textView = new TextView(getActivity());
+ textView.setMaxLines(4);
+
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ getActivity().mContainer.addView(textView);
+ }
+ });
+
+ assertEquals("Max lines must match", TextViewCompat.getMaxLines(textView), 4);
+ }
+}
diff --git a/v4/tests/java/android/support/v4/widget/test/TextViewTestActivity.java b/v4/tests/java/android/support/v4/widget/test/TextViewTestActivity.java
new file mode 100644
index 0000000..7366127
--- /dev/null
+++ b/v4/tests/java/android/support/v4/widget/test/TextViewTestActivity.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v4.widget.test;
+
+
+import android.app.Activity;
+
+public class TextViewTestActivity extends Activity {
+
+}
diff --git a/v7/appcompat/res/values-af/strings.xml b/v7/appcompat/res/values-af/strings.xml
index 39649091..4bb50b0 100644
--- a/v7/appcompat/res/values-af/strings.xml
+++ b/v7/appcompat/res/values-af/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deel met %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deel met"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"AF"</string>
</resources>
diff --git a/v7/appcompat/res/values-am/strings.xml b/v7/appcompat/res/values-am/strings.xml
index ae720f8..a76c931 100644
--- a/v7/appcompat/res/values-am/strings.xml
+++ b/v7/appcompat/res/values-am/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ከ%s ጋር ያጋሩ"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ከሚከተለው ጋር ያጋሩ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"በርቷል"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ጠፍቷል"</string>
</resources>
diff --git a/v7/appcompat/res/values-ar/strings.xml b/v7/appcompat/res/values-ar/strings.xml
index 313daf8..f0046a9 100644
--- a/v7/appcompat/res/values-ar/strings.xml
+++ b/v7/appcompat/res/values-ar/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"مشاركة مع %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"مشاركة مع"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"تشغيل"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"إيقاف"</string>
</resources>
diff --git a/v7/appcompat/res/values-bg/strings.xml b/v7/appcompat/res/values-bg/strings.xml
index c71fd6c..d8cbcd0 100644
--- a/v7/appcompat/res/values-bg/strings.xml
+++ b/v7/appcompat/res/values-bg/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Споделяне със: %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Споделяне със:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ИЗКЛ."</string>
</resources>
diff --git a/v7/appcompat/res/values-bn-rBD/strings.xml b/v7/appcompat/res/values-bn-rBD/strings.xml
index 6be164f..872d425 100644
--- a/v7/appcompat/res/values-bn-rBD/strings.xml
+++ b/v7/appcompat/res/values-bn-rBD/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s এর সাথে ভাগ করুন"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"এর সাথে ভাগ করুন"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"৯৯৯+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"চালু"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"বন্ধ"</string>
</resources>
diff --git a/v7/appcompat/res/values-ca/strings.xml b/v7/appcompat/res/values-ca/strings.xml
index 2613ea6..863e69f 100644
--- a/v7/appcompat/res/values-ca/strings.xml
+++ b/v7/appcompat/res/values-ca/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Comparteix amb %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Comparteix amb"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAT"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAT"</string>
</resources>
diff --git a/v7/appcompat/res/values-cs/strings.xml b/v7/appcompat/res/values-cs/strings.xml
index c8e1921..cba91eb 100644
--- a/v7/appcompat/res/values-cs/strings.xml
+++ b/v7/appcompat/res/values-cs/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Sdílet pomocí %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Sdílet pomocí"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ZAPNUTO"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"VYPNUTO"</string>
</resources>
diff --git a/v7/appcompat/res/values-da/strings.xml b/v7/appcompat/res/values-da/strings.xml
index e7ac13f..bda45791 100644
--- a/v7/appcompat/res/values-da/strings.xml
+++ b/v7/appcompat/res/values-da/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"TIL"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"FRA"</string>
</resources>
diff --git a/v7/appcompat/res/values-de/strings.xml b/v7/appcompat/res/values-de/strings.xml
index 06a18b5..b5a74e9 100644
--- a/v7/appcompat/res/values-de/strings.xml
+++ b/v7/appcompat/res/values-de/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Freigeben für %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Freigeben für"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"An"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"Aus"</string>
</resources>
diff --git a/v7/appcompat/res/values-el/strings.xml b/v7/appcompat/res/values-el/strings.xml
index 5309082..1ecc119 100644
--- a/v7/appcompat/res/values-el/strings.xml
+++ b/v7/appcompat/res/values-el/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Κοινή χρήση με %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Κοινή χρήση με"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ΑΠΕΝΕΡΓΟΠΟΙΗΣΗ"</string>
</resources>
diff --git a/v7/appcompat/res/values-en-rAU/strings.xml b/v7/appcompat/res/values-en-rAU/strings.xml
index ab73cfd..4db58a9 100644
--- a/v7/appcompat/res/values-en-rAU/strings.xml
+++ b/v7/appcompat/res/values-en-rAU/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
</resources>
diff --git a/v7/appcompat/res/values-en-rGB/strings.xml b/v7/appcompat/res/values-en-rGB/strings.xml
index ab73cfd..4db58a9 100644
--- a/v7/appcompat/res/values-en-rGB/strings.xml
+++ b/v7/appcompat/res/values-en-rGB/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
</resources>
diff --git a/v7/appcompat/res/values-en-rIN/strings.xml b/v7/appcompat/res/values-en-rIN/strings.xml
index ab73cfd..4db58a9 100644
--- a/v7/appcompat/res/values-en-rIN/strings.xml
+++ b/v7/appcompat/res/values-en-rIN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Share with %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Share with"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
</resources>
diff --git a/v7/appcompat/res/values-es-rUS/strings.xml b/v7/appcompat/res/values-es-rUS/strings.xml
index f1e3dbb..043c6ae 100644
--- a/v7/appcompat/res/values-es-rUS/strings.xml
+++ b/v7/appcompat/res/values-es-rUS/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
</resources>
diff --git a/v7/appcompat/res/values-es/strings.xml b/v7/appcompat/res/values-es/strings.xml
index d8e7d39..8f6ea4b 100644
--- a/v7/appcompat/res/values-es/strings.xml
+++ b/v7/appcompat/res/values-es/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"SÍ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"NO"</string>
</resources>
diff --git a/v7/appcompat/res/values-et-rEE/strings.xml b/v7/appcompat/res/values-et-rEE/strings.xml
index 03091c4..b8c7f16 100644
--- a/v7/appcompat/res/values-et-rEE/strings.xml
+++ b/v7/appcompat/res/values-et-rEE/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jagamine kasutajaga %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jagamine:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"SEES"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"VÄLJAS"</string>
</resources>
diff --git a/v7/appcompat/res/values-eu-rES/strings.xml b/v7/appcompat/res/values-eu-rES/strings.xml
index 92bda4a..3b0fb90 100644
--- a/v7/appcompat/res/values-eu-rES/strings.xml
+++ b/v7/appcompat/res/values-eu-rES/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partekatu %s erabiltzailearekin"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partekatu hauekin"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"AKTIBATUTA"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESAKTIBATUTA"</string>
</resources>
diff --git a/v7/appcompat/res/values-fa/strings.xml b/v7/appcompat/res/values-fa/strings.xml
index 97d6ea7..ae4eb85 100644
--- a/v7/appcompat/res/values-fa/strings.xml
+++ b/v7/appcompat/res/values-fa/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="abc_action_mode_done" msgid="4076576682505996667">"تمام"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"انجام شد"</string>
<string name="abc_action_bar_home_description" msgid="4600421777120114993">"پیمایش به صفحه اصلی"</string>
<string name="abc_action_bar_up_description" msgid="1594238315039666878">"پیمایش به بالا"</string>
<string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"گزینههای بیشتر"</string>
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"اشتراکگذاری با %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراکگذاری با"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"۹۹۹+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"روشن"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"خاموش"</string>
</resources>
diff --git a/v7/appcompat/res/values-fi/strings.xml b/v7/appcompat/res/values-fi/strings.xml
index 77a4a98..4b3e728 100644
--- a/v7/appcompat/res/values-fi/strings.xml
+++ b/v7/appcompat/res/values-fi/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Jakaminen: %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Jakaminen:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"KÄYTÖSSÄ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"POIS KÄYTÖSTÄ"</string>
</resources>
diff --git a/v7/appcompat/res/values-fr-rCA/strings.xml b/v7/appcompat/res/values-fr-rCA/strings.xml
index 1f636fb..291bd4e 100644
--- a/v7/appcompat/res/values-fr-rCA/strings.xml
+++ b/v7/appcompat/res/values-fr-rCA/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
</resources>
diff --git a/v7/appcompat/res/values-fr/strings.xml b/v7/appcompat/res/values-fr/strings.xml
index 8fc4240..b7f5604 100644
--- a/v7/appcompat/res/values-fr/strings.xml
+++ b/v7/appcompat/res/values-fr/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partager avec %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partager avec"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVÉ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DÉSACTIVÉ"</string>
</resources>
diff --git a/v7/appcompat/res/values-gl-rES/strings.xml b/v7/appcompat/res/values-gl-rES/strings.xml
index ee1e7d5..b6b11be 100644
--- a/v7/appcompat/res/values-gl-rES/strings.xml
+++ b/v7/appcompat/res/values-gl-rES/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartir con %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartir con"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAR"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESACTIVAR"</string>
</resources>
diff --git a/v7/appcompat/res/values-hi/strings.xml b/v7/appcompat/res/values-hi/strings.xml
index 17d3d7b..95daa34 100644
--- a/v7/appcompat/res/values-hi/strings.xml
+++ b/v7/appcompat/res/values-hi/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s के साथ साझा करें"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"इसके द्वारा साझा करें"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
</resources>
diff --git a/v7/appcompat/res/values-hr/strings.xml b/v7/appcompat/res/values-hr/strings.xml
index 6467bfa..da68332 100644
--- a/v7/appcompat/res/values-hr/strings.xml
+++ b/v7/appcompat/res/values-hr/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dijeljenje sa: %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dijeljenje sa"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"UKLJUČENO"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ISKLJUČENO"</string>
</resources>
diff --git a/v7/appcompat/res/values-hu/strings.xml b/v7/appcompat/res/values-hu/strings.xml
index 1cb4fe5..57ab85b 100644
--- a/v7/appcompat/res/values-hu/strings.xml
+++ b/v7/appcompat/res/values-hu/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Megosztás a következővel: %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Megosztás a következővel:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"BE"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"KI"</string>
</resources>
diff --git a/v7/appcompat/res/values-hy-rAM/strings.xml b/v7/appcompat/res/values-hy-rAM/strings.xml
index 708275a..903fa43 100644
--- a/v7/appcompat/res/values-hy-rAM/strings.xml
+++ b/v7/appcompat/res/values-hy-rAM/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Տարածել ըստ %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Տարածել"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ՄԻԱՑՎԱԾ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ԱՆՋԱՏՎԱԾ"</string>
</resources>
diff --git a/v7/appcompat/res/values-in/strings.xml b/v7/appcompat/res/values-in/strings.xml
index d2d0ecc..0e7003c 100644
--- a/v7/appcompat/res/values-in/strings.xml
+++ b/v7/appcompat/res/values-in/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bagikan dengan %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bagikan dengan"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"AKTIF"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"NONAKTIF"</string>
</resources>
diff --git a/v7/appcompat/res/values-is-rIS/strings.xml b/v7/appcompat/res/values-is-rIS/strings.xml
index c8ded4d..fb305b2 100644
--- a/v7/appcompat/res/values-is-rIS/strings.xml
+++ b/v7/appcompat/res/values-is-rIS/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deila með %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deila með"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"KVEIKT"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"SLÖKKT"</string>
</resources>
diff --git a/v7/appcompat/res/values-it/strings.xml b/v7/appcompat/res/values-it/strings.xml
index 31bff55..a2d9bee 100644
--- a/v7/appcompat/res/values-it/strings.xml
+++ b/v7/appcompat/res/values-it/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Condividi con %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Condividi con"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
</resources>
diff --git a/v7/appcompat/res/values-iw/strings.xml b/v7/appcompat/res/values-iw/strings.xml
index 6b834d9..329d0ec 100644
--- a/v7/appcompat/res/values-iw/strings.xml
+++ b/v7/appcompat/res/values-iw/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"שתף עם %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"שתף עם"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"פועל"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"כבוי"</string>
</resources>
diff --git a/v7/appcompat/res/values-ja/strings.xml b/v7/appcompat/res/values-ja/strings.xml
index 45fb2c0..fa55b08 100644
--- a/v7/appcompat/res/values-ja/strings.xml
+++ b/v7/appcompat/res/values-ja/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sと共有"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"共有"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ON"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"OFF"</string>
</resources>
diff --git a/v7/appcompat/res/values-ka-rGE/strings.xml b/v7/appcompat/res/values-ka-rGE/strings.xml
index 91c31fb..b14bcb7 100644
--- a/v7/appcompat/res/values-ka-rGE/strings.xml
+++ b/v7/appcompat/res/values-ka-rGE/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-თან გაზიარება"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"გაზიარება:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ჩართულია"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"გამორთულია"</string>
</resources>
diff --git a/v7/appcompat/res/values-kk-rKZ/strings.xml b/v7/appcompat/res/values-kk-rKZ/strings.xml
index 81fcfa9..52b9af5 100644
--- a/v7/appcompat/res/values-kk-rKZ/strings.xml
+++ b/v7/appcompat/res/values-kk-rKZ/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="abc_action_mode_done" msgid="4076576682505996667">"Дайын"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Орындалды"</string>
<string name="abc_action_bar_home_description" msgid="4600421777120114993">"Негізгі бетте қозғалу"</string>
<string name="abc_action_bar_up_description" msgid="1594238315039666878">"Жоғары қозғалу"</string>
<string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Басқа опциялар"</string>
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s бөлісу"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлісу"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ҚОСУЛЫ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ӨШІРУЛІ"</string>
</resources>
diff --git a/v7/appcompat/res/values-km-rKH/strings.xml b/v7/appcompat/res/values-km-rKH/strings.xml
index ee4bcbe..aa81b7d 100644
--- a/v7/appcompat/res/values-km-rKH/strings.xml
+++ b/v7/appcompat/res/values-km-rKH/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ចែករំលែកជាមួយ %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ចែករំលែកជាមួយ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"បើក"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"បិទ"</string>
</resources>
diff --git a/v7/appcompat/res/values-kn-rIN/strings.xml b/v7/appcompat/res/values-kn-rIN/strings.xml
index abd409e..7ef7572 100644
--- a/v7/appcompat/res/values-kn-rIN/strings.xml
+++ b/v7/appcompat/res/values-kn-rIN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ಜೊತೆಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ಇವರೊಂದಿಗೆ ಹಂಚಿಕೊಳ್ಳಿ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ಆನ್"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ಆಫ್"</string>
</resources>
diff --git a/v7/appcompat/res/values-ko/strings.xml b/v7/appcompat/res/values-ko/strings.xml
index 262f543..7c158f9 100644
--- a/v7/appcompat/res/values-ko/strings.xml
+++ b/v7/appcompat/res/values-ko/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s와(과) 공유"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"공유 대상"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"사용"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"사용 안함"</string>
</resources>
diff --git a/v7/appcompat/res/values-ky-rKG/strings.xml b/v7/appcompat/res/values-ky-rKG/strings.xml
index 3176cc6..a758b96 100644
--- a/v7/appcompat/res/values-ky-rKG/strings.xml
+++ b/v7/appcompat/res/values-ky-rKG/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s аркылуу бөлүшүү"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Бөлүшүү"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"КҮЙҮК"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ӨЧҮК"</string>
</resources>
diff --git a/v7/appcompat/res/values-lo-rLA/strings.xml b/v7/appcompat/res/values-lo-rLA/strings.xml
index c95fd60..3b93232 100644
--- a/v7/appcompat/res/values-lo-rLA/strings.xml
+++ b/v7/appcompat/res/values-lo-rLA/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"ແບ່ງປັນກັບ %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ແບ່ງປັນກັບ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ເປີດ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ປິດ"</string>
</resources>
diff --git a/v7/appcompat/res/values-lt/strings.xml b/v7/appcompat/res/values-lt/strings.xml
index 992910c..b070a2f 100644
--- a/v7/appcompat/res/values-lt/strings.xml
+++ b/v7/appcompat/res/values-lt/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Bendrinti naudojant „%s“"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bendrinti naudojant"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ĮJUNGTI"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"IŠJUNGTI"</string>
</resources>
diff --git a/v7/appcompat/res/values-lv/strings.xml b/v7/appcompat/res/values-lv/strings.xml
index 6700c87..7c4ef4f 100644
--- a/v7/appcompat/res/values-lv/strings.xml
+++ b/v7/appcompat/res/values-lv/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kopīgot ar %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kopīgot ar:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"IESLĒGTS"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"IZSLĒGTS"</string>
</resources>
diff --git a/v7/appcompat/res/values-mk-rMK/strings.xml b/v7/appcompat/res/values-mk-rMK/strings.xml
index a386996..ac2b03e 100644
--- a/v7/appcompat/res/values-mk-rMK/strings.xml
+++ b/v7/appcompat/res/values-mk-rMK/strings.xml
@@ -38,6 +38,4 @@
<skip />
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Сподели со"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛУЧЕНО"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ИСКЛУЧЕНО"</string>
</resources>
diff --git a/v7/appcompat/res/values-ml-rIN/strings.xml b/v7/appcompat/res/values-ml-rIN/strings.xml
index 292fcc0..53f8e4b 100644
--- a/v7/appcompat/res/values-ml-rIN/strings.xml
+++ b/v7/appcompat/res/values-ml-rIN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s എന്നതുമായി പങ്കിടുക"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"ഇവരുമായി പങ്കിടുക"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ഓൺ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ഓഫ്"</string>
</resources>
diff --git a/v7/appcompat/res/values-mn-rMN/strings.xml b/v7/appcompat/res/values-mn-rMN/strings.xml
index 75a9724..a89dc4d 100644
--- a/v7/appcompat/res/values-mn-rMN/strings.xml
+++ b/v7/appcompat/res/values-mn-rMN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s-тай хуваалцах"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Хуваалцах"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ИДЭВХТЭЙ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ИДЭВХГҮЙ"</string>
</resources>
diff --git a/v7/appcompat/res/values-mr-rIN/strings.xml b/v7/appcompat/res/values-mr-rIN/strings.xml
index 76d42a9..1afbd81 100644
--- a/v7/appcompat/res/values-mr-rIN/strings.xml
+++ b/v7/appcompat/res/values-mr-rIN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सह सामायिक करा"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"यांच्यासह सामायिक करा"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"चालू"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"बंद"</string>
</resources>
diff --git a/v7/appcompat/res/values-ms-rMY/strings.xml b/v7/appcompat/res/values-ms-rMY/strings.xml
index 75ffefb..9763618 100644
--- a/v7/appcompat/res/values-ms-rMY/strings.xml
+++ b/v7/appcompat/res/values-ms-rMY/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Kongsi dengan %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Kongsi dengan"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"HIDUP"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"MATI"</string>
</resources>
diff --git a/v7/appcompat/res/values-my-rMM/strings.xml b/v7/appcompat/res/values-my-rMM/strings.xml
index f8690aa..936ac99 100644
--- a/v7/appcompat/res/values-my-rMM/strings.xml
+++ b/v7/appcompat/res/values-my-rMM/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ကို မျှဝေပါရန်"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"မျှဝေဖို့ ရွေးပါ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"၉၉၉+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ဖွင့်"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ပိတ်"</string>
</resources>
diff --git a/v7/appcompat/res/values-nb/strings.xml b/v7/appcompat/res/values-nb/strings.xml
index 10f3024..483f7077 100644
--- a/v7/appcompat/res/values-nb/strings.xml
+++ b/v7/appcompat/res/values-nb/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Del med %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Del med"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
</resources>
diff --git a/v7/appcompat/res/values-ne-rNP/strings.xml b/v7/appcompat/res/values-ne-rNP/strings.xml
index a841f21..4a08778 100644
--- a/v7/appcompat/res/values-ne-rNP/strings.xml
+++ b/v7/appcompat/res/values-ne-rNP/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s सँग साझेदारी गर्नुहोस्"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"साझेदारी गर्नुहोस्..."</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"९९९+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"सक्रिय गर्नुहोस्"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"निष्क्रिय पार्नुहोस्"</string>
</resources>
diff --git a/v7/appcompat/res/values-nl/strings.xml b/v7/appcompat/res/values-nl/strings.xml
index adb0f0e..38a7607 100644
--- a/v7/appcompat/res/values-nl/strings.xml
+++ b/v7/appcompat/res/values-nl/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Delen met %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Delen met"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"AAN"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"UIT"</string>
</resources>
diff --git a/v7/appcompat/res/values-pl/strings.xml b/v7/appcompat/res/values-pl/strings.xml
index 166986a..72fa439 100644
--- a/v7/appcompat/res/values-pl/strings.xml
+++ b/v7/appcompat/res/values-pl/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Udostępnij dla %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Udostępnij dla"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"WŁ."</string>
- <string name="abc_capital_off" msgid="121134116657445385">"WYŁ."</string>
</resources>
diff --git a/v7/appcompat/res/values-pt-rBR/strings.xml b/v7/appcompat/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 06cf8d9..0000000
--- a/v7/appcompat/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2012 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="abc_action_mode_done" msgid="4076576682505996667">"Concluído"</string>
- <string name="abc_action_bar_home_description" msgid="4600421777120114993">"Navegar para a página inicial"</string>
- <string name="abc_action_bar_up_description" msgid="1594238315039666878">"Navegar para cima"</string>
- <string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Mais opções"</string>
- <string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Recolher"</string>
- <string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
- <string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
- <string name="abc_searchview_description_search" msgid="8264924765203268293">"Pesquisar"</string>
- <string name="abc_search_hint" msgid="7723749260725869598">"Pesquisar..."</string>
- <string name="abc_searchview_description_query" msgid="2550479030709304392">"Consulta de pesquisa"</string>
- <string name="abc_searchview_description_clear" msgid="3691816814315814921">"Limpar consulta"</string>
- <string name="abc_searchview_description_submit" msgid="8928215447528550784">"Enviar consulta"</string>
- <string name="abc_searchview_description_voice" msgid="893419373245838918">"Pesquisa por voz"</string>
- <string name="abc_activitychooserview_choose_application" msgid="2031811694353399454">"Selecione um app"</string>
- <string name="abc_activity_chooser_view_see_all" msgid="7468859129482906941">"Ver tudo"</string>
- <string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
- <string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
- <string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
-</resources>
diff --git a/v7/appcompat/res/values-pt-rPT/strings.xml b/v7/appcompat/res/values-pt-rPT/strings.xml
index 176aade..d76c5c8 100644
--- a/v7/appcompat/res/values-pt-rPT/strings.xml
+++ b/v7/appcompat/res/values-pt-rPT/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Partilhar com %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Partilhar com"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"+999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ATIVADO"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESATIVADO"</string>
</resources>
diff --git a/v7/appcompat/res/values-pt/strings.xml b/v7/appcompat/res/values-pt/strings.xml
index 06cf8d9..dfcfce8 100644
--- a/v7/appcompat/res/values-pt/strings.xml
+++ b/v7/appcompat/res/values-pt/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Compartilhar com %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Compartilhar com"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ATIVAR"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DESATIVAR"</string>
</resources>
diff --git a/v7/appcompat/res/values-ro/strings.xml b/v7/appcompat/res/values-ro/strings.xml
index 9879823..55538ee 100644
--- a/v7/appcompat/res/values-ro/strings.xml
+++ b/v7/appcompat/res/values-ro/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Trimiteți la %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Trimiteți la"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"˃999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ACTIVAȚI"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"DEZACTIVAȚI"</string>
</resources>
diff --git a/v7/appcompat/res/values-ru/strings.xml b/v7/appcompat/res/values-ru/strings.xml
index 08ed085..03a2c8f 100644
--- a/v7/appcompat/res/values-ru/strings.xml
+++ b/v7/appcompat/res/values-ru/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Открыть доступ пользователю %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Открыть доступ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ВКЛ."</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ОТКЛ."</string>
</resources>
diff --git a/v7/appcompat/res/values-si-rLK/strings.xml b/v7/appcompat/res/values-si-rLK/strings.xml
index 47d7dc6..a03b5bd 100644
--- a/v7/appcompat/res/values-si-rLK/strings.xml
+++ b/v7/appcompat/res/values-si-rLK/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s සමඟ බෙදාගන්න"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"සමඟ බෙදාගන්න"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ක්රියාත්මකයි"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ක්රියාවිරහිතයි"</string>
</resources>
diff --git a/v7/appcompat/res/values-sk/strings.xml b/v7/appcompat/res/values-sk/strings.xml
index b7a2dc0..f7f0b81 100644
--- a/v7/appcompat/res/values-sk/strings.xml
+++ b/v7/appcompat/res/values-sk/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Zdieľať pomocou %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Zdieľať pomocou"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ZAP."</string>
- <string name="abc_capital_off" msgid="121134116657445385">"VYP."</string>
</resources>
diff --git a/v7/appcompat/res/values-sl/strings.xml b/v7/appcompat/res/values-sl/strings.xml
index 173180f..7d5f0bf 100644
--- a/v7/appcompat/res/values-sl/strings.xml
+++ b/v7/appcompat/res/values-sl/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Deljenje z:"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Deljenje z"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"VKLOPLJENO"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"IZKLOPLJENO"</string>
</resources>
diff --git a/v7/appcompat/res/values-sr/strings.xml b/v7/appcompat/res/values-sr/strings.xml
index a54af9b..e147d75 100644
--- a/v7/appcompat/res/values-sr/strings.xml
+++ b/v7/appcompat/res/values-sr/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Дели са апликацијом %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Дели са"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"УКЉУЧИ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ИСКЉУЧИ"</string>
</resources>
diff --git a/v7/appcompat/res/values-sv/strings.xml b/v7/appcompat/res/values-sv/strings.xml
index a0c9cc0..feebdb2ba 100644
--- a/v7/appcompat/res/values-sv/strings.xml
+++ b/v7/appcompat/res/values-sv/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Dela med %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Dela med"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">">999"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"PÅ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"AV"</string>
</resources>
diff --git a/v7/appcompat/res/values-sw/strings.xml b/v7/appcompat/res/values-sw/strings.xml
index f1382ba..25c4039 100644
--- a/v7/appcompat/res/values-sw/strings.xml
+++ b/v7/appcompat/res/values-sw/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Shiriki na %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Shiriki na:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"IMEWASHWA"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"IMEZIMWA"</string>
</resources>
diff --git a/v7/appcompat/res/values-ta-rIN/strings.xml b/v7/appcompat/res/values-ta-rIN/strings.xml
index a31eb25..099526b 100644
--- a/v7/appcompat/res/values-ta-rIN/strings.xml
+++ b/v7/appcompat/res/values-ta-rIN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s உடன் பகிர்"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"இதனுடன் பகிர்"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"இயக்கு"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"முடக்கு"</string>
</resources>
diff --git a/v7/appcompat/res/values-te-rIN/strings.xml b/v7/appcompat/res/values-te-rIN/strings.xml
index 2f6695d..8ea231a4 100644
--- a/v7/appcompat/res/values-te-rIN/strings.xml
+++ b/v7/appcompat/res/values-te-rIN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%sతో భాగస్వామ్యం చేయి"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"వీరితో భాగస్వామ్యం చేయి"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"ఆన్ చేయి"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ఆఫ్ చేయి"</string>
</resources>
diff --git a/v7/appcompat/res/values-th/strings.xml b/v7/appcompat/res/values-th/strings.xml
index b77ee55..cc5ab0a 100644
--- a/v7/appcompat/res/values-th/strings.xml
+++ b/v7/appcompat/res/values-th/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"แชร์กับ %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"แชร์กับ"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"เปิด"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ปิด"</string>
</resources>
diff --git a/v7/appcompat/res/values-tl/strings.xml b/v7/appcompat/res/values-tl/strings.xml
index 73e1b2f..aa7169f 100644
--- a/v7/appcompat/res/values-tl/strings.xml
+++ b/v7/appcompat/res/values-tl/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Ibahagi sa/kay %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Ibahagi sa/kay"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"I-ON"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"I-OFF"</string>
</resources>
diff --git a/v7/appcompat/res/values-tr/strings.xml b/v7/appcompat/res/values-tr/strings.xml
index 185cd4d..0d592fc 100644
--- a/v7/appcompat/res/values-tr/strings.xml
+++ b/v7/appcompat/res/values-tr/strings.xml
@@ -16,7 +16,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="abc_action_mode_done" msgid="4076576682505996667">"Bitti"</string>
+ <string name="abc_action_mode_done" msgid="4076576682505996667">"Tamamlandı"</string>
<string name="abc_action_bar_home_description" msgid="4600421777120114993">"Ana ekrana git"</string>
<string name="abc_action_bar_up_description" msgid="1594238315039666878">"Yukarı git"</string>
<string name="abc_action_menu_overflow_description" msgid="3588849162933574182">"Diğer seçenekler"</string>
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s ile paylaş"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Şununla paylaş"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"AÇ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"KAPAT"</string>
</resources>
diff --git a/v7/appcompat/res/values-uk/strings.xml b/v7/appcompat/res/values-uk/strings.xml
index 5e81c70..ff08b47 100644
--- a/v7/appcompat/res/values-uk/strings.xml
+++ b/v7/appcompat/res/values-uk/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Надіслати через %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Надіслати через"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"УВІМК."</string>
- <string name="abc_capital_off" msgid="121134116657445385">"ВИМК."</string>
</resources>
diff --git a/v7/appcompat/res/values-ur-rPK/strings.xml b/v7/appcompat/res/values-ur-rPK/strings.xml
index 7972fe6..5196476 100644
--- a/v7/appcompat/res/values-ur-rPK/strings.xml
+++ b/v7/appcompat/res/values-ur-rPK/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"%s کے ساتھ اشتراک کریں"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"اشتراک کریں مع"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"آن"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"آف"</string>
</resources>
diff --git a/v7/appcompat/res/values-uz-rUZ/strings.xml b/v7/appcompat/res/values-uz-rUZ/strings.xml
index 4a713a9..fa884f7 100644
--- a/v7/appcompat/res/values-uz-rUZ/strings.xml
+++ b/v7/appcompat/res/values-uz-rUZ/strings.xml
@@ -23,7 +23,7 @@
<string name="abc_toolbar_collapse_description" msgid="1603543279005712093">"Yig‘ish"</string>
<string name="abc_action_bar_home_description_format" msgid="1397052879051804371">"%1$s, %2$s"</string>
<string name="abc_action_bar_home_subtitle_description_format" msgid="6623331958280229229">"%1$s, %2$s, %3$s"</string>
- <string name="abc_searchview_description_search" msgid="8264924765203268293">"Qidirish"</string>
+ <string name="abc_searchview_description_search" msgid="8264924765203268293">"Izlash"</string>
<string name="abc_search_hint" msgid="7723749260725869598">"Qidirish…"</string>
<string name="abc_searchview_description_query" msgid="2550479030709304392">"So‘rovni izlash"</string>
<string name="abc_searchview_description_clear" msgid="3691816814315814921">"So‘rovni tozalash"</string>
@@ -36,6 +36,4 @@
<skip />
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Bo‘lishish:"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"YONIQ"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"O‘CHIQ"</string>
</resources>
diff --git a/v7/appcompat/res/values-vi/strings.xml b/v7/appcompat/res/values-vi/strings.xml
index ec24827..8190bc0 100644
--- a/v7/appcompat/res/values-vi/strings.xml
+++ b/v7/appcompat/res/values-vi/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Chia sẻ với %s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Chia sẻ với"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"BẬT"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"TẮT"</string>
</resources>
diff --git a/v7/appcompat/res/values-zh-rCN/strings.xml b/v7/appcompat/res/values-zh-rCN/strings.xml
index 8ac28b7..b0fbc2f 100644
--- a/v7/appcompat/res/values-zh-rCN/strings.xml
+++ b/v7/appcompat/res/values-zh-rCN/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"通过%s分享"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享方式"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"开启"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"关闭"</string>
</resources>
diff --git a/v7/appcompat/res/values-zh-rHK/strings.xml b/v7/appcompat/res/values-zh-rHK/strings.xml
index 91d3289..2c46334 100644
--- a/v7/appcompat/res/values-zh-rHK/strings.xml
+++ b/v7/appcompat/res/values-zh-rHK/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"分享對象"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999 +"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
</resources>
diff --git a/v7/appcompat/res/values-zh-rTW/strings.xml b/v7/appcompat/res/values-zh-rTW/strings.xml
index 45fea16..bfabf5a 100644
--- a/v7/appcompat/res/values-zh-rTW/strings.xml
+++ b/v7/appcompat/res/values-zh-rTW/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"與「%s」分享"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"選擇分享對象"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"開啟"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"關閉"</string>
</resources>
diff --git a/v7/appcompat/res/values-zu/strings.xml b/v7/appcompat/res/values-zu/strings.xml
index 932624f..edc265d 100644
--- a/v7/appcompat/res/values-zu/strings.xml
+++ b/v7/appcompat/res/values-zu/strings.xml
@@ -34,6 +34,4 @@
<string name="abc_shareactionprovider_share_with_application" msgid="7165123711973476752">"Yabelana no-%s"</string>
<string name="abc_shareactionprovider_share_with" msgid="3421042268587513524">"Yabelana no-"</string>
<string name="status_bar_notification_info_overflow" msgid="2869576371154716097">"999+"</string>
- <string name="abc_capital_on" msgid="3405795526292276155">"VULIWE"</string>
- <string name="abc_capital_off" msgid="121134116657445385">"VALIWE"</string>
</resources>
diff --git a/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java b/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
index 6dceaf6..c15c531 100644
--- a/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
+++ b/v7/appcompat/src/android/support/v7/app/ActionBarDrawerToggle.java
@@ -282,9 +282,11 @@
}
private void toggle() {
- if (mDrawerLayout.isDrawerVisible(GravityCompat.START)) {
+ int drawerLockMode = mDrawerLayout.getDrawerLockMode(GravityCompat.START);
+ if (mDrawerLayout.isDrawerVisible(GravityCompat.START)
+ && (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_OPEN)) {
mDrawerLayout.closeDrawer(GravityCompat.START);
- } else {
+ } else if (drawerLockMode != DrawerLayout.LOCK_MODE_LOCKED_CLOSED) {
mDrawerLayout.openDrawer(GravityCompat.START);
}
}
diff --git a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
index d2c7b91..e147b7d 100644
--- a/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
+++ b/v7/appcompat/src/android/support/v7/app/AppCompatDelegateImplV7.java
@@ -115,6 +115,8 @@
private PanelFeatureState[] mPanels;
private PanelFeatureState mPreparedPanel;
+ private boolean mLongPressBackDown;
+
private boolean mInvalidatePanelMenuPosted;
private int mInvalidatePanelMenuFeatures;
private final Runnable mInvalidatePanelMenuRunnable = new Runnable() {
@@ -874,9 +876,17 @@
onKeyUpPanel(Window.FEATURE_OPTIONS_PANEL, event);
return true;
case KeyEvent.KEYCODE_BACK:
+ final boolean wasLongPressBackDown = mLongPressBackDown;
+ mLongPressBackDown = false;
+
PanelFeatureState st = getPanelState(Window.FEATURE_OPTIONS_PANEL, false);
if (st != null && st.isOpen) {
- closePanel(st, true);
+ if (!wasLongPressBackDown) {
+ // Certain devices allow opening the options menu via a long press of the
+ // back button. We should only close the open options menu if it wasn't
+ // opened via a long press gesture.
+ closePanel(st, true);
+ }
return true;
}
if (onBackPressed()) {
@@ -895,6 +905,11 @@
// For empty menus, PhoneWindow's KEYCODE_BACK handling will steals all events,
// not allowing the Activity to call onBackPressed().
return true;
+ case KeyEvent.KEYCODE_BACK:
+ // Certain devices allow opening the options menu via a long press of the back
+ // button. We keep a record of whether the last event is from a long press.
+ mLongPressBackDown = (event.getFlags() & KeyEvent.FLAG_LONG_PRESS) != 0;
+ break;
}
// On API v7-10 we need to manually call onKeyShortcut() as this is not called
diff --git a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
index ea70a88..4fcaf13 100644
--- a/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
+++ b/v7/appcompat/src/android/support/v7/widget/AppCompatDrawableManager.java
@@ -25,6 +25,7 @@
import android.graphics.drawable.DrawableContainer;
import android.graphics.drawable.InsetDrawable;
import android.graphics.drawable.LayerDrawable;
+import android.graphics.drawable.StateListDrawable;
import android.os.Build;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
@@ -621,23 +622,21 @@
drawable.clearColorFilter();
}
- if (Build.VERSION.SDK_INT <= 10) {
- // On Gingerbread, GradientDrawable does not invalidate itself when it's
- // ColorFilter has changed, so we need to force an invalidation
+ if (Build.VERSION.SDK_INT <= 23) {
+ // Pre-v23 there is no guarantee that a state change will invoke an invalidation,
+ // so we force it ourselves
drawable.invalidateSelf();
}
}
private static boolean shouldMutateBackground(Drawable drawable) {
- if (Build.VERSION.SDK_INT >= 16) {
- // For SDK 16+, we should be fine mutating the drawable
- return true;
- }
-
if (drawable instanceof LayerDrawable) {
return Build.VERSION.SDK_INT >= 16;
} else if (drawable instanceof InsetDrawable) {
return Build.VERSION.SDK_INT >= 14;
+ } else if (drawable instanceof StateListDrawable) {
+ // StateListDrawable has a bug in mutate() on API 7
+ return Build.VERSION.SDK_INT >= 8;
} else if (drawable instanceof DrawableContainer) {
// If we have a DrawableContainer, let's traverse it's child array
final Drawable.ConstantState state = drawable.getConstantState();
@@ -663,7 +662,7 @@
return getPorterDuffColorFilter(color, tintMode);
}
- private static PorterDuffColorFilter getPorterDuffColorFilter(int color, PorterDuff.Mode mode) {
+ public static PorterDuffColorFilter getPorterDuffColorFilter(int color, PorterDuff.Mode mode) {
// First, lets see if the cache already contains the color filter
PorterDuffColorFilter filter = COLOR_FILTER_CACHE.get(color, mode);
diff --git a/v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java b/v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java
index 3477761..5dba5d6 100644
--- a/v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java
+++ b/v7/cardview/api21/android/support/v7/widget/RoundRectDrawable.java
@@ -15,11 +15,15 @@
*/
package android.support.v7.widget;
+import android.content.res.ColorStateList;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Outline;
import android.graphics.Paint;
import android.graphics.PixelFormat;
+import android.graphics.PorterDuff;
+import android.graphics.PorterDuffColorFilter;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
@@ -29,7 +33,7 @@
/**
* Very simple drawable that draws a rounded rectangle background with arbitrary corners and also
- * reports proper outline for L.
+ * reports proper outline for Lollipop.
* <p>
* Simpler and uses less resources compared to GradientDrawable or ShapeDrawable.
*/
@@ -42,6 +46,10 @@
private boolean mInsetForPadding = false;
private boolean mInsetForRadius = true;
+ private PorterDuffColorFilter mTintFilter;
+ private ColorStateList mTint;
+ private PorterDuff.Mode mTintMode;
+
public RoundRectDrawable(int backgroundColor, float radius) {
mRadius = radius;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG);
@@ -68,7 +76,21 @@
@Override
public void draw(Canvas canvas) {
- canvas.drawRoundRect(mBoundsF, mRadius, mRadius, mPaint);
+ final Paint paint = mPaint;
+
+ final boolean clearColorFilter;
+ if (mTintFilter != null && paint.getColorFilter() == null) {
+ paint.setColorFilter(mTintFilter);
+ clearColorFilter = true;
+ } else {
+ clearColorFilter = false;
+ }
+
+ canvas.drawRoundRect(mBoundsF, mRadius, mRadius, paint);
+
+ if (clearColorFilter) {
+ paint.setColorFilter(null);
+ }
}
private void updateBounds(Rect bounds) {
@@ -108,12 +130,12 @@
@Override
public void setAlpha(int alpha) {
- // not supported because older versions do not support
+ mPaint.setAlpha(alpha);
}
@Override
public void setColorFilter(ColorFilter cf) {
- // not supported because older versions do not support
+ mPaint.setColorFilter(cf);
}
@Override
@@ -129,4 +151,44 @@
mPaint.setColor(color);
invalidateSelf();
}
+
+ @Override
+ public void setTintList(ColorStateList tint) {
+ mTint = tint;
+ mTintFilter = createTintFilter(mTint, mTintMode);
+ invalidateSelf();
+ }
+
+ @Override
+ public void setTintMode(PorterDuff.Mode tintMode) {
+ mTintMode = tintMode;
+ mTintFilter = createTintFilter(mTint, mTintMode);
+ invalidateSelf();
+ }
+
+ @Override
+ protected boolean onStateChange(int[] stateSet) {
+ if (mTint != null && mTintMode != null) {
+ mTintFilter = createTintFilter(mTint, mTintMode);
+ return true;
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isStateful() {
+ return (mTint != null && mTint.isStateful()) || super.isStateful();
+ }
+
+ /**
+ * Ensures the tint filter is consistent with the current tint color and
+ * mode.
+ */
+ private PorterDuffColorFilter createTintFilter(ColorStateList tint, PorterDuff.Mode tintMode) {
+ if (tint == null || tintMode == null) {
+ return null;
+ }
+ final int color = tint.getColorForState(getState(), Color.TRANSPARENT);
+ return new PorterDuffColorFilter(color, tintMode);
+ }
}
diff --git a/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java b/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java
index 054ada8..505edcc 100644
--- a/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java
+++ b/v7/cardview/eclair-mr1/android/support/v7/widget/RoundRectDrawableWithShadow.java
@@ -131,8 +131,13 @@
}
void setShadowSize(float shadowSize, float maxShadowSize) {
- if (shadowSize < 0 || maxShadowSize < 0) {
- throw new IllegalArgumentException("invalid shadow size");
+ if (shadowSize < 0f) {
+ throw new IllegalArgumentException("Invalid shadow size " + shadowSize +
+ ". Must be >= 0");
+ }
+ if (maxShadowSize < 0f) {
+ throw new IllegalArgumentException("Invalid max shadow size " + maxShadowSize +
+ ". Must be >= 0");
}
shadowSize = toEven(shadowSize);
maxShadowSize = toEven(maxShadowSize);
@@ -184,8 +189,6 @@
@Override
public void setColorFilter(ColorFilter cf) {
mPaint.setColorFilter(cf);
- mCornerShadowPaint.setColorFilter(cf);
- mEdgeShadowPaint.setColorFilter(cf);
}
@Override
@@ -194,6 +197,10 @@
}
void setCornerRadius(float radius) {
+ if (radius < 0f) {
+ throw new IllegalArgumentException("Invalid radius " + radius +
+ ". Must be >= 0");
+ }
radius = (int) (radius + .5f);
if (mCornerRadius == radius) {
return;
diff --git a/v7/cardview/src/android/support/v7/widget/CardView.java b/v7/cardview/src/android/support/v7/widget/CardView.java
index bc992b8..eb181bc 100644
--- a/v7/cardview/src/android/support/v7/widget/CardView.java
+++ b/v7/cardview/src/android/support/v7/widget/CardView.java
@@ -27,33 +27,33 @@
/**
* A FrameLayout with a rounded corner background and shadow.
* <p>
- * CardView uses <code>elevation</code> property on L for shadows and falls back to a custom shadow
- * implementation on older platforms.
+ * CardView uses <code>elevation</code> property on Lollipop for shadows and falls back to a
+ * custom emulated shadow implementation on older platforms.
* <p>
- * Due to expensive nature of rounded corner clipping, on platforms before L, CardView does not
- * clip its children that intersect with rounded corners. Instead, it adds padding to avoid such
+ * Due to expensive nature of rounded corner clipping, on platforms before Lollipop, CardView does
+ * not clip its children that intersect with rounded corners. Instead, it adds padding to avoid such
* intersection (See {@link #setPreventCornerOverlap(boolean)} to change this behavior).
* <p>
- * Before L, CardView adds padding to its content and draws shadows to that area. This padding
- * amount is equal to <code>maxCardElevation + (1 - cos45) * cornerRadius</code> on the sides and
- * <code>maxCardElevation * 1.5 + (1 - cos45) * cornerRadius</code> on top and bottom.
+ * Before Lollipop, CardView adds padding to its content and draws shadows to that area. This
+ * padding amount is equal to <code>maxCardElevation + (1 - cos45) * cornerRadius</code> on the
+ * sides and <code>maxCardElevation * 1.5 + (1 - cos45) * cornerRadius</code> on top and bottom.
* <p>
* Since padding is used to offset content for shadows, you cannot set padding on CardView.
- * Instead,
- * you can use content padding attributes in XML or {@link #setContentPadding(int, int, int, int)}
- * in code to set the padding between the edges of the Card and children of CardView.
+ * Instead, you can use content padding attributes in XML or
+ * {@link #setContentPadding(int, int, int, int)} in code to set the padding between the edges of
+ * the CardView and children of CardView.
* <p>
* Note that, if you specify exact dimensions for the CardView, because of the shadows, its content
- * area will be different between platforms before L and after L. By using api version specific
- * resource values, you can avoid these changes. Alternatively, If you want CardView to add inner
- * padding on platforms L and after as well, you can set {@link #setUseCompatPadding(boolean)} to
- * <code>true</code>.
+ * area will be different between platforms before Lollipop and after Lollipop. By using api version
+ * specific resource values, you can avoid these changes. Alternatively, If you want CardView to add
+ * inner padding on platforms Lollipop and after as well, you can call
+ * {@link #setUseCompatPadding(boolean)} and pass <code>true</code>.
* <p>
* To change CardView's elevation in a backward compatible way, use
- * {@link #setCardElevation(float)}. CardView will use elevation API on L and before L, it will
- * change the shadow size. To avoid moving the View while shadow size is changing, shadow size is
- * clamped by {@link #getMaxCardElevation()}. If you want to change elevation dynamically, you
- * should call {@link #setMaxCardElevation(float)} when CardView is initialized.
+ * {@link #setCardElevation(float)}. CardView will use elevation API on Lollipop and before
+ * Lollipop, it will change the shadow size. To avoid moving the View while shadow size is changing,
+ * shadow size is clamped by {@link #getMaxCardElevation()}. If you want to change elevation
+ * dynamically, you should call {@link #setMaxCardElevation(float)} when CardView is initialized.
*
* @attr ref android.support.v7.cardview.R.styleable#CardView_cardBackgroundColor
* @attr ref android.support.v7.cardview.R.styleable#CardView_cardCornerRadius
@@ -116,10 +116,10 @@
}
/**
- * Returns whether CardView will add inner padding on platforms L and after.
+ * Returns whether CardView will add inner padding on platforms Lollipop and after.
*
- * @return True CardView adds inner padding on platforms L and after to have same dimensions
- * with platforms before L.
+ * @return <code>true</code> if CardView adds inner padding on platforms Lollipop and after to
+ * have same dimensions with platforms before Lollipop.
*/
@Override
public boolean getUseCompatPadding() {
@@ -127,19 +127,19 @@
}
/**
- * CardView adds additional padding to draw shadows on platforms before L.
+ * CardView adds additional padding to draw shadows on platforms before Lollipop.
* <p>
- * This may cause Cards to have different sizes between L and before L. If you need to align
- * CardView with other Views, you may need api version specific dimension resources to account
- * for the changes.
+ * This may cause Cards to have different sizes between Lollipop and before Lollipop. If you
+ * need to align CardView with other Views, you may need api version specific dimension
+ * resources to account for the changes.
* As an alternative, you can set this flag to <code>true</code> and CardView will add the same
- * padding values on platforms L and after.
+ * padding values on platforms Lollipop and after.
* <p>
* Since setting this flag to true adds unnecessary gaps in the UI, default value is
* <code>false</code>.
*
- * @param useCompatPadding True if CardView should add padding for the shadows on platforms L
- * and above.
+ * @param useCompatPadding <code>true></code> if CardView should add padding for the shadows on
+ * platforms Lollipop and above.
* @attr ref android.support.v7.cardview.R.styleable#CardView_cardUseCompatPadding
*/
public void setUseCompatPadding(boolean useCompatPadding) {
@@ -306,13 +306,13 @@
/**
* Updates the backward compatible elevation of the CardView.
*
- * @param radius The backward compatible elevation in pixels.
+ * @param elevation The backward compatible elevation in pixels.
* @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation
* @see #getCardElevation()
* @see #setMaxCardElevation(float)
*/
- public void setCardElevation(float radius) {
- IMPL.setElevation(this, radius);
+ public void setCardElevation(float elevation) {
+ IMPL.setElevation(this, elevation);
}
/**
@@ -327,24 +327,24 @@
}
/**
- * Updates the backward compatible elevation of the CardView.
+ * Updates the backward compatible maximum elevation of the CardView.
* <p>
- * Calling this method has no effect if device OS version is L or newer and
+ * Calling this method has no effect if device OS version is Lollipop or newer and
* {@link #getUseCompatPadding()} is <code>false</code>.
*
- * @param radius The backward compatible elevation in pixels.
- * @attr ref android.support.v7.cardview.R.styleable#CardView_cardElevation
+ * @param maxElevation The backward compatible maximum elevation in pixels.
+ * @attr ref android.support.v7.cardview.R.styleable#CardView_cardMaxElevation
* @see #setCardElevation(float)
* @see #getMaxCardElevation()
*/
- public void setMaxCardElevation(float radius) {
- IMPL.setMaxElevation(this, radius);
+ public void setMaxCardElevation(float maxElevation) {
+ IMPL.setMaxElevation(this, maxElevation);
}
/**
- * Returns the backward compatible elevation of the CardView.
+ * Returns the backward compatible maximum elevation of the CardView.
*
- * @return Elevation of the CardView
+ * @return Maximum elevation of the CardView
* @see #setMaxCardElevation(float)
* @see #getCardElevation()
*/
@@ -354,9 +354,9 @@
/**
* Returns whether CardView should add extra padding to content to avoid overlaps with rounded
- * corners on API versions 20 and below.
+ * corners on pre-Lollipop platforms.
*
- * @return True if CardView prevents overlaps with rounded corners on platforms before L.
+ * @return True if CardView prevents overlaps with rounded corners on platforms before Lollipop.
* Default value is <code>true</code>.
*/
@Override
@@ -365,11 +365,11 @@
}
/**
- * On API 20 and before, CardView does not clip the bounds of the Card for the rounded corners.
- * Instead, it adds padding to content so that it won't overlap with the rounded corners.
- * You can disable this behavior by setting this field to <code>false</code>.
+ * On pre-Lollipop platforms, CardView does not clip the bounds of the Card for the rounded
+ * corners. Instead, it adds padding to content so that it won't overlap with the rounded
+ * corners. You can disable this behavior by setting this field to <code>false</code>.
* <p>
- * Setting this value on API 21 and above does not have any effect unless you have enabled
+ * Setting this value on Lollipop and above does not have any effect unless you have enabled
* compatibility padding.
*
* @param preventCornerOverlap Whether CardView should add extra padding to content to avoid
diff --git a/v7/gridlayout/src/android/support/v7/widget/GridLayout.java b/v7/gridlayout/src/android/support/v7/widget/GridLayout.java
index cee59eb..a493911 100644
--- a/v7/gridlayout/src/android/support/v7/widget/GridLayout.java
+++ b/v7/gridlayout/src/android/support/v7/widget/GridLayout.java
@@ -1647,7 +1647,8 @@
boolean validSolution = true;
// do a binary search to find the max delta that won't conflict with constraints
while(deltaMin < deltaMax) {
- final int delta = (deltaMin + deltaMax) / 2;
+ // cast to long to prevent overflow.
+ final int delta = (int)(((long)deltaMin + deltaMax) / 2);
invalidateValues();
shareOutDelta(delta, totalWeight);
validSolution = solve(getArcs(), a, false);
diff --git a/v7/mediarouter/res/layout/mr_playback_control.xml b/v7/mediarouter/res/layout/mr_playback_control.xml
index 1b8a317..9ee2191 100644
--- a/v7/mediarouter/res/layout/mr_playback_control.xml
+++ b/v7/mediarouter/res/layout/mr_playback_control.xml
@@ -29,7 +29,8 @@
android:contentDescription="@string/mr_controller_play"
android:background="?attr/selectableItemBackgroundBorderless"
android:visibility="gone" />
- <LinearLayout android:orientation="vertical"
+ <LinearLayout android:id="@+id/mr_control_title_container"
+ android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toLeftOf="@id/mr_control_play_pause"
diff --git a/v7/mediarouter/res/values-af/strings.xml b/v7/mediarouter/res/values-af/strings.xml
index 024a99c..891e66d 100644
--- a/v7/mediarouter/res/values-af/strings.xml
+++ b/v7/mediarouter/res/values-af/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Stelsel"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Toestelle"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knoppie"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Saai uit na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Vind tans toestelle"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ontkoppel"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Hou op uitsaai"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Maak toe"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Speel"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Laat wag"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Vou uit"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Vou in"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media is gekies nie"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen inligting beskikbaar nie"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Saai tans skerm uit"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Saai uit"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Koppel aan toestel"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Soek tans vir toestelle…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Ontkoppel"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Hou op uitsaai"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Roete-instellings"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Speel"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Laat wag"</string>
</resources>
diff --git a/v7/mediarouter/res/values-am/strings.xml b/v7/mediarouter/res/values-am/strings.xml
index 4456b45..9d9a90d 100644
--- a/v7/mediarouter/res/values-am/strings.xml
+++ b/v7/mediarouter/res/values-am/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"ስርዓት"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"መሣሪያዎች"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"የCast አዝራር"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast አድርግ ወደ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"መሣሪያዎችን በማግኘት ላይ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ግንኙነት አቋርጥ"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Cast ማድረግ አቁም"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ዝጋ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"አጫውት"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ለአፍታ አቁም"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"አስፋ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ሰብስብ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ምንም ማህደረመረጃ አልተመረጠም"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ምንም መረጃ አይገኝም"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ማያ ገጽን በመውሰድ ላይ"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"ውሰድ"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"ከመሳሪያ ጋር ያገናኙ"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"መሳሪያዎችን በመፈለግ ላይ…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"ግንኙነት አቋርጥ"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"መውሰድ አቁም"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"የመንገድ ቅንብሮች"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"አጫውት"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"ለአፍታ አቁም"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ar/strings.xml b/v7/mediarouter/res/values-ar/strings.xml
index 7222590..c0c5a25 100644
--- a/v7/mediarouter/res/values-ar/strings.xml
+++ b/v7/mediarouter/res/values-ar/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"النظام"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"الأجهزة"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"زر الإرسال"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"إرسال إلى"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"جارٍ البحث عن أجهزة"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع الاتصال"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"إيقاف الإرسال"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"إغلاق"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"تشغيل"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"إيقاف مؤقت"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"توسيع"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"تصغير"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"لم يتم اختيار أية وسائط"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"لا تتوفر أية معلومات"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"جارٍ إرسال الشاشة"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"إرسال"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"الاتصال بجهاز"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"جارٍ البحث عن الأجهزة…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"قطع الاتصال"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"إيقاف الإرسال"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"إعدادات المسار"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"تشغيل"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"إيقاف مؤقت"</string>
</resources>
diff --git a/v7/mediarouter/res/values-bg/strings.xml b/v7/mediarouter/res/values-bg/strings.xml
index de49179..93676ed 100644
--- a/v7/mediarouter/res/values-bg/strings.xml
+++ b/v7/mediarouter/res/values-bg/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Бутон за предаване"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Предаване към"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Търсят се устройства"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекратяване на връзката"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Спиране на предаването"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затваряне"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Пускане"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Поставяне на пауза"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Разгъване"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свиване"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Няма избрана мултимедия"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Няма налична информация"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранът се предава"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Предаване"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Свързване с устройство"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Търсят се устройства…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Прекратяване на връзката"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Спиране на предаването"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Настройки за маршрута"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Пускане"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Поставяне на пауза"</string>
</resources>
diff --git a/v7/mediarouter/res/values-bn-rBD/strings.xml b/v7/mediarouter/res/values-bn-rBD/strings.xml
index 7eb5301..ee08f48 100644
--- a/v7/mediarouter/res/values-bn-rBD/strings.xml
+++ b/v7/mediarouter/res/values-bn-rBD/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"সিস্টেম"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ডিভাইসগুলি"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"কাস্ট করার বোতাম"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"এতে কাস্ট করুন"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ডিভাইসগুলিকে খোঁজা হচ্ছে"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"সংযোগ বিচ্ছিন্ন করুন"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"কাস্ট করা বন্ধ করুন"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"বন্ধ করুন"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"চালান"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"বিরাম দিন"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"প্রসারিত করুন"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"সঙ্কুচিত করুন"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"কোনো মিডিয়া নির্বাচন করা হয়নি"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"কোনো তথ্য উপলব্ধ নেই"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"স্ক্রীন কাস্ট করা হচ্ছে"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"কাস্ট করুন"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"ডিভাইসে সংযোগ করুন"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"ডিভাইসগুলি অনুসন্ধান করা হচ্ছে…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"সংযোগ বিচ্ছিন্ন করুন"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"কাস্ট করা বন্ধ করুন"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"সেটিংস রুট করুন"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"চালান"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"বিরাম দিন"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ca/strings.xml b/v7/mediarouter/res/values-ca/strings.xml
index ab8809a..ce4c180 100644
--- a/v7/mediarouter/res/values-ca/strings.xml
+++ b/v7/mediarouter/res/values-ca/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositius"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botó d\'emetre"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emet a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"S\'estan cercant dispositius"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconnecta"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Atura l\'emissió"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tanca"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reprodueix"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Posa en pausa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Desplega"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Replega"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No s\'ha seleccionat cap fitxer multimèdia"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hi ha informació disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emissió de pantalla"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Emet"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connecta al dispositiu"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"S\'estan cercant dispositius…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconnecta"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Atura l\'emissió"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuració de la ruta"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reprodueix"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Posa en pausa"</string>
</resources>
diff --git a/v7/mediarouter/res/values-cs/strings.xml b/v7/mediarouter/res/values-cs/strings.xml
index 57c1594..c17629a 100644
--- a/v7/mediarouter/res/values-cs/strings.xml
+++ b/v7/mediarouter/res/values-cs/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Zařízení"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačítko odesílání"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Odesílat do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Hledání zařízení"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojit"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Zastavit odesílání"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavřít"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Přehrát"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastavit"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbalit"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sbalit"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nebyla vybrána žádná média"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nejsou k dispozici žádné informace"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Odesílání obsahu obrazovky"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Odeslat"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Připojení k zařízení"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Vyhledávání zařízení…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Odpojit"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Ukončit odesílání"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavení trasy"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Přehrát"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pozastavit"</string>
</resources>
diff --git a/v7/mediarouter/res/values-da/strings.xml b/v7/mediarouter/res/values-da/strings.xml
index eb6c8fa..786cdc6 100644
--- a/v7/mediarouter/res/values-da/strings.xml
+++ b/v7/mediarouter/res/values-da/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheder"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knap"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finder enheder"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Afbryd"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Stop med at caste"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Luk"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Afspil"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sæt på pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Udvid"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Der er ikke valgt nogen medier"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Der er ingen tilgængelige oplysninger"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skærmen castes"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Opret forbindelse til enheden"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Søger efter enheder..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Afbryd forbindelsen"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Stop med at caste"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ruteindstillinger"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Afspil"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Sæt på pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-de/strings.xml b/v7/mediarouter/res/values-de/strings.xml
index 17a84af..296b611 100644
--- a/v7/mediarouter/res/values-de/strings.xml
+++ b/v7/mediarouter/res/values-de/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Geräte"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-Symbol"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Streamen auf"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Geräte werden gesucht."</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Verbindung trennen"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Streaming stoppen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Schließen"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Wiedergeben"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausieren"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Maximieren"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minimieren"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Keine Medien ausgewählt"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Keine Informationen verfügbar"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Bildschirm wird gestreamt."</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Übertragen"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Mit Gerät verbinden"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Geräte werden gesucht…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Verbindung aufheben"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Übertragung stoppen"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Routingeinstellungen"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Wiedergabe"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-el/strings.xml b/v7/mediarouter/res/values-el/strings.xml
index 9258296..153ad7b 100644
--- a/v7/mediarouter/res/values-el/strings.xml
+++ b/v7/mediarouter/res/values-el/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Σύστημα"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Συσκευές"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Κουμπί Cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Μετάδοση σε"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Εύρεση συσκευών"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Αποσύνδεση"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Διακοπή μετάδοσης"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Κλείσιμο"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Αναπαραγωγή"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Παύση"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ανάπτυξη"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Σύμπτυξη"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Δεν έχουν επιλεγεί μέσα"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Δεν υπάρχουν διαθέσιμες πληροφορίες"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Μετάδοση οθόνης"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Μετάδοση"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Σύνδεση με τη συσκευή"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Αναζήτηση συσκευών…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Αποσύνδεση"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Διακοπή μετάδοσης"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ρυθμίσεις διαδρομής"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Αναπαραγωγή"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Παύση"</string>
</resources>
diff --git a/v7/mediarouter/res/values-en-rAU/strings.xml b/v7/mediarouter/res/values-en-rAU/strings.xml
index 5edd79b..1cb9d4a 100644
--- a/v7/mediarouter/res/values-en-rAU/strings.xml
+++ b/v7/mediarouter/res/values-en-rAU/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-en-rGB/strings.xml b/v7/mediarouter/res/values-en-rGB/strings.xml
index 5edd79b..1cb9d4a 100644
--- a/v7/mediarouter/res/values-en-rGB/strings.xml
+++ b/v7/mediarouter/res/values-en-rGB/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-en-rIN/strings.xml b/v7/mediarouter/res/values-en-rIN/strings.xml
index 5edd79b..1cb9d4a 100644
--- a/v7/mediarouter/res/values-en-rIN/strings.xml
+++ b/v7/mediarouter/res/values-en-rIN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Devices"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast button"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast to"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finding devices"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Disconnect"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Stop casting"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Close"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expand"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Collapse"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No media selected"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No info available"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Casting screen"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connect to device"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Searching for devices…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnect"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Stop casting"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route settings"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Play"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-es-rUS/strings.xml b/v7/mediarouter/res/values-es-rUS/strings.xml
index b0a0a61..7d3b402 100644
--- a/v7/mediarouter/res/values-es-rUS/strings.xml
+++ b/v7/mediarouter/res/values-es-rUS/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón para transmitir"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Detener la transmisión"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se seleccionó ningún contenido multimedia"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Sin información disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitiendo pantalla"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar al dispositivo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Detener transmisión"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuración de ruta"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reproducir"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausar"</string>
</resources>
diff --git a/v7/mediarouter/res/values-es/strings.xml b/v7/mediarouter/res/values-es/strings.xml
index 3a1eaeb..d80e303 100644
--- a/v7/mediarouter/res/values-es/strings.xml
+++ b/v7/mediarouter/res/values-es/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de enviar"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Enviar a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Dejar de enviar contenido"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Cerrar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproducir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mostrar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ocultar"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"No se ha seleccionado ningún medio"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"No hay información disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Enviando pantalla"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Enviar contenido"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar a dispositivo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Dejar de enviar contenido"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ajustes de ruta"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reproducir"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
</resources>
diff --git a/v7/mediarouter/res/values-et-rEE/strings.xml b/v7/mediarouter/res/values-et-rEE/strings.xml
index 9058dcf..e458335 100644
--- a/v7/mediarouter/res/values-et-rEE/strings.xml
+++ b/v7/mediarouter/res/values-et-rEE/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Süsteem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Seadmed"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Ülekandenupp"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Ülekandmine seadmesse"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Seadmete otsimine"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkesta ühendus"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Peata ülekanne"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulgemine"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Esitamine"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Peatamine"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laiendamine"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ahendamine"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Meediat pole valitud"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Teave puudub"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekraanikuva ülekandmine"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Ülekandmine"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Seadmega ühendamine"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Seadmete otsimine …"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Katkesta ühendus"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Lõpeta ülekanne"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Marsruudi seaded"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Esitamine"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Peatamine"</string>
</resources>
diff --git a/v7/mediarouter/res/values-eu-rES/strings.xml b/v7/mediarouter/res/values-eu-rES/strings.xml
index ad85c5a..899be285 100644
--- a/v7/mediarouter/res/values-eu-rES/strings.xml
+++ b/v7/mediarouter/res/values-eu-rES/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Gailuak"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Igorri botoia"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Igorri hona"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Gailuak bilatzen"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deskonektatu"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Utzi igortzeari"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Itxi"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Erreproduzitu"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausatu"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Zabaldu"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tolestu"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ez da hautatu multimedia-edukirik"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ez dago informaziorik"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Pantaila igortzen"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Igorri"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Konektatu gailura"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Gailuak bilatzen…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Deskonektatu"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Utzi igortzeari"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ibilbidearen ezarpenak"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Erreproduzitu"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausatu"</string>
</resources>
diff --git a/v7/mediarouter/res/values-fa/strings.xml b/v7/mediarouter/res/values-fa/strings.xml
index 87a81ba..76dcec6 100644
--- a/v7/mediarouter/res/values-fa/strings.xml
+++ b/v7/mediarouter/res/values-fa/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"سیستم"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"دستگاهها"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"دکمه ارسال محتوا"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ارسال محتوا به"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"پیدا کردن دستگاهها"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"قطع ارتباط"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"توقف ارسال محتوا"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"بستن"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"پخش"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"توقف موقت"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"بزرگ کردن"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"کوچک کردن"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"رسانه انتخاب نشده است"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"اطلاعات دردسترس نیست"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"درحال فرستادن صفحه"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"فرستادن"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"برقراری ارتباط با دستگاه"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"در حال جستجو برای دستگاهها..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"قطع ارتباط"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"توقف فرستادن"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"تنظیمات مسیر"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"پخش"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"توقف موقت"</string>
</resources>
diff --git a/v7/mediarouter/res/values-fi/strings.xml b/v7/mediarouter/res/values-fi/strings.xml
index a93d74e..44c8b64 100644
--- a/v7/mediarouter/res/values-fi/strings.xml
+++ b/v7/mediarouter/res/values-fi/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Järjestelmä"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Laitteet"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-painike"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Suoratoiston kohde"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Etsitään laitteita"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Katkaise yhteys"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Lopeta suoratoisto"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sulje"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Toista"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Keskeytä"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Laajenna"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Tiivistä"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ei valittua mediaa."</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tietoja ei ole saatavilla"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Suoratoistetaan näyttöä"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Lähetä"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Yhdistä laitteeseen"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Etsitään laitteita…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Katkaise yhteys"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Lopeta suoratoisto"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Reitin asetukset"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Toista"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Keskeytä"</string>
</resources>
diff --git a/v7/mediarouter/res/values-fr-rCA/strings.xml b/v7/mediarouter/res/values-fr-rCA/strings.xml
index f0c6976..6f385ff 100644
--- a/v7/mediarouter/res/values-fr-rCA/strings.xml
+++ b/v7/mediarouter/res/values-fr-rCA/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Bouton Diffuser"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Se déconnecter"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Arrêter la diffusion"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lire"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Interrompre"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Diffuser"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connexion au périphérique"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Paramètres de l\'itinéraire"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Lecture"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Suspendre"</string>
</resources>
diff --git a/v7/mediarouter/res/values-fr/strings.xml b/v7/mediarouter/res/values-fr/strings.xml
index de94f18..711ccd3 100644
--- a/v7/mediarouter/res/values-fr/strings.xml
+++ b/v7/mediarouter/res/values-fr/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Système"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Appareils"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Icône Cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Diffuser sur"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Recherche d\'appareils en cours…"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Déconnecter"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Arrêter de diffuser"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fermer"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lecture"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Développer"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Réduire"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Aucun média sélectionné"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Aucune information disponible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Diffusion de l\'écran en cours…"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Caster"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connecter à l\'appareil"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Recherche d\'appareils en cours…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Déconnecter"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Arrêter la diffusion"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Paramètres de l\'itinéraire"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Lecture"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-gl-rES/strings.xml b/v7/mediarouter/res/values-gl-rES/strings.xml
index fb76c68..61bc1e2 100644
--- a/v7/mediarouter/res/values-gl-rES/strings.xml
+++ b/v7/mediarouter/res/values-gl-rES/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botón de emitir"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitir en"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Buscando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Parar de emitir"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Pechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduce"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ampliar"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Contraer"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Non se seleccionaron recursos"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Non hai información dispoñible"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emisión de pantalla"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Emitir"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar co dispositivo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Buscando dispositivos…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Parar de emitir"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configuración da ruta"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reproduce"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
</resources>
diff --git a/v7/mediarouter/res/values-hi/strings.xml b/v7/mediarouter/res/values-hi/strings.xml
index e2c7a43..c2f58f3 100644
--- a/v7/mediarouter/res/values-hi/strings.xml
+++ b/v7/mediarouter/res/values-hi/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"डिवाइस"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट करें बटन"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"इस पर कास्ट करें"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"डिवाइस ढूंढ रहा है"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करें"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"कास्ट करना बंद करें"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करें"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"चलाएं"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"रोकें"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करें"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त करें"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कोई मीडिया चयनित नहीं है"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोई जानकारी उपलब्ध नहीं"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट हो रही है"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट करें"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"डिवाइस से कनेक्ट करें"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"डिवाइस की खोज हो रही है…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करें"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"कास्ट करना बंद करें"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिंग"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"चलाएं"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"रोकें"</string>
</resources>
diff --git a/v7/mediarouter/res/values-hr/strings.xml b/v7/mediarouter/res/values-hr/strings.xml
index d79258fbf..dcb4934 100644
--- a/v7/mediarouter/res/values-hr/strings.xml
+++ b/v7/mediarouter/res/values-hr/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sustav"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Uređaji"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za emitiranje"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Emitiranje na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Traženje uređaja"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini vezu"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Zaustavi emitiranje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zatvaranje"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reprodukcija"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pauziranje"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Proširivanje"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sažimanje"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nije odabran nijedan medij"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacije nisu dostupne"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Emitiranje zaslona"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Emitiranje"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Povezivanje s uređajem"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Traženje uređaja…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Prekini vezu"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Zaustavi emitiranje"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Postavke rute"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reprodukcija"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pauziraj"</string>
</resources>
diff --git a/v7/mediarouter/res/values-hu/strings.xml b/v7/mediarouter/res/values-hu/strings.xml
index 7686fea..0a76065 100644
--- a/v7/mediarouter/res/values-hu/strings.xml
+++ b/v7/mediarouter/res/values-hu/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Rendszer"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Eszközök"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Átküldés gomb"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Átküldés ide"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Eszközök keresése"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Leválasztás"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Átküldés leállítása"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Bezárás"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Lejátszás"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Szüneteltetés"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kibontás"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Összecsukás"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nincs média kiválasztva"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nincs információ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Képernyőtartalom átküldése"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Tartalomátküldés"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Csatlakozás adott eszközhöz"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Eszközkeresés…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Leválasztás"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Átküldés leállítása"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Útvonal-beállítások"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Indítás"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Szüneteltetés"</string>
</resources>
diff --git a/v7/mediarouter/res/values-hy-rAM/strings.xml b/v7/mediarouter/res/values-hy-rAM/strings.xml
index 85bd488..19c65ed 100644
--- a/v7/mediarouter/res/values-hy-rAM/strings.xml
+++ b/v7/mediarouter/res/values-hy-rAM/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Համակարգ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Սարքեր"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Հեռարձակման կոճակ"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Հեռարձակել դեպի"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Սարքերի որոնում"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Անջատել"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Դադարեցնել հեռարձակումը"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Փակել"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Նվագարկել"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Դադար"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Ընդարձակել"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Կոծկել"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Մեդիա ֆայլեր չեն ընտրվել"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Տեղեկությունները հասանելի չեն"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Էկրանը հեռարձակվում է"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Հեռարձակում"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Միանալ սարքին"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Որոնվում են սարքեր..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Անջատել"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Դադարեցնել հեռարձակումը"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ֆայլերի փոխանցման կարգավորումներ"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Նվագարկել"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Դադար"</string>
</resources>
diff --git a/v7/mediarouter/res/values-in/strings.xml b/v7/mediarouter/res/values-in/strings.xml
index 3d01880..b90a0cb 100644
--- a/v7/mediarouter/res/values-in/strings.xml
+++ b/v7/mediarouter/res/values-in/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Perangkat"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tombol transmisi"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmisi ke"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari perangkat"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Hentikan transmisi"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Putar"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Luaskan"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Ciutkan"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tidak ada media yang dipilih"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Tidak ada info yang tersedia"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmisi layar"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Transmisi"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Sambungkan ke perangkat"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Menelusuri perangkat…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Hentikan transmisi"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Setelan rute"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Putar"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Jeda"</string>
</resources>
diff --git a/v7/mediarouter/res/values-is-rIS/strings.xml b/v7/mediarouter/res/values-is-rIS/strings.xml
index 366f6f6..9fa308e 100644
--- a/v7/mediarouter/res/values-is-rIS/strings.xml
+++ b/v7/mediarouter/res/values-is-rIS/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Kerfi"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Tæki"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Útsendingarhnappur"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Senda út í"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Leitað að tækjum"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Aftengjast"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Stöðva útsendingu"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Loka"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spila"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Hlé"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Stækka"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Minnka"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Enginn miðill valinn"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Engar upplýsingar í boði"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skjár sendur út"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Senda út"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Tengjast tæki"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Leitar að tækjum…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Aftengja"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Stöðva útsendingu"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Leiðarstillingar"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Spila"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Hlé"</string>
</resources>
diff --git a/v7/mediarouter/res/values-it/strings.xml b/v7/mediarouter/res/values-it/strings.xml
index 9febd99..8c3324d 100644
--- a/v7/mediarouter/res/values-it/strings.xml
+++ b/v7/mediarouter/res/values-it/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivi"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Pulsante Trasmetti"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Trasmetti a"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Ricerca di dispositivi in corso"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Scollega"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Interrompi trasmissione"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Chiudi"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Riproduci"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Espandi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Comprimi"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nessun contenuto multimediale selezionato"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nessuna informazione disponibile"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Trasmissione dello schermo in corso"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Trasmetti"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Connetti al dispositivo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Ricerca di dispositivi…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Disconnetti"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Interrompi trasmissione"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Impostazioni percorso"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Riproduci"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
</resources>
diff --git a/v7/mediarouter/res/values-iw/strings.xml b/v7/mediarouter/res/values-iw/strings.xml
index d1698a5..720a4e2 100644
--- a/v7/mediarouter/res/values-iw/strings.xml
+++ b/v7/mediarouter/res/values-iw/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"מערכת"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"מכשירים"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"לחצן הפעלת Cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"העבר אל"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"מחפש מכשירים"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"נתק"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"עצור העברה"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"סגור"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"הפעל"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"השהה"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"הרחב"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"כווץ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"לא נבחרה מדיה"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"אין מידע זמין"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"העברת מסך מתבצעת"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"העבר"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"התחבר למכשיר"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"מחפש מכשירים…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"התנתק"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"עצור העברה"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"הגדרות נתיב"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"הפעל"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"השהה"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ja/strings.xml b/v7/mediarouter/res/values-ja/strings.xml
index ea8d838..37d80b6 100644
--- a/v7/mediarouter/res/values-ja/strings.xml
+++ b/v7/mediarouter/res/values-ja/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"システム"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"端末"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"キャストアイコン"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"キャスト先"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"端末を検索しています"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"接続を解除"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"キャストを停止"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"閉じる"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"再生"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"一時停止"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折りたたむ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"メディアが選択されていません"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"情報がありません"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"画面をキャストしています"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"キャスト"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"端末に接続"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"端末を検索しています…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"接続を解除"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"キャストを停止"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ルーティング設定"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"再生"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"一時停止"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ka-rGE/strings.xml b/v7/mediarouter/res/values-ka-rGE/strings.xml
index 2182b64..b37403a 100644
--- a/v7/mediarouter/res/values-ka-rGE/strings.xml
+++ b/v7/mediarouter/res/values-ka-rGE/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"სისტემა"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"მოწყობილობები"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ტრანსლირების ღილაკი"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ტრანსლირებული"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"მიმდინარეობს მოწყობილობების მოძიება"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"კავშირის გაწყვეტა"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"ტრანსლირების შეჩერება"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"დახურვა"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"დაკვრა"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"პაუზა"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"გაშლა"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ჩაკეცვა"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"მედია არჩეული არ არის"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ინფორმაცია არ არის ხელმისაწვდომი"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"მიმდინარეობს ეკრანის გადაცემა"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"მსახიობები"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"მოწყობილობასთან დაკავშირება"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"მოწყობილობების ძიება…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"კავშირის გაწყვეტა"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"ტრანსლაციის შეჩერება"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"მარშრუტის პარამეტრები"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"დაკვრა"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"პაუზა"</string>
</resources>
diff --git a/v7/mediarouter/res/values-kk-rKZ/strings.xml b/v7/mediarouter/res/values-kk-rKZ/strings.xml
index 5c72c5f..0778828 100644
--- a/v7/mediarouter/res/values-kk-rKZ/strings.xml
+++ b/v7/mediarouter/res/values-kk-rKZ/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Жүйе"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Құрылғылар"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Трансляциялау түймесі"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Келесіге трансляциялау"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Құрылғыларды табу"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажырату"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Трансляциялауды тоқтату"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабу"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Ойнату"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Кідірту"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жаю"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жию"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ешбір тасушы таңдалмаған"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Қол жетімді ақпарат жоқ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Экранды трансляциялау"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Трансляциялау"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Құрылғыға жалғау"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Құрылғыларды іздеуде…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Ажырату"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Трансляциялауды тоқтату"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Жол параметрлері"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Ойнату"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Кідірту"</string>
</resources>
diff --git a/v7/mediarouter/res/values-km-rKH/strings.xml b/v7/mediarouter/res/values-km-rKH/strings.xml
index cdf94db..d41b47c 100644
--- a/v7/mediarouter/res/values-km-rKH/strings.xml
+++ b/v7/mediarouter/res/values-km-rKH/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"ប្រព័ន្ធ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ឧបករណ៍"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ប៊ូតុងខាស"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ខាសទៅ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ស្វែងរកឧបករណ៍"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ផ្ដាច់"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"បញ្ឈប់ការខាស"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"បិទ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ចាក់"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ផ្អាក"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ពង្រីក"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"បង្រួម"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"គ្មានការជ្រើសមេឌៀទេ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"មិនមានព័ត៌មានទេ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"កំពុងខាសអេក្រង់"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"បញ្ជូន"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"ភ្ជាប់ឧបករណ៍"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"កំពុងស្វែងរកឧបករណ៍..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"ផ្ដាច់"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"បញ្ឈប់ការខាស"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ការកំណត់ផ្លូវ"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"ចាក់"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"ផ្អាក"</string>
</resources>
diff --git a/v7/mediarouter/res/values-kn-rIN/strings.xml b/v7/mediarouter/res/values-kn-rIN/strings.xml
index 970dc41..19785c9e 100644
--- a/v7/mediarouter/res/values-kn-rIN/strings.xml
+++ b/v7/mediarouter/res/values-kn-rIN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"ಸಿಸ್ಟಂ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ಸಾಧನಗಳು"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ಬಿತ್ತರಿಸು ಬಟನ್"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ಇದಕ್ಕೆ ಬಿತ್ತರಿಸಿ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ಮುಚ್ಚು"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ಪ್ಲೇ ಮಾಡಿ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ವಿರಾಮ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ವಿಸ್ತರಿಸು"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ಸಂಕುಚಿಸು"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ಯಾವುದೇ ಮಾಧ್ಯಮ ಆಯ್ಕೆಮಾಡಲಾಗಿಲ್ಲ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ಯಾವುದೇ ಮಾಹಿತಿ ಲಭ್ಯವಿಲ್ಲ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ಪರದೆಯನ್ನು ಬಿತ್ತರಿಸಲಾಗುತ್ತಿದೆ"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"ಪಾತ್ರ"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"ಸಾಧನಕ್ಕೆ ಸಂಪರ್ಕಪಡಿಸಿ"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"ಸಾಧನಗಳನ್ನು ಹುಡುಕಲಾಗುತ್ತಿದೆ…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"ಸಂಪರ್ಕ ಕಡಿತಗೊಳಿಸು"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"ಬಿತ್ತರಿಸುವಿಕೆ ನಿಲ್ಲಿಸು"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ಮಾರ್ಗ ಸೆಟ್ಟಿಂಗ್ಗಳು"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"ಪ್ಲೇ ಮಾಡು"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"ವಿರಾಮ"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ko/strings.xml b/v7/mediarouter/res/values-ko/strings.xml
index 2b3455f..f9ee94ec 100644
--- a/v7/mediarouter/res/values-ko/strings.xml
+++ b/v7/mediarouter/res/values-ko/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"시스템"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"기기"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"전송 버튼"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"전송 대상"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"기기를 찾는 중"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"연결 해제"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"전송 중지"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"닫기"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"재생"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"일시중지"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"펼치기"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"접기"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"선택한 미디어 없음"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"정보가 없습니다."</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"화면 전송 중"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"전송"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"기기에 연결"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"기기 검색 중…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"연결 해제"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"전송 중지"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"경로 설정"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"재생"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"일시중지"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ky-rKG/strings.xml b/v7/mediarouter/res/values-ky-rKG/strings.xml
index d7409db..6565d05 100644
--- a/v7/mediarouter/res/values-ky-rKG/strings.xml
+++ b/v7/mediarouter/res/values-ky-rKG/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Түзмөктөр"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Тышкы экранга чыгаруу баскычы"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Төмөнкүгө чыгаруу"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Түзмөктөр изделүүдө"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ажыратуу"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Тышк экранга чыгарну токтотуу"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Жабуу"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Ойнотуу"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Тындыруу"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Жайып көрсөтүү"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Жыйыштыруу"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Бир да медиа файл тандалган жок"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Эч маалымат жок"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Тышкы экранга чыгарылууда"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Тандалгандар"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Түзмөккө туташуу"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Түзмөктөр изделүүдө..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Ажыратуу"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Тышк экранга чыгарну токтотуу"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Багыт жөндөөлөрү"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Ойнотуу"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Тындыруу"</string>
</resources>
diff --git a/v7/mediarouter/res/values-lo-rLA/strings.xml b/v7/mediarouter/res/values-lo-rLA/strings.xml
index a19dd69..8077770 100644
--- a/v7/mediarouter/res/values-lo-rLA/strings.xml
+++ b/v7/mediarouter/res/values-lo-rLA/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"ລະບົບ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ອຸປະກອນ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ປຸ່ມຄາສທ໌"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ຄາສທ໌ຫາ"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ກຳລັງຊອກຫາອຸປະກອນ"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ຕັດການເຊື່ອມຕໍ່"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"ຢຸດການຄາສທ໌"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ປິດ"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ຫຼິ້ນ"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ຢຸດຊົ່ວຄາວ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ຂະຫຍາຍ"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ຫຍໍ້ລົງ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ບໍ່ໄດ້ເລືອກມີເດຍໃດໄວ້"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ບໍ່ມີຂໍ້ມູນ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"ການສົ່ງພາບໜ້າຈໍ"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"ສົ່ງສັນຍານ"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"ເຊື່ອມຕໍ່ຫາອຸປະກອນ"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"ກຳລັງຊອກຫາອຸປະກອນ..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"ຕັດການເຊື່ອມຕໍ່"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"ຢຸດການສົ່ງສັນຍານ"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ການຕັ້ງຄ່າເສັ້ນທາງ"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"ຫຼິ້ນ"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"ຢຸດຊົ່ວຄາວ"</string>
</resources>
diff --git a/v7/mediarouter/res/values-lt/strings.xml b/v7/mediarouter/res/values-lt/strings.xml
index d286e0c..3e78374 100644
--- a/v7/mediarouter/res/values-lt/strings.xml
+++ b/v7/mediarouter/res/values-lt/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Įrenginiai"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Perdavimo mygtukas"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Perduoti į"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Randami įrenginiai"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atjungti"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Sustabdyti perdavimą"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Uždaryti"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Leisti"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pristabdyti"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Išskleisti"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sutraukti"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nepasirinkta jokia medija"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Informacija nepasiekiama"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Perduodamas ekranas"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Perduoti"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Prijungimas prie įrenginio"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Ieškoma įrenginių…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Atjungti"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Sustabdyti perdavimą"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Maršruto nustatymai"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Leisti"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pristabdyti"</string>
</resources>
diff --git a/v7/mediarouter/res/values-lv/strings.xml b/v7/mediarouter/res/values-lv/strings.xml
index 8f49d85..a7f30a4 100644
--- a/v7/mediarouter/res/values-lv/strings.xml
+++ b/v7/mediarouter/res/values-lv/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistēma"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Ierīces"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Apraides poga"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Apraidīšana uz ierīci"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Notiek ierīču meklēšana"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Atvienot"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Pārtraukt apraidi"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Aizvērt"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Atskaņot"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Apturēt"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Izvērst"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Sakļaut"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nav atlasīti multivides faili"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nav pieejama informācija"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Notiek ekrāna apraide"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Apraidīt"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Savienojuma izveide ar ierīci"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Notiek ierīču meklēšana..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Atvienot"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Pārtraukt apraidi"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Maršruta iestatījumi"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Atskaņot"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Apturēt"</string>
</resources>
diff --git a/v7/mediarouter/res/values-mk-rMK/strings.xml b/v7/mediarouter/res/values-mk-rMK/strings.xml
index e8ff3e7..47df5bc 100644
--- a/v7/mediarouter/res/values-mk-rMK/strings.xml
+++ b/v7/mediarouter/res/values-mk-rMK/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Уреди"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Копчето за Cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Емитувај на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Наоѓање уреди"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Исклучи"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Запри го емитувањето"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Репродуцирај"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Собери"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Не се избрани медиуми"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нема достапни информации"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Екранот се емитува"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Емитувај"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Поврзи се со уредот"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Се пребаруваат уреди..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Исклучи се"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Запри префрлување"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Поставки на маршрутата"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Репродуцирај"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Пауза"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ml-rIN/strings.xml b/v7/mediarouter/res/values-ml-rIN/strings.xml
index 7dbdf5d..93192b6 100644
--- a/v7/mediarouter/res/values-ml-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ml-rIN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"സിസ്റ്റം"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"ഉപകരണങ്ങൾ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ടാപ്പുചെയ്യുക"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"ഇതിലേക്ക് കാസ്റ്റുചെയ്യുക"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"ഉപകരണങ്ങൾ കണ്ടെത്തുന്നു"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"വിച്ഛേദിക്കുക"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"അടയ്ക്കുക"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"പ്ലേ ചെയ്യുക"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"തൽക്കാലം നിർത്തൂ"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"വികസിപ്പിക്കുക"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ചുരുക്കുക"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"മീഡിയയൊന്നും തിരഞ്ഞെടുത്തിട്ടില്ല"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"വിവരങ്ങളൊന്നും ലഭ്യമല്ല"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"സ്ക്രീൻ കാസ്റ്റുചെയ്യുന്നു"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"കാസ്റ്റുചെയ്യുക"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"ഉപകരണത്തിലേക്ക് കണക്റ്റുചെയ്യുക"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"ഉപകരണങ്ങൾക്കായി തിരയുന്നു…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"വിച്ഛേദിക്കുക"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"കാസ്റ്റുചെയ്യൽ നിർത്തുക"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"റൂട്ട് ക്രമീകരണം"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"പ്ലേ ചെയ്യുക"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"താൽക്കാലികമായി നിർത്തുക"</string>
</resources>
diff --git a/v7/mediarouter/res/values-mn-rMN/strings.xml b/v7/mediarouter/res/values-mn-rMN/strings.xml
index db6d599..e14eb50 100644
--- a/v7/mediarouter/res/values-mn-rMN/strings.xml
+++ b/v7/mediarouter/res/values-mn-rMN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Төхөөрөмжүүд"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Дамжуулах товчлуур"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Дамжуулах"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Төхөөрөмж хайж байна"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Салгах"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Дамжуулахыг зогсоох"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Хаах"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Тоглуулах"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Түр зогсоох"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Дэлгэх"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Хураах"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ямар ч медиа сонгоогүй"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Мэдээлэл байхгүй байна"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Дэлгэцийг дамжуулж байна"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Дамжуулах"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Төхөөрөмжтэй холбох"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Төхөөрөмжүүдийг хайж байна…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Салгах"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Нэвтрүүлэхийг зогсоох"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Маршрут тохиргоо"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Тоглуулах"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Түр зогсоох"</string>
</resources>
diff --git a/v7/mediarouter/res/values-mr-rIN/strings.xml b/v7/mediarouter/res/values-mr-rIN/strings.xml
index b3f9264..8313f5a 100644
--- a/v7/mediarouter/res/values-mr-rIN/strings.xml
+++ b/v7/mediarouter/res/values-mr-rIN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"सिस्टम"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"डिव्हाइसेस"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"कास्ट बटण"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"यावर कास्ट करा"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"डिव्हाइसेस शोधत आहे"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"डिस्कनेक्ट करा"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"कास्ट करणे थांबवा"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बंद करा"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"प्ले करा"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"विराम"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तृत करा"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संकुचित करा"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"मीडिया निवडला नाही"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"कोणतीही माहिती उपलब्ध नाही"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रीन कास्ट करीत आहे"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट करा"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"डिव्हाइसला कनेक्ट करा"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"डिव्हाइसेस शोधत आहे…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"डिस्कनेक्ट करा"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"कास्ट करणे थांबवा"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिंग्ज"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"प्ले करा"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"विराम द्या"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ms-rMY/strings.xml b/v7/mediarouter/res/values-ms-rMY/strings.xml
index 4d7a0c8..23371d3 100644
--- a/v7/mediarouter/res/values-ms-rMY/strings.xml
+++ b/v7/mediarouter/res/values-ms-rMY/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Peranti"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butang Hantar"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Hantar ke"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Mencari peranti"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Putuskan sambungan"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Berhenti menghantar"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Tutup"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Main"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Jeda"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Kembangkan"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Runtuhkan"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Tiada media dipilih"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Maklumat tidak tersedia"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Menghantar skrin"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Barisan pelakon"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Sambung kepada peranti"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Mencari peranti..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Putuskan sambungan"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Berhenti menghantar"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Tetapan laluan"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Main"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Jeda"</string>
</resources>
diff --git a/v7/mediarouter/res/values-my-rMM/strings.xml b/v7/mediarouter/res/values-my-rMM/strings.xml
index 9447089..d8efc8a 100644
--- a/v7/mediarouter/res/values-my-rMM/strings.xml
+++ b/v7/mediarouter/res/values-my-rMM/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"စနစ်"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"စက်ပစ္စည်းများ"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ကာစ်တ်လုပ်ရန် ခလုတ်"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"သို့ ကာစ်တ်လုပ်ရန်"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"စက်ပစ္စည်းများ ရှာဖွေခြင်း"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ဆက်သွယ်မှု ဖြတ်ရန်"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"ကာစ်တ်လုပ်ခြင်း ရပ်တန့်ရန်"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ပိတ်ရန်"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ဖွင့်ရန်"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"ခဏရပ်ရန်"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ဖြန့်ချရန်၃"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ခေါက်သိမ်းရန်..."</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"မည်သည့်မီဒီမှ မရွေးချယ်ထားပါ"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"အချက်အလက် မရရှိနိုင်ပါ"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"တည်းဖြတ်ရေး မျက်နှာပြင်"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"သရုပ်ဆောင်များ"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"စက်တစ်ခုကို ချိတ်ဆက်ပါ"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"စက်ပစ္စည်းများကို ရှာဖွေနေပါသည်"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"ချိတ်ဆက်ခြင်းရပ်တန့်ရန်"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"ပုံစံသွင်းမှု ရပ်ရန်"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"လမ်းကြောင်း အပြင်အဆင်များ"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"ဖွင့်ရန်"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"ခဏရပ်ရန်"</string>
</resources>
diff --git a/v7/mediarouter/res/values-nb/strings.xml b/v7/mediarouter/res/values-nb/strings.xml
index aea341f..f806229 100644
--- a/v7/mediarouter/res/values-nb/strings.xml
+++ b/v7/mediarouter/res/values-nb/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-ikonet"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Cast til"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Finner enheter"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koble fra"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Stopp castingen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Lukk"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spill av"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sett på pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utvid"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Skjul"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Du har ikke valgt noen medier"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Ingen informasjon er tilgjengelig"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Caster skjermen"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Koble til enheten"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Søker etter enheter …"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Koble fra"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Stopp castingen"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ruteinnstillinger"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Spill av"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Sett på pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ne-rNP/strings.xml b/v7/mediarouter/res/values-ne-rNP/strings.xml
index d261553..237279c 100644
--- a/v7/mediarouter/res/values-ne-rNP/strings.xml
+++ b/v7/mediarouter/res/values-ne-rNP/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"प्रणाली"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"उपकरणहरू"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast बटन"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"यसमा Cast गर्नुहोस्"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"यन्त्रहरू पत्ता लगाउँदै"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"विच्छेद गर्नुहोस्"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"casting रोक्नुहोस्"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"बन्द गर्नुहोस्"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"बजाउनुहोस्"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"रोक्नुहोस्"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"विस्तार गर्नुहोस्"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"संक्षिप्त पार्नुहोस्"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"कुनै मिडिया चयन भएको छैन"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"जानकारी उपलब्ध छैन"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"स्क्रिन cast गर्दै"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"कास्ट"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"उपकरणसँग जडान गर्नुहोस्"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"उपकरणहरूका लागि खोजी गरिँदै..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"विच्छेदन गर्नुहोस्"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"कास्टिंग रोक्नुहोस्"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"मार्ग सेटिङ"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"बजाउनुहोस्"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"रोक्नुहोस्"</string>
</resources>
diff --git a/v7/mediarouter/res/values-nl/strings.xml b/v7/mediarouter/res/values-nl/strings.xml
index 7843b52..22323b1 100644
--- a/v7/mediarouter/res/values-nl/strings.xml
+++ b/v7/mediarouter/res/values-nl/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Systeem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Apparaten"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-icoon"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Casten naar"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Apparaten zoeken"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Loskoppelen"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Casten stoppen"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Sluiten"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Afspelen"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Onderbreken"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Uitvouwen"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Samenvouwen"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Geen media geselecteerd"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Geen informatie beschikbaar"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Scherm casten"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Casten"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Verbinding maken met apparaat"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Zoeken naar apparaten…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Verbinding verbreken"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Casten stoppen"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Route-instellingen"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Afspelen"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Onderbreken"</string>
</resources>
diff --git a/v7/mediarouter/res/values-pl/strings.xml b/v7/mediarouter/res/values-pl/strings.xml
index c6e7f8a..fbcb7e1 100644
--- a/v7/mediarouter/res/values-pl/strings.xml
+++ b/v7/mediarouter/res/values-pl/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Urządzenia"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Przycisk Cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Przesyłaj na"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Znajdowanie urządzeń"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odłącz"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Zatrzymaj przesyłanie"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zamknij"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Odtwórz"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Wstrzymaj"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozwiń"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zwiń"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie wybrano multimediów"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Brak informacji"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Przesyłam ekran"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Przesyłaj"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Połącz z urządzeniem"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Szukam urządzeń…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Rozłącz"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Zakończ przesyłanie"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Ustawienia trasy"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Odtwórz"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Wstrzymaj"</string>
</resources>
diff --git a/v7/mediarouter/res/values-pt-rBR/strings.xml b/v7/mediarouter/res/values-pt-rBR/strings.xml
deleted file mode 100644
index 17e64f0..0000000
--- a/v7/mediarouter/res/values-pt-rBR/strings.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Copyright (C) 2013 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<resources xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
- <string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
-</resources>
diff --git a/v7/mediarouter/res/values-pt-rPT/strings.xml b/v7/mediarouter/res/values-pt-rPT/strings.xml
index 3c9d4cb..7982b3c 100644
--- a/v7/mediarouter/res/values-pt-rPT/strings.xml
+++ b/v7/mediarouter/res/values-pt-rPT/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"A localizar dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desassociar"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper a transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Interromper"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Reduzir"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhum suporte multimédia selecionado"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"A transmitir o ecrã"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Ligar ao dispositivo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"A pesquisar dispositivos…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Desassociar"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Parar a transmissão"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Definições de trajeto"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Colocar em pausa"</string>
</resources>
diff --git a/v7/mediarouter/res/values-pt/strings.xml b/v7/mediarouter/res/values-pt/strings.xml
index 17e64f0..12a954a 100644
--- a/v7/mediarouter/res/values-pt/strings.xml
+++ b/v7/mediarouter/res/values-pt/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistema"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispositivos"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Botão Transmitir"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Transmitir para"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Localizando dispositivos"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Desconectar"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Interromper transmissão"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Fechar"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Reproduzir"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausar"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Expandir"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Recolher"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nenhuma mídia selecionada"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nenhuma informação disponível"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Transmitindo a tela"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Transmitir"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Conectar ao dispositivo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Procurando dispositivos…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Desconectar"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Interromper transmissão"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Configurações de rota"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Reproduzir"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausar"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ro/strings.xml b/v7/mediarouter/res/values-ro/strings.xml
index 20c3b71..6e8bb4c 100644
--- a/v7/mediarouter/res/values-ro/strings.xml
+++ b/v7/mediarouter/res/values-ro/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Dispozitive"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Butonul de proiecție"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Proiectați pe"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Se caută dispozitive"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Deconectați-vă"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Opriți proiecția"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Închideți"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Redați"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Întrerupeți"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Extindeți"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Restrângeți"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Niciun fișier media selectat"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nu sunt disponibile informații"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Se proiectează ecranul"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Trimiteți"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Conectați-vă la dispozitiv"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Se caută dispozitive..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Deconectați-vă"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Nu mai proiectați"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Setări pentru traseu"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Redați"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Întrerupeți"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ru/strings.xml b/v7/mediarouter/res/values-ru/strings.xml
index 5a47ec6..0b9d7a7 100644
--- a/v7/mediarouter/res/values-ru/strings.xml
+++ b/v7/mediarouter/res/values-ru/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Устройства"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляции"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Выберите устройство"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Поиск устройств…"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Отключить"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Остановить трансляцию"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрыть"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Воспроизвести"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Приостановить"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Развернуть"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Свернуть"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медиафайл не выбран"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Данных нет"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Подключение к удаленному монитору"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Транслировать."</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Подключение к устройству"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Поиск устройств…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Отключить"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Остановить трансляцию"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Настройки передачи файлов"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Воспроизвести."</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Приостановить."</string>
</resources>
diff --git a/v7/mediarouter/res/values-si-rLK/strings.xml b/v7/mediarouter/res/values-si-rLK/strings.xml
index 45f67ff..6db6506 100644
--- a/v7/mediarouter/res/values-si-rLK/strings.xml
+++ b/v7/mediarouter/res/values-si-rLK/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"පද්ධතිය"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"උපාංග"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"විකාශ බොත්තම"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"විකාශය"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"උපාංග සෙවීම"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"විසන්ධි කරන්න"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"විකාශ කිරීම නවත්වන්න"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"වසන්න"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ධාවනය කරන්න"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"විරාම ගන්වන්න"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"දිග හරින්න"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"හකුළන්න"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"මාධ්යය තෝරා නැත"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ලබා ගත හැකි තොරතුරු නොමැත"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"විකාශ තිරය"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"උපාංගයට සම්බන්ධ වන්න"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"උපාංග සඳහා සොයමින්…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"විසන්ධි කරන්න"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"කාස්ට් කිරීම නවත්වන්න"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"ගමන් මගේ සැකසීම්"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"ධාවනය කරන්න"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"විරාමය"</string>
</resources>
diff --git a/v7/mediarouter/res/values-sk/strings.xml b/v7/mediarouter/res/values-sk/strings.xml
index df95e00..e6a02ac 100644
--- a/v7/mediarouter/res/values-sk/strings.xml
+++ b/v7/mediarouter/res/values-sk/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Systém"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Zariadenia"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Tlačidlo prenosu"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Prenos do"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Vyhľadávanie zariadení"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Odpojiť"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Zastaviť prenos"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zavrieť"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Prehrať"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pozastaviť"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Rozbaliť"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Zbaliť"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Nie sú vybrané žiadne médiá"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Nie sú k dispozícii žiadne informácie"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Prenáša sa obrazovka"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Preniesť"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Pripojenie k zariadeniu"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Prebieha vyhľadávanie zariadení…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Odpojiť"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Zastaviť prenášanie"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavenia trasy"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Prehrať"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pozastaviť"</string>
</resources>
diff --git a/v7/mediarouter/res/values-sl/strings.xml b/v7/mediarouter/res/values-sl/strings.xml
index 6425222..8b02d5d 100644
--- a/v7/mediarouter/res/values-sl/strings.xml
+++ b/v7/mediarouter/res/values-sl/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Naprave"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Gumb za predvajanje"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Predvajanje prek:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Iskanje naprav"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Prekini povezavo"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Ustavi predvajanje"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Zapri"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Predvajanje"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Zaustavi"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Razširi"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Strni"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ni izbrane predstavnosti"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Podatki niso na voljo"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Predvajanje zaslona"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Predvajanje"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Povezovanje z napravo"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Iskanje naprav …"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Prekini povezavo"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Ustavi predvajanje"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Nastavitve poti"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Predvajaj"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Zaustavi"</string>
</resources>
diff --git a/v7/mediarouter/res/values-sr/strings.xml b/v7/mediarouter/res/values-sr/strings.xml
index 26a36a9..9bca659 100644
--- a/v7/mediarouter/res/values-sr/strings.xml
+++ b/v7/mediarouter/res/values-sr/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Систем"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Уређаји"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Дугме Пребаци"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Пребацујте на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Проналажење уређаја"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Прекини везу"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Заустави пребацивање"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Затвори"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Пусти"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Паузирај"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Прошири"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Скупи"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Нема изабраних медија"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Нису доступне никакве информације"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Пребацује се екран"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Пребацуј"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Повежите са уређајем"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Претраживање уређаја…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Прекини везу"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Заустави пребацивање"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Подешавања путање"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Пусти"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Паузирај"</string>
</resources>
diff --git a/v7/mediarouter/res/values-sv/strings.xml b/v7/mediarouter/res/values-sv/strings.xml
index 3e8c47b..e802f47 100644
--- a/v7/mediarouter/res/values-sv/strings.xml
+++ b/v7/mediarouter/res/values-sv/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Enheter"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Cast-knappen"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Casta till"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Letar efter enheter"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Koppla från"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Sluta casta"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Stäng"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Spela upp"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Pausa"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Utöka"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Komprimera"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Inga media har valts"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Det finns ingen information"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Skärmen castas"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Casta"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Anslut till enhet"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Söker efter enheter ..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Koppla från"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Sluta casta"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Inställningar för omdirigering"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Spela upp"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Pausa"</string>
</resources>
diff --git a/v7/mediarouter/res/values-sw/strings.xml b/v7/mediarouter/res/values-sw/strings.xml
index 38fdb45..5f2c5b7 100644
--- a/v7/mediarouter/res/values-sw/strings.xml
+++ b/v7/mediarouter/res/values-sw/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Mfumo"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Vifaa"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Kitufe cha kutuma"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Tuma kwenye"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Inatafuta vifaa"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ondoa"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Acha kutuma"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Funga"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Cheza"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Sitisha"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Panua"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Kunja"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Hakuna maudhui yaliyochaguliwa"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hakuna maelezo yaliyopatikana"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Inatuma skrini"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Tuma"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Unganisha kwenye kifaa"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Inatafuta vifaa..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Tenganisha"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Acha kutuma"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Mipangilio ya njia"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Google Play"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Sitisha"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ta-rIN/strings.xml b/v7/mediarouter/res/values-ta-rIN/strings.xml
index 6147b75..2496d80 100644
--- a/v7/mediarouter/res/values-ta-rIN/strings.xml
+++ b/v7/mediarouter/res/values-ta-rIN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"அமைப்பு"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"சாதனங்கள்"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"அனுப்புதல் பொத்தான்"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"இதற்கு அனுப்பு"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"சாதனங்களைத் தேடுகிறது"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"தொடர்பைத் துண்டி"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"அனுப்புவதை நிறுத்து"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"மூடும்"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"இயக்கும்"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"இடைநிறுத்தும்"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"விரிவாக்கு"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"சுருக்கு"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"மீடியா எதுவும் தேர்ந்தெடுக்கப்படவில்லை"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"தகவல் எதுவுமில்லை"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"திரையை அனுப்புகிறீர்கள்"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"அனுப்பு"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"சாதனத்துடன் இணைக்கவும்"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"சாதனங்களைத் தேடுகிறது..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"துண்டி"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"அனுப்புவதை நிறுத்து"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"வழி அமைப்புகள்"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"இயக்கு"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"இடைநிறுத்து"</string>
</resources>
diff --git a/v7/mediarouter/res/values-te-rIN/strings.xml b/v7/mediarouter/res/values-te-rIN/strings.xml
index 73c75f4..897fa1e 100644
--- a/v7/mediarouter/res/values-te-rIN/strings.xml
+++ b/v7/mediarouter/res/values-te-rIN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"సిస్టమ్"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"పరికరాలు"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ప్రసారం చేయి బటన్"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"దీనికి ప్రసారం చేయండి"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"పరికరాలను కనుగొంటోంది"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"డిస్కనెక్ట్ చేయి"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"ప్రసారాన్ని ఆపివేయి"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"మూసివేస్తుంది"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"ప్లే చేస్తుంది"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"పాజ్ చేస్తుంది"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"విస్తరింపజేస్తుంది"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"కుదిస్తుంది"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"మీడియా ఏదీ ఎంచుకోబడలేదు"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"సమాచారం అందుబాటులో లేదు"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"స్క్రీన్ను ప్రసారం చేస్తోంది"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"ప్రసారం చేయండి"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"పరికరానికి కనెక్ట్ చేయండి"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"పరికరాల కోసం శోధిస్తోంది…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"డిస్కనెక్ట్ చేయి"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"ప్రసారాన్ని ఆపివేయి"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"మార్గ సెట్టింగ్లు"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"ప్లే చేయి"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"పాజ్ చేయి"</string>
</resources>
diff --git a/v7/mediarouter/res/values-th/strings.xml b/v7/mediarouter/res/values-th/strings.xml
index fdf0957..7fed923 100644
--- a/v7/mediarouter/res/values-th/strings.xml
+++ b/v7/mediarouter/res/values-th/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"ระบบ"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"อุปกรณ์"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"ปุ่ม \"แคสต์\""</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"แคสต์ไปยัง"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"กำลังค้นหาอุปกรณ์"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"ยกเลิกการเชื่อมต่อ"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"หยุดการแคสต์"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"ปิด"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"เล่น"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"หยุดชั่วคราว"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"ขยาย"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"ยุบ"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"ไม่ได้เลือกสื่อไว้"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"ไม่มีข้อมูล"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"กำลังแคสต์หน้าจอ"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"ส่ง"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"เชื่อมต่อกับอุปกรณ์"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"กำลังค้นหาอุปกรณ์…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"ยกเลิกการเชื่อมต่อ"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"หยุดการส่ง"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"การตั้งค่าเส้นทาง"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"เล่น"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"หยุดชั่วคราว"</string>
</resources>
diff --git a/v7/mediarouter/res/values-tl/strings.xml b/v7/mediarouter/res/values-tl/strings.xml
index 7c04b33..b22031a 100644
--- a/v7/mediarouter/res/values-tl/strings.xml
+++ b/v7/mediarouter/res/values-tl/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"System"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Mga Device"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Button na I-cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"I-cast sa"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Naghahanap ng mga device"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Idiskonekta"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Itigil ang pagca-cast"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Isara"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"I-play"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"I-pause"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Palawakin"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"I-collapse"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Walang piniling media"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Walang available na impormasyon"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Kina-cast ang screen"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"I-cast"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Kumonekta sa device"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Naghahanap ng mga device…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Idiskonekta"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Itigil ang pagca-cast"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Mga setting ng ruta"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"I-play"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"I-pause"</string>
</resources>
diff --git a/v7/mediarouter/res/values-tr/strings.xml b/v7/mediarouter/res/values-tr/strings.xml
index f8316f4..dad9c60 100644
--- a/v7/mediarouter/res/values-tr/strings.xml
+++ b/v7/mediarouter/res/values-tr/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Sistem"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Cihazlar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Yayın düğmesi"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Şuraya yayınla:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Cihazlar bulunuyor"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Bağlantıyı kes"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Yayını durdur"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Kapat"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Oynat"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Duraklat"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Genişlet"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Daralt"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Medya seçilmedi"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Bilgi yok"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekran yayınlanıyor"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Yayınla"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Cihaza bağlanın"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Cihaz arayın…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Bağlantıyı kes"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Yayını durdur"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Rota ayarları"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Oynat"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Duraklat"</string>
</resources>
diff --git a/v7/mediarouter/res/values-uk/strings.xml b/v7/mediarouter/res/values-uk/strings.xml
index fd4e0d0..9daaf87 100644
--- a/v7/mediarouter/res/values-uk/strings.xml
+++ b/v7/mediarouter/res/values-uk/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Система"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Пристрої"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Кнопка трансляції"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Транслювати на"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Пошук пристроїв"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Відключити"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Припинити трансляцію"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Закрити"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Відтворити"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Призупинити"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Розгорнути"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Згорнути"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Медіа-файл не вибрано"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Немає даних"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Трансляція екрана"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Транслювати"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Під’єднатися до пристрою"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Пошук пристроїв…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Від’єднатися"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Зупинити трансляцію"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Налаштування маршруту"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Відтворити"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Призупинити"</string>
</resources>
diff --git a/v7/mediarouter/res/values-ur-rPK/strings.xml b/v7/mediarouter/res/values-ur-rPK/strings.xml
index afd5534..fd2cbb7 100644
--- a/v7/mediarouter/res/values-ur-rPK/strings.xml
+++ b/v7/mediarouter/res/values-ur-rPK/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"سسٹم"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"آلات"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"کاسٹ کرنے کا بٹن"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"اس میں کاسٹ کریں"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"آلات تلاش ہو رہے ہیں"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"غیر منسلک کریں"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"کاسٹ کرنا بند کریں"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"بند کریں"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"چلائیں"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"موقوف کریں"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"پھیلائیں"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"سکیڑیں"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"کوئی میڈیا منتخب نہیں ہے"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"کوئی معلومات دستیاب نہیں"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"سکرین کاسٹ ہو رہی ہے"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"کاسٹ کریں"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"آلہ سے مربوط ہوں"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"آلات تلاش کر رہا ہے…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"غیر مربوط کریں"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"کاسٹ کرنا بند کریں"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"روٹ کی ترتیبات"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"چلائیں"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"موقوف کریں"</string>
</resources>
diff --git a/v7/mediarouter/res/values-uz-rUZ/strings.xml b/v7/mediarouter/res/values-uz-rUZ/strings.xml
index c13b06b..6c364d5 100644
--- a/v7/mediarouter/res/values-uz-rUZ/strings.xml
+++ b/v7/mediarouter/res/values-uz-rUZ/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Tizim"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Qurilmalar"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Translatsiya tugmasi"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Quyidagiga translatsiya qilish:"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Qurilmalarni topish"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ulanishni uzish"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Translatsiyani to‘xtatish"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Yopish"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Boshlash"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"To‘xtatib turish"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Yoyish"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Yig‘ish"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Multimedia tanlamagan"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Hech qanday ma’lumot yo‘q"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Ekranni translatsiya qilish"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Translatsiya qilish"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Qurilmaga ulanish"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Qurilmalar izlanmoqda…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Uzish"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Translatsiyani to‘xtatish"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Yo‘naltirish sozlamalari"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Ijro qilish"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"To‘xtatib turish"</string>
</resources>
diff --git a/v7/mediarouter/res/values-vi/strings.xml b/v7/mediarouter/res/values-vi/strings.xml
index 3301cee..0a53da0 100644
--- a/v7/mediarouter/res/values-vi/strings.xml
+++ b/v7/mediarouter/res/values-vi/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Hệ thống"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Thiết bị"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Nút truyền"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Truyền tới"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Tìm thiết bị"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Ngắt kết nối"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Dừng truyền"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Đóng"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Phát"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Tạm dừng"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Mở rộng"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Thu gọn"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Không có phương tiện nào được chọn"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Không có thông tin nào"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Đang truyền màn hình"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Truyền"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Kết nối với thiết bị"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Đang tìm kiếm thiết bị…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Ngắt kết nối"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Ngừng truyền"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Cài đặt tuyến đường"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Phát"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Tạm dừng"</string>
</resources>
diff --git a/v7/mediarouter/res/values-zh-rCN/strings.xml b/v7/mediarouter/res/values-zh-rCN/strings.xml
index cdd66f53..e9b04d7 100644
--- a/v7/mediarouter/res/values-zh-rCN/strings.xml
+++ b/v7/mediarouter/res/values-zh-rCN/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"系统"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"设备"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投射按钮"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投射到"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在查找设备"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"断开连接"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"停止投射"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"关闭"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暂停"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展开"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"折叠"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未选择任何媒体"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"没有任何相关信息"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投射屏幕"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"投射"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"连接到设备"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜索设备…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"断开连接"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"停止投射"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由设置"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"暂停"</string>
</resources>
diff --git a/v7/mediarouter/res/values-zh-rHK/strings.xml b/v7/mediarouter/res/values-zh-rHK/strings.xml
index 873e5ce..66d2f55 100644
--- a/v7/mediarouter/res/values-zh-rHK/strings.xml
+++ b/v7/mediarouter/res/values-zh-rHK/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投放至"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"停止投放"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"尚未選擇媒體"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有詳細資料"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"投放"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"停止投放"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由設定"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"暫停"</string>
</resources>
diff --git a/v7/mediarouter/res/values-zh-rTW/strings.xml b/v7/mediarouter/res/values-zh-rTW/strings.xml
index 27755e7..a6fa252 100644
--- a/v7/mediarouter/res/values-zh-rTW/strings.xml
+++ b/v7/mediarouter/res/values-zh-rTW/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"系統"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"裝置"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"投放按鈕"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"投放到"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"正在尋找裝置"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"中斷連線"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"停止投放"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"關閉"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"播放"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"暫停"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"展開"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"收合"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"未選取任何媒體"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"沒有可用的資訊"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"正在投放螢幕"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"投放"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"連線至裝置"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"正在搜尋裝置..."</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"中斷連線"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"停止投放"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"路由設定"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"播放"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"暫停"</string>
</resources>
diff --git a/v7/mediarouter/res/values-zu/strings.xml b/v7/mediarouter/res/values-zu/strings.xml
index f513fd4..78f415d 100644
--- a/v7/mediarouter/res/values-zu/strings.xml
+++ b/v7/mediarouter/res/values-zu/strings.xml
@@ -18,17 +18,12 @@
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="mr_system_route_name" msgid="5441529851481176817">"Isistimu"</string>
<string name="mr_user_route_category_name" msgid="7498112907524977311">"Amadivayisi"</string>
- <string name="mr_button_content_description" msgid="3698378085901466129">"Inkinobho ye-Cast"</string>
- <string name="mr_chooser_title" msgid="414301941546135990">"Sakaza ku-"</string>
- <string name="mr_chooser_searching" msgid="6349900579507521956">"Ithola amadivayisi"</string>
- <string name="mr_controller_disconnect" msgid="1227264889412989580">"Nqamula"</string>
- <string name="mr_controller_stop" msgid="4570331844078181931">"Misa ukusakaza"</string>
- <string name="mr_controller_close_description" msgid="7333862312480583260">"Vala"</string>
- <string name="mr_controller_play" msgid="683634565969987458">"Dlala"</string>
- <string name="mr_controller_pause" msgid="5451884435510905406">"Misa isikhashana"</string>
- <string name="mr_controller_expand_group" msgid="8062427022744266907">"Nweba"</string>
- <string name="mr_controller_collapse_group" msgid="7924809056904240926">"Goqa"</string>
- <string name="mr_controller_no_media_selected" msgid="6547130360349182381">"Ayikho imidiya ekhethiwe"</string>
- <string name="mr_controller_no_info_available" msgid="5585418471741142924">"Alukho ulwazi olutholakalayo"</string>
- <string name="mr_controller_casting_screen" msgid="4868457957151124867">"Isikrini sokusakaza"</string>
+ <string name="mr_button_content_description" msgid="8327680881775995150">"Abalingisi"</string>
+ <string name="mr_chooser_title" msgid="7106830097177242655">"Xhumeka kudivayisi"</string>
+ <string name="mr_chooser_searching" msgid="7553005460920830010">"Iseshela amadivayisi…"</string>
+ <string name="mr_controller_disconnect" msgid="109793632378378069">"Nqamula"</string>
+ <string name="mr_controller_stop" msgid="5398645111664294430">"Misa ukusakaza"</string>
+ <string name="mr_media_route_controller_settings_description" msgid="379358765881274425">"Izilungiselelo zomzila"</string>
+ <string name="mr_controller_play" msgid="5214423499524760404">"Dlala"</string>
+ <string name="mr_controller_pause" msgid="8315773974194466049">"Misa isikhashana"</string>
</resources>
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java
index 9fdd56c..c44e8d2 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteButton.java
@@ -120,7 +120,8 @@
}
public MediaRouteButton(Context context, AttributeSet attrs, int defStyleAttr) {
- super(MediaRouterThemeHelper.createThemedContext(context), attrs, defStyleAttr);
+ super(MediaRouterThemeHelper.createThemedContext(context, defStyleAttr), attrs,
+ defStyleAttr);
context = getContext();
mRouter = MediaRouter.getInstance(context);
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
index 9beb8d9..5856f38 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteChooserDialog.java
@@ -28,7 +28,6 @@
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
-import android.support.v7.media.MediaControlIntent;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.support.v7.mediarouter.R;
@@ -65,9 +64,6 @@
public class MediaRouteChooserDialog extends Dialog {
private static final String TAG = "MediaRouteChooserDialog";
- // Should match to SystemMediaRouteProvider.PACKAGE_NAME.
- static final String SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME = "android";
-
private final MediaRouter mRouter;
private final MediaRouterCallback mCallback;
@@ -82,7 +78,7 @@
}
public MediaRouteChooserDialog(Context context, int theme) {
- super(MediaRouterThemeHelper.createThemedContext(context), theme);
+ super(MediaRouterThemeHelper.createThemedContext(context, theme), theme);
context = getContext();
mRouter = MediaRouter.getInstance(context);
@@ -322,7 +318,7 @@
// Only speakers can be grouped for now.
return mSpeakerGroupIcon;
}
- if (isSystemLiveAudioOnlyRoute(route)) {
+ if (route.isDeviceTypeBluetooth()) {
return mBluetoothIcon;
}
return mDefaultIcon;
@@ -365,11 +361,16 @@
@Override
public int compare(MediaRouter.RouteInfo lhs, MediaRouter.RouteInfo rhs) {
- if (isSystemLiveAudioOnlyRoute(lhs)) {
- if (!isSystemLiveAudioOnlyRoute(rhs)) {
+ if (lhs == null) {
+ return rhs == null ? 0 : -1;
+ } else if (rhs == null) {
+ return 1;
+ }
+ if (lhs.isDeviceTypeBluetooth()) {
+ if (!rhs.isDeviceTypeBluetooth()) {
return 1;
}
- } else if (isSystemLiveAudioOnlyRoute(rhs)) {
+ } else if (rhs.isDeviceTypeBluetooth()) {
return -1;
}
Float lhsUsageScore = sRouteUsageScoreMap.get(lhs.getId());
@@ -430,17 +431,4 @@
prefEditor.commit();
}
}
-
- // Used to determine whether the route represents a bluetooth device.
- // TODO: Find a better way to precisely detect bluetooth routes.
- private static boolean isSystemLiveAudioOnlyRoute(MediaRouter.RouteInfo route) {
- return isSystemMediaRouteProvider(route)
- && route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
- && !route.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
- }
-
- private static boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
- return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
- SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
- }
}
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
index e5988ad..1f375a0 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteControllerDialog.java
@@ -16,8 +16,7 @@
package android.support.v7.app;
-import static android.widget.SeekBar.OnSeekBarChangeListener;
-
+import android.app.PendingIntent;
import android.content.ContentResolver;
import android.content.Context;
import android.content.res.Resources;
@@ -36,7 +35,6 @@
import android.support.v4.media.session.PlaybackStateCompat;
import android.support.v4.view.accessibility.AccessibilityEventCompat;
import android.support.v7.graphics.Palette;
-import android.support.v7.media.MediaControlIntent;
import android.support.v7.media.MediaRouteSelector;
import android.support.v7.media.MediaRouter;
import android.support.v7.mediarouter.R;
@@ -65,7 +63,9 @@
import java.io.BufferedInputStream;
import java.io.IOException;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
/**
* This class implements the route controller dialog for {@link MediaRouter}.
@@ -82,9 +82,7 @@
// Time to wait before updating the volume when the user lets go of the seek bar
// to allow the route provider time to propagate the change and publish a new
// route descriptor.
- private static final int VOLUME_UPDATE_DELAY_MILLIS = 250;
- private static final int VOLUME_SLIDER_TAG_MASTER = 0;
- private static final int VOLUME_SLIDER_TAG_GROUP_BASE = 100;
+ private static final int VOLUME_UPDATE_DELAY_MILLIS = 500;
private static final int BUTTON_NEUTRAL_RES_ID = android.R.id.button3;
private static final int BUTTON_DISCONNECT_RES_ID = android.R.id.button2;
@@ -120,18 +118,19 @@
private boolean mVolumeControlEnabled = true;
// Layout for media controllers including play/pause button and the main volume slider.
private LinearLayout mMediaMainControlLayout;
- private RelativeLayout mPlaybackControl;
- private LinearLayout mVolumeControl;
+ private RelativeLayout mPlaybackControlLayout;
+ private LinearLayout mVolumeControlLayout;
private View mDividerView;
private ListView mVolumeGroupList;
private SeekBar mVolumeSlider;
private VolumeChangeListener mVolumeChangeListener;
- private boolean mVolumeSliderTouched;
+ private MediaRouter.RouteInfo mRouteInVolumeSliderTouched;
private int mVolumeGroupListItemIconSize;
private int mVolumeGroupListItemHeight;
private int mVolumeGroupListMaxHeight;
private final int mVolumeGroupListPaddingTop;
+ private Map<MediaRouter.RouteInfo, SeekBar> mVolumeSliderMap;
private MediaControllerCompat mMediaController;
private MediaControllerCallback mControllerCallback;
@@ -152,18 +151,18 @@
}
public MediaRouteControllerDialog(Context context, int theme) {
- super(MediaRouterThemeHelper.createThemedContext(context), theme);
+ super(MediaRouterThemeHelper.createThemedContext(context, theme), theme);
mContext = getContext();
mControllerCallback = new MediaControllerCallback();
- mRouter = MediaRouter.getInstance(context);
+ mRouter = MediaRouter.getInstance(mContext);
mCallback = new MediaRouterCallback();
mRoute = mRouter.getSelectedRoute();
setMediaSession(mRouter.getMediaSessionToken());
- mVolumeGroupListPaddingTop = context.getResources().getDimensionPixelSize(
+ mVolumeGroupListPaddingTop = mContext.getResources().getDimensionPixelSize(
R.dimen.mr_controller_volume_group_list_padding_top);
mAccessibilityManager =
- (AccessibilityManager) context.getSystemService(Context.ACCESSIBILITY_SERVICE);
+ (AccessibilityManager) mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
}
/**
@@ -211,7 +210,7 @@
if (mVolumeControlEnabled != enable) {
mVolumeControlEnabled = enable;
if (mCreated) {
- updateVolumeControl();
+ updateVolumeControlLayout();
}
}
}
@@ -308,20 +307,41 @@
mCloseButton.setOnClickListener(listener);
mCustomControlLayout = (FrameLayout) findViewById(R.id.mr_custom_control);
mDefaultControlLayout = (FrameLayout) findViewById(R.id.mr_default_control);
+
+ // Start the session activity when a content item (album art, title or subtitle) is clicked.
+ View.OnClickListener onClickListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mMediaController != null) {
+ PendingIntent pi = mMediaController.getSessionActivity();
+ if (pi != null) {
+ try {
+ pi.send();
+ dismiss();
+ } catch (PendingIntent.CanceledException e) {
+ Log.e(TAG, pi + " was not sent, it had been canceled.");
+ }
+ }
+ }
+ }
+ };
mArtView = (ImageView) findViewById(R.id.mr_art);
+ mArtView.setOnClickListener(onClickListener);
+ findViewById(R.id.mr_control_title_container).setOnClickListener(onClickListener);
mMediaMainControlLayout = (LinearLayout) findViewById(R.id.mr_media_main_control);
mDividerView = findViewById(R.id.mr_control_divider);
- mPlaybackControl = (RelativeLayout) findViewById(R.id.mr_playback_control);
+ mPlaybackControlLayout = (RelativeLayout) findViewById(R.id.mr_playback_control);
mTitleView = (TextView) findViewById(R.id.mr_control_title);
mSubtitleView = (TextView) findViewById(R.id.mr_control_subtitle);
mPlayPauseButton = (ImageButton) findViewById(R.id.mr_control_play_pause);
mPlayPauseButton.setOnClickListener(listener);
- mVolumeControl = (LinearLayout) findViewById(R.id.mr_volume_control);
+ mVolumeControlLayout = (LinearLayout) findViewById(R.id.mr_volume_control);
+ mVolumeControlLayout.setVisibility(View.GONE);
mVolumeSlider = (SeekBar) findViewById(R.id.mr_volume_slider);
- mVolumeSlider.setTag(VOLUME_SLIDER_TAG_MASTER);
+ mVolumeSlider.setTag(mRoute);
mVolumeChangeListener = new VolumeChangeListener();
mVolumeSlider.setOnSeekBarChangeListener(mVolumeChangeListener);
@@ -330,6 +350,8 @@
mMediaMainControlLayout, mVolumeGroupList, getGroup() != null);
MediaRouterThemeHelper.setVolumeSliderColor(mContext,
(MediaRouteVolumeSlider) mVolumeSlider, mMediaMainControlLayout);
+ mVolumeSliderMap = new HashMap<>();
+ mVolumeSliderMap.put(mRoute, mVolumeSlider);
mGroupExpandCollapseButton =
(MediaRouteExpandCollapseButton) findViewById(R.id.mr_group_expand_collapse);
@@ -441,19 +463,12 @@
mFetchArtTask = new FetchArtTask();
mFetchArtTask.execute();
}
- updateVolumeControl();
- updatePlaybackControl();
+ updateVolumeControlLayout();
+ updatePlaybackControlLayout();
}
- private boolean isPlaybackControlLayoutNeeded() {
- // If a route does not support remote playback, it means that the route is dedicated for
- // audio or video mirroring such as A2DP speaker or headset. In this case, the route
- // provider does not provide any playback information such as metadata or playback status.
- // But, for live video, playback control layout shows a message that the screen is being
- // mirrored, while it does not show anything for live audio.
- return mCustomControlView == null && (mDescription != null || mState != null)
- && (mRoute.supportsControlCategory(MediaControlIntent.CATEGORY_REMOTE_PLAYBACK)
- || mRoute.supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO));
+ private boolean canShowPlaybackControlLayout() {
+ return mCustomControlView == null && (mDescription != null || mState != null);
}
/**
@@ -462,29 +477,29 @@
*/
private int getMainControllerHeight(boolean showPlaybackControl) {
int height = 0;
- if (showPlaybackControl || mVolumeControl.getVisibility() == View.VISIBLE) {
+ if (showPlaybackControl || mVolumeControlLayout.getVisibility() == View.VISIBLE) {
height += mMediaMainControlLayout.getPaddingTop()
+ mMediaMainControlLayout.getPaddingBottom();
if (showPlaybackControl) {
- height += mPlaybackControl.getMeasuredHeight();
+ height += mPlaybackControlLayout.getMeasuredHeight();
}
- if (mVolumeControl.getVisibility() == View.VISIBLE) {
- height += mVolumeControl.getMeasuredHeight();
+ if (mVolumeControlLayout.getVisibility() == View.VISIBLE) {
+ height += mVolumeControlLayout.getMeasuredHeight();
}
- if (showPlaybackControl && mVolumeControl.getVisibility() == View.VISIBLE) {
+ if (showPlaybackControl && mVolumeControlLayout.getVisibility() == View.VISIBLE) {
height += mDividerView.getMeasuredHeight();
}
}
return height;
}
- private void updateMediaControlVisibility(boolean showPlaybackControl) {
+ private void updateMediaControlVisibility(boolean canShowPlaybackControlLayout) {
// TODO: Update the top and bottom padding of the control layout according to the display
// height.
- mDividerView.setVisibility((mVolumeControl.getVisibility() == View.VISIBLE
- && showPlaybackControl) ? View.VISIBLE : View.GONE);
- mMediaMainControlLayout.setVisibility((mVolumeControl.getVisibility() == View.GONE
- && !showPlaybackControl) ? View.GONE : View.VISIBLE);
+ mDividerView.setVisibility((mVolumeControlLayout.getVisibility() == View.VISIBLE
+ && canShowPlaybackControlLayout) ? View.VISIBLE : View.GONE);
+ mMediaMainControlLayout.setVisibility((mVolumeControlLayout.getVisibility() == View.GONE
+ && !canShowPlaybackControlLayout) ? View.GONE : View.VISIBLE);
}
private void updateLayoutHeight() {
@@ -508,7 +523,7 @@
// Measure the size of widgets and get the height of main components.
int oldHeight = getLayoutHeight(mMediaMainControlLayout);
setLayoutHeight(mMediaMainControlLayout, ViewGroup.LayoutParams.FILL_PARENT);
- updateMediaControlVisibility(isPlaybackControlLayoutNeeded());
+ updateMediaControlVisibility(canShowPlaybackControlLayout());
View decorView = getWindow().getDecorView();
decorView.measure(
MeasureSpec.makeMeasureSpec(getWindow().getAttributes().width, MeasureSpec.EXACTLY),
@@ -523,7 +538,7 @@
? ImageView.ScaleType.FIT_XY : ImageView.ScaleType.FIT_CENTER);
}
}
- int mainControllerHeight = getMainControllerHeight(isPlaybackControlLayoutNeeded());
+ int mainControllerHeight = getMainControllerHeight(canShowPlaybackControlLayout());
int volumeGroupListCount = mVolumeGroupList.getAdapter() != null
? mVolumeGroupList.getAdapter().getCount() : 0;
// Scale down volume group list items in landscape mode.
@@ -563,15 +578,15 @@
desiredControlLayoutHeight = visibleGroupListHeight + mainControllerHeight;
}
// Show the playback control if it fits the screen.
- if (isPlaybackControlLayoutNeeded()
+ if (canShowPlaybackControlLayout()
&& desiredControlLayoutHeight <= maximumControlViewHeight) {
- mPlaybackControl.setVisibility(View.VISIBLE);
+ mPlaybackControlLayout.setVisibility(View.VISIBLE);
} else {
- mPlaybackControl.setVisibility(View.GONE);
+ mPlaybackControlLayout.setVisibility(View.GONE);
}
- updateMediaControlVisibility(mPlaybackControl.getVisibility() == View.VISIBLE);
+ updateMediaControlVisibility(mPlaybackControlLayout.getVisibility() == View.VISIBLE);
mainControllerHeight = getMainControllerHeight(
- mPlaybackControl.getVisibility() == View.VISIBLE);
+ mPlaybackControlLayout.getVisibility() == View.VISIBLE);
desiredControlLayoutHeight =
Math.max(artViewHeight, visibleGroupListHeight) + mainControllerHeight;
@@ -641,10 +656,10 @@
view.startAnimation(anim);
}
- private void updateVolumeControl() {
- if (!mVolumeSliderTouched) {
- if (isVolumeControlAvailable(mRoute)) {
- mVolumeControl.setVisibility(View.VISIBLE);
+ private void updateVolumeControlLayout() {
+ if (isVolumeControlAvailable(mRoute)) {
+ if (mVolumeControlLayout.getVisibility() == View.GONE) {
+ mVolumeControlLayout.setVisibility(View.VISIBLE);
mVolumeSlider.setMax(mRoute.getVolumeMax());
mVolumeSlider.setProgress(mRoute.getVolume());
if (getGroup() == null) {
@@ -654,35 +669,18 @@
VolumeGroupAdapter adapter =
(VolumeGroupAdapter) mVolumeGroupList.getAdapter();
if (adapter != null) {
- adapter.notifyDataSetChanged();
- }
- }
- } else {
- mVolumeControl.setVisibility(View.GONE);
- }
- updateLayoutHeight();
- } else if (mVolumeControl.getVisibility() == View.VISIBLE) {
- mVolumeSlider.setProgress(mRoute.getVolume());
- if (mIsGroupExpanded) {
- for (int i = 0; i < mVolumeGroupList.getChildCount(); ++i) {
- SeekBar volumeSlider = (SeekBar) mVolumeGroupList.getChildAt(i)
- .findViewById(R.id.mr_volume_slider);
- int tag = (int) volumeSlider.getTag();
- int index = tag - VOLUME_SLIDER_TAG_GROUP_BASE;
- if (index < 0 || index >= getGroup().getRouteCount()) {
- continue;
- }
- MediaRouter.RouteInfo route = getGroup().getRouteAt(index);
- if (isVolumeControlAvailable(route)) {
- volumeSlider.setProgress(route.getVolume());
+ adapter.notifyDataSetChanged();
}
}
}
+ } else {
+ mVolumeControlLayout.setVisibility(View.GONE);
}
+ updateLayoutHeight();
}
- private void updatePlaybackControl() {
- if (isPlaybackControlLayoutNeeded()) {
+ private void updatePlaybackControlLayout() {
+ if (canShowPlaybackControlLayout()) {
CharSequence title = mDescription == null ? null : mDescription.getTitle();
boolean hasTitle = !TextUtils.isEmpty(title);
@@ -697,8 +695,12 @@
mTitleView.setText(R.string.mr_controller_casting_screen);
showTitle = true;
} else if (mState == null || mState.getState() == PlaybackStateCompat.STATE_NONE) {
- mTitleView.setText(R.string.mr_controller_no_media_selected);
- showTitle = true;
+ // Show "No media selected" as we don't yet know the playback state.
+ // (Only exception is bluetooth where we don't show anything.)
+ if (!mRoute.isDeviceTypeBluetooth()) {
+ mTitleView.setText(R.string.mr_controller_no_media_selected);
+ showTitle = true;
+ }
} else if (!hasTitle && !hasSubtitle) {
mTitleView.setText(R.string.mr_controller_no_info_available);
showTitle = true;
@@ -757,16 +759,6 @@
view.setLayoutParams(lp);
}
- private static int getLayoutBottomMargin(View view) {
- return ((ViewGroup.MarginLayoutParams) view.getLayoutParams()).bottomMargin;
- }
-
- private static void setLayoutBottomMargin(View view, int bottomMargin) {
- ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
- params.bottomMargin = bottomMargin;
- view.setLayoutParams(params);
- }
-
/**
* Returns desired art height to fit into controller dialog.
*/
@@ -792,8 +784,9 @@
@Override
public void onRouteVolumeChanged(MediaRouter router, MediaRouter.RouteInfo route) {
- if (route == mRoute) {
- updateVolumeControl();
+ SeekBar volumeSlider = mVolumeSliderMap.get(route);
+ if (volumeSlider != null && mRouteInVolumeSliderTouched != route) {
+ volumeSlider.setProgress(route.getVolume());
}
}
}
@@ -857,24 +850,24 @@
}
}
- private class VolumeChangeListener implements OnSeekBarChangeListener {
+ private class VolumeChangeListener implements SeekBar.OnSeekBarChangeListener {
private final Runnable mStopTrackingTouch = new Runnable() {
@Override
public void run() {
- if (mVolumeSliderTouched) {
- mVolumeSliderTouched = false;
- updateVolumeControl();
+ if (mRouteInVolumeSliderTouched != null) {
+ SeekBar volumeSlider = mVolumeSliderMap.get(mRouteInVolumeSliderTouched);
+ volumeSlider.setProgress(mRouteInVolumeSliderTouched.getVolume());
+ mRouteInVolumeSliderTouched = null;
}
}
};
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
- if (mVolumeSliderTouched) {
+ if (mRouteInVolumeSliderTouched != null) {
mVolumeSlider.removeCallbacks(mStopTrackingTouch);
- } else {
- mVolumeSliderTouched = true;
}
+ mRouteInVolumeSliderTouched = (MediaRouter.RouteInfo) seekBar.getTag();
}
@Override
@@ -888,14 +881,9 @@
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (fromUser) {
- int tag = (int) seekBar.getTag();
- if (tag == VOLUME_SLIDER_TAG_MASTER) {
- mRoute.requestSetVolume(progress);
- } else {
- int index = tag - VOLUME_SLIDER_TAG_GROUP_BASE;
- if (index >= 0 && index < getGroup().getRouteCount()) {
- getGroup().getRouteAt(index).requestSetVolume(progress);
- }
+ MediaRouter.RouteInfo route = (MediaRouter.RouteInfo) seekBar.getTag();
+ if (route.getVolume() != progress) {
+ route.requestSetVolume(progress);
}
}
}
@@ -931,7 +919,8 @@
(MediaRouteVolumeSlider) v.findViewById(R.id.mr_volume_slider);
MediaRouterThemeHelper.setVolumeSliderColor(
mContext, volumeSlider, mVolumeGroupList);
- volumeSlider.setTag(VOLUME_SLIDER_TAG_GROUP_BASE + position);
+ volumeSlider.setTag(route);
+ mVolumeSliderMap.put(route, volumeSlider);
volumeSlider.setHideThumb(!isEnabled);
volumeSlider.setEnabled(isEnabled);
if (isEnabled) {
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouteExpandCollapseButton.java b/v7/mediarouter/src/android/support/v7/app/MediaRouteExpandCollapseButton.java
index 6a68846..6ccfaa8 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouteExpandCollapseButton.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouteExpandCollapseButton.java
@@ -54,7 +54,8 @@
context, R.drawable.ic_collapse);
ColorFilter filter = new PorterDuffColorFilter(
- MediaRouterThemeHelper.getControllerColor(context), PorterDuff.Mode.SRC_IN);
+ MediaRouterThemeHelper.getControllerColor(context, defStyleAttr),
+ PorterDuff.Mode.SRC_IN);
mExpandAnimationDrawable.setColorFilter(filter);
mCollapseAnimationDrawable.setColorFilter(filter);
diff --git a/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java b/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java
index f5a258c..33ab7bc 100644
--- a/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java
+++ b/v7/mediarouter/src/android/support/v7/app/MediaRouterThemeHelper.java
@@ -17,6 +17,7 @@
package android.support.v7.app;
import android.content.Context;
+import android.content.res.TypedArray;
import android.graphics.Color;
import android.support.annotation.IntDef;
import android.support.v4.graphics.ColorUtils;
@@ -41,22 +42,34 @@
private MediaRouterThemeHelper() {
}
- public static Context createThemedContext(Context context) {
- int style;
+ /**
+ * Creates a themed context based on the explicit style resource or the parent context's default
+ * theme.
+ * <p>
+ * The theme which will be applied on top of the parent {@code context}'s theme is determined
+ * by the primary color defined in the given {@code style}, or in the parent {@code context}.
+ *
+ * @param context the parent context
+ * @param style the resource ID of the style against which to inflate this context, or
+ * {@code 0} to use the parent {@code context}'s default theme.
+ * @return The themed context.
+ */
+ public static Context createThemedContext(Context context, int style) {
+ int theme;
if (isLightTheme(context)) {
- if (getControllerColor(context) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- style = R.style.Theme_MediaRouter_Light;
+ if (getControllerColor(context, style) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
+ theme = R.style.Theme_MediaRouter_Light;
} else {
- style = R.style.Theme_MediaRouter_Light_DarkControlPanel;
+ theme = R.style.Theme_MediaRouter_Light_DarkControlPanel;
}
} else {
- if (getControllerColor(context) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
- style = R.style.Theme_MediaRouter_LightControlPanel;
+ if (getControllerColor(context, style) == COLOR_DARK_ON_LIGHT_BACKGROUND) {
+ theme = R.style.Theme_MediaRouter_LightControlPanel;
} else {
- style = R.style.Theme_MediaRouter;
+ theme = R.style.Theme_MediaRouter;
}
}
- return new ContextThemeWrapper(context, style);
+ return new ContextThemeWrapper(context, theme);
}
public static int getThemeResource(Context context, int attr) {
@@ -70,8 +83,8 @@
? value.getFloat() : 0.5f;
}
- public static @ControllerColorType int getControllerColor(Context context) {
- int primaryColor = getThemeColor(context, R.attr.colorPrimary);
+ public static @ControllerColorType int getControllerColor(Context context, int style) {
+ int primaryColor = getThemeColor(context, style, R.attr.colorPrimary);
if (ColorUtils.calculateContrast(COLOR_WHITE_ON_DARK_BACKGROUND, primaryColor)
>= MIN_CONTRAST) {
return COLOR_WHITE_ON_DARK_BACKGROUND;
@@ -80,22 +93,23 @@
}
public static int getButtonTextColor(Context context) {
- int primaryColor = getThemeColor(context, R.attr.colorPrimary);
- int backgroundColor = getThemeColor(context, android.R.attr.colorBackground);
+ int primaryColor = getThemeColor(context, 0, R.attr.colorPrimary);
+ int backgroundColor = getThemeColor(context, 0, android.R.attr.colorBackground);
if (ColorUtils.calculateContrast(primaryColor, backgroundColor) < MIN_CONTRAST) {
// Default to colorAccent if the contrast ratio is low.
- return getThemeColor(context, R.attr.colorAccent);
+ return getThemeColor(context, 0, R.attr.colorAccent);
}
return primaryColor;
}
public static void setMediaControlsBackgroundColor(
Context context, View mainControls, View groupControls, boolean hasGroup) {
- int primaryColor = getThemeColor(context, R.attr.colorPrimary);
- int primaryDarkColor = getThemeColor(context, R.attr.colorPrimaryDark);
- if (hasGroup && ColorUtils.calculateContrast(COLOR_WHITE_ON_DARK_BACKGROUND, primaryColor)
- < MIN_CONTRAST) {
+ int primaryColor = getThemeColor(context, 0, R.attr.colorPrimary);
+ int primaryDarkColor = getThemeColor(context, 0, R.attr.colorPrimaryDark);
+ int controllerColor = getControllerColor(context, 0);
+ if (hasGroup && controllerColor == COLOR_DARK_ON_LIGHT_BACKGROUND
+ && ColorUtils.calculateContrast(controllerColor, primaryDarkColor) < MIN_CONTRAST) {
// Instead of showing dark controls in a possibly dark (i.e. the primary dark), model
// the white dialog and use the primary color for the group controls.
primaryDarkColor = primaryColor;
@@ -111,7 +125,7 @@
public static void setVolumeSliderColor(
Context context, MediaRouteVolumeSlider volumeSlider, View backgroundView) {
- int controllerColor = getControllerColor(context);
+ int controllerColor = getControllerColor(context, 0);
if (Color.alpha(controllerColor) != 0xFF) {
// Composite with the background in order not to show the underlying progress bar
// through the thumb.
@@ -127,7 +141,16 @@
&& value.data != 0;
}
- private static int getThemeColor(Context context, int attr) {
+ private static int getThemeColor(Context context, int style, int attr) {
+ if (style != 0) {
+ int[] attrs = { attr };
+ TypedArray ta = context.obtainStyledAttributes(style, attrs);
+ int color = ta.getColor(0, 0);
+ ta.recycle();
+ if (color != 0) {
+ return color;
+ }
+ }
TypedValue value = new TypedValue();
context.getTheme().resolveAttribute(attr, value, true);
if (value.resourceId != 0) {
diff --git a/v7/mediarouter/src/android/support/v7/media/MediaRouter.java b/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
index 18bcc85..b2e74e4 100644
--- a/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
+++ b/v7/mediarouter/src/android/support/v7/media/MediaRouter.java
@@ -40,6 +40,7 @@
import android.support.v4.util.Pair;
import android.support.v7.media.MediaRouteProvider.ProviderMetadata;
import android.support.v7.media.MediaRouteProvider.RouteController;
+import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
@@ -913,6 +914,9 @@
static final int CHANGE_VOLUME = 1 << 1;
static final int CHANGE_PRESENTATION_DISPLAY = 1 << 2;
+ // Should match to SystemMediaRouteProvider.PACKAGE_NAME.
+ static final String SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME = "android";
+
RouteInfo(ProviderInfo provider, String descriptorId, String uniqueId) {
mProvider = provider;
mDescriptorId = descriptorId;
@@ -1226,6 +1230,33 @@
return mDeviceType;
}
+
+ /**
+ * Gets whether the type of the receiver device associated with this route is
+ * {@link #DEVICE_TYPE_BLUETOOTH}.
+ * <p>
+ * This is a workaround for platform version 23 or below where the system route provider
+ * doesn't specify device type for bluetooth media routes.
+ * </p>
+ *
+ * @return True if the receiver device type can be assumed to be
+ * {@link #DEVICE_TYPE_BLUETOOTH}, false otherwise.
+ * @hide
+ */
+ public boolean isDeviceTypeBluetooth() {
+ if (mDeviceType == DEVICE_TYPE_BLUETOOTH) {
+ return true;
+ }
+ return isSystemMediaRouteProvider(this)
+ && supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_AUDIO)
+ && !supportsControlCategory(MediaControlIntent.CATEGORY_LIVE_VIDEO);
+ }
+
+ private static boolean isSystemMediaRouteProvider(MediaRouter.RouteInfo route) {
+ return TextUtils.equals(route.getProviderInstance().getMetadata().getPackageName(),
+ SYSTEM_MEDIA_ROUTE_PROVIDER_PACKAGE_NAME);
+ }
+
/**
* Gets information about how volume is handled on the route.
*
diff --git a/v7/palette/api/current.txt b/v7/palette/api/current.txt
index fac6a55..3b24b77 100644
--- a/v7/palette/api/current.txt
+++ b/v7/palette/api/current.txt
@@ -7,6 +7,7 @@
method public static deprecated android.support.v7.graphics.Palette generate(android.graphics.Bitmap, int);
method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, android.support.v7.graphics.Palette.PaletteAsyncListener);
method public static deprecated android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generateAsync(android.graphics.Bitmap, int, android.support.v7.graphics.Palette.PaletteAsyncListener);
+ method public int getColorForTarget(android.support.v7.graphics.Target, int);
method public int getDarkMutedColor(int);
method public android.support.v7.graphics.Palette.Swatch getDarkMutedSwatch();
method public int getDarkVibrantColor(int);
@@ -17,7 +18,9 @@
method public android.support.v7.graphics.Palette.Swatch getLightVibrantSwatch();
method public int getMutedColor(int);
method public android.support.v7.graphics.Palette.Swatch getMutedSwatch();
+ method public android.support.v7.graphics.Palette.Swatch getSwatchForTarget(android.support.v7.graphics.Target);
method public java.util.List<android.support.v7.graphics.Palette.Swatch> getSwatches();
+ method public java.util.List<android.support.v7.graphics.Target> getTargets();
method public int getVibrantColor(int);
method public android.support.v7.graphics.Palette.Swatch getVibrantSwatch();
}
@@ -26,12 +29,15 @@
ctor public Palette.Builder(android.graphics.Bitmap);
ctor public Palette.Builder(java.util.List<android.support.v7.graphics.Palette.Swatch>);
method public android.support.v7.graphics.Palette.Builder addFilter(android.support.v7.graphics.Palette.Filter);
+ method public android.support.v7.graphics.Palette.Builder addTarget(android.support.v7.graphics.Target);
method public android.support.v7.graphics.Palette.Builder clearFilters();
method public android.support.v7.graphics.Palette.Builder clearRegion();
+ method public android.support.v7.graphics.Palette.Builder clearTargets();
method public android.support.v7.graphics.Palette generate();
method public android.os.AsyncTask<android.graphics.Bitmap, java.lang.Void, android.support.v7.graphics.Palette> generate(android.support.v7.graphics.Palette.PaletteAsyncListener);
method public android.support.v7.graphics.Palette.Builder maximumColorCount(int);
- method public android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
+ method public android.support.v7.graphics.Palette.Builder resizeBitmapArea(int);
+ method public deprecated android.support.v7.graphics.Palette.Builder resizeBitmapSize(int);
method public android.support.v7.graphics.Palette.Builder setRegion(int, int, int, int);
}
@@ -52,5 +58,40 @@
method public int getTitleTextColor();
}
+ public final class Target {
+ method public float getLightnessWeight();
+ method public float getMaximumLightness();
+ method public float getMaximumSaturation();
+ method public float getMinimumLightness();
+ method public float getMinimumSaturation();
+ method public float getPopulationWeight();
+ method public float getSaturationWeight();
+ method public float getTargetLightness();
+ method public float getTargetSaturation();
+ method public boolean isExclusive();
+ field public static final android.support.v7.graphics.Target DARK_MUTED;
+ field public static final android.support.v7.graphics.Target DARK_VIBRANT;
+ field public static final android.support.v7.graphics.Target LIGHT_MUTED;
+ field public static final android.support.v7.graphics.Target LIGHT_VIBRANT;
+ field public static final android.support.v7.graphics.Target MUTED;
+ field public static final android.support.v7.graphics.Target VIBRANT;
+ }
+
+ public static final class Target.Builder {
+ ctor public Target.Builder();
+ ctor public Target.Builder(android.support.v7.graphics.Target);
+ method public android.support.v7.graphics.Target build();
+ method public android.support.v7.graphics.Target.Builder setExclusive(boolean);
+ method public android.support.v7.graphics.Target.Builder setLightnessWeight(float);
+ method public android.support.v7.graphics.Target.Builder setMaximumLightness(float);
+ method public android.support.v7.graphics.Target.Builder setMaximumSaturation(float);
+ method public android.support.v7.graphics.Target.Builder setMinimumLightness(float);
+ method public android.support.v7.graphics.Target.Builder setMinimumSaturation(float);
+ method public android.support.v7.graphics.Target.Builder setPopulationWeight(float);
+ method public android.support.v7.graphics.Target.Builder setSaturationWeight(float);
+ method public android.support.v7.graphics.Target.Builder setTargetLightness(float);
+ method public android.support.v7.graphics.Target.Builder setTargetSaturation(float);
+ }
+
}
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/DefaultGenerator.java b/v7/palette/src/main/java/android/support/v7/graphics/DefaultGenerator.java
deleted file mode 100644
index 3ee2bfa..0000000
--- a/v7/palette/src/main/java/android/support/v7/graphics/DefaultGenerator.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*
- * Copyright 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.support.v7.graphics;
-
-import android.support.v4.graphics.ColorUtils;
-import android.support.v7.graphics.Palette.Swatch;
-
-import java.util.List;
-
-class DefaultGenerator extends Palette.Generator {
-
- private static final float TARGET_DARK_LUMA = 0.26f;
- private static final float MAX_DARK_LUMA = 0.45f;
-
- private static final float MIN_LIGHT_LUMA = 0.55f;
- private static final float TARGET_LIGHT_LUMA = 0.74f;
-
- private static final float MIN_NORMAL_LUMA = 0.3f;
- private static final float TARGET_NORMAL_LUMA = 0.5f;
- private static final float MAX_NORMAL_LUMA = 0.7f;
-
- private static final float TARGET_MUTED_SATURATION = 0.3f;
- private static final float MAX_MUTED_SATURATION = 0.4f;
-
- private static final float TARGET_VIBRANT_SATURATION = 1f;
- private static final float MIN_VIBRANT_SATURATION = 0.35f;
-
- private static final float WEIGHT_SATURATION = 3f;
- private static final float WEIGHT_LUMA = 6f;
- private static final float WEIGHT_POPULATION = 1f;
-
- private List<Swatch> mSwatches;
-
- private int mHighestPopulation;
-
- private Swatch mVibrantSwatch;
- private Swatch mMutedSwatch;
- private Swatch mDarkVibrantSwatch;
- private Swatch mDarkMutedSwatch;
- private Swatch mLightVibrantSwatch;
- private Swatch mLightMutedSwatch;
-
- @Override
- public void generate(final List<Swatch> swatches) {
- mSwatches = swatches;
-
- mHighestPopulation = findMaxPopulation();
-
- generateVariationColors();
-
- // Now try and generate any missing colors
- generateEmptySwatches();
- }
-
- @Override
- public Swatch getVibrantSwatch() {
- return mVibrantSwatch;
- }
-
- @Override
- public Swatch getLightVibrantSwatch() {
- return mLightVibrantSwatch;
- }
-
- @Override
- public Swatch getDarkVibrantSwatch() {
- return mDarkVibrantSwatch;
- }
-
- @Override
- public Swatch getMutedSwatch() {
- return mMutedSwatch;
- }
-
- @Override
- public Swatch getLightMutedSwatch() {
- return mLightMutedSwatch;
- }
-
- @Override
- public Swatch getDarkMutedSwatch() {
- return mDarkMutedSwatch;
- }
-
- private void generateVariationColors() {
- mVibrantSwatch = findColorVariation(TARGET_NORMAL_LUMA, MIN_NORMAL_LUMA, MAX_NORMAL_LUMA,
- TARGET_VIBRANT_SATURATION, MIN_VIBRANT_SATURATION, 1f);
-
- mLightVibrantSwatch = findColorVariation(TARGET_LIGHT_LUMA, MIN_LIGHT_LUMA, 1f,
- TARGET_VIBRANT_SATURATION, MIN_VIBRANT_SATURATION, 1f);
-
- mDarkVibrantSwatch = findColorVariation(TARGET_DARK_LUMA, 0f, MAX_DARK_LUMA,
- TARGET_VIBRANT_SATURATION, MIN_VIBRANT_SATURATION, 1f);
-
- mMutedSwatch = findColorVariation(TARGET_NORMAL_LUMA, MIN_NORMAL_LUMA, MAX_NORMAL_LUMA,
- TARGET_MUTED_SATURATION, 0f, MAX_MUTED_SATURATION);
-
- mLightMutedSwatch = findColorVariation(TARGET_LIGHT_LUMA, MIN_LIGHT_LUMA, 1f,
- TARGET_MUTED_SATURATION, 0f, MAX_MUTED_SATURATION);
-
- mDarkMutedSwatch = findColorVariation(TARGET_DARK_LUMA, 0f, MAX_DARK_LUMA,
- TARGET_MUTED_SATURATION, 0f, MAX_MUTED_SATURATION);
- }
-
- /**
- * Try and generate any missing swatches from the swatches we did find.
- */
- private void generateEmptySwatches() {
- if (mVibrantSwatch == null) {
- // If we do not have a vibrant color...
- if (mDarkVibrantSwatch != null) {
- // ...but we do have a dark vibrant, generate the value by modifying the luma
- final float[] newHsl = copyHslValues(mDarkVibrantSwatch);
- newHsl[2] = TARGET_NORMAL_LUMA;
- mVibrantSwatch = new Swatch(ColorUtils.HSLToColor(newHsl), 0);
- }
- }
-
- if (mDarkVibrantSwatch == null) {
- // If we do not have a dark vibrant color...
- if (mVibrantSwatch != null) {
- // ...but we do have a vibrant, generate the value by modifying the luma
- final float[] newHsl = copyHslValues(mVibrantSwatch);
- newHsl[2] = TARGET_DARK_LUMA;
- mDarkVibrantSwatch = new Swatch(ColorUtils.HSLToColor(newHsl), 0);
- }
- }
- }
-
- /**
- * Find the {@link Palette.Swatch} with the highest population value and return the population.
- */
- private int findMaxPopulation() {
- int population = 0;
- for (Swatch swatch : mSwatches) {
- population = Math.max(population, swatch.getPopulation());
- }
- return population;
- }
-
- private Swatch findColorVariation(float targetLuma, float minLuma, float maxLuma,
- float targetSaturation, float minSaturation, float maxSaturation) {
- Swatch max = null;
- float maxValue = 0f;
-
- for (Swatch swatch : mSwatches) {
- final float sat = swatch.getHsl()[1];
- final float luma = swatch.getHsl()[2];
-
- if (sat >= minSaturation && sat <= maxSaturation &&
- luma >= minLuma && luma <= maxLuma &&
- !isAlreadySelected(swatch)) {
- float value = createComparisonValue(sat, targetSaturation, luma, targetLuma,
- swatch.getPopulation(), mHighestPopulation);
- if (max == null || value > maxValue) {
- max = swatch;
- maxValue = value;
- }
- }
- }
-
- return max;
- }
-
- /**
- * @return true if we have already selected {@code swatch}
- */
- private boolean isAlreadySelected(Swatch swatch) {
- return mVibrantSwatch == swatch || mDarkVibrantSwatch == swatch ||
- mLightVibrantSwatch == swatch || mMutedSwatch == swatch ||
- mDarkMutedSwatch == swatch || mLightMutedSwatch == swatch;
- }
-
- private static float createComparisonValue(float saturation, float targetSaturation,
- float luma, float targetLuma,
- int population, int maxPopulation) {
- return createComparisonValue(saturation, targetSaturation, WEIGHT_SATURATION,
- luma, targetLuma, WEIGHT_LUMA,
- population, maxPopulation, WEIGHT_POPULATION);
- }
-
- private static float createComparisonValue(
- float saturation, float targetSaturation, float saturationWeight,
- float luma, float targetLuma, float lumaWeight,
- int population, int maxPopulation, float populationWeight) {
- return weightedMean(
- invertDiff(saturation, targetSaturation), saturationWeight,
- invertDiff(luma, targetLuma), lumaWeight,
- population / (float) maxPopulation, populationWeight
- );
- }
-
- /**
- * Copy a {@link Swatch}'s HSL values into a new float[].
- */
- private static float[] copyHslValues(Swatch color) {
- final float[] newHsl = new float[3];
- System.arraycopy(color.getHsl(), 0, newHsl, 0, 3);
- return newHsl;
- }
-
- /**
- * Returns a value in the range 0-1. 1 is returned when {@code value} equals the
- * {@code targetValue} and then decreases as the absolute difference between {@code value} and
- * {@code targetValue} increases.
- *
- * @param value the item's value
- * @param targetValue the value which we desire
- */
- private static float invertDiff(float value, float targetValue) {
- return 1f - Math.abs(value - targetValue);
- }
-
- private static float weightedMean(float... values) {
- float sum = 0f;
- float sumWeight = 0f;
-
- for (int i = 0; i < values.length; i += 2) {
- float value = values[i];
- float weight = values[i + 1];
-
- sum += (value * weight);
- sumWeight += weight;
- }
-
- return sum / sumWeight;
- }
-}
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
index 57f34a6..d0dff30 100644
--- a/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Palette.java
@@ -21,16 +21,20 @@
import android.graphics.Rect;
import android.os.AsyncTask;
import android.support.annotation.ColorInt;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.graphics.ColorUtils;
import android.support.v4.os.AsyncTaskCompat;
+import android.support.v4.util.ArrayMap;
import android.util.Log;
+import android.util.SparseBooleanArray;
import android.util.TimingLogger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* A helper class to extract prominent colors from an image.
@@ -80,7 +84,7 @@
void onGenerated(Palette palette);
}
- private static final int DEFAULT_RESIZE_BITMAP_MAX_DIMENSION = 192;
+ private static final int DEFAULT_RESIZE_BITMAP_AREA = 160 * 160;
private static final int DEFAULT_CALCULATE_NUMBER_COLORS = 16;
private static final float MIN_CONTRAST_TITLE_TEXT = 3.0f;
@@ -140,151 +144,266 @@
}
private final List<Swatch> mSwatches;
- private final Generator mGenerator;
+ private final List<Target> mTargets;
- private Palette(List<Swatch> swatches, Generator generator) {
+ private final Map<Target, Swatch> mSelectedSwatches;
+ private final SparseBooleanArray mUsedColors;
+
+ private final int mMaxPopulation;
+
+ private Palette(List<Swatch> swatches, List<Target> targets) {
mSwatches = swatches;
- mGenerator = generator;
+ mTargets = targets;
+
+ mUsedColors = new SparseBooleanArray();
+ mSelectedSwatches = new ArrayMap<>();
+
+ mMaxPopulation = findMaxPopulation();
}
/**
* Returns all of the swatches which make up the palette.
*/
+ @NonNull
public List<Swatch> getSwatches() {
return Collections.unmodifiableList(mSwatches);
}
/**
+ * Returns the targets used to generate this palette.
+ */
+ @NonNull
+ public List<Target> getTargets() {
+ return Collections.unmodifiableList(mTargets);
+ }
+
+ /**
* Returns the most vibrant swatch in the palette. Might be null.
+ *
+ * @see Target#VIBRANT
*/
@Nullable
public Swatch getVibrantSwatch() {
- return mGenerator.getVibrantSwatch();
+ return getSwatchForTarget(Target.VIBRANT);
}
/**
* Returns a light and vibrant swatch from the palette. Might be null.
+ *
+ * @see Target#LIGHT_VIBRANT
*/
@Nullable
public Swatch getLightVibrantSwatch() {
- return mGenerator.getLightVibrantSwatch();
+ return getSwatchForTarget(Target.LIGHT_VIBRANT);
}
/**
* Returns a dark and vibrant swatch from the palette. Might be null.
+ *
+ * @see Target#DARK_VIBRANT
*/
@Nullable
public Swatch getDarkVibrantSwatch() {
- return mGenerator.getDarkVibrantSwatch();
+ return getSwatchForTarget(Target.DARK_VIBRANT);
}
/**
* Returns a muted swatch from the palette. Might be null.
+ *
+ * @see Target#MUTED
*/
@Nullable
public Swatch getMutedSwatch() {
- return mGenerator.getMutedSwatch();
+ return getSwatchForTarget(Target.MUTED);
}
/**
* Returns a muted and light swatch from the palette. Might be null.
+ *
+ * @see Target#LIGHT_MUTED
*/
@Nullable
public Swatch getLightMutedSwatch() {
- return mGenerator.getLightMutedSwatch();
+ return getSwatchForTarget(Target.LIGHT_MUTED);
}
/**
* Returns a muted and dark swatch from the palette. Might be null.
+ *
+ * @see Target#DARK_MUTED
*/
@Nullable
public Swatch getDarkMutedSwatch() {
- return mGenerator.getDarkMutedSwatch();
+ return getSwatchForTarget(Target.DARK_MUTED);
}
/**
* Returns the most vibrant color in the palette as an RGB packed int.
*
* @param defaultColor value to return if the swatch isn't available
+ * @see #getVibrantSwatch()
*/
@ColorInt
- public int getVibrantColor(@ColorInt int defaultColor) {
- Swatch swatch = getVibrantSwatch();
- return swatch != null ? swatch.getRgb() : defaultColor;
+ public int getVibrantColor(@ColorInt final int defaultColor) {
+ return getColorForTarget(Target.VIBRANT, defaultColor);
}
/**
* Returns a light and vibrant color from the palette as an RGB packed int.
*
* @param defaultColor value to return if the swatch isn't available
+ * @see #getLightVibrantSwatch()
*/
@ColorInt
- public int getLightVibrantColor(@ColorInt int defaultColor) {
- Swatch swatch = getLightVibrantSwatch();
- return swatch != null ? swatch.getRgb() : defaultColor;
+ public int getLightVibrantColor(@ColorInt final int defaultColor) {
+ return getColorForTarget(Target.LIGHT_VIBRANT, defaultColor);
}
/**
* Returns a dark and vibrant color from the palette as an RGB packed int.
*
* @param defaultColor value to return if the swatch isn't available
+ * @see #getDarkVibrantSwatch()
*/
@ColorInt
- public int getDarkVibrantColor(@ColorInt int defaultColor) {
- Swatch swatch = getDarkVibrantSwatch();
- return swatch != null ? swatch.getRgb() : defaultColor;
+ public int getDarkVibrantColor(@ColorInt final int defaultColor) {
+ return getColorForTarget(Target.DARK_VIBRANT, defaultColor);
}
/**
* Returns a muted color from the palette as an RGB packed int.
*
* @param defaultColor value to return if the swatch isn't available
+ * @see #getMutedSwatch()
*/
@ColorInt
- public int getMutedColor(@ColorInt int defaultColor) {
- Swatch swatch = getMutedSwatch();
- return swatch != null ? swatch.getRgb() : defaultColor;
+ public int getMutedColor(@ColorInt final int defaultColor) {
+ return getColorForTarget(Target.MUTED, defaultColor);
}
/**
* Returns a muted and light color from the palette as an RGB packed int.
*
* @param defaultColor value to return if the swatch isn't available
+ * @see #getLightMutedSwatch()
*/
@ColorInt
- public int getLightMutedColor(@ColorInt int defaultColor) {
- Swatch swatch = getLightMutedSwatch();
- return swatch != null ? swatch.getRgb() : defaultColor;
+ public int getLightMutedColor(@ColorInt final int defaultColor) {
+ return getColorForTarget(Target.LIGHT_MUTED, defaultColor);
}
/**
* Returns a muted and dark color from the palette as an RGB packed int.
*
* @param defaultColor value to return if the swatch isn't available
+ * @see #getDarkMutedSwatch()
*/
@ColorInt
- public int getDarkMutedColor(@ColorInt int defaultColor) {
- Swatch swatch = getDarkMutedSwatch();
- return swatch != null ? swatch.getRgb() : defaultColor;
+ public int getDarkMutedColor(@ColorInt final int defaultColor) {
+ return getColorForTarget(Target.DARK_MUTED, defaultColor);
}
/**
- * Scale the bitmap down so that it's largest dimension is {@code targetMaxDimension}.
- * If {@code bitmap} is smaller than this, then it is returned.
+ * Returns the selected swatch for the given target from the palette, or {@code null} if one
+ * could not be found.
*/
- private static Bitmap scaleBitmapDown(Bitmap bitmap, final int targetMaxDimension) {
- final int maxDimension = Math.max(bitmap.getWidth(), bitmap.getHeight());
+ @Nullable
+ public Swatch getSwatchForTarget(@NonNull final Target target) {
+ return mSelectedSwatches.get(target);
+ }
- if (maxDimension <= targetMaxDimension) {
- // If the bitmap is small enough already, just return it
- return bitmap;
+ /**
+ * Returns the selected color for the given target from the palette as an RGB packed int.
+ *
+ * @param defaultColor value to return if the swatch isn't available
+ */
+ @ColorInt
+ public int getColorForTarget(@NonNull final Target target, @ColorInt final int defaultColor) {
+ Swatch swatch = getSwatchForTarget(target);
+ return swatch != null ? swatch.getRgb() : defaultColor;
+ }
+
+ private void generate() {
+ // We need to make sure that the scored targets are generated first. This is so that
+ // inherited targets have something to inherit from
+ for (int i = 0, count = mTargets.size(); i < count; i++) {
+ final Target target = mTargets.get(i);
+ target.normalizeWeights();
+ mSelectedSwatches.put(target, generateScoredTarget(target));
+ }
+ // We now clear out the used colors
+ mUsedColors.clear();
+ }
+
+ private Swatch generateScoredTarget(final Target target) {
+ final Swatch maxScoreSwatch = getMaxScoredSwatchForTarget(target);
+ if (maxScoreSwatch != null && target.isExclusive()) {
+ // If we have a swatch, and the target is exclusive, add the color to the used list
+ mUsedColors.append(maxScoreSwatch.getRgb(), true);
+ }
+ return maxScoreSwatch;
+ }
+
+ private Swatch getMaxScoredSwatchForTarget(final Target target) {
+ float maxScore = 0;
+ Swatch maxScoreSwatch = null;
+ for (int i = 0, count = mSwatches.size(); i < count; i++) {
+ final Swatch swatch = mSwatches.get(i);
+ if (shouldBeScoredForTarget(swatch, target)) {
+ final float score = generateScore(swatch, target);
+ if (maxScoreSwatch == null || score > maxScore) {
+ maxScoreSwatch = swatch;
+ maxScore = score;
+ }
+ }
+ }
+ return maxScoreSwatch;
+ }
+
+ private boolean shouldBeScoredForTarget(final Swatch swatch, final Target target) {
+ // Check whether the HSL values are within the correct ranges, and this color hasn't
+ // been used yet.
+ final float hsl[] = swatch.getHsl();
+ return hsl[1] >= target.getMinimumSaturation() && hsl[1] <= target.getMaximumSaturation()
+ && hsl[2] >= target.getMinimumLightness() && hsl[2] <= target.getMaximumLightness()
+ && !mUsedColors.get(swatch.getRgb());
+ }
+
+ private float generateScore(Swatch swatch, Target target) {
+ final float[] hsl = swatch.getHsl();
+
+ float saturationScore = 0;
+ float luminanceScore = 0;
+ float populationScore = 0;
+
+ if (target.getSaturationWeight() > 0) {
+ saturationScore = target.getSaturationWeight()
+ * (1f - Math.abs(hsl[1] - target.getTargetSaturation()));
+ }
+ if (target.getLightnessWeight() > 0) {
+ luminanceScore = target.getLightnessWeight()
+ * (1f - Math.abs(hsl[2] - target.getTargetLightness()));
+ }
+ if (target.getPopulationWeight() > 0) {
+ populationScore = target.getPopulationWeight()
+ * (swatch.getPopulation() / (float) mMaxPopulation);
}
- final double scaleRatio = targetMaxDimension / (double) maxDimension;
- return Bitmap.createScaledBitmap(bitmap,
- (int) Math.ceil(bitmap.getWidth() * scaleRatio),
- (int) Math.ceil(bitmap.getHeight() * scaleRatio),
- false);
+ return saturationScore + luminanceScore + populationScore;
+ }
+
+ private int findMaxPopulation() {
+ int max = 0;
+ for (int i = 0, count = mSwatches.size(); i < count; i++) {
+ max = Math.max(mSwatches.get(i).getPopulation(), max);
+ }
+ return max;
+ }
+
+ private static float[] copyHslValues(Swatch color) {
+ final float[] newHsl = new float[3];
+ System.arraycopy(color.getHsl(), 0, newHsl, 0, 3);
+ return newHsl;
}
/**
@@ -318,6 +437,11 @@
mPopulation = population;
}
+ Swatch(float[] hsl, int population) {
+ this(ColorUtils.HSLToColor(hsl), population);
+ mHsl = hsl;
+ }
+
/**
* @return this swatch's RGB color value
*/
@@ -335,8 +459,8 @@
public float[] getHsl() {
if (mHsl == null) {
mHsl = new float[3];
- ColorUtils.RGBToHSL(mRed, mGreen, mBlue, mHsl);
}
+ ColorUtils.RGBToHSL(mRed, mGreen, mBlue, mHsl);
return mHsl;
}
@@ -445,13 +569,16 @@
public static final class Builder {
private final List<Swatch> mSwatches;
private final Bitmap mBitmap;
+
+ private final List<Target> mTargets = new ArrayList<>();
+
private int mMaxColors = DEFAULT_CALCULATE_NUMBER_COLORS;
- private int mResizeMaxDimension = DEFAULT_RESIZE_BITMAP_MAX_DIMENSION;
+ private int mResizeArea = DEFAULT_RESIZE_BITMAP_AREA;
+ private int mResizeMaxDimension = -1;
+
private final List<Filter> mFilters = new ArrayList<>();
private Rect mRegion;
- private Generator mGenerator;
-
/**
* Construct a new {@link Builder} using a source {@link Bitmap}
*/
@@ -462,6 +589,14 @@
mFilters.add(DEFAULT_FILTER);
mBitmap = bitmap;
mSwatches = null;
+
+ // Add the default targets
+ mTargets.add(Target.LIGHT_VIBRANT);
+ mTargets.add(Target.VIBRANT);
+ mTargets.add(Target.DARK_VIBRANT);
+ mTargets.add(Target.LIGHT_MUTED);
+ mTargets.add(Target.MUTED);
+ mTargets.add(Target.DARK_MUTED);
}
/**
@@ -478,15 +613,6 @@
}
/**
- * Set the {@link Generator} to use when generating the {@link Palette}. If this is called
- * with {@code null} then the default generator will be used.
- */
- Builder generator(Generator generator) {
- mGenerator = generator;
- return this;
- }
-
- /**
* Set the maximum number of colors to use in the quantization step when using a
* {@link android.graphics.Bitmap} as the source.
* <p>
@@ -494,6 +620,7 @@
* the range 10-16. For images which are largely made up of people's faces then this
* value should be increased to ~24.
*/
+ @NonNull
public Builder maximumColorCount(int colors) {
mMaxColors = colors;
return this;
@@ -504,13 +631,38 @@
* If the bitmap's largest dimension is greater than the value specified, then the bitmap
* will be resized so that it's largest dimension matches {@code maxDimension}. If the
* bitmap is smaller or equal, the original is used as-is.
+ *
+ * @deprecated Using {@link #resizeBitmapArea(int)} is preferred since it can handle
+ * abnormal aspect ratios more gracefully.
+ *
+ * @param maxDimension the number of pixels that the max dimension should be scaled down to,
+ * or any value <= 0 to disable resizing.
+ */
+ @NonNull
+ @Deprecated
+ public Builder resizeBitmapSize(final int maxDimension) {
+ mResizeMaxDimension = maxDimension;
+ mResizeArea = -1;
+ return this;
+ }
+
+ /**
+ * Set the resize value when using a {@link android.graphics.Bitmap} as the source.
+ * If the bitmap's area is greater than the value specified, then the bitmap
+ * will be resized so that it's area matches {@code area}. If the
+ * bitmap is smaller or equal, the original is used as-is.
* <p>
* This value has a large effect on the processing time. The larger the resized image is,
* the greater time it will take to generate the palette. The smaller the image is, the
* more detail is lost in the resulting image and thus less precision for color selection.
+ *
+ * @param area the number of pixels that the intemediary scaled down Bitmap should cover,
+ * or any value <= 0 to disable resizing.
*/
- public Builder resizeBitmapSize(int maxDimension) {
- mResizeMaxDimension = maxDimension;
+ @NonNull
+ public Builder resizeBitmapArea(final int area) {
+ mResizeArea = area;
+ mResizeMaxDimension = -1;
return this;
}
@@ -518,6 +670,7 @@
* Clear all added filters. This includes any default filters added automatically by
* {@link Palette}.
*/
+ @NonNull
public Builder clearFilters() {
mFilters.clear();
return this;
@@ -529,6 +682,7 @@
*
* @param filter filter to add.
*/
+ @NonNull
public Builder addFilter(Filter filter) {
if (filter != null) {
mFilters.add(filter);
@@ -545,6 +699,7 @@
* @param right The right side of the rectangle used for the region.
* @param bottom The bottom of the rectangle used for the region.
*/
+ @NonNull
public Builder setRegion(int left, int top, int right, int bottom) {
if (mBitmap != null) {
if (mRegion == null) mRegion = new Rect();
@@ -562,14 +717,41 @@
/**
* Clear any previously region set via {@link #setRegion(int, int, int, int)}.
*/
+ @NonNull
public Builder clearRegion() {
mRegion = null;
return this;
}
/**
+ * Add a target profile to be generated in the palette.
+ *
+ * <p>You can retrieve the result via {@link Palette#getSwatchForTarget(Target)}.</p>
+ */
+ @NonNull
+ public Builder addTarget(@NonNull final Target target) {
+ if (!mTargets.contains(target)) {
+ mTargets.add(target);
+ }
+ return this;
+ }
+
+ /**
+ * Clear all added targets. This includes any default targets added automatically by
+ * {@link Palette}.
+ */
+ @NonNull
+ public Builder clearTargets() {
+ if (mTargets != null) {
+ mTargets.clear();
+ }
+ return this;
+ }
+
+ /**
* Generate and return the {@link Palette} synchronously.
*/
+ @NonNull
public Palette generate() {
final TimingLogger logger = LOG_TIMINGS
? new TimingLogger(LOG_TAG, "Generation")
@@ -578,15 +760,10 @@
List<Swatch> swatches;
if (mBitmap != null) {
- // We have a Bitmap so we need to quantization to reduce the number of colors
+ // We have a Bitmap so we need to use quantization to reduce the number of colors
- if (mResizeMaxDimension <= 0) {
- throw new IllegalArgumentException(
- "Minimum dimension size for resizing should should be >= 1");
- }
-
- // First we'll scale down the bitmap so it's largest dimension is as specified
- final Bitmap bitmap = scaleBitmapDown(mBitmap, mResizeMaxDimension);
+ // First we'll scale down the bitmap if needed
+ final Bitmap bitmap = scaleBitmapDown(mBitmap);
if (logger != null) {
logger.addSplit("Processed Bitmap");
@@ -613,6 +790,7 @@
if (bitmap != mBitmap) {
bitmap.recycle();
}
+
swatches = quantizer.getQuantizedColors();
if (logger != null) {
@@ -623,20 +801,10 @@
swatches = mSwatches;
}
- // If we haven't been provided with a generator, use the default
- if (mGenerator == null) {
- mGenerator = new DefaultGenerator();
- }
-
- // Now call let the Generator do it's thing
- mGenerator.generate(swatches);
-
- if (logger != null) {
- logger.addSplit("Generator.generate() completed");
- }
-
// Now create a Palette instance
- Palette p = new Palette(swatches, mGenerator);
+ final Palette p = new Palette(swatches, mTargets);
+ // And make it generate itself
+ p.generate();
if (logger != null) {
logger.addSplit("Created Palette");
@@ -651,6 +819,7 @@
* {@link PaletteAsyncListener#onGenerated} method will be called with the palette when
* generated.
*/
+ @NonNull
public AsyncTask<Bitmap, Void, Palette> generate(final PaletteAsyncListener listener) {
if (listener == null) {
throw new IllegalArgumentException("listener can not be null");
@@ -702,59 +871,34 @@
return subsetPixels;
}
}
- }
-
- static abstract class Generator {
/**
- * This method will be called with the {@link Palette.Swatch} that represent an image.
- * You should process this list so that you have appropriate values when the other methods in
- * class are called.
- * <p>
- * This method will probably be called on a background thread.
+ * Scale the bitmap down as needed.
*/
- public abstract void generate(List<Palette.Swatch> swatches);
+ private Bitmap scaleBitmapDown(final Bitmap bitmap) {
+ double scaleRatio = -1;
- /**
- * Return the most vibrant {@link Palette.Swatch}
- */
- public Palette.Swatch getVibrantSwatch() {
- return null;
- }
+ if (mResizeArea > 0) {
+ final int bitmapArea = bitmap.getWidth() * bitmap.getHeight();
+ if (bitmapArea > mResizeArea) {
+ scaleRatio = mResizeArea / (double) bitmapArea;
+ }
+ } else if (mResizeMaxDimension > 0) {
+ final int maxDimension = Math.max(bitmap.getWidth(), bitmap.getHeight());
+ if (maxDimension > mResizeMaxDimension) {
+ scaleRatio = mResizeMaxDimension / (double) maxDimension;
+ }
+ }
- /**
- * Return a light and vibrant {@link Palette.Swatch}
- */
- public Palette.Swatch getLightVibrantSwatch() {
- return null;
- }
+ if (scaleRatio <= 0) {
+ // Scaling has been disabled or not needed so just return the Bitmap
+ return bitmap;
+ }
- /**
- * Return a dark and vibrant {@link Palette.Swatch}
- */
- public Palette.Swatch getDarkVibrantSwatch() {
- return null;
- }
-
- /**
- * Return a muted {@link Palette.Swatch}
- */
- public Palette.Swatch getMutedSwatch() {
- return null;
- }
-
- /**
- * Return a muted and light {@link Palette.Swatch}
- */
- public Palette.Swatch getLightMutedSwatch() {
- return null;
- }
-
- /**
- * Return a muted and dark {@link Palette.Swatch}
- */
- public Palette.Swatch getDarkMutedSwatch() {
- return null;
+ return Bitmap.createScaledBitmap(bitmap,
+ (int) Math.ceil(bitmap.getWidth() * scaleRatio),
+ (int) Math.ceil(bitmap.getHeight() * scaleRatio),
+ false);
}
}
diff --git a/v7/palette/src/main/java/android/support/v7/graphics/Target.java b/v7/palette/src/main/java/android/support/v7/graphics/Target.java
new file mode 100644
index 0000000..8ac8205
--- /dev/null
+++ b/v7/palette/src/main/java/android/support/v7/graphics/Target.java
@@ -0,0 +1,381 @@
+/*
+ * Copyright 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.support.v7.graphics;
+
+import android.support.annotation.FloatRange;
+
+/**
+ * A class which allows custom selection of colors in a {@link Palette}'s generation. Instances
+ * can be created via the {@link Builder} class.
+ *
+ * <p>To use the target, use the {@link Palette.Builder#addTarget(Target)} API when building a
+ * Palette.</p>
+ */
+public final class Target {
+
+ private static final float TARGET_DARK_LUMA = 0.26f;
+ private static final float MAX_DARK_LUMA = 0.45f;
+
+ private static final float MIN_LIGHT_LUMA = 0.55f;
+ private static final float TARGET_LIGHT_LUMA = 0.74f;
+
+ private static final float MIN_NORMAL_LUMA = 0.3f;
+ private static final float TARGET_NORMAL_LUMA = 0.5f;
+ private static final float MAX_NORMAL_LUMA = 0.7f;
+
+ private static final float TARGET_MUTED_SATURATION = 0.3f;
+ private static final float MAX_MUTED_SATURATION = 0.4f;
+
+ private static final float TARGET_VIBRANT_SATURATION = 1f;
+ private static final float MIN_VIBRANT_SATURATION = 0.35f;
+
+ private static final float WEIGHT_SATURATION = 0.24f;
+ private static final float WEIGHT_LUMA = 0.52f;
+ private static final float WEIGHT_POPULATION = 0.24f;
+
+ private static final int INDEX_MIN = 0;
+ private static final int INDEX_TARGET = 1;
+ private static final int INDEX_MAX = 2;
+
+ private static final int INDEX_WEIGHT_SAT = 0;
+ private static final int INDEX_WEIGHT_LUMA = 1;
+ private static final int INDEX_WEIGHT_POP = 2;
+
+ /**
+ * A target which has the characteristics of a vibrant color which is light in luminance.
+ */
+ public static final Target LIGHT_VIBRANT;
+
+ /**
+ * A target which has the characteristics of a vibrant color which is neither light or dark.
+ */
+ public static final Target VIBRANT;
+
+ /**
+ * A target which has the characteristics of a vibrant color which is dark in luminance.
+ */
+ public static final Target DARK_VIBRANT;
+
+ /**
+ * A target which has the characteristics of a muted color which is light in luminance.
+ */
+ public static final Target LIGHT_MUTED;
+
+ /**
+ * A target which has the characteristics of a muted color which is neither light or dark.
+ */
+ public static final Target MUTED;
+
+ /**
+ * A target which has the characteristics of a muted color which is dark in luminance.
+ */
+ public static final Target DARK_MUTED;
+
+ static {
+ LIGHT_VIBRANT = new Target();
+ setDefaultLightLightnessValues(LIGHT_VIBRANT);
+ setDefaultVibrantSaturationValues(LIGHT_VIBRANT);
+
+ VIBRANT = new Target();
+ setDefaultNormalLightnessValues(VIBRANT);
+ setDefaultVibrantSaturationValues(VIBRANT);
+
+ DARK_VIBRANT = new Target();
+ setDefaultDarkLightnessValues(DARK_VIBRANT);
+ setDefaultVibrantSaturationValues(DARK_VIBRANT);
+
+ LIGHT_MUTED = new Target();
+ setDefaultLightLightnessValues(LIGHT_MUTED);
+ setDefaultMutedSaturationValues(LIGHT_MUTED);
+
+ MUTED = new Target();
+ setDefaultNormalLightnessValues(MUTED);
+ setDefaultMutedSaturationValues(MUTED);
+
+ DARK_MUTED = new Target();
+ setDefaultDarkLightnessValues(DARK_MUTED);
+ setDefaultMutedSaturationValues(DARK_MUTED);
+ }
+
+ private final float[] mSaturationTargets = new float[3];
+ private final float[] mLightnessTargets = new float[3];
+ private final float[] mWeights = new float[3];
+ private boolean mIsExclusive = true; // default to true
+
+ private Target() {
+ setTargetDefaultValues(mSaturationTargets);
+ setTargetDefaultValues(mLightnessTargets);
+ setDefaultWeights();
+ }
+
+ private Target(Target from) {
+ System.arraycopy(from.mSaturationTargets, 0, mSaturationTargets, 0,
+ mSaturationTargets.length);
+ System.arraycopy(from.mLightnessTargets, 0, mLightnessTargets, 0,
+ mLightnessTargets.length);
+ System.arraycopy(from.mWeights, 0, mWeights, 0, mWeights.length);
+ }
+
+ /**
+ * The minimum saturation value for this target.
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getMinimumSaturation() {
+ return mSaturationTargets[INDEX_MIN];
+ }
+
+ /**
+ * The target saturation value for this target.
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getTargetSaturation() {
+ return mSaturationTargets[INDEX_TARGET];
+ }
+
+ /**
+ * The maximum saturation value for this target.
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getMaximumSaturation() {
+ return mSaturationTargets[INDEX_MAX];
+ }
+
+ /**
+ * The minimum lightness value for this target.
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getMinimumLightness() {
+ return mLightnessTargets[INDEX_MIN];
+ }
+
+ /**
+ * The target lightness value for this target.
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getTargetLightness() {
+ return mLightnessTargets[INDEX_TARGET];
+ }
+
+ /**
+ * The maximum lightness value for this target.
+ */
+ @FloatRange(from = 0, to = 1)
+ public float getMaximumLightness() {
+ return mLightnessTargets[INDEX_MAX];
+ }
+
+ /**
+ * The weight of important that a color's saturation value has on selection.
+ */
+ public float getSaturationWeight() {
+ return mWeights[INDEX_WEIGHT_SAT];
+ }
+
+ /**
+ * The weight of important that a color's lightness value has on selection.
+ */
+ public float getLightnessWeight() {
+ return mWeights[INDEX_WEIGHT_LUMA];
+ }
+
+ /**
+ * The weight of important that a color's population value has on selection.
+ */
+ public float getPopulationWeight() {
+ return mWeights[INDEX_WEIGHT_POP];
+ }
+
+ /**
+ * Returns whether any color selected for this target is exclusive for this target only.
+ *
+ * <p>If false, then the color can be selected for other targets.</p>
+ */
+ public boolean isExclusive() {
+ return mIsExclusive;
+ }
+
+ private static void setTargetDefaultValues(final float[] values) {
+ values[INDEX_MIN] = 0f;
+ values[INDEX_TARGET] = 0.5f;
+ values[INDEX_MAX] = 1f;
+ }
+
+ private void setDefaultWeights() {
+ mWeights[INDEX_WEIGHT_SAT] = WEIGHT_SATURATION;
+ mWeights[INDEX_WEIGHT_LUMA] = WEIGHT_LUMA;
+ mWeights[INDEX_WEIGHT_POP] = WEIGHT_POPULATION;
+ }
+
+ void normalizeWeights() {
+ float sum = 0;
+ for (int i = 0, z = mWeights.length; i < z; i++) {
+ float weight = mWeights[i];
+ if (weight > 0) {
+ sum += weight;
+ }
+ }
+ if (sum != 0) {
+ for (int i = 0, z = mWeights.length; i < z; i++) {
+ if (mWeights[i] > 0) {
+ mWeights[i] /= sum;
+ }
+ }
+ }
+ }
+
+ private static void setDefaultDarkLightnessValues(Target target) {
+ target.mLightnessTargets[INDEX_TARGET] = TARGET_DARK_LUMA;
+ target.mLightnessTargets[INDEX_MAX] = MAX_DARK_LUMA;
+ }
+
+ private static void setDefaultNormalLightnessValues(Target target) {
+ target.mLightnessTargets[INDEX_MIN] = MIN_NORMAL_LUMA;
+ target.mLightnessTargets[INDEX_TARGET] = TARGET_NORMAL_LUMA;
+ target.mLightnessTargets[INDEX_MAX] = MAX_NORMAL_LUMA;
+ }
+
+ private static void setDefaultLightLightnessValues(Target target) {
+ target.mLightnessTargets[INDEX_MIN] = MIN_LIGHT_LUMA;
+ target.mLightnessTargets[INDEX_TARGET] = TARGET_LIGHT_LUMA;
+ }
+
+ private static void setDefaultVibrantSaturationValues(Target target) {
+ target.mSaturationTargets[INDEX_MIN] = MIN_VIBRANT_SATURATION;
+ target.mSaturationTargets[INDEX_TARGET] = TARGET_VIBRANT_SATURATION;
+ }
+
+ private static void setDefaultMutedSaturationValues(Target target) {
+ target.mSaturationTargets[INDEX_TARGET] = TARGET_MUTED_SATURATION;
+ target.mSaturationTargets[INDEX_MAX] = MAX_MUTED_SATURATION;
+ }
+
+ /**
+ * Builder class for generating custom {@link Target} instances.
+ */
+ public final static class Builder {
+ private final Target mTarget;
+
+ /**
+ * Create a new {@link Target} builder from scratch.
+ */
+ public Builder() {
+ mTarget = new Target();
+ }
+
+ /**
+ * Create a new builder based on an existing {@link Target}.
+ */
+ public Builder(Target target) {
+ mTarget = new Target(target);
+ }
+
+ /**
+ * Set the minimum saturation value for this target.
+ */
+ public Builder setMinimumSaturation(@FloatRange(from = 0, to = 1) float value) {
+ mTarget.mSaturationTargets[INDEX_MIN] = value;
+ return this;
+ }
+
+ /**
+ * Set the target/ideal saturation value for this target.
+ */
+ public Builder setTargetSaturation(@FloatRange(from = 0, to = 1) float value) {
+ mTarget.mSaturationTargets[INDEX_TARGET] = value;
+ return this;
+ }
+
+ /**
+ * Set the maximum saturation value for this target.
+ */
+ public Builder setMaximumSaturation(@FloatRange(from = 0, to = 1) float value) {
+ mTarget.mSaturationTargets[INDEX_MAX] = value;
+ return this;
+ }
+
+ /**
+ * Set the minimum lightness value for this target.
+ */
+ public Builder setMinimumLightness(@FloatRange(from = 0, to = 1) float value) {
+ mTarget.mLightnessTargets[INDEX_MIN] = value;
+ return this;
+ }
+
+ /**
+ * Set the target/ideal lightness value for this target.
+ */
+ public Builder setTargetLightness(@FloatRange(from = 0, to = 1) float value) {
+ mTarget.mLightnessTargets[INDEX_TARGET] = value;
+ return this;
+ }
+
+ /**
+ * Set the maximum lightness value for this target.
+ */
+ public Builder setMaximumLightness(@FloatRange(from = 0, to = 1) float value) {
+ mTarget.mLightnessTargets[INDEX_MAX] = value;
+ return this;
+ }
+
+ /**
+ * Set the weight of important that a color's saturation value has on selection. A weight
+ * of <= 0 means that it has no weight and is ignored.
+ */
+ public Builder setSaturationWeight(@FloatRange(from = 0) float weight) {
+ mTarget.mWeights[INDEX_WEIGHT_SAT] = weight;
+ return this;
+ }
+
+ /**
+ * Set the weight of important that a color's lightness value has on selection. A weight
+ * of <= 0 means that it has no weight and is ignored.
+ */
+ public Builder setLightnessWeight(@FloatRange(from = 0) float weight) {
+ mTarget.mWeights[INDEX_WEIGHT_LUMA] = weight;
+ return this;
+ }
+
+ /**
+ * Set the weight of important that a color's population value has on selection. A weight
+ * of <= 0 means that it has no weight and is ignored.
+ */
+ public Builder setPopulationWeight(@FloatRange(from = 0) float weight) {
+ mTarget.mWeights[INDEX_WEIGHT_POP] = weight;
+ return this;
+ }
+
+ /**
+ * Set whether any color selected for this target is exclusive to this target only.
+ * Defaults to true.
+ *
+ * @param exclusive true if any the color is exclusive to this target, or false is the
+ * color can be selected for other targets.
+ */
+ public Builder setExclusive(boolean exclusive) {
+ mTarget.mIsExclusive = exclusive;
+ return this;
+ }
+
+ /**
+ * Builds and returns the resulting {@link Target}.
+ */
+ public Target build() {
+ return mTarget;
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
index be99130..221d3ea 100644
--- a/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
+++ b/v7/preference/src/android/support/v7/preference/PreferenceFragmentCompat.java
@@ -55,7 +55,7 @@
* hierarchy. Furthermore, subsequent {@link PreferenceScreen} in the hierarchy
* denote a screen break--that is the preferences contained within subsequent
* {@link PreferenceScreen} should be shown on another screen. The preference
- * framework handles showing these other screens from the preference hierarchy.
+ * framework handles this by calling {@link #onNavigateToScreen(PreferenceScreen)}.
* <p>
* The preference hierarchy can be formed in multiple ways:
* <li> From an XML file specifying the hierarchy
diff --git a/v7/recyclerview/build.gradle b/v7/recyclerview/build.gradle
index 25b686d..c9f1a22 100644
--- a/v7/recyclerview/build.gradle
+++ b/v7/recyclerview/build.gradle
@@ -78,6 +78,17 @@
artifacts.add('archives', sourcesJarTask);
}
+// TODO make this generic for all projects
+afterEvaluate {
+ def originalTask = tasks['packageDebugAndroidTest']
+ tasks['assembleDebugAndroidTest'].doLast {
+ copy {
+ from(originalTask.outputFile)
+ into(rootProject.ext.testApkDistOut)
+ }
+ }
+}
+
uploadArchives {
repositories {
mavenDeployer {
diff --git a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java b/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
index 910405a..7dcaea0 100644
--- a/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
+++ b/v7/recyclerview/src/android/support/v7/widget/GridLayoutManager.java
@@ -303,11 +303,31 @@
if (state.getItemCount() > 0 && !state.isPreLayout()) {
ensureAnchorIsInFirstSpan(recycler, state, anchorInfo);
}
+ ensureViewSet();
+ }
+
+ private void ensureViewSet() {
if (mSet == null || mSet.length != mSpanCount) {
mSet = new View[mSpanCount];
}
}
+ @Override
+ public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler,
+ RecyclerView.State state) {
+ updateMeasurements();
+ ensureViewSet();
+ return super.scrollHorizontallyBy(dx, recycler, state);
+ }
+
+ @Override
+ public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler,
+ RecyclerView.State state) {
+ updateMeasurements();
+ ensureViewSet();
+ return super.scrollVerticallyBy(dy, recycler, state);
+ }
+
private void ensureAnchorIsInFirstSpan(RecyclerView.Recycler recycler, RecyclerView.State state,
AnchorInfo anchorInfo) {
int span = getSpanIndex(recycler, state, anchorInfo.mPosition);
diff --git a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
index 3a39f3d..6192c66 100644
--- a/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
+++ b/v7/recyclerview/tests/src/android/support/v7/widget/GridLayoutManagerTest.java
@@ -20,6 +20,7 @@
import android.graphics.Rect;
import android.support.v4.view.AccessibilityDelegateCompat;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
+import android.test.UiThreadTest;
import android.util.Log;
import android.util.SparseIntArray;
import android.view.View;
@@ -85,6 +86,27 @@
mGlm.waitForLayout(2);
}
+ @UiThreadTest
+ public void testScrollWithoutLayout() throws Throwable {
+ final RecyclerView recyclerView = setupBasic(new Config(3, 100));
+ mGlm.expectLayout(1);
+ setRecyclerView(recyclerView);
+ mGlm.setSpanCount(5);
+ recyclerView.scrollBy(0, 10);
+ }
+
+ public void testScrollWithoutLayoutAfterInvalidate() throws Throwable {
+ final RecyclerView recyclerView = setupBasic(new Config(3, 100));
+ waitForFirstLayout(recyclerView);
+ runTestOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ mGlm.setSpanCount(5);
+ recyclerView.scrollBy(0, 10);
+ }
+ });
+ }
+
public void testPredictiveSpanLookup1() throws Throwable {
predictiveSpanLookupTest(0, false);
}