Loading packages/SystemUI/res/values/config.xml +7 −0 Original line number Diff line number Diff line Loading @@ -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> Loading packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java +1 −1 Original line number Diff line number Diff line Loading @@ -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), Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +14 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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 { Loading @@ -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) { Loading Loading @@ -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. */ Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +4 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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); } } packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +29 −23 Original line number Diff line number Diff line Loading @@ -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)); } Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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); Loading Loading
packages/SystemUI/res/values/config.xml +7 −0 Original line number Diff line number Diff line Loading @@ -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> Loading
packages/SystemUI/src/com/android/systemui/statusbar/ScrimView.java +1 −1 Original line number Diff line number Diff line Loading @@ -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), Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java +14 −3 Original line number Diff line number Diff line Loading @@ -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(); Loading Loading @@ -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 Loading Loading @@ -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); Loading Loading @@ -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 { Loading @@ -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) { Loading Loading @@ -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. */ Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +4 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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) { Loading Loading @@ -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); } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarWindowView.java +29 −23 Original line number Diff line number Diff line Loading @@ -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)); } Loading Loading @@ -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 Loading Loading @@ -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(); Loading @@ -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); Loading