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

Commit 5b002995 authored by Jorim Jaggi's avatar Jorim Jaggi Committed by Android Git Automerger
Browse files

am 79107083: Merge "Add option to enable scrim SRC optimization" into lmp-dev

* commit '79107083':
  Add option to enable scrim SRC optimization
parents 697ace4e 79107083
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -81,6 +81,13 @@
    <!-- Show camera affordance on Keyguard -->
    <bool name="config_keyguardShowCameraAffordance">true</bool>

    <!-- Whether we should use SRC drawing mode when drawing the scrim behind. If this flag is set,
         we change the canvas opacity so libhwui doesn't call glClear on our surface, and then we
         draw the scrim with SRC to overwrite the whole buffer, which saves us a layer of overdraw.
         However, SRC performs poorly on some devices, where it is more efficient to
         glClear + SRC_OVER, in which case this flag should be disabled. -->
    <bool name="config_status_bar_scrim_behind_use_src">true</bool>

    <!-- The length of the vibration when the notification pops open. -->
    <integer name="one_finger_pop_duration_ms">10</integer>

+1 −1
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ public class ScrimView extends View

    @Override
    protected void onDraw(Canvas canvas) {
        if (mDrawAsSrc || !mIsEmpty) {
        if (mDrawAsSrc || (!mIsEmpty && mViewAlpha > 0f)) {
            PorterDuff.Mode mode = mDrawAsSrc ? PorterDuff.Mode.SRC : PorterDuff.Mode.SRC_OVER;
            int color = mScrimColor;
            color = Color.argb((int) (Color.alpha(color) * mViewAlpha), Color.red(color),
+14 −3
Original line number Diff line number Diff line
@@ -430,6 +430,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
    private boolean mVisible;
    private boolean mWaitingForKeyguardExit;
    private boolean mDozing;
    private boolean mScrimSrcModeEnabled;

    private Interpolator mLinearOutSlowIn;
    private Interpolator mLinearInterpolator = new LinearInterpolator();
@@ -569,6 +570,8 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        mDisplay = ((WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE))
                .getDefaultDisplay();
        updateDisplaySize();
        mScrimSrcModeEnabled = mContext.getResources().getBoolean(
                R.bool.config_status_bar_scrim_behind_use_src);
        super.start(); // calls createAndAddWindows()

        mMediaSessionManager
@@ -737,7 +740,7 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,

        ScrimView scrimBehind = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_behind);
        ScrimView scrimInFront = (ScrimView) mStatusBarWindow.findViewById(R.id.scrim_in_front);
        mScrimController = new ScrimController(scrimBehind, scrimInFront);
        mScrimController = new ScrimController(scrimBehind, scrimInFront, mScrimSrcModeEnabled);
        mScrimController.setBackDropView(mBackdrop);
        mStatusBarView.setScrimController(mScrimController);

@@ -1870,7 +1873,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
                if (mBackdropBack.getDrawable() != null) {
                    Drawable drawable = mBackdropBack.getDrawable();
                    mBackdropFront.setImageDrawable(drawable);
                    if (mScrimSrcModeEnabled) {
                        mBackdropFront.getDrawable().mutate().setXfermode(mSrcOverXferMode);
                    }
                    mBackdropFront.setAlpha(1f);
                    mBackdropFront.setVisibility(View.VISIBLE);
                } else {
@@ -1885,7 +1890,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
                } else {
                    mBackdropBack.setImageBitmap(artworkBitmap);
                }
                if (mScrimSrcModeEnabled) {
                    mBackdropBack.getDrawable().mutate().setXfermode(mSrcXferMode);
                }

                if (mBackdropFront.getVisibility() == View.VISIBLE) {
                    if (DEBUG_MEDIA) {
@@ -2134,6 +2141,10 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
        return mMediaNotificationKey;
    }

    public boolean isScrimSrcModeEnabled() {
        return mScrimSrcModeEnabled;
    }

    /**
     * All changes to the status bar and notifications funnel through here and are batched.
     */
+4 −2
Original line number Diff line number Diff line
@@ -74,8 +74,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
    private final Interpolator mInterpolator = new DecelerateInterpolator();
    private final Interpolator mLinearOutSlowInInterpolator;
    private BackDropView mBackDropView;
    private boolean mScrimSrcEnabled;

    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront) {
    public ScrimController(ScrimView scrimBehind, ScrimView scrimInFront, boolean scrimSrcEnabled) {
        mScrimBehind = scrimBehind;
        mScrimInFront = scrimInFront;
        final Context context = scrimBehind.getContext();
@@ -83,6 +84,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
        mLinearOutSlowInInterpolator = AnimationUtils.loadInterpolator(context,
                android.R.interpolator.linear_out_slow_in);
        mDozeParameters = new DozeParameters(context);
        mScrimSrcEnabled = scrimSrcEnabled;
    }

    public void setKeyguardShowing(boolean showing) {
@@ -384,7 +386,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener {
    }

    private void updateScrimBehindDrawingMode() {
        boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE;
        boolean asSrc = mBackDropView.getVisibility() != View.VISIBLE && mScrimSrcEnabled;
        mScrimBehind.setDrawAsSrc(asSrc);
    }
}
+29 −23
Original line number Diff line number Diff line
@@ -55,7 +55,6 @@ public class StatusBarWindowView extends FrameLayout {
    public StatusBarWindowView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setMotionEventSplittingEnabled(false);
        setWillNotDraw(false);
        mTransparentSrcPaint.setColor(0);
        mTransparentSrcPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
    }
@@ -105,11 +104,16 @@ public class StatusBarWindowView extends FrameLayout {
        // We need to ensure that our window doesn't suffer from overdraw which would normally
        // occur if our window is translucent. Since we are drawing the whole window anyway with
        // the scrim, we don't need the window to be cleared in the beginning.
        if (mService.isScrimSrcModeEnabled()) {
            IBinder windowToken = getWindowToken();
            WindowManager.LayoutParams lp = (WindowManager.LayoutParams) getLayoutParams();
            lp.token = windowToken;
            setLayoutParams(lp);
            WindowManagerGlobal.getInstance().changeCanvasOpacity(windowToken, true);
            setWillNotDraw(false);
        } else {
            setWillNotDraw(!DEBUG);
        }
    }

    @Override
@@ -199,6 +203,7 @@ public class StatusBarWindowView extends FrameLayout {
    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (mService.isScrimSrcModeEnabled()) {
            // We need to ensure that our window is always drawn fully even when we have paddings,
            // since we simulate it to be opaque.
            int paddedBottom = getHeight() - getPaddingBottom();
@@ -217,6 +222,7 @@ public class StatusBarWindowView extends FrameLayout {
                canvas.drawRect(paddedRight, getPaddingTop(), getWidth(), paddedBottom,
                        mTransparentSrcPaint);
            }
        }
        if (DEBUG) {
            Paint pt = new Paint();
            pt.setColor(0x80FFFF00);