From 38180dfa0499e4f1d246efcdee43d146089943b3 Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 13 Oct 2021 15:48:30 -0400 Subject: [PATCH 1/2] Restart SystemUI when a flag changes. Bug: 202860494 Test: manual Change-Id: Ic5356aa093db8afc9f57e724603472efa5473a2f --- .../systemui/flags/FeatureFlagManager.java | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java b/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java index 2ed632876b06a..d096f8d97a4c0 100644 --- a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java +++ b/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java @@ -64,31 +64,45 @@ public class FeatureFlagManager implements FlagReader, FlagWriter { /** Return a {@link BooleanFlag}'s value. */ public boolean isEnabled(int id, boolean defaultValue) { + + Boolean result = isEnabledInternal(id); + return result == null ? defaultValue : result; + } + + /** Returns the stored value or null if not set. */ + private Boolean isEnabledInternal(int id) { String data = mSystemPropertiesHelper.get(keyToSysPropKey(id)); if (data.isEmpty()) { - return defaultValue; + return null; } JSONObject json; try { json = new JSONObject(data); if (!assertType(json, TYPE_BOOLEAN)) { - return defaultValue; + return null; } + return json.getBoolean(FIELD_VALUE); } catch (JSONException e) { - eraseFlag(id); - return defaultValue; + eraseInternal(id); // Don't restart SystemUI in this case. } + return null; } /** Set whether a given {@link BooleanFlag} is enabled or not. */ public void setEnabled(int id, boolean value) { + Boolean currentValue = isEnabledInternal(id); + if (currentValue != null && currentValue == value) { + return; + } + JSONObject json = new JSONObject(); try { json.put(FIELD_TYPE, TYPE_BOOLEAN); json.put(FIELD_VALUE, value); mSystemPropertiesHelper.set(keyToSysPropKey(id), json.toString()); - Log.i(TAG, "Set id " + id + " to " + value); + Log.i(TAG, "Set id " + id + " to " + value); + restartSystemUI(); } catch (JSONException e) { // no-op } @@ -96,6 +110,12 @@ public class FeatureFlagManager implements FlagReader, FlagWriter { /** Erase a flag's overridden value if there is one. */ public void eraseFlag(int id) { + eraseInternal(id); + restartSystemUI(); + } + + /** Works just like {@link #eraseFlag(int)} except that it doesn't restart SystemUI. */ + private void eraseInternal(int id) { // We can't actually "erase" things from sysprops, but we can set them to empty! mSystemPropertiesHelper.set(keyToSysPropKey(id), ""); Log.i(TAG, "Erase id " + id); @@ -105,6 +125,12 @@ public class FeatureFlagManager implements FlagReader, FlagWriter { public void removeListener(Listener run) {} + private void restartSystemUI() { + Log.i(TAG, "Restarting SystemUI"); + // SysUI starts back when up exited. Is there a better way to do this? + System.exit(0); + } + private static String keyToSysPropKey(int key) { return SYSPROP_PREFIX + key; } From c9d778dbfb682319b375c63780ef34a06726eb1c Mon Sep 17 00:00:00 2001 From: Dave Mankoff Date: Wed, 13 Oct 2021 16:00:28 -0400 Subject: [PATCH 2/2] Cache flag values when they are read. Bug: 202860494 Test: manual Change-Id: Icde45251feb344b36bddf5717b9b21c28cb85eb0 --- .../com/android/systemui/flags/FeatureFlagManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java b/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java index d096f8d97a4c0..5b6845fcdb4fa 100644 --- a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java +++ b/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java @@ -28,6 +28,7 @@ import com.android.systemui.dagger.SysUISingleton; import org.json.JSONException; import org.json.JSONObject; +import java.util.HashMap; import java.util.Map; import javax.inject.Inject; @@ -54,6 +55,8 @@ public class FeatureFlagManager implements FlagReader, FlagWriter { private static final String FLAGS_PERMISSION = "com.android.systemui.permission.FLAGS"; private final SystemPropertiesHelper mSystemPropertiesHelper; + private final Map mBooleanFlagCache = new HashMap<>(); + @Inject public FeatureFlagManager(SystemPropertiesHelper systemPropertiesHelper, Context context) { mSystemPropertiesHelper = systemPropertiesHelper; @@ -64,9 +67,12 @@ public class FeatureFlagManager implements FlagReader, FlagWriter { /** Return a {@link BooleanFlag}'s value. */ public boolean isEnabled(int id, boolean defaultValue) { + if (!mBooleanFlagCache.containsKey(id)) { + Boolean result = isEnabledInternal(id); + mBooleanFlagCache.put(id, result == null ? defaultValue : result); + } - Boolean result = isEnabledInternal(id); - return result == null ? defaultValue : result; + return mBooleanFlagCache.get(id); } /** Returns the stored value or null if not set. */