Loading packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java +12 −3 Original line number Diff line number Diff line Loading @@ -15,15 +15,19 @@ */ package com.android.systemui.flags; import android.util.ArraySet; import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; /** * Concrete implementation of the a Flag manager that returns default values for debug builds */ @SysUISingleton public class FeatureFlagManager { public class FeatureFlagManager implements FlagReader, FlagWriter { @Inject public FeatureFlagManager() {} public boolean isEnabled(int key, boolean defaultValue) { return isEnabled(Integer.toString(key), defaultValue); } Loading @@ -40,4 +44,9 @@ public class FeatureFlagManager { public void setEnabled(String key, boolean value) { // TODO } public void addListener(Listener run) {} public void removeListener(Listener run) {} } packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +9 −0 Original line number Diff line number Diff line Loading @@ -38,7 +38,10 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.dagger.DemoModeModule; import com.android.systemui.doze.dagger.DozeComponent; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlagManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FlagReader; import com.android.systemui.flags.FlagWriter; import com.android.systemui.fragments.FragmentService; import com.android.systemui.log.dagger.LogModule; import com.android.systemui.model.SysUiState; Loading Loading @@ -149,6 +152,12 @@ public abstract class SystemUIModule { return state; } @Binds abstract FlagReader provideFlagReader(FeatureFlagManager impl); @Binds abstract FlagWriter provideFlagWriter(FeatureFlagManager impl); @BindsOptionalOf abstract CommandQueue optionalCommandQueue(); Loading packages/SystemUI/src/com/android/systemui/flags/FeatureFlagManager.java +9 −7 Original line number Diff line number Diff line Loading @@ -18,19 +18,21 @@ package com.android.systemui.flags; import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; /** * Default implementation of the a Flag manager that returns default values for release builds */ @SysUISingleton public class FeatureFlagManager { public boolean getBoolean(int key, boolean defaultValue) { public class FeatureFlagManager implements FlagReader, FlagWriter { @Inject public FeatureFlagManager() {} public boolean isEnabled(String key, boolean defaultValue) { return defaultValue; } public void setBoolean(int key, boolean value) {} public boolean getBoolean(String key, boolean defaultValue) { public boolean isEnabled(int key, boolean defaultValue) { return defaultValue; } public void setBoolean(String key, boolean value) {} public void addFlagChangedListener(Runnable run) {} public void removeFlagUpdatedListener(Runnable run) {} public void setEnabled(String key, boolean value) {} public void setEnabled(int key, boolean value) {} } packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java +37 −49 Original line number Diff line number Diff line Loading @@ -16,26 +16,29 @@ package com.android.systemui.flags; import android.content.Context; import android.content.res.Resources; import android.util.SparseArray; import androidx.annotation.BoolRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.FlagReaderPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.dump.DumpManager; import com.android.systemui.util.wrapper.BuildInfo; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import javax.inject.Inject; /** * Reads and caches feature flags for quick access * * Feature flags must be defined as boolean resources. For example: * Feature flags must be defined as boolean resources. For example:t * * {@code * <bool name="flag_foo_bar_baz">false</bool> Loading @@ -55,71 +58,39 @@ import javax.inject.Inject; * Calls to this class should probably be wrapped by a method in {@link FeatureFlags}. */ @SysUISingleton public class FeatureFlagReader { public class FeatureFlagReader implements Dumpable { private final Resources mResources; private final boolean mAreFlagsOverrideable; private final PluginManager mPluginManager; private final SystemPropertiesHelper mSystemPropertiesHelper; private final SparseArray<CachedFlag> mCachedFlags = new SparseArray<>(); private FlagReaderPlugin mPlugin = new FlagReaderPlugin(){}; private final FlagReader mFlagReader; @Inject public FeatureFlagReader( @Main Resources resources, BuildInfo build, PluginManager pluginManager, SystemPropertiesHelper systemPropertiesHelper) { DumpManager dumpManager, SystemPropertiesHelper systemPropertiesHelper, FlagReader reader) { mResources = resources; mPluginManager = pluginManager; mFlagReader = reader; mSystemPropertiesHelper = systemPropertiesHelper; mAreFlagsOverrideable = build.isDebuggable() && mResources.getBoolean(R.bool.are_flags_overrideable); mPluginManager.addPluginListener(mPluginListener, FlagReaderPlugin.class); } private final PluginListener<FlagReaderPlugin> mPluginListener = new PluginListener<FlagReaderPlugin>() { public void onPluginConnected(FlagReaderPlugin plugin, Context context) { mPlugin = plugin; } public void onPluginDisconnected(FlagReaderPlugin plugin) { mPlugin = new FlagReaderPlugin() {}; dumpManager.registerDumpable("FeatureFlags", this); } }; boolean isEnabled(BooleanFlag flag) { return mPlugin.isEnabled(flag.getId(), flag.getDefault()); } String getValue(StringFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); } int getValue(IntFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); return mFlagReader.isEnabled(flag.getId(), flag.getDefault()); } long getValue(LongFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); void addListener(FlagReader.Listener listener) { mFlagReader.addListener(listener); } float getValue(FloatFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); } double getValue(DoubleFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); } void addListener(FlagReaderPlugin.Listener listener) { mPlugin.addListener(listener); } void removeListener(FlagReaderPlugin.Listener listener) { mPlugin.removeListener(listener); void removeListener(FlagReader.Listener listener) { mFlagReader.removeListener(listener); } /** Loading Loading @@ -172,6 +143,23 @@ public class FeatureFlagReader { } } @Override public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { ArrayList<String> flagStrings = new ArrayList<>(mCachedFlags.size()); for (int i = 0; i < mCachedFlags.size(); i++) { int key = mCachedFlags.keyAt(i); // get the object by the key. CachedFlag flag = mCachedFlags.get(key); flagStrings.add(" " + RESNAME_PREFIX + flag.name + ": " + flag.value + "\n"); } flagStrings.sort(String.CASE_INSENSITIVE_ORDER); pw.println("AreFlagsOverrideable: " + mAreFlagsOverrideable); pw.println("Cached FeatureFlags:"); for (String flagString : flagStrings) { pw.print(flagString); } } private static class CachedFlag { public final String name; public final boolean value; Loading packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java +1 −39 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import android.util.FeatureFlagUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.FlagReaderPlugin; import java.util.ArrayList; import java.util.HashMap; Loading Loading @@ -51,7 +50,7 @@ public class FeatureFlags { flagReader.addListener(mListener); } private final FlagReaderPlugin.Listener mListener = id -> { private final FlagReader.Listener mListener = id -> { if (mListeners.containsKey(id) && mFlagMap.containsKey(id)) { mListeners.get(id).forEach(listener -> listener.onFlagChanged(mFlagMap.get(id))); } Loading @@ -70,45 +69,8 @@ public class FeatureFlags { return mFlagReader.isEnabled(flag); } /** * @param flag The {@link StringFlag} of interest. * @return The value of the flag. */ public String getValue(StringFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link IntFlag} of interest. * @return The value of the flag. */ public int getValue(IntFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link LongFlag} of interest. * @return The value of the flag. */ public long getValue(LongFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link FloatFlag} of interest. * @return The value of the flag. */ public float getValue(FloatFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link DoubleFlag} of interest. * @return The value of the flag. */ public double getValue(DoubleFlag flag) { return mFlagReader.getValue(flag); } /** Add a listener for a specific flag. */ public void addFlagListener(Flag<?> flag, Listener listener) { Loading Loading
packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java +12 −3 Original line number Diff line number Diff line Loading @@ -15,15 +15,19 @@ */ package com.android.systemui.flags; import android.util.ArraySet; import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; /** * Concrete implementation of the a Flag manager that returns default values for debug builds */ @SysUISingleton public class FeatureFlagManager { public class FeatureFlagManager implements FlagReader, FlagWriter { @Inject public FeatureFlagManager() {} public boolean isEnabled(int key, boolean defaultValue) { return isEnabled(Integer.toString(key), defaultValue); } Loading @@ -40,4 +44,9 @@ public class FeatureFlagManager { public void setEnabled(String key, boolean value) { // TODO } public void addListener(Listener run) {} public void removeListener(Listener run) {} }
packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +9 −0 Original line number Diff line number Diff line Loading @@ -38,7 +38,10 @@ import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.demomode.dagger.DemoModeModule; import com.android.systemui.doze.dagger.DozeComponent; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FeatureFlagManager; import com.android.systemui.flags.FeatureFlags; import com.android.systemui.flags.FlagReader; import com.android.systemui.flags.FlagWriter; import com.android.systemui.fragments.FragmentService; import com.android.systemui.log.dagger.LogModule; import com.android.systemui.model.SysUiState; Loading Loading @@ -149,6 +152,12 @@ public abstract class SystemUIModule { return state; } @Binds abstract FlagReader provideFlagReader(FeatureFlagManager impl); @Binds abstract FlagWriter provideFlagWriter(FeatureFlagManager impl); @BindsOptionalOf abstract CommandQueue optionalCommandQueue(); Loading
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagManager.java +9 −7 Original line number Diff line number Diff line Loading @@ -18,19 +18,21 @@ package com.android.systemui.flags; import com.android.systemui.dagger.SysUISingleton; import javax.inject.Inject; /** * Default implementation of the a Flag manager that returns default values for release builds */ @SysUISingleton public class FeatureFlagManager { public boolean getBoolean(int key, boolean defaultValue) { public class FeatureFlagManager implements FlagReader, FlagWriter { @Inject public FeatureFlagManager() {} public boolean isEnabled(String key, boolean defaultValue) { return defaultValue; } public void setBoolean(int key, boolean value) {} public boolean getBoolean(String key, boolean defaultValue) { public boolean isEnabled(int key, boolean defaultValue) { return defaultValue; } public void setBoolean(String key, boolean value) {} public void addFlagChangedListener(Runnable run) {} public void removeFlagUpdatedListener(Runnable run) {} public void setEnabled(String key, boolean value) {} public void setEnabled(int key, boolean value) {} }
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java +37 −49 Original line number Diff line number Diff line Loading @@ -16,26 +16,29 @@ package com.android.systemui.flags; import android.content.Context; import android.content.res.Resources; import android.util.SparseArray; import androidx.annotation.BoolRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.android.systemui.Dumpable; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.plugins.FlagReaderPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.dump.DumpManager; import com.android.systemui.util.wrapper.BuildInfo; import java.io.FileDescriptor; import java.io.PrintWriter; import java.util.ArrayList; import javax.inject.Inject; /** * Reads and caches feature flags for quick access * * Feature flags must be defined as boolean resources. For example: * Feature flags must be defined as boolean resources. For example:t * * {@code * <bool name="flag_foo_bar_baz">false</bool> Loading @@ -55,71 +58,39 @@ import javax.inject.Inject; * Calls to this class should probably be wrapped by a method in {@link FeatureFlags}. */ @SysUISingleton public class FeatureFlagReader { public class FeatureFlagReader implements Dumpable { private final Resources mResources; private final boolean mAreFlagsOverrideable; private final PluginManager mPluginManager; private final SystemPropertiesHelper mSystemPropertiesHelper; private final SparseArray<CachedFlag> mCachedFlags = new SparseArray<>(); private FlagReaderPlugin mPlugin = new FlagReaderPlugin(){}; private final FlagReader mFlagReader; @Inject public FeatureFlagReader( @Main Resources resources, BuildInfo build, PluginManager pluginManager, SystemPropertiesHelper systemPropertiesHelper) { DumpManager dumpManager, SystemPropertiesHelper systemPropertiesHelper, FlagReader reader) { mResources = resources; mPluginManager = pluginManager; mFlagReader = reader; mSystemPropertiesHelper = systemPropertiesHelper; mAreFlagsOverrideable = build.isDebuggable() && mResources.getBoolean(R.bool.are_flags_overrideable); mPluginManager.addPluginListener(mPluginListener, FlagReaderPlugin.class); } private final PluginListener<FlagReaderPlugin> mPluginListener = new PluginListener<FlagReaderPlugin>() { public void onPluginConnected(FlagReaderPlugin plugin, Context context) { mPlugin = plugin; } public void onPluginDisconnected(FlagReaderPlugin plugin) { mPlugin = new FlagReaderPlugin() {}; dumpManager.registerDumpable("FeatureFlags", this); } }; boolean isEnabled(BooleanFlag flag) { return mPlugin.isEnabled(flag.getId(), flag.getDefault()); } String getValue(StringFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); } int getValue(IntFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); return mFlagReader.isEnabled(flag.getId(), flag.getDefault()); } long getValue(LongFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); void addListener(FlagReader.Listener listener) { mFlagReader.addListener(listener); } float getValue(FloatFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); } double getValue(DoubleFlag flag) { return mPlugin.getValue(flag.getId(), flag.getDefault()); } void addListener(FlagReaderPlugin.Listener listener) { mPlugin.addListener(listener); } void removeListener(FlagReaderPlugin.Listener listener) { mPlugin.removeListener(listener); void removeListener(FlagReader.Listener listener) { mFlagReader.removeListener(listener); } /** Loading Loading @@ -172,6 +143,23 @@ public class FeatureFlagReader { } } @Override public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) { ArrayList<String> flagStrings = new ArrayList<>(mCachedFlags.size()); for (int i = 0; i < mCachedFlags.size(); i++) { int key = mCachedFlags.keyAt(i); // get the object by the key. CachedFlag flag = mCachedFlags.get(key); flagStrings.add(" " + RESNAME_PREFIX + flag.name + ": " + flag.value + "\n"); } flagStrings.sort(String.CASE_INSENSITIVE_ORDER); pw.println("AreFlagsOverrideable: " + mAreFlagsOverrideable); pw.println("Cached FeatureFlags:"); for (String flagString : flagStrings) { pw.print(flagString); } } private static class CachedFlag { public final String name; public final boolean value; Loading
packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java +1 −39 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import android.util.FeatureFlagUtils; import com.android.internal.annotations.VisibleForTesting; import com.android.systemui.R; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.FlagReaderPlugin; import java.util.ArrayList; import java.util.HashMap; Loading Loading @@ -51,7 +50,7 @@ public class FeatureFlags { flagReader.addListener(mListener); } private final FlagReaderPlugin.Listener mListener = id -> { private final FlagReader.Listener mListener = id -> { if (mListeners.containsKey(id) && mFlagMap.containsKey(id)) { mListeners.get(id).forEach(listener -> listener.onFlagChanged(mFlagMap.get(id))); } Loading @@ -70,45 +69,8 @@ public class FeatureFlags { return mFlagReader.isEnabled(flag); } /** * @param flag The {@link StringFlag} of interest. * @return The value of the flag. */ public String getValue(StringFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link IntFlag} of interest. * @return The value of the flag. */ public int getValue(IntFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link LongFlag} of interest. * @return The value of the flag. */ public long getValue(LongFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link FloatFlag} of interest. * @return The value of the flag. */ public float getValue(FloatFlag flag) { return mFlagReader.getValue(flag); } /** * @param flag The {@link DoubleFlag} of interest. * @return The value of the flag. */ public double getValue(DoubleFlag flag) { return mFlagReader.getValue(flag); } /** Add a listener for a specific flag. */ public void addFlagListener(Flag<?> flag, Listener listener) { Loading