DisplayCutout: Cache rotations of DisplayCutout
Caches the result of the DisplayCutout computation for all rotations.
With the fix to 72444324, the rotated DisplayCutout is recomputed a
lot more frequently for all rotations.
Bug: 72444324
Test: atest RotationCacheTest
Change-Id: Id413cf35fc2a6e77f738f0e3b42971e0387fd7bb
diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java
index 473eeda..13357b8 100644
--- a/services/core/java/com/android/server/wm/DisplayContent.java
+++ b/services/core/java/com/android/server/wm/DisplayContent.java
@@ -154,6 +154,7 @@
import com.android.internal.util.ToBooleanFunction;
import com.android.internal.view.IInputMethodClient;
import com.android.server.policy.WindowManagerPolicy;
+import com.android.server.wm.utils.RotationCache;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -215,7 +216,8 @@
int mInitialDisplayDensity = 0;
DisplayCutout mInitialDisplayCutout;
- DisplayCutout mDisplayCutoutOverride;
+ private final RotationCache<DisplayCutout, DisplayCutout> mDisplayCutoutCache
+ = new RotationCache<>(this::calculateDisplayCutoutForRotationUncached);
/**
* Overridden display size. Initialized with {@link #mInitialDisplayWidth}
@@ -1198,7 +1200,11 @@
}
DisplayCutout calculateDisplayCutoutForRotation(int rotation) {
- final DisplayCutout cutout = mInitialDisplayCutout;
+ return mDisplayCutoutCache.getOrCompute(mInitialDisplayCutout, rotation);
+ }
+
+ private DisplayCutout calculateDisplayCutoutForRotationUncached(
+ DisplayCutout cutout, int rotation) {
if (cutout == null || cutout == DisplayCutout.NO_CUTOUT) {
return cutout;
}