Loading packages/SystemUI/res/values/config.xml +4 −0 Original line number Diff line number Diff line Loading @@ -706,4 +706,8 @@ <item>@drawable/rounded_corner_bottom</item> <item>@drawable/rounded_corner_bottom_secondary</item> </array> <!-- Flag to enable privacy dot views, it shall be true for normal case --> <bool name="config_enablePrivacyDot">true</bool> </resources> packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +65 −43 Original line number Diff line number Diff line Loading @@ -160,6 +160,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { private Handler mHandler; private boolean mPendingRotationChange; private boolean mIsRoundedCornerMultipleRadius; private boolean mIsPrivacyDotEnabled; private int mStatusBarHeightPortrait; private int mStatusBarHeightLandscape; private Drawable mRoundedCornerDrawable; Loading Loading @@ -253,6 +254,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mRotation = mContext.getDisplay().getRotation(); mDisplayUniqueId = mContext.getDisplay().getUniqueId(); mIsRoundedCornerMultipleRadius = isRoundedCornerMultipleRadius(mContext, mDisplayUniqueId); mIsPrivacyDotEnabled = mContext.getResources().getBoolean(R.bool.config_enablePrivacyDot); mWindowManager = mContext.getSystemService(WindowManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class); updateRoundedCornerDrawable(); Loading Loading @@ -312,24 +314,24 @@ public class ScreenDecorations extends SystemUI implements Tunable { } private void setupDecorations() { if (hasRoundedCorners() || shouldDrawCutout()) { if (hasRoundedCorners() || shouldDrawCutout() || mIsPrivacyDotEnabled) { updateStatusBarHeight(); final DisplayCutout cutout = getCutout(); final Rect[] bounds = cutout == null ? null : cutout.getBoundingRectsAll(); int rotatedPos; for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { rotatedPos = getBoundPositionFromRotation(i, mRotation); if ((bounds != null && !bounds[rotatedPos].isEmpty()) || shouldShowRoundedCorner(i)) { createOverlay(i); if (shouldShowCutout(i, cutout) || shouldShowRoundedCorner(i, cutout) || shouldShowPrivacyDot(i, cutout)) { createOverlay(i, cutout); } else { removeOverlay(i); } } if (mIsPrivacyDotEnabled) { // Overlays have been created, send the dots to the controller //TODO: need a better way to do this mDotViewController.initialize( mTopLeftDot, mTopRightDot, mBottomLeftDot, mBottomRightDot); } } else { removeAllOverlays(); } Loading Loading @@ -416,7 +418,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mOverlays[pos] = null; } private void createOverlay(@BoundsPosition int pos) { private void createOverlay(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { if (mOverlays == null) { mOverlays = new View[BOUNDS_POSITION_LENGTH]; } Loading @@ -437,7 +439,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mOverlays[pos].setAlpha(0); mOverlays[pos].setForceDarkAllowed(false); updateView(pos); updateView(pos, cutout); mWindowManager.addView(mOverlays[pos], getWindowLayoutParams(pos)); Loading @@ -461,34 +463,19 @@ public class ScreenDecorations extends SystemUI implements Tunable { * Allow overrides for top/bottom positions */ private View overlayForPosition(@BoundsPosition int pos) { switch (pos) { case BOUNDS_POSITION_TOP: case BOUNDS_POSITION_LEFT: View top = LayoutInflater.from(mContext) .inflate(R.layout.rounded_corners_top, null); mTopLeftDot = top.findViewById(R.id.privacy_dot_left_container); mTopRightDot = top.findViewById(R.id.privacy_dot_right_container); return top; case BOUNDS_POSITION_BOTTOM: case BOUNDS_POSITION_RIGHT: View bottom = LayoutInflater.from(mContext) .inflate(R.layout.rounded_corners_bottom, null); mBottomLeftDot = bottom.findViewById(R.id.privacy_dot_left_container); mBottomRightDot = bottom.findViewById(R.id.privacy_dot_right_container); return bottom; default: throw new IllegalArgumentException("Unknown bounds position"); } final int layoutId = (pos == BOUNDS_POSITION_LEFT || pos == BOUNDS_POSITION_TOP) ? R.layout.rounded_corners_top : R.layout.rounded_corners_bottom; return LayoutInflater.from(mContext).inflate(layoutId, null); } private void updateView(@BoundsPosition int pos) { private void updateView(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { if (mOverlays == null || mOverlays[pos] == null) { return; } // update rounded corner view rotation updateRoundedCornerView(pos, R.id.left); updateRoundedCornerView(pos, R.id.right); updateRoundedCornerView(pos, R.id.left, cutout); updateRoundedCornerView(pos, R.id.right, cutout); updateRoundedCornerSize(mRoundedDefault, mRoundedDefaultTop, mRoundedDefaultBottom); updateRoundedCornerImageView(); Loading @@ -496,6 +483,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { if (mCutoutViews != null && mCutoutViews[pos] != null) { mCutoutViews[pos].setRotation(mRotation); } updatePrivacyDotView(pos, cutout); } @VisibleForTesting Loading Loading @@ -671,11 +660,12 @@ public class ScreenDecorations extends SystemUI implements Tunable { if (mOverlays != null) { updateLayoutParams(); final DisplayCutout cutout = getCutout(); for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { if (mOverlays[i] == null) { continue; } updateView(i); updateView(i, cutout); } } } Loading Loading @@ -807,13 +797,14 @@ public class ScreenDecorations extends SystemUI implements Tunable { return drawable; } private void updateRoundedCornerView(@BoundsPosition int pos, int id) { private void updateRoundedCornerView(@BoundsPosition int pos, int id, @Nullable DisplayCutout cutout) { final View rounded = mOverlays[pos].findViewById(id); if (rounded == null) { return; } rounded.setVisibility(View.GONE); if (shouldShowRoundedCorner(pos)) { if (shouldShowRoundedCorner(pos, cutout)) { final int gravity = getRoundedCornerGravity(pos, id == R.id.left); ((FrameLayout.LayoutParams) rounded.getLayoutParams()).gravity = gravity; setRoundedCornerOrientation(rounded, gravity); Loading @@ -821,6 +812,26 @@ public class ScreenDecorations extends SystemUI implements Tunable { } } private void updatePrivacyDotView(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { final ViewGroup viewGroup = (ViewGroup) mOverlays[pos]; final View left = viewGroup.findViewById(R.id.privacy_dot_left_container); final View right = viewGroup.findViewById(R.id.privacy_dot_right_container); if (shouldShowPrivacyDot(pos, cutout)) { // TODO (b/201481944) Privacy Dots pos and var are wrong with long side cutout enable if (pos == BOUNDS_POSITION_LEFT || pos == BOUNDS_POSITION_TOP) { mTopLeftDot = left; mTopRightDot = right; } else { mBottomLeftDot = left; mBottomRightDot = right; } } else { viewGroup.removeView(left); viewGroup.removeView(right); } } private int getRoundedCornerGravity(@BoundsPosition int pos, boolean isStart) { final int rotatedPos = getBoundPositionFromRotation(pos, mRotation); switch (rotatedPos) { Loading Loading @@ -872,12 +883,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { || mIsRoundedCornerMultipleRadius; } private boolean shouldShowRoundedCorner(@BoundsPosition int pos) { if (!hasRoundedCorners()) { return false; } DisplayCutout cutout = getCutout(); private boolean isDefaultShownOverlayPos(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { // for cutout is null or cutout with only waterfall. final boolean emptyBoundsOrWaterfall = cutout == null || cutout.isBoundsEmpty(); // Shows rounded corner on left and right overlays only when there is no top or bottom Loading @@ -892,6 +899,21 @@ public class ScreenDecorations extends SystemUI implements Tunable { } } private boolean shouldShowRoundedCorner(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { return hasRoundedCorners() && isDefaultShownOverlayPos(pos, cutout); } private boolean shouldShowPrivacyDot(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { return mIsPrivacyDotEnabled && isDefaultShownOverlayPos(pos, cutout); } private boolean shouldShowCutout(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { final Rect[] bounds = cutout == null ? null : cutout.getBoundingRectsAll(); final int rotatedPos = getBoundPositionFromRotation(pos, mRotation); return (bounds != null && !bounds[rotatedPos].isEmpty()); } private boolean shouldDrawCutout() { return shouldDrawCutout(mContext); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +6 −4 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ public class KeyguardStatusBarView extends RelativeLayout { private boolean mKeyguardUserSwitcherEnabled; private final UserManager mUserManager; private boolean mIsPrivacyDotEnabled; private int mSystemIconsSwitcherHiddenExpandedMargin; private int mStatusBarPaddingEnd; private int mMinDotWidth; Loading Loading @@ -112,7 +113,7 @@ public class KeyguardStatusBarView extends RelativeLayout { mCutoutSpace = findViewById(R.id.cutout_space_view); mStatusIconArea = findViewById(R.id.status_icon_area); mStatusIconContainer = findViewById(R.id.statusIcons); mIsPrivacyDotEnabled = mContext.getResources().getBoolean(R.bool.config_enablePrivacyDot); loadDimens(); } Loading Loading @@ -270,9 +271,10 @@ public class KeyguardStatusBarView extends RelativeLayout { mDisplayCutout, cornerCutoutMargins, mRoundedCornerPadding); // consider privacy dot space final int minLeft = isLayoutRtl() ? Math.max(mMinDotWidth, mPadding.first) : mPadding.first; final int minRight = isLayoutRtl() ? mPadding.second : Math.max(mMinDotWidth, mPadding.second); final int minLeft = (isLayoutRtl() && mIsPrivacyDotEnabled) ? Math.max(mMinDotWidth, mPadding.first) : mPadding.first; final int minRight = (!isLayoutRtl() && mIsPrivacyDotEnabled) ? Math.max(mMinDotWidth, mPadding.second) : mPadding.second; setPadding(minLeft, waterfallTop, minRight, 0); } Loading packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt +6 −2 Original line number Diff line number Diff line Loading @@ -70,6 +70,9 @@ class StatusBarContentInsetsProvider @Inject constructor( // (e.g. network displays) private val insetsCache = LruCache<CacheKey, Rect>(MAX_CACHE_SIZE) private val listeners = mutableSetOf<StatusBarContentInsetsChangedListener>() private val isPrivacyDotEnabled: Boolean by lazy(LazyThreadSafetyMode.PUBLICATION) { context.resources.getBoolean(R.bool.config_enablePrivacyDot) } init { configurationController.addCallback(this) Loading Loading @@ -152,8 +155,9 @@ class StatusBarContentInsetsProvider @Inject constructor( val isRtl = rotatedResources.configuration.layoutDirection == LAYOUT_DIRECTION_RTL val roundedCornerPadding = rotatedResources .getDimensionPixelSize(R.dimen.rounded_corner_content_padding) val minDotWidth = rotatedResources .getDimensionPixelSize(R.dimen.ongoing_appops_dot_min_padding) val minDotWidth = if (isPrivacyDotEnabled) rotatedResources.getDimensionPixelSize(R.dimen.ongoing_appops_dot_min_padding) else 0 val minLeft: Int val minRight: Int Loading packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +457 −95 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
packages/SystemUI/res/values/config.xml +4 −0 Original line number Diff line number Diff line Loading @@ -706,4 +706,8 @@ <item>@drawable/rounded_corner_bottom</item> <item>@drawable/rounded_corner_bottom_secondary</item> </array> <!-- Flag to enable privacy dot views, it shall be true for normal case --> <bool name="config_enablePrivacyDot">true</bool> </resources>
packages/SystemUI/src/com/android/systemui/ScreenDecorations.java +65 −43 Original line number Diff line number Diff line Loading @@ -160,6 +160,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { private Handler mHandler; private boolean mPendingRotationChange; private boolean mIsRoundedCornerMultipleRadius; private boolean mIsPrivacyDotEnabled; private int mStatusBarHeightPortrait; private int mStatusBarHeightLandscape; private Drawable mRoundedCornerDrawable; Loading Loading @@ -253,6 +254,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mRotation = mContext.getDisplay().getRotation(); mDisplayUniqueId = mContext.getDisplay().getUniqueId(); mIsRoundedCornerMultipleRadius = isRoundedCornerMultipleRadius(mContext, mDisplayUniqueId); mIsPrivacyDotEnabled = mContext.getResources().getBoolean(R.bool.config_enablePrivacyDot); mWindowManager = mContext.getSystemService(WindowManager.class); mDisplayManager = mContext.getSystemService(DisplayManager.class); updateRoundedCornerDrawable(); Loading Loading @@ -312,24 +314,24 @@ public class ScreenDecorations extends SystemUI implements Tunable { } private void setupDecorations() { if (hasRoundedCorners() || shouldDrawCutout()) { if (hasRoundedCorners() || shouldDrawCutout() || mIsPrivacyDotEnabled) { updateStatusBarHeight(); final DisplayCutout cutout = getCutout(); final Rect[] bounds = cutout == null ? null : cutout.getBoundingRectsAll(); int rotatedPos; for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { rotatedPos = getBoundPositionFromRotation(i, mRotation); if ((bounds != null && !bounds[rotatedPos].isEmpty()) || shouldShowRoundedCorner(i)) { createOverlay(i); if (shouldShowCutout(i, cutout) || shouldShowRoundedCorner(i, cutout) || shouldShowPrivacyDot(i, cutout)) { createOverlay(i, cutout); } else { removeOverlay(i); } } if (mIsPrivacyDotEnabled) { // Overlays have been created, send the dots to the controller //TODO: need a better way to do this mDotViewController.initialize( mTopLeftDot, mTopRightDot, mBottomLeftDot, mBottomRightDot); } } else { removeAllOverlays(); } Loading Loading @@ -416,7 +418,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mOverlays[pos] = null; } private void createOverlay(@BoundsPosition int pos) { private void createOverlay(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { if (mOverlays == null) { mOverlays = new View[BOUNDS_POSITION_LENGTH]; } Loading @@ -437,7 +439,7 @@ public class ScreenDecorations extends SystemUI implements Tunable { mOverlays[pos].setAlpha(0); mOverlays[pos].setForceDarkAllowed(false); updateView(pos); updateView(pos, cutout); mWindowManager.addView(mOverlays[pos], getWindowLayoutParams(pos)); Loading @@ -461,34 +463,19 @@ public class ScreenDecorations extends SystemUI implements Tunable { * Allow overrides for top/bottom positions */ private View overlayForPosition(@BoundsPosition int pos) { switch (pos) { case BOUNDS_POSITION_TOP: case BOUNDS_POSITION_LEFT: View top = LayoutInflater.from(mContext) .inflate(R.layout.rounded_corners_top, null); mTopLeftDot = top.findViewById(R.id.privacy_dot_left_container); mTopRightDot = top.findViewById(R.id.privacy_dot_right_container); return top; case BOUNDS_POSITION_BOTTOM: case BOUNDS_POSITION_RIGHT: View bottom = LayoutInflater.from(mContext) .inflate(R.layout.rounded_corners_bottom, null); mBottomLeftDot = bottom.findViewById(R.id.privacy_dot_left_container); mBottomRightDot = bottom.findViewById(R.id.privacy_dot_right_container); return bottom; default: throw new IllegalArgumentException("Unknown bounds position"); } final int layoutId = (pos == BOUNDS_POSITION_LEFT || pos == BOUNDS_POSITION_TOP) ? R.layout.rounded_corners_top : R.layout.rounded_corners_bottom; return LayoutInflater.from(mContext).inflate(layoutId, null); } private void updateView(@BoundsPosition int pos) { private void updateView(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { if (mOverlays == null || mOverlays[pos] == null) { return; } // update rounded corner view rotation updateRoundedCornerView(pos, R.id.left); updateRoundedCornerView(pos, R.id.right); updateRoundedCornerView(pos, R.id.left, cutout); updateRoundedCornerView(pos, R.id.right, cutout); updateRoundedCornerSize(mRoundedDefault, mRoundedDefaultTop, mRoundedDefaultBottom); updateRoundedCornerImageView(); Loading @@ -496,6 +483,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { if (mCutoutViews != null && mCutoutViews[pos] != null) { mCutoutViews[pos].setRotation(mRotation); } updatePrivacyDotView(pos, cutout); } @VisibleForTesting Loading Loading @@ -671,11 +660,12 @@ public class ScreenDecorations extends SystemUI implements Tunable { if (mOverlays != null) { updateLayoutParams(); final DisplayCutout cutout = getCutout(); for (int i = 0; i < BOUNDS_POSITION_LENGTH; i++) { if (mOverlays[i] == null) { continue; } updateView(i); updateView(i, cutout); } } } Loading Loading @@ -807,13 +797,14 @@ public class ScreenDecorations extends SystemUI implements Tunable { return drawable; } private void updateRoundedCornerView(@BoundsPosition int pos, int id) { private void updateRoundedCornerView(@BoundsPosition int pos, int id, @Nullable DisplayCutout cutout) { final View rounded = mOverlays[pos].findViewById(id); if (rounded == null) { return; } rounded.setVisibility(View.GONE); if (shouldShowRoundedCorner(pos)) { if (shouldShowRoundedCorner(pos, cutout)) { final int gravity = getRoundedCornerGravity(pos, id == R.id.left); ((FrameLayout.LayoutParams) rounded.getLayoutParams()).gravity = gravity; setRoundedCornerOrientation(rounded, gravity); Loading @@ -821,6 +812,26 @@ public class ScreenDecorations extends SystemUI implements Tunable { } } private void updatePrivacyDotView(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { final ViewGroup viewGroup = (ViewGroup) mOverlays[pos]; final View left = viewGroup.findViewById(R.id.privacy_dot_left_container); final View right = viewGroup.findViewById(R.id.privacy_dot_right_container); if (shouldShowPrivacyDot(pos, cutout)) { // TODO (b/201481944) Privacy Dots pos and var are wrong with long side cutout enable if (pos == BOUNDS_POSITION_LEFT || pos == BOUNDS_POSITION_TOP) { mTopLeftDot = left; mTopRightDot = right; } else { mBottomLeftDot = left; mBottomRightDot = right; } } else { viewGroup.removeView(left); viewGroup.removeView(right); } } private int getRoundedCornerGravity(@BoundsPosition int pos, boolean isStart) { final int rotatedPos = getBoundPositionFromRotation(pos, mRotation); switch (rotatedPos) { Loading Loading @@ -872,12 +883,8 @@ public class ScreenDecorations extends SystemUI implements Tunable { || mIsRoundedCornerMultipleRadius; } private boolean shouldShowRoundedCorner(@BoundsPosition int pos) { if (!hasRoundedCorners()) { return false; } DisplayCutout cutout = getCutout(); private boolean isDefaultShownOverlayPos(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { // for cutout is null or cutout with only waterfall. final boolean emptyBoundsOrWaterfall = cutout == null || cutout.isBoundsEmpty(); // Shows rounded corner on left and right overlays only when there is no top or bottom Loading @@ -892,6 +899,21 @@ public class ScreenDecorations extends SystemUI implements Tunable { } } private boolean shouldShowRoundedCorner(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { return hasRoundedCorners() && isDefaultShownOverlayPos(pos, cutout); } private boolean shouldShowPrivacyDot(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { return mIsPrivacyDotEnabled && isDefaultShownOverlayPos(pos, cutout); } private boolean shouldShowCutout(@BoundsPosition int pos, @Nullable DisplayCutout cutout) { final Rect[] bounds = cutout == null ? null : cutout.getBoundingRectsAll(); final int rotatedPos = getBoundPositionFromRotation(pos, mRotation); return (bounds != null && !bounds[rotatedPos].isEmpty()); } private boolean shouldDrawCutout() { return shouldDrawCutout(mContext); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/KeyguardStatusBarView.java +6 −4 Original line number Diff line number Diff line Loading @@ -72,6 +72,7 @@ public class KeyguardStatusBarView extends RelativeLayout { private boolean mKeyguardUserSwitcherEnabled; private final UserManager mUserManager; private boolean mIsPrivacyDotEnabled; private int mSystemIconsSwitcherHiddenExpandedMargin; private int mStatusBarPaddingEnd; private int mMinDotWidth; Loading Loading @@ -112,7 +113,7 @@ public class KeyguardStatusBarView extends RelativeLayout { mCutoutSpace = findViewById(R.id.cutout_space_view); mStatusIconArea = findViewById(R.id.status_icon_area); mStatusIconContainer = findViewById(R.id.statusIcons); mIsPrivacyDotEnabled = mContext.getResources().getBoolean(R.bool.config_enablePrivacyDot); loadDimens(); } Loading Loading @@ -270,9 +271,10 @@ public class KeyguardStatusBarView extends RelativeLayout { mDisplayCutout, cornerCutoutMargins, mRoundedCornerPadding); // consider privacy dot space final int minLeft = isLayoutRtl() ? Math.max(mMinDotWidth, mPadding.first) : mPadding.first; final int minRight = isLayoutRtl() ? mPadding.second : Math.max(mMinDotWidth, mPadding.second); final int minLeft = (isLayoutRtl() && mIsPrivacyDotEnabled) ? Math.max(mMinDotWidth, mPadding.first) : mPadding.first; final int minRight = (!isLayoutRtl() && mIsPrivacyDotEnabled) ? Math.max(mMinDotWidth, mPadding.second) : mPadding.second; setPadding(minLeft, waterfallTop, minRight, 0); } Loading
packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBarContentInsetsProvider.kt +6 −2 Original line number Diff line number Diff line Loading @@ -70,6 +70,9 @@ class StatusBarContentInsetsProvider @Inject constructor( // (e.g. network displays) private val insetsCache = LruCache<CacheKey, Rect>(MAX_CACHE_SIZE) private val listeners = mutableSetOf<StatusBarContentInsetsChangedListener>() private val isPrivacyDotEnabled: Boolean by lazy(LazyThreadSafetyMode.PUBLICATION) { context.resources.getBoolean(R.bool.config_enablePrivacyDot) } init { configurationController.addCallback(this) Loading Loading @@ -152,8 +155,9 @@ class StatusBarContentInsetsProvider @Inject constructor( val isRtl = rotatedResources.configuration.layoutDirection == LAYOUT_DIRECTION_RTL val roundedCornerPadding = rotatedResources .getDimensionPixelSize(R.dimen.rounded_corner_content_padding) val minDotWidth = rotatedResources .getDimensionPixelSize(R.dimen.ongoing_appops_dot_min_padding) val minDotWidth = if (isPrivacyDotEnabled) rotatedResources.getDimensionPixelSize(R.dimen.ongoing_appops_dot_min_padding) else 0 val minLeft: Int val minRight: Int Loading
packages/SystemUI/tests/src/com/android/systemui/ScreenDecorationsTest.java +457 −95 File changed.Preview size limit exceeded, changes collapsed. Show changes