Loading packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java +42 −21 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ import androidx.annotation.Nullable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.SecureSettings; import org.jetbrains.annotations.NotNull; Loading Loading @@ -74,7 +73,6 @@ public class FeatureFlagsDebug implements FeatureFlags { private final FlagManager mFlagManager; private final Context mContext; private final GlobalSettings mGlobalSettings; private final SecureSettings mSecureSettings; private final Resources mResources; private final SystemPropertiesHelper mSystemProperties; private final ServerFlagReader mServerFlagReader; Loading @@ -87,8 +85,9 @@ public class FeatureFlagsDebug implements FeatureFlags { private final ServerFlagReader.ChangeListener mOnPropertiesChanged = new ServerFlagReader.ChangeListener() { @Override public void onChange() { mRestarter.restartSystemUI(); public void onChange(Flag<?> flag) { mRestarter.restartSystemUI( "Server flag change: " + flag.getNamespace() + "." + flag.getName()); } }; Loading @@ -97,7 +96,6 @@ public class FeatureFlagsDebug implements FeatureFlags { FlagManager flagManager, Context context, GlobalSettings globalSettings, SecureSettings secureSettings, SystemPropertiesHelper systemProperties, @Main Resources resources, ServerFlagReader serverFlagReader, Loading @@ -106,7 +104,6 @@ public class FeatureFlagsDebug implements FeatureFlags { mFlagManager = flagManager; mContext = context; mGlobalSettings = globalSettings; mSecureSettings = secureSettings; mResources = resources; mSystemProperties = systemProperties; mServerFlagReader = serverFlagReader; Loading @@ -119,7 +116,8 @@ public class FeatureFlagsDebug implements FeatureFlags { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SET_FLAG); filter.addAction(ACTION_GET_FLAGS); mFlagManager.setOnSettingsChangedAction(this::restartSystemUI); mFlagManager.setOnSettingsChangedAction( suppressRestart -> restartSystemUI(suppressRestart, "Settings changed")); mFlagManager.setClearCacheAction(this::removeFromCache); mContext.registerReceiver(mReceiver, filter, null, null, Context.RECEIVER_EXPORTED_UNAUDITED); Loading Loading @@ -233,6 +231,10 @@ public class FeatureFlagsDebug implements FeatureFlags { Boolean result = readBooleanFlagOverride(flag.getName()); if (result == null) { result = readBooleanFlagOverride(flag.getId()); if (result != null) { // Move overrides from id to name setFlagValueInternal(flag.getName(), result, BooleanFlagSerializer.INSTANCE); } } boolean hasServerOverride = mServerFlagReader.hasOverride( flag.getNamespace(), flag.getName()); Loading Loading @@ -305,25 +307,38 @@ public class FeatureFlagsDebug implements FeatureFlags { requireNonNull(value, "Cannot set a null value"); T currentValue = readFlagValueInternal(name, serializer); if (Objects.equals(currentValue, value)) { Log.i(TAG, "Flag id " + name + " is already " + value); Log.i(TAG, "Flag \"" + name + "\" is already " + value); return; } setFlagValueInternal(name, value, serializer); Log.i(TAG, "Set flag \"" + name + "\" to " + value); removeFromCache(name); mFlagManager.dispatchListenersAndMaybeRestart( name, suppressRestart -> restartSystemUI( suppressRestart, "Flag \"" + name + "\" changed to " + value)); } private <T> void setFlagValueInternal( String name, @NonNull T value, FlagSerializer<T> serializer) { final String data = serializer.toSettingsData(value); if (data == null) { Log.w(TAG, "Failed to set id " + name + " to " + value); Log.w(TAG, "Failed to set flag " + name + " to " + value); return; } mGlobalSettings.putStringForUser(mFlagManager.nameToSettingsKey(name), data, UserHandle.USER_CURRENT); Log.i(TAG, "Set id " + name + " to " + value); removeFromCache(name); mFlagManager.dispatchListenersAndMaybeRestart(name, this::restartSystemUI); } <T> void eraseFlag(Flag<T> flag) { if (flag instanceof SysPropFlag) { mSystemProperties.erase(((SysPropFlag<T>) flag).getName()); dispatchListenersAndMaybeRestart(flag.getName(), this::restartAndroid); mSystemProperties.erase(flag.getName()); dispatchListenersAndMaybeRestart( flag.getName(), suppressRestart -> restartSystemUI( suppressRestart, "SysProp Flag \"" + flag.getNamespace() + "." + flag.getName() + "\" reset to default.")); } else { eraseFlag(flag.getName()); } Loading @@ -333,7 +348,10 @@ public class FeatureFlagsDebug implements FeatureFlags { private void eraseFlag(String name) { eraseInternal(name); removeFromCache(name); dispatchListenersAndMaybeRestart(name, this::restartSystemUI); dispatchListenersAndMaybeRestart( name, suppressRestart -> restartSystemUI( suppressRestart, "Flag \"" + name + "\" reset to default")); } private void dispatchListenersAndMaybeRestart(String name, Consumer<Boolean> restartAction) { Loading Loading @@ -367,20 +385,20 @@ public class FeatureFlagsDebug implements FeatureFlags { mFlagManager.removeListener(listener); } private void restartSystemUI(boolean requestSuppress) { private void restartSystemUI(boolean requestSuppress, String reason) { if (requestSuppress) { Log.i(TAG, "SystemUI Restart Suppressed"); return; } mRestarter.restartSystemUI(); mRestarter.restartSystemUI(reason); } private void restartAndroid(boolean requestSuppress) { private void restartAndroid(boolean requestSuppress, String reason) { if (requestSuppress) { Log.i(TAG, "Android Restart Suppressed"); return; } mRestarter.restartAndroid(); mRestarter.restartAndroid(reason); } void setBooleanFlagInternal(Flag<?> flag, boolean value) { Loading @@ -391,8 +409,11 @@ public class FeatureFlagsDebug implements FeatureFlags { } else if (flag instanceof SysPropBooleanFlag) { // Store SysProp flags in SystemProperties where they can read by outside parties. mSystemProperties.setBoolean(((SysPropBooleanFlag) flag).getName(), value); dispatchListenersAndMaybeRestart(flag.getName(), FeatureFlagsDebug.this::restartAndroid); dispatchListenersAndMaybeRestart( flag.getName(), suppressRestart -> restartSystemUI( suppressRestart, "Flag \"" + flag.getName() + "\" changed to " + value)); } else { throw new IllegalArgumentException("Unknown flag type"); } Loading packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebugRestarter.kt +10 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ constructor( ) : Restarter { private var androidRestartRequested = false private var pendingReason = "" val observer = object : WakefulnessLifecycle.Observer { Loading @@ -38,18 +39,20 @@ constructor( } } override fun restartSystemUI() { override fun restartSystemUI(reason: String) { Log.d(FeatureFlagsDebug.TAG, "SystemUI Restart requested. Restarting on next screen off.") scheduleRestart() Log.i(FeatureFlagsDebug.TAG, reason) scheduleRestart(reason) } override fun restartAndroid() { override fun restartAndroid(reason: String) { Log.d(FeatureFlagsDebug.TAG, "Android Restart requested. Restarting on next screen off.") androidRestartRequested = true scheduleRestart() scheduleRestart(reason) } fun scheduleRestart() { fun scheduleRestart(reason: String) { pendingReason = reason if (wakefulnessLifecycle.wakefulness == WakefulnessLifecycle.WAKEFULNESS_ASLEEP) { restartNow() } else { Loading @@ -59,9 +62,9 @@ constructor( private fun restartNow() { if (androidRestartRequested) { systemExitRestarter.restartAndroid() systemExitRestarter.restartAndroid(pendingReason) } else { systemExitRestarter.restartSystemUI() systemExitRestarter.restartSystemUI(pendingReason) } } } packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsRelease.java +3 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,9 @@ public class FeatureFlagsRelease implements FeatureFlags { private final ServerFlagReader.ChangeListener mOnPropertiesChanged = new ServerFlagReader.ChangeListener() { @Override public void onChange() { mRestarter.restartSystemUI(); public void onChange(Flag<?> flag) { mRestarter.restartSystemUI( "Server flag change: " + flag.getNamespace() + "." + flag.getName()); } }; Loading packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsReleaseRestarter.kt +11 −9 Original line number Diff line number Diff line Loading @@ -36,41 +36,43 @@ constructor( ) : Restarter { var listenersAdded = false var pendingRestart: Runnable? = null private var pendingReason = "" var androidRestartRequested = false val observer = object : WakefulnessLifecycle.Observer { override fun onFinishedGoingToSleep() { scheduleRestart() scheduleRestart(pendingReason) } } val batteryCallback = object : BatteryController.BatteryStateChangeCallback { override fun onBatteryLevelChanged(level: Int, pluggedIn: Boolean, charging: Boolean) { scheduleRestart() scheduleRestart(pendingReason) } } override fun restartSystemUI() { override fun restartSystemUI(reason: String) { Log.d( FeatureFlagsDebug.TAG, "SystemUI Restart requested. Restarting when plugged in and idle." ) scheduleRestart() scheduleRestart(reason) } override fun restartAndroid() { override fun restartAndroid(reason: String) { Log.d( FeatureFlagsDebug.TAG, "Android Restart requested. Restarting when plugged in and idle." ) androidRestartRequested = true scheduleRestart() scheduleRestart(reason) } private fun scheduleRestart() { private fun scheduleRestart(reason: String) { // Don't bother adding listeners twice. pendingReason = reason if (!listenersAdded) { listenersAdded = true wakefulnessLifecycle.addObserver(observer) Loading @@ -91,9 +93,9 @@ constructor( private fun restartNow() { Log.d(FeatureFlagsRelease.TAG, "Restarting due to systemui flag change") if (androidRestartRequested) { systemExitRestarter.restartAndroid() systemExitRestarter.restartAndroid(pendingReason) } else { systemExitRestarter.restartSystemUI() systemExitRestarter.restartSystemUI(pendingReason) } } } packages/SystemUI/src/com/android/systemui/flags/Restarter.kt +2 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ package com.android.systemui.flags interface Restarter { fun restartSystemUI() fun restartSystemUI(reason: String) fun restartAndroid() fun restartAndroid(reason: String) } Loading
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java +42 −21 Original line number Diff line number Diff line Loading @@ -40,7 +40,6 @@ import androidx.annotation.Nullable; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.util.settings.GlobalSettings; import com.android.systemui.util.settings.SecureSettings; import org.jetbrains.annotations.NotNull; Loading Loading @@ -74,7 +73,6 @@ public class FeatureFlagsDebug implements FeatureFlags { private final FlagManager mFlagManager; private final Context mContext; private final GlobalSettings mGlobalSettings; private final SecureSettings mSecureSettings; private final Resources mResources; private final SystemPropertiesHelper mSystemProperties; private final ServerFlagReader mServerFlagReader; Loading @@ -87,8 +85,9 @@ public class FeatureFlagsDebug implements FeatureFlags { private final ServerFlagReader.ChangeListener mOnPropertiesChanged = new ServerFlagReader.ChangeListener() { @Override public void onChange() { mRestarter.restartSystemUI(); public void onChange(Flag<?> flag) { mRestarter.restartSystemUI( "Server flag change: " + flag.getNamespace() + "." + flag.getName()); } }; Loading @@ -97,7 +96,6 @@ public class FeatureFlagsDebug implements FeatureFlags { FlagManager flagManager, Context context, GlobalSettings globalSettings, SecureSettings secureSettings, SystemPropertiesHelper systemProperties, @Main Resources resources, ServerFlagReader serverFlagReader, Loading @@ -106,7 +104,6 @@ public class FeatureFlagsDebug implements FeatureFlags { mFlagManager = flagManager; mContext = context; mGlobalSettings = globalSettings; mSecureSettings = secureSettings; mResources = resources; mSystemProperties = systemProperties; mServerFlagReader = serverFlagReader; Loading @@ -119,7 +116,8 @@ public class FeatureFlagsDebug implements FeatureFlags { IntentFilter filter = new IntentFilter(); filter.addAction(ACTION_SET_FLAG); filter.addAction(ACTION_GET_FLAGS); mFlagManager.setOnSettingsChangedAction(this::restartSystemUI); mFlagManager.setOnSettingsChangedAction( suppressRestart -> restartSystemUI(suppressRestart, "Settings changed")); mFlagManager.setClearCacheAction(this::removeFromCache); mContext.registerReceiver(mReceiver, filter, null, null, Context.RECEIVER_EXPORTED_UNAUDITED); Loading Loading @@ -233,6 +231,10 @@ public class FeatureFlagsDebug implements FeatureFlags { Boolean result = readBooleanFlagOverride(flag.getName()); if (result == null) { result = readBooleanFlagOverride(flag.getId()); if (result != null) { // Move overrides from id to name setFlagValueInternal(flag.getName(), result, BooleanFlagSerializer.INSTANCE); } } boolean hasServerOverride = mServerFlagReader.hasOverride( flag.getNamespace(), flag.getName()); Loading Loading @@ -305,25 +307,38 @@ public class FeatureFlagsDebug implements FeatureFlags { requireNonNull(value, "Cannot set a null value"); T currentValue = readFlagValueInternal(name, serializer); if (Objects.equals(currentValue, value)) { Log.i(TAG, "Flag id " + name + " is already " + value); Log.i(TAG, "Flag \"" + name + "\" is already " + value); return; } setFlagValueInternal(name, value, serializer); Log.i(TAG, "Set flag \"" + name + "\" to " + value); removeFromCache(name); mFlagManager.dispatchListenersAndMaybeRestart( name, suppressRestart -> restartSystemUI( suppressRestart, "Flag \"" + name + "\" changed to " + value)); } private <T> void setFlagValueInternal( String name, @NonNull T value, FlagSerializer<T> serializer) { final String data = serializer.toSettingsData(value); if (data == null) { Log.w(TAG, "Failed to set id " + name + " to " + value); Log.w(TAG, "Failed to set flag " + name + " to " + value); return; } mGlobalSettings.putStringForUser(mFlagManager.nameToSettingsKey(name), data, UserHandle.USER_CURRENT); Log.i(TAG, "Set id " + name + " to " + value); removeFromCache(name); mFlagManager.dispatchListenersAndMaybeRestart(name, this::restartSystemUI); } <T> void eraseFlag(Flag<T> flag) { if (flag instanceof SysPropFlag) { mSystemProperties.erase(((SysPropFlag<T>) flag).getName()); dispatchListenersAndMaybeRestart(flag.getName(), this::restartAndroid); mSystemProperties.erase(flag.getName()); dispatchListenersAndMaybeRestart( flag.getName(), suppressRestart -> restartSystemUI( suppressRestart, "SysProp Flag \"" + flag.getNamespace() + "." + flag.getName() + "\" reset to default.")); } else { eraseFlag(flag.getName()); } Loading @@ -333,7 +348,10 @@ public class FeatureFlagsDebug implements FeatureFlags { private void eraseFlag(String name) { eraseInternal(name); removeFromCache(name); dispatchListenersAndMaybeRestart(name, this::restartSystemUI); dispatchListenersAndMaybeRestart( name, suppressRestart -> restartSystemUI( suppressRestart, "Flag \"" + name + "\" reset to default")); } private void dispatchListenersAndMaybeRestart(String name, Consumer<Boolean> restartAction) { Loading Loading @@ -367,20 +385,20 @@ public class FeatureFlagsDebug implements FeatureFlags { mFlagManager.removeListener(listener); } private void restartSystemUI(boolean requestSuppress) { private void restartSystemUI(boolean requestSuppress, String reason) { if (requestSuppress) { Log.i(TAG, "SystemUI Restart Suppressed"); return; } mRestarter.restartSystemUI(); mRestarter.restartSystemUI(reason); } private void restartAndroid(boolean requestSuppress) { private void restartAndroid(boolean requestSuppress, String reason) { if (requestSuppress) { Log.i(TAG, "Android Restart Suppressed"); return; } mRestarter.restartAndroid(); mRestarter.restartAndroid(reason); } void setBooleanFlagInternal(Flag<?> flag, boolean value) { Loading @@ -391,8 +409,11 @@ public class FeatureFlagsDebug implements FeatureFlags { } else if (flag instanceof SysPropBooleanFlag) { // Store SysProp flags in SystemProperties where they can read by outside parties. mSystemProperties.setBoolean(((SysPropBooleanFlag) flag).getName(), value); dispatchListenersAndMaybeRestart(flag.getName(), FeatureFlagsDebug.this::restartAndroid); dispatchListenersAndMaybeRestart( flag.getName(), suppressRestart -> restartSystemUI( suppressRestart, "Flag \"" + flag.getName() + "\" changed to " + value)); } else { throw new IllegalArgumentException("Unknown flag type"); } Loading
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebugRestarter.kt +10 −7 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ constructor( ) : Restarter { private var androidRestartRequested = false private var pendingReason = "" val observer = object : WakefulnessLifecycle.Observer { Loading @@ -38,18 +39,20 @@ constructor( } } override fun restartSystemUI() { override fun restartSystemUI(reason: String) { Log.d(FeatureFlagsDebug.TAG, "SystemUI Restart requested. Restarting on next screen off.") scheduleRestart() Log.i(FeatureFlagsDebug.TAG, reason) scheduleRestart(reason) } override fun restartAndroid() { override fun restartAndroid(reason: String) { Log.d(FeatureFlagsDebug.TAG, "Android Restart requested. Restarting on next screen off.") androidRestartRequested = true scheduleRestart() scheduleRestart(reason) } fun scheduleRestart() { fun scheduleRestart(reason: String) { pendingReason = reason if (wakefulnessLifecycle.wakefulness == WakefulnessLifecycle.WAKEFULNESS_ASLEEP) { restartNow() } else { Loading @@ -59,9 +62,9 @@ constructor( private fun restartNow() { if (androidRestartRequested) { systemExitRestarter.restartAndroid() systemExitRestarter.restartAndroid(pendingReason) } else { systemExitRestarter.restartSystemUI() systemExitRestarter.restartSystemUI(pendingReason) } } }
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsRelease.java +3 −2 Original line number Diff line number Diff line Loading @@ -57,8 +57,9 @@ public class FeatureFlagsRelease implements FeatureFlags { private final ServerFlagReader.ChangeListener mOnPropertiesChanged = new ServerFlagReader.ChangeListener() { @Override public void onChange() { mRestarter.restartSystemUI(); public void onChange(Flag<?> flag) { mRestarter.restartSystemUI( "Server flag change: " + flag.getNamespace() + "." + flag.getName()); } }; Loading
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsReleaseRestarter.kt +11 −9 Original line number Diff line number Diff line Loading @@ -36,41 +36,43 @@ constructor( ) : Restarter { var listenersAdded = false var pendingRestart: Runnable? = null private var pendingReason = "" var androidRestartRequested = false val observer = object : WakefulnessLifecycle.Observer { override fun onFinishedGoingToSleep() { scheduleRestart() scheduleRestart(pendingReason) } } val batteryCallback = object : BatteryController.BatteryStateChangeCallback { override fun onBatteryLevelChanged(level: Int, pluggedIn: Boolean, charging: Boolean) { scheduleRestart() scheduleRestart(pendingReason) } } override fun restartSystemUI() { override fun restartSystemUI(reason: String) { Log.d( FeatureFlagsDebug.TAG, "SystemUI Restart requested. Restarting when plugged in and idle." ) scheduleRestart() scheduleRestart(reason) } override fun restartAndroid() { override fun restartAndroid(reason: String) { Log.d( FeatureFlagsDebug.TAG, "Android Restart requested. Restarting when plugged in and idle." ) androidRestartRequested = true scheduleRestart() scheduleRestart(reason) } private fun scheduleRestart() { private fun scheduleRestart(reason: String) { // Don't bother adding listeners twice. pendingReason = reason if (!listenersAdded) { listenersAdded = true wakefulnessLifecycle.addObserver(observer) Loading @@ -91,9 +93,9 @@ constructor( private fun restartNow() { Log.d(FeatureFlagsRelease.TAG, "Restarting due to systemui flag change") if (androidRestartRequested) { systemExitRestarter.restartAndroid() systemExitRestarter.restartAndroid(pendingReason) } else { systemExitRestarter.restartSystemUI() systemExitRestarter.restartSystemUI(pendingReason) } } }
packages/SystemUI/src/com/android/systemui/flags/Restarter.kt +2 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,7 @@ package com.android.systemui.flags interface Restarter { fun restartSystemUI() fun restartSystemUI(reason: String) fun restartAndroid() fun restartAndroid(reason: String) }