From 4cbae07281b6c39c7dc10f321833418e24b1f92e Mon Sep 17 00:00:00 2001 From: Fabian Kozynski Date: Tue, 2 Aug 2022 09:54:41 -0400 Subject: [PATCH] Reduce blocking calls to Settings in main thread In most cases, mTileList contains the same information as the Settings value, so there's no need to retrieve it before modifying it. Keep track of that with a dirty flag. This way, we reduce the number of blocking calls in the main thread (as that's the thread that processes the tiles). Test: manual, factory reset Test: existing QSTileHostTest Test: performance metrics are back to baseline Fixes: 240256263 Change-Id: Idebd37d1458c80330b60802729575219b6a7b49a --- .../com/android/systemui/qs/QSTileHost.java | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 4552abd402b0e..77652c9ddf2fa 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -110,6 +110,11 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D private Context mUserContext; private UserTracker mUserTracker; private SecureSettings mSecureSettings; + // Keep track of whether mTilesList contains the same information as the Settings value. + // This is a performance optimization to reduce the number of blocking calls to Settings from + // main thread. + // This is enforced by only cleaning the flag at the end of a successful run of #onTuningChanged + private boolean mTilesListDirty = true; private final TileServiceRequestController mTileServiceRequestController; private TileLifecycleManager.Factory mTileLifeCycleManagerFactory; @@ -374,6 +379,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D // the ones that are in the setting, update the Setting. saveTilesToSettings(mTileSpecs); } + mTilesListDirty = false; for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).onTilesChanged(); } @@ -436,6 +442,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D ); } + // When calling this, you may want to modify mTilesListDirty accordingly. @MainThread private void saveTilesToSettings(List tileSpecs) { mSecureSettings.putStringForUser(TILES_SETTING, TextUtils.join(",", tileSpecs), @@ -445,9 +452,15 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D @MainThread private void changeTileSpecs(Predicate> changeFunction) { - final String setting = mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser); - final List tileSpecs = loadTileSpecs(mContext, setting); + final List tileSpecs; + if (!mTilesListDirty) { + tileSpecs = new ArrayList<>(mTileSpecs); + } else { + tileSpecs = loadTileSpecs(mContext, + mSecureSettings.getStringForUser(TILES_SETTING, mCurrentUser)); + } if (changeFunction.test(tileSpecs)) { + mTilesListDirty = true; saveTilesToSettings(tileSpecs); } } @@ -507,6 +520,7 @@ public class QSTileHost implements QSHost, Tunable, PluginListener, D } } if (DEBUG) Log.d(TAG, "saveCurrentTiles " + newTiles); + mTilesListDirty = true; saveTilesToSettings(newTiles); }