From 546e7ad2dac7de8febbff814f8faeaae7d3d82cf Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Sat, 10 Apr 2021 02:45:46 +0800 Subject: [PATCH] Only update insetsHint while necessary To improve the performance, this CL makes it only calculates and updates insetsHint when: - the insets source is visible at the server side. - the insets source frame is changed. Fix: 183739779 Test: atest --iterations 10 ImePerfTest#testHideIme Change-Id: Ie4e6fe7af21a036dabbca71c9170f40e04997a13 --- .../android/server/wm/InsetsSourceProvider.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 073231401715f..7daebff2ccc20 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -84,6 +84,7 @@ class InsetsSourceProvider { private TriConsumer mImeFrameProvider; private final Rect mImeOverrideFrame = new Rect(); private boolean mIsLeashReadyForDispatching; + private final Rect mLastSourceFrame = new Rect(); private final Consumer mSetLeashPositionConsumer = t -> { if (mControl != null) { @@ -268,11 +269,14 @@ class InsetsSourceProvider { mSetLeashPositionConsumer.accept(mWin.getPendingTransaction()); } } - final Insets insetsHint = mSource.calculateInsets( - mWin.getBounds(), true /* ignoreVisibility */); - if (!insetsHint.equals(mControl.getInsetsHint())) { - changed = true; - mControl.setInsetsHint(insetsHint); + if (mServerVisible && !mLastSourceFrame.equals(mSource.getFrame())) { + final Insets insetsHint = mSource.calculateInsets( + mWin.getBounds(), true /* ignoreVisibility */); + if (!insetsHint.equals(mControl.getInsetsHint())) { + changed = true; + mControl.setInsetsHint(insetsHint); + } + mLastSourceFrame.set(mSource.getFrame()); } if (changed) { mStateController.notifyControlChanged(mControlTarget);