Loading packages/SystemUI/res/values/config.xml +1 −1 Original line number Diff line number Diff line Loading @@ -331,7 +331,7 @@ <!-- Nav bar button default ordering/layout --> <string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string> <string name="config_navBarLayoutQuickstep" translatable="false">back[1.7WC];home;contextual[1.7WC]</string> <string name="config_navBarLayoutHandle" translatable="false">start_contextual[.1WC];home_handle;ime_switcher[.1WC]</string> <string name="config_navBarLayoutHandle" translatable="false">start_contextual[40AC];home_handle;ime_switcher[40AC]</string> <bool name="quick_settings_show_full_alarm">false</bool> Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +22 −7 Original line number Diff line number Diff line Loading @@ -84,6 +84,8 @@ public class NavigationBarInflaterView extends FrameLayout public static final String KEY_CODE_END = ")"; private static final String WEIGHT_SUFFIX = "W"; private static final String WEIGHT_CENTERED_SUFFIX = "WC"; private static final String ABSOLUTE_SUFFIX = "A"; private static final String ABSOLUTE_VERTICAL_CENTERED_SUFFIX = "C"; private final List<NavBarButtonProvider> mPlugins = new ArrayList<>(); Loading Loading @@ -353,17 +355,20 @@ public class NavigationBarInflaterView extends FrameLayout String sizeStr = extractSize(buttonSpec); if (sizeStr == null) return v; if (sizeStr.contains(WEIGHT_SUFFIX)) { if (sizeStr.contains(WEIGHT_SUFFIX) || sizeStr.contains(ABSOLUTE_SUFFIX)) { // To support gravity, wrap in RelativeLayout and apply gravity to it. // Children wanting to use gravity must be smaller then the frame. float weight = Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX))); ReverseRelativeLayout frame = new ReverseRelativeLayout(mContext); LayoutParams childParams = new LayoutParams(v.getLayoutParams()); // Compute gravity to apply int gravity = (landscape) ? (start ? Gravity.TOP : Gravity.BOTTOM) : (start ? Gravity.START : Gravity.END); if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) gravity = Gravity.CENTER; if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) { gravity = Gravity.CENTER; } else if (sizeStr.endsWith(ABSOLUTE_VERTICAL_CENTERED_SUFFIX)) { gravity = Gravity.CENTER_VERTICAL; } // Set default gravity, flipped if needed in reversed layouts (270 RTL and 90 LTR) frame.setDefaultGravity(gravity); Loading @@ -371,8 +376,16 @@ public class NavigationBarInflaterView extends FrameLayout frame.addView(v, childParams); if (sizeStr.contains(WEIGHT_SUFFIX)) { // Use weighting to set the width of the frame float weight = Float.parseFloat( sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX))); frame.setLayoutParams(new LinearLayout.LayoutParams(0, MATCH_PARENT, weight)); } else { int width = (int) convertDpToPx(mContext, Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(ABSOLUTE_SUFFIX)))); frame.setLayoutParams(new LinearLayout.LayoutParams(width, MATCH_PARENT)); } // Ensure ripples can be drawn outside bounds frame.setClipChildren(false); Loading Loading @@ -490,8 +503,6 @@ public class NavigationBarInflaterView extends FrameLayout } } private void clearViews() { if (mButtonDispatchers != null) { for (int i = 0; i < mButtonDispatchers.size(); i++) { Loading @@ -508,6 +519,10 @@ public class NavigationBarInflaterView extends FrameLayout } } private static float convertDpToPx(Context context, float dp) { return dp * context.getResources().getDisplayMetrics().density; } @Override public void onPluginConnected(NavBarButtonProvider plugin, Context context) { mPlugins.add(plugin); Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java +9 −7 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.util.FloatProperty; Loading Loading @@ -79,7 +78,6 @@ public class KeyButtonDrawable extends Drawable { private final Paint mIconPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private final Paint mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private final ShadowDrawableState mState; private AnimatedVectorDrawable mAnimatedDrawable; Loading @@ -101,7 +99,6 @@ public class KeyButtonDrawable extends Drawable { mAnimatedDrawable = (AnimatedVectorDrawable) mState.mChildState.newDrawable().mutate(); setDrawableBounds(mAnimatedDrawable); } mOvalBgPaint.setColor(mState.mDarkColor); } public void setDarkIntensity(float intensity) { Loading Loading @@ -215,6 +212,15 @@ public class KeyButtonDrawable extends Drawable { return mState.mBaseWidth + (mState.mShadowSize + Math.abs(mState.mShadowOffsetX)) * 2; } /** Return if the drawable has oval background. */ public boolean hasOvalBg() { return mState.mHasOvalBg; } public int getDarkColor() { return mState.mDarkColor; } public boolean canAnimate() { return mState.mSupportsAnimation; } Loading Loading @@ -244,10 +250,6 @@ public class KeyButtonDrawable extends Drawable { return; } if (mState.mHasOvalBg) { canvas.drawOval(new RectF(bounds), mOvalBgPaint); } if (mAnimatedDrawable != null) { mAnimatedDrawable.draw(canvas); } else { Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java +30 −5 Original line number Diff line number Diff line Loading @@ -73,6 +73,13 @@ public class KeyButtonRipple extends Drawable { private final HashSet<Animator> mRunningAnimations = new HashSet<>(); private final ArrayList<Animator> mTmpArray = new ArrayList<>(); public enum Type { OVAL, ROUNDED_RECT } private Type mType = Type.ROUNDED_RECT; public KeyButtonRipple(Context ctx, View targetView) { mMaxWidth = ctx.getResources().getDimensionPixelSize(R.dimen.key_button_ripple_max_width); mTargetView = targetView; Loading @@ -86,6 +93,10 @@ public class KeyButtonRipple extends Drawable { mDelayTouchFeedback = delay; } public void setType(Type type) { mType = type; } private Paint getRipplePaint() { if (mRipplePaint == null) { mRipplePaint = new Paint(); Loading @@ -111,9 +122,15 @@ public class KeyButtonRipple extends Drawable { final float ry = horizontal ? cy : radius; final float corner = horizontal ? cy : cx; canvas.drawRoundRect(cx - rx, cy - ry, cx + rx, cy + ry, corner, corner, p); if (mType == Type.ROUNDED_RECT) { canvas.drawRoundRect(cx - rx, cy - ry, cx + rx, cy + ry, corner, corner, p); } else { canvas.save(); canvas.translate(cx, cy); float r = Math.min(rx, ry); canvas.drawOval(-r, -r, r, r, p); canvas.restore(); } } } Loading Loading @@ -148,8 +165,16 @@ public class KeyButtonRipple extends Drawable { private void drawHardware(RecordingCanvas c) { if (mDrawingHardwareGlow) { if (mType == Type.ROUNDED_RECT) { c.drawRoundRect(mLeftProp, mTopProp, mRightProp, mBottomProp, mRxProp, mRyProp, mPaintProp); } else { CanvasProperty<Float> cx = CanvasProperty.createFloat(getBounds().width() / 2); CanvasProperty<Float> cy = CanvasProperty.createFloat(getBounds().height() / 2); int d = Math.min(getBounds().width(), getBounds().height()); CanvasProperty<Float> r = CanvasProperty.createFloat(1.0f * d / 2); c.drawCircle(cx, cy, r, mPaintProp); } } } Loading packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +28 −3 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ import android.app.ActivityManager; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.hardware.input.InputManager; Loading Loading @@ -76,6 +78,8 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private final OverviewProxyService mOverviewProxyService; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private final InputManager mInputManager; private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private boolean mHasOvalBg = false; private final Runnable mCheckLongPress = new Runnable() { public void run() { Loading Loading @@ -127,6 +131,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { mOverviewProxyService = Dependency.get(OverviewProxyService.class); mInputManager = manager; setBackground(mRipple); setWillNotDraw(false); forceHasOverlappingRendering(false); } Loading Loading @@ -357,7 +362,14 @@ public class KeyButtonView extends ImageView implements ButtonInterface { public void setDarkIntensity(float darkIntensity) { Drawable drawable = getDrawable(); if (drawable != null) { ((KeyButtonDrawable) getDrawable()).setDarkIntensity(darkIntensity); KeyButtonDrawable keyButtonDrawable = (KeyButtonDrawable) drawable; keyButtonDrawable.setDarkIntensity(darkIntensity); mHasOvalBg = keyButtonDrawable.hasOvalBg(); if (mHasOvalBg) { mOvalBgPaint.setColor(keyButtonDrawable.getDarkColor()); } mRipple.setType(keyButtonDrawable.hasOvalBg() ? KeyButtonRipple.Type.OVAL : KeyButtonRipple.Type.ROUNDED_RECT); // Since we reuse the same drawable for multiple views, we need to invalidate the view // manually. Loading @@ -371,10 +383,23 @@ public class KeyButtonView extends ImageView implements ButtonInterface { mRipple.setDelayTouchFeedback(shouldDelay); } @Override public void draw(Canvas canvas) { if (mHasOvalBg) { canvas.save(); int cx = (getLeft() + getRight()) / 2; int cy = (getTop() + getBottom()) / 2; canvas.translate(cx, cy); int d = Math.min(getWidth(), getHeight()); int r = d / 2; canvas.drawOval(-r, -r, r, r, mOvalBgPaint); canvas.restore(); } super.draw(canvas); } @Override public void setVertical(boolean vertical) { mIsVertical = vertical; } } Loading
packages/SystemUI/res/values/config.xml +1 −1 Original line number Diff line number Diff line Loading @@ -331,7 +331,7 @@ <!-- Nav bar button default ordering/layout --> <string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string> <string name="config_navBarLayoutQuickstep" translatable="false">back[1.7WC];home;contextual[1.7WC]</string> <string name="config_navBarLayoutHandle" translatable="false">start_contextual[.1WC];home_handle;ime_switcher[.1WC]</string> <string name="config_navBarLayoutHandle" translatable="false">start_contextual[40AC];home_handle;ime_switcher[40AC]</string> <bool name="quick_settings_show_full_alarm">false</bool> Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +22 −7 Original line number Diff line number Diff line Loading @@ -84,6 +84,8 @@ public class NavigationBarInflaterView extends FrameLayout public static final String KEY_CODE_END = ")"; private static final String WEIGHT_SUFFIX = "W"; private static final String WEIGHT_CENTERED_SUFFIX = "WC"; private static final String ABSOLUTE_SUFFIX = "A"; private static final String ABSOLUTE_VERTICAL_CENTERED_SUFFIX = "C"; private final List<NavBarButtonProvider> mPlugins = new ArrayList<>(); Loading Loading @@ -353,17 +355,20 @@ public class NavigationBarInflaterView extends FrameLayout String sizeStr = extractSize(buttonSpec); if (sizeStr == null) return v; if (sizeStr.contains(WEIGHT_SUFFIX)) { if (sizeStr.contains(WEIGHT_SUFFIX) || sizeStr.contains(ABSOLUTE_SUFFIX)) { // To support gravity, wrap in RelativeLayout and apply gravity to it. // Children wanting to use gravity must be smaller then the frame. float weight = Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX))); ReverseRelativeLayout frame = new ReverseRelativeLayout(mContext); LayoutParams childParams = new LayoutParams(v.getLayoutParams()); // Compute gravity to apply int gravity = (landscape) ? (start ? Gravity.TOP : Gravity.BOTTOM) : (start ? Gravity.START : Gravity.END); if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) gravity = Gravity.CENTER; if (sizeStr.endsWith(WEIGHT_CENTERED_SUFFIX)) { gravity = Gravity.CENTER; } else if (sizeStr.endsWith(ABSOLUTE_VERTICAL_CENTERED_SUFFIX)) { gravity = Gravity.CENTER_VERTICAL; } // Set default gravity, flipped if needed in reversed layouts (270 RTL and 90 LTR) frame.setDefaultGravity(gravity); Loading @@ -371,8 +376,16 @@ public class NavigationBarInflaterView extends FrameLayout frame.addView(v, childParams); if (sizeStr.contains(WEIGHT_SUFFIX)) { // Use weighting to set the width of the frame float weight = Float.parseFloat( sizeStr.substring(0, sizeStr.indexOf(WEIGHT_SUFFIX))); frame.setLayoutParams(new LinearLayout.LayoutParams(0, MATCH_PARENT, weight)); } else { int width = (int) convertDpToPx(mContext, Float.parseFloat(sizeStr.substring(0, sizeStr.indexOf(ABSOLUTE_SUFFIX)))); frame.setLayoutParams(new LinearLayout.LayoutParams(width, MATCH_PARENT)); } // Ensure ripples can be drawn outside bounds frame.setClipChildren(false); Loading Loading @@ -490,8 +503,6 @@ public class NavigationBarInflaterView extends FrameLayout } } private void clearViews() { if (mButtonDispatchers != null) { for (int i = 0; i < mButtonDispatchers.size(); i++) { Loading @@ -508,6 +519,10 @@ public class NavigationBarInflaterView extends FrameLayout } } private static float convertDpToPx(Context context, float dp) { return dp * context.getResources().getDisplayMetrics().density; } @Override public void onPluginConnected(NavBarButtonProvider plugin, Context context) { mPlugins.add(plugin); Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonDrawable.java +9 −7 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ import android.graphics.PorterDuff; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffColorFilter; import android.graphics.Rect; import android.graphics.RectF; import android.graphics.drawable.AnimatedVectorDrawable; import android.graphics.drawable.Drawable; import android.util.FloatProperty; Loading Loading @@ -79,7 +78,6 @@ public class KeyButtonDrawable extends Drawable { private final Paint mIconPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private final Paint mShadowPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private final ShadowDrawableState mState; private AnimatedVectorDrawable mAnimatedDrawable; Loading @@ -101,7 +99,6 @@ public class KeyButtonDrawable extends Drawable { mAnimatedDrawable = (AnimatedVectorDrawable) mState.mChildState.newDrawable().mutate(); setDrawableBounds(mAnimatedDrawable); } mOvalBgPaint.setColor(mState.mDarkColor); } public void setDarkIntensity(float intensity) { Loading Loading @@ -215,6 +212,15 @@ public class KeyButtonDrawable extends Drawable { return mState.mBaseWidth + (mState.mShadowSize + Math.abs(mState.mShadowOffsetX)) * 2; } /** Return if the drawable has oval background. */ public boolean hasOvalBg() { return mState.mHasOvalBg; } public int getDarkColor() { return mState.mDarkColor; } public boolean canAnimate() { return mState.mSupportsAnimation; } Loading Loading @@ -244,10 +250,6 @@ public class KeyButtonDrawable extends Drawable { return; } if (mState.mHasOvalBg) { canvas.drawOval(new RectF(bounds), mOvalBgPaint); } if (mAnimatedDrawable != null) { mAnimatedDrawable.draw(canvas); } else { Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonRipple.java +30 −5 Original line number Diff line number Diff line Loading @@ -73,6 +73,13 @@ public class KeyButtonRipple extends Drawable { private final HashSet<Animator> mRunningAnimations = new HashSet<>(); private final ArrayList<Animator> mTmpArray = new ArrayList<>(); public enum Type { OVAL, ROUNDED_RECT } private Type mType = Type.ROUNDED_RECT; public KeyButtonRipple(Context ctx, View targetView) { mMaxWidth = ctx.getResources().getDimensionPixelSize(R.dimen.key_button_ripple_max_width); mTargetView = targetView; Loading @@ -86,6 +93,10 @@ public class KeyButtonRipple extends Drawable { mDelayTouchFeedback = delay; } public void setType(Type type) { mType = type; } private Paint getRipplePaint() { if (mRipplePaint == null) { mRipplePaint = new Paint(); Loading @@ -111,9 +122,15 @@ public class KeyButtonRipple extends Drawable { final float ry = horizontal ? cy : radius; final float corner = horizontal ? cy : cx; canvas.drawRoundRect(cx - rx, cy - ry, cx + rx, cy + ry, corner, corner, p); if (mType == Type.ROUNDED_RECT) { canvas.drawRoundRect(cx - rx, cy - ry, cx + rx, cy + ry, corner, corner, p); } else { canvas.save(); canvas.translate(cx, cy); float r = Math.min(rx, ry); canvas.drawOval(-r, -r, r, r, p); canvas.restore(); } } } Loading Loading @@ -148,8 +165,16 @@ public class KeyButtonRipple extends Drawable { private void drawHardware(RecordingCanvas c) { if (mDrawingHardwareGlow) { if (mType == Type.ROUNDED_RECT) { c.drawRoundRect(mLeftProp, mTopProp, mRightProp, mBottomProp, mRxProp, mRyProp, mPaintProp); } else { CanvasProperty<Float> cx = CanvasProperty.createFloat(getBounds().width() / 2); CanvasProperty<Float> cy = CanvasProperty.createFloat(getBounds().height() / 2); int d = Math.min(getBounds().width(), getBounds().height()); CanvasProperty<Float> r = CanvasProperty.createFloat(1.0f * d / 2); c.drawCircle(cx, cy, r, mPaintProp); } } } Loading
packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyButtonView.java +28 −3 Original line number Diff line number Diff line Loading @@ -25,6 +25,8 @@ import android.app.ActivityManager; import android.content.Context; import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.hardware.input.InputManager; Loading Loading @@ -76,6 +78,8 @@ public class KeyButtonView extends ImageView implements ButtonInterface { private final OverviewProxyService mOverviewProxyService; private final MetricsLogger mMetricsLogger = Dependency.get(MetricsLogger.class); private final InputManager mInputManager; private final Paint mOvalBgPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG); private boolean mHasOvalBg = false; private final Runnable mCheckLongPress = new Runnable() { public void run() { Loading Loading @@ -127,6 +131,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface { mOverviewProxyService = Dependency.get(OverviewProxyService.class); mInputManager = manager; setBackground(mRipple); setWillNotDraw(false); forceHasOverlappingRendering(false); } Loading Loading @@ -357,7 +362,14 @@ public class KeyButtonView extends ImageView implements ButtonInterface { public void setDarkIntensity(float darkIntensity) { Drawable drawable = getDrawable(); if (drawable != null) { ((KeyButtonDrawable) getDrawable()).setDarkIntensity(darkIntensity); KeyButtonDrawable keyButtonDrawable = (KeyButtonDrawable) drawable; keyButtonDrawable.setDarkIntensity(darkIntensity); mHasOvalBg = keyButtonDrawable.hasOvalBg(); if (mHasOvalBg) { mOvalBgPaint.setColor(keyButtonDrawable.getDarkColor()); } mRipple.setType(keyButtonDrawable.hasOvalBg() ? KeyButtonRipple.Type.OVAL : KeyButtonRipple.Type.ROUNDED_RECT); // Since we reuse the same drawable for multiple views, we need to invalidate the view // manually. Loading @@ -371,10 +383,23 @@ public class KeyButtonView extends ImageView implements ButtonInterface { mRipple.setDelayTouchFeedback(shouldDelay); } @Override public void draw(Canvas canvas) { if (mHasOvalBg) { canvas.save(); int cx = (getLeft() + getRight()) / 2; int cy = (getTop() + getBottom()) / 2; canvas.translate(cx, cy); int d = Math.min(getWidth(), getHeight()); int r = d / 2; canvas.drawOval(-r, -r, r, r, mOvalBgPaint); canvas.restore(); } super.draw(canvas); } @Override public void setVertical(boolean vertical) { mIsVertical = vertical; } }