Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9564138a authored by Tracy Zhou's avatar Tracy Zhou
Browse files

Move rotation button closer to the edge of the screen.

Will take care of ripple color in the next change. Right now the ripple is more on the subtle side and doesn't show when the background is dark.

Test: manual
Bug: 131706959
Change-Id: Ie8a9943f17323a8ae9f6f25d69f022091196e451
parent 4a4bc355
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -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>

+22 −7
Original line number Diff line number Diff line
@@ -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<>();

@@ -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);
@@ -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);
@@ -490,8 +503,6 @@ public class NavigationBarInflaterView extends FrameLayout
        }
    }



    private void clearViews() {
        if (mButtonDispatchers != null) {
            for (int i = 0; i < mButtonDispatchers.size(); i++) {
@@ -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);
+9 −7
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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) {
@@ -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;
    }
@@ -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 {
+30 −5
Original line number Diff line number Diff line
@@ -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;
@@ -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();
@@ -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();
            }
        }
    }

@@ -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);
            }
        }
    }

+28 −3
Original line number Diff line number Diff line
@@ -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;
@@ -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() {
@@ -127,6 +131,7 @@ public class KeyButtonView extends ImageView implements ButtonInterface {
        mOverviewProxyService = Dependency.get(OverviewProxyService.class);
        mInputManager = manager;
        setBackground(mRipple);
        setWillNotDraw(false);
        forceHasOverlappingRendering(false);
    }

@@ -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.
@@ -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;
    }
}