Merge "Revert "Fix flicker when swiching resolution change"" into tm-qpr-dev am: fa1f278976

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20080411

Change-Id: Ia9a42cf2b100a857852c6ba40c3b246d4907cf11
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Shawn Lin
2022-09-30 15:07:26 +00:00
committed by Automerger Merge Worker
4 changed files with 104 additions and 15 deletions

View File

@@ -455,6 +455,7 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
} }
} }
boolean needToUpdateProviderViews = false;
final String newUniqueId = mDisplayInfo.uniqueId; final String newUniqueId = mDisplayInfo.uniqueId;
if (!Objects.equals(newUniqueId, mDisplayUniqueId)) { if (!Objects.equals(newUniqueId, mDisplayUniqueId)) {
mDisplayUniqueId = newUniqueId; mDisplayUniqueId = newUniqueId;
@@ -472,6 +473,37 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
setupDecorations(); setupDecorations();
return; return;
} }
if (mScreenDecorHwcLayer != null) {
updateHwLayerRoundedCornerDrawable();
updateHwLayerRoundedCornerExistAndSize();
}
needToUpdateProviderViews = true;
}
final float newRatio = getPhysicalPixelDisplaySizeRatio();
if (mRoundedCornerResDelegate.getPhysicalPixelDisplaySizeRatio() != newRatio) {
mRoundedCornerResDelegate.setPhysicalPixelDisplaySizeRatio(newRatio);
if (mScreenDecorHwcLayer != null) {
updateHwLayerRoundedCornerExistAndSize();
}
needToUpdateProviderViews = true;
}
if (needToUpdateProviderViews) {
updateOverlayProviderViews(null);
} else {
updateOverlayProviderViews(new Integer[] {
mFaceScanningViewId,
R.id.display_cutout,
R.id.display_cutout_left,
R.id.display_cutout_right,
R.id.display_cutout_bottom,
});
}
if (mScreenDecorHwcLayer != null) {
mScreenDecorHwcLayer.onDisplayChanged(newUniqueId);
} }
} }
}; };
@@ -1037,8 +1069,6 @@ public class ScreenDecorations extends CoreStartable implements Tunable , Dumpab
&& (newRotation != mRotation || displayModeChanged(mDisplayMode, newMod))) { && (newRotation != mRotation || displayModeChanged(mDisplayMode, newMod))) {
mRotation = newRotation; mRotation = newRotation;
mDisplayMode = newMod; mDisplayMode = newMod;
mRoundedCornerResDelegate.setPhysicalPixelDisplaySizeRatio(
getPhysicalPixelDisplaySizeRatio());
if (mScreenDecorHwcLayer != null) { if (mScreenDecorHwcLayer != null) {
mScreenDecorHwcLayer.pendingConfigChange = false; mScreenDecorHwcLayer.pendingConfigChange = false;
mScreenDecorHwcLayer.updateRotation(mRotation); mScreenDecorHwcLayer.updateRotation(mRotation);

View File

@@ -78,18 +78,23 @@ class RoundedCornerResDelegate(
reloadMeasures() reloadMeasures()
} }
private fun reloadAll(newReloadToken: Int) {
if (reloadToken == newReloadToken) {
return
}
reloadToken = newReloadToken
reloadRes()
reloadMeasures()
}
fun updateDisplayUniqueId(newDisplayUniqueId: String?, newReloadToken: Int?) { fun updateDisplayUniqueId(newDisplayUniqueId: String?, newReloadToken: Int?) {
if (displayUniqueId != newDisplayUniqueId) { if (displayUniqueId != newDisplayUniqueId) {
displayUniqueId = newDisplayUniqueId displayUniqueId = newDisplayUniqueId
newReloadToken ?.let { reloadToken = it } newReloadToken ?.let { reloadToken = it }
reloadRes() reloadRes()
reloadMeasures() reloadMeasures()
} else if (newReloadToken != null) { } else {
if (reloadToken == newReloadToken) { newReloadToken?.let { reloadAll(it) }
return
}
reloadToken = newReloadToken
reloadMeasures()
} }
} }

View File

@@ -1005,13 +1005,18 @@ public class ScreenDecorationsTest extends SysuiTestCase {
assertEquals(new Size(3, 3), resDelegate.getTopRoundedSize()); assertEquals(new Size(3, 3), resDelegate.getTopRoundedSize());
assertEquals(new Size(4, 4), resDelegate.getBottomRoundedSize()); assertEquals(new Size(4, 4), resDelegate.getBottomRoundedSize());
doReturn(2f).when(mScreenDecorations).getPhysicalPixelDisplaySizeRatio(); setupResources(20 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded4px)
/* roundedTopDrawable */,
getTestsDrawable(com.android.systemui.tests.R.drawable.rounded5px)
/* roundedBottomDrawable */,
0 /* roundedPadding */, true /* privacyDot */, false /* faceScanning*/);
mDisplayInfo.rotation = Surface.ROTATION_270; mDisplayInfo.rotation = Surface.ROTATION_270;
mScreenDecorations.onConfigurationChanged(null); mScreenDecorations.onConfigurationChanged(null);
assertEquals(new Size(6, 6), resDelegate.getTopRoundedSize()); assertEquals(new Size(4, 4), resDelegate.getTopRoundedSize());
assertEquals(new Size(8, 8), resDelegate.getBottomRoundedSize()); assertEquals(new Size(5, 5), resDelegate.getBottomRoundedSize());
} }
@Test @Test
@@ -1287,6 +1292,51 @@ public class ScreenDecorationsTest extends SysuiTestCase {
verifyFaceScanningViewExists(true); verifyFaceScanningViewExists(true);
} }
@Test
public void testOnDisplayChanged_hwcLayer() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* privacyDot */, false /* faceScanning */);
final DisplayDecorationSupport decorationSupport = new DisplayDecorationSupport();
decorationSupport.format = PixelFormat.R_8;
doReturn(decorationSupport).when(mDisplay).getDisplayDecorationSupport();
// top cutout
mMockCutoutList.add(new CutoutDecorProviderImpl(BOUNDS_POSITION_TOP));
mScreenDecorations.start();
final ScreenDecorHwcLayer hwcLayer = mScreenDecorations.mScreenDecorHwcLayer;
spyOn(hwcLayer);
doReturn(mDisplay).when(hwcLayer).getDisplay();
mScreenDecorations.mDisplayListener.onDisplayChanged(1);
verify(hwcLayer, times(1)).onDisplayChanged(any());
}
@Test
public void testOnDisplayChanged_nonHwcLayer() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,
null /* roundedTopDrawable */, null /* roundedBottomDrawable */,
0 /* roundedPadding */, false /* privacyDot */, false /* faceScanning */);
// top cutout
mMockCutoutList.add(new CutoutDecorProviderImpl(BOUNDS_POSITION_TOP));
mScreenDecorations.start();
final ScreenDecorations.DisplayCutoutView cutoutView = (ScreenDecorations.DisplayCutoutView)
mScreenDecorations.getOverlayView(R.id.display_cutout);
assertNotNull(cutoutView);
spyOn(cutoutView);
doReturn(mDisplay).when(cutoutView).getDisplay();
mScreenDecorations.mDisplayListener.onDisplayChanged(1);
verify(cutoutView, times(1)).onDisplayChanged(any());
}
@Test @Test
public void testHasSameProvidersWithNullOverlays() { public void testHasSameProvidersWithNullOverlays() {
setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */, setupResources(0 /* radius */, 0 /* radiusTop */, 0 /* radiusBottom */,

View File

@@ -24,11 +24,12 @@ import androidx.annotation.DrawableRes
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.internal.R as InternalR import com.android.internal.R as InternalR
import com.android.systemui.R as SystemUIR import com.android.systemui.R as SystemUIR
import com.android.systemui.SysuiTestCase
import com.android.systemui.tests.R import com.android.systemui.tests.R
import com.android.systemui.SysuiTestCase
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Before import org.junit.Before
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith import org.junit.runner.RunWith
import org.mockito.Mock import org.mockito.Mock
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@@ -101,11 +102,14 @@ class RoundedCornerResDelegateTest : SysuiTestCase() {
assertEquals(Size(3, 3), roundedCornerResDelegate.topRoundedSize) assertEquals(Size(3, 3), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(4, 4), roundedCornerResDelegate.bottomRoundedSize) assertEquals(Size(4, 4), roundedCornerResDelegate.bottomRoundedSize)
roundedCornerResDelegate.physicalPixelDisplaySizeRatio = 2f setupResources(radius = 100,
roundedTopDrawable = getTestsDrawable(R.drawable.rounded4px),
roundedBottomDrawable = getTestsDrawable(R.drawable.rounded5px))
roundedCornerResDelegate.updateDisplayUniqueId(null, 1) roundedCornerResDelegate.updateDisplayUniqueId(null, 1)
assertEquals(Size(6, 6), roundedCornerResDelegate.topRoundedSize) assertEquals(Size(4, 4), roundedCornerResDelegate.topRoundedSize)
assertEquals(Size(8, 8), roundedCornerResDelegate.bottomRoundedSize) assertEquals(Size(5, 5), roundedCornerResDelegate.bottomRoundedSize)
} }
@Test @Test