Merge "Respect the autoMirror attr on drawable to flip horizontally" into qt-dev

This commit is contained in:
TreeHugger Robot
2019-04-09 22:01:17 +00:00
committed by Android (Google) Code Review
5 changed files with 31 additions and 13 deletions

View File

@@ -17,6 +17,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp" android:width="28dp"
android:height="28dp" android:height="28dp"
android:autoMirrored="true"
android:viewportWidth="28" android:viewportWidth="28"
android:viewportHeight="28"> android:viewportHeight="28">

View File

@@ -17,6 +17,7 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" <vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="28dp" android:width="28dp"
android:height="28dp" android:height="28dp"
android:autoMirrored="true"
android:viewportWidth="28" android:viewportWidth="28"
android:viewportHeight="28"> android:viewportHeight="28">
<path <path

View File

@@ -507,9 +507,7 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
final boolean useAltBack = final boolean useAltBack =
(mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0; (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_BACK_ALT) != 0;
final boolean isRtl = mConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL; final boolean isRtl = mConfiguration.getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
float degrees = useAltBack float degrees = useAltBack ? (isRtl ? 90 : -90) : 0;
? (isRtl ? 270 : -90)
: (isRtl ? 180 : 0);
if (drawable.getRotation() == degrees) { if (drawable.getRotation() == degrees) {
return; return;
} }

View File

@@ -37,6 +37,7 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.FloatProperty; import android.util.FloatProperty;
import android.view.ContextThemeWrapper; import android.view.ContextThemeWrapper;
import android.view.View;
import com.android.settingslib.Utils; import com.android.settingslib.Utils;
import com.android.systemui.R; import com.android.systemui.R;
@@ -79,9 +80,10 @@ public class KeyButtonDrawable extends Drawable {
private final ShadowDrawableState mState; private final ShadowDrawableState mState;
private AnimatedVectorDrawable mAnimatedDrawable; private AnimatedVectorDrawable mAnimatedDrawable;
public KeyButtonDrawable(Drawable d, @ColorInt int lightColor, @ColorInt int darkColor) { public KeyButtonDrawable(Drawable d, @ColorInt int lightColor, @ColorInt int darkColor,
boolean horizontalFlip) {
this(d, new ShadowDrawableState(lightColor, darkColor, this(d, new ShadowDrawableState(lightColor, darkColor,
d instanceof AnimatedVectorDrawable)); d instanceof AnimatedVectorDrawable, horizontalFlip));
} }
private KeyButtonDrawable(Drawable d, ShadowDrawableState state) { private KeyButtonDrawable(Drawable d, ShadowDrawableState state) {
@@ -282,7 +284,12 @@ public class KeyButtonDrawable extends Drawable {
// Call mutate, so that the pixel allocation by the underlying vector drawable is cleared. // Call mutate, so that the pixel allocation by the underlying vector drawable is cleared.
final Drawable d = mState.mChildState.newDrawable().mutate(); final Drawable d = mState.mChildState.newDrawable().mutate();
setDrawableBounds(d); setDrawableBounds(d);
canvas.save();
if (mState.mHorizontalFlip) {
canvas.scale(-1f, 1f, width * 0.5f, height * 0.5f);
}
d.draw(canvas); d.draw(canvas);
canvas.restore();
if (mState.mIsHardwareBitmap) { if (mState.mIsHardwareBitmap) {
bitmap = bitmap.copy(Bitmap.Config.HARDWARE, false); bitmap = bitmap.copy(Bitmap.Config.HARDWARE, false);
@@ -305,7 +312,12 @@ public class KeyButtonDrawable extends Drawable {
// Call mutate, so that the pixel allocation by the underlying vector drawable is cleared. // Call mutate, so that the pixel allocation by the underlying vector drawable is cleared.
final Drawable d = mState.mChildState.newDrawable().mutate(); final Drawable d = mState.mChildState.newDrawable().mutate();
setDrawableBounds(d); setDrawableBounds(d);
canvas.save();
if (mState.mHorizontalFlip) {
canvas.scale(-1f, 1f, width * 0.5f, height * 0.5f);
}
d.draw(canvas); d.draw(canvas);
canvas.restore();
// Draws the shadow from original drawable // Draws the shadow from original drawable
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
@@ -357,6 +369,7 @@ public class KeyButtonDrawable extends Drawable {
int mShadowColor; int mShadowColor;
float mDarkIntensity; float mDarkIntensity;
int mAlpha; int mAlpha;
boolean mHorizontalFlip;
boolean mIsHardwareBitmap; boolean mIsHardwareBitmap;
Bitmap mLastDrawnIcon; Bitmap mLastDrawnIcon;
@@ -368,11 +381,12 @@ public class KeyButtonDrawable extends Drawable {
final boolean mSupportsAnimation; final boolean mSupportsAnimation;
public ShadowDrawableState(@ColorInt int lightColor, @ColorInt int darkColor, public ShadowDrawableState(@ColorInt int lightColor, @ColorInt int darkColor,
boolean animated) { boolean animated, boolean horizontalFlip) {
mLightColor = lightColor; mLightColor = lightColor;
mDarkColor = darkColor; mDarkColor = darkColor;
mSupportsAnimation = animated; mSupportsAnimation = animated;
mAlpha = 255; mAlpha = 255;
mHorizontalFlip = horizontalFlip;
} }
@Override @Override
@@ -400,7 +414,7 @@ public class KeyButtonDrawable extends Drawable {
* @return KeyButtonDrawable * @return KeyButtonDrawable
*/ */
public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon, public static KeyButtonDrawable create(@NonNull Context ctx, @DrawableRes int icon,
boolean hasShadow) { boolean hasShadow) {
final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme); final int dualToneDarkTheme = Utils.getThemeAttr(ctx, R.attr.darkIconTheme);
final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme); final int dualToneLightTheme = Utils.getThemeAttr(ctx, R.attr.lightIconTheme);
Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme); Context lightContext = new ContextThemeWrapper(ctx, dualToneLightTheme);
@@ -409,7 +423,7 @@ public class KeyButtonDrawable extends Drawable {
} }
public static KeyButtonDrawable create(Context lightContext, Context darkContext, public static KeyButtonDrawable create(Context lightContext, Context darkContext,
@DrawableRes int iconResId, boolean hasShadow) { @DrawableRes int iconResId, boolean hasShadow) {
return create(lightContext, return create(lightContext,
Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor), Utils.getColorAttrDefaultColor(lightContext, R.attr.singleToneColor),
Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor), Utils.getColorAttrDefaultColor(darkContext, R.attr.singleToneColor),
@@ -418,10 +432,12 @@ public class KeyButtonDrawable extends Drawable {
public static KeyButtonDrawable create(Context context, @ColorInt int lightColor, public static KeyButtonDrawable create(Context context, @ColorInt int lightColor,
@ColorInt int darkColor, @DrawableRes int iconResId, boolean hasShadow) { @ColorInt int darkColor, @DrawableRes int iconResId, boolean hasShadow) {
final KeyButtonDrawable drawable = new KeyButtonDrawable(context.getDrawable(iconResId), final Resources res = context.getResources();
lightColor, darkColor); boolean isRtl = res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL;
Drawable d = context.getDrawable(iconResId);
final KeyButtonDrawable drawable = new KeyButtonDrawable(d, lightColor, darkColor,
isRtl && d.isAutoMirrored());
if (hasShadow) { if (hasShadow) {
final Resources res = context.getResources();
int offsetX = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_x); int offsetX = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_x);
int offsetY = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_y); int offsetY = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_offset_y);
int radius = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_radius); int radius = res.getDimensionPixelSize(R.dimen.nav_key_button_shadow_radius);

View File

@@ -179,8 +179,10 @@ public class NavigationBarContextTest extends SysuiTestCase {
final int unusedColor = 0; final int unusedColor = 0;
final Drawable d = mock(Drawable.class); final Drawable d = mock(Drawable.class);
final ContextualButton button = spy(mBtn0); final ContextualButton button = spy(mBtn0);
final KeyButtonDrawable kbd1 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor)); final KeyButtonDrawable kbd1 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor,
final KeyButtonDrawable kbd2 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor)); false /* horizontalFlip */));
final KeyButtonDrawable kbd2 = spy(new KeyButtonDrawable(d, unusedColor, unusedColor,
false /* horizontalFlip */));
kbd1.setDarkIntensity(TEST_DARK_INTENSITY); kbd1.setDarkIntensity(TEST_DARK_INTENSITY);
kbd2.setDarkIntensity(0f); kbd2.setDarkIntensity(0f);