Remove flag plugin with flag manager with DI
Test: FeatureFlagsTest
Bug: 196602427
Change-Id: I43961a091f0f10ebd1a168f40703f0067d9f8a18
Merged-In: I43961a091f0f10ebd1a168f40703f0067d9f8a18
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FlagReaderPlugin.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/FlagReaderPlugin.java
deleted file mode 100644
index ab17499..0000000
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/FlagReaderPlugin.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.systemui.plugins;
-
-import com.android.systemui.plugins.annotations.ProvidesInterface;
-
-
-/**
- * Plugin for loading flag values from an alternate source of truth.
- */
-@ProvidesInterface(action = FlagReaderPlugin.ACTION, version = FlagReaderPlugin.VERSION)
-public interface FlagReaderPlugin extends Plugin {
- int VERSION = 1;
- String ACTION = "com.android.systemui.flags.FLAG_READER_PLUGIN";
-
- /** Returns a boolean value for the given flag. */
- default boolean isEnabled(int id, boolean def) {
- return def;
- }
-
- /** Returns a string value for the given flag id. */
- default String getValue(int id, String def) {
- return def;
- }
-
- /** Returns a int value for the given flag. */
- default int getValue(int id, int def) {
- return def;
- }
-
- /** Returns a long value for the given flag. */
- default long getValue(int id, long def) {
- return def;
- }
-
- /** Returns a float value for the given flag. */
- default float getValue(int id, float def) {
- return def;
- }
-
- /** Returns a double value for the given flag. */
- default double getValue(int id, double def) {
- return def;
- }
-
- /** Add a listener to be alerted when any flag changes. */
- default void addListener(Listener listener) {}
-
- /** Remove a listener to be alerted when any flag changes. */
- default void removeListener(Listener listener) {}
-
- /** A simple listener to be alerted when a flag changes. */
- interface Listener {
- /** */
- void onFlagChanged(int id);
- }
-}
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 5c4f08e..b3a6699 100644
--- a/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java
+++ b/packages/SystemUI/src-debug/com/android/systemui/flags/FeatureFlagManager.java
@@ -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);
}
@@ -40,4 +44,9 @@
public void setEnabled(String key, boolean value) {
// TODO
}
-}
\ No newline at end of file
+
+ public void addListener(Listener run) {}
+
+ public void removeListener(Listener run) {}
+
+}
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
index 3b459d1..f933128 100644
--- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
+++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java
@@ -38,7 +38,10 @@
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;
@@ -149,6 +152,12 @@
return state;
}
+ @Binds
+ abstract FlagReader provideFlagReader(FeatureFlagManager impl);
+
+ @Binds
+ abstract FlagWriter provideFlagWriter(FeatureFlagManager impl);
+
@BindsOptionalOf
abstract CommandQueue optionalCommandQueue();
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagManager.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagManager.java
index dc09f2a..85baed4 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagManager.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagManager.java
@@ -18,19 +18,21 @@
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) {}
}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java
index d4d01c8..e78646a 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java
@@ -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>
@@ -55,71 +58,39 @@
* 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);
+ dumpManager.registerDumpable("FeatureFlags", this);
}
- 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() {};
- }
- };
-
boolean isEnabled(BooleanFlag flag) {
- return mPlugin.isEnabled(flag.getId(), flag.getDefault());
+ return mFlagReader.isEnabled(flag.getId(), flag.getDefault());
}
- String getValue(StringFlag flag) {
- return mPlugin.getValue(flag.getId(), flag.getDefault());
+ void addListener(FlagReader.Listener listener) {
+ mFlagReader.addListener(listener);
}
- int getValue(IntFlag flag) {
- return mPlugin.getValue(flag.getId(), flag.getDefault());
- }
-
- long getValue(LongFlag flag) {
- return mPlugin.getValue(flag.getId(), flag.getDefault());
- }
-
- 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);
}
/**
@@ -172,6 +143,23 @@
}
}
+ @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;
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java
index e2cef43..105e7f5 100644
--- a/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java
+++ b/packages/SystemUI/src/com/android/systemui/flags/FeatureFlags.java
@@ -22,7 +22,6 @@
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;
@@ -51,7 +50,7 @@
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)));
}
@@ -71,44 +70,7 @@
}
/**
- * @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) {
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagReader.java b/packages/SystemUI/src/com/android/systemui/flags/FlagReader.java
new file mode 100644
index 0000000..1ae8c1f
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/flags/FlagReader.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.flags;
+
+
+/**
+ * Plugin for loading flag values
+ */
+public interface FlagReader {
+ /** Returns a boolean value for the given flag. */
+ default boolean isEnabled(int id, boolean def) {
+ return def;
+ }
+
+ /** Add a listener to be alerted when any flag changes. */
+ default void addListener(Listener listener) {}
+
+ /** Remove a listener to be alerted when any flag changes. */
+ default void removeListener(Listener listener) {}
+
+ /** A simple listener to be alerted when a flag changes. */
+ interface Listener {
+ /** */
+ void onFlagChanged(int id);
+ }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/flags/FlagWriter.kt b/packages/SystemUI/src/com/android/systemui/flags/FlagWriter.kt
new file mode 100644
index 0000000..bacc66b
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/flags/FlagWriter.kt
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.systemui.flags
+
+interface FlagWriter {
+ fun setEnabled(key: Int, value: Boolean) {}
+}
\ No newline at end of file
diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagReaderTest.java b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagReaderTest.java
index 7bc5f86..fc6f3fd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagReaderTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagReaderTest.java
@@ -32,6 +32,7 @@
import com.android.systemui.R;
import com.android.systemui.SysuiTestCase;
+import com.android.systemui.dump.DumpManager;
import com.android.systemui.shared.plugins.PluginManager;
import com.android.systemui.util.wrapper.BuildInfo;
@@ -44,8 +45,9 @@
public class FeatureFlagReaderTest extends SysuiTestCase {
@Mock private Resources mResources;
@Mock private BuildInfo mBuildInfo;
- @Mock private PluginManager mPluginManager;
+ @Mock private DumpManager mDumpManager;
@Mock private SystemPropertiesHelper mSystemPropertiesHelper;
+ @Mock private FlagReader mFlagReader;
private FeatureFlagReader mReader;
@@ -66,7 +68,7 @@
when(mBuildInfo.isDebuggable()).thenReturn(isDebuggable);
when(mResources.getBoolean(R.bool.are_flags_overrideable)).thenReturn(isOverrideable);
mReader = new FeatureFlagReader(
- mResources, mBuildInfo, mPluginManager, mSystemPropertiesHelper);
+ mResources, mBuildInfo, mDumpManager, mSystemPropertiesHelper, mFlagReader);
}
@Test
diff --git a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsTest.java b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsTest.java
index 1a96178..a850f70 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/flags/FeatureFlagsTest.java
@@ -23,7 +23,6 @@
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
-import com.android.systemui.plugins.FlagReaderPlugin;
import org.junit.Before;
import org.junit.Test;
@@ -51,11 +50,10 @@
mFeatureFlags.addFlag(flag);
// Assert and capture that a plugin listener was added.
- ArgumentCaptor<FlagReaderPlugin.Listener> pluginListenerCaptor =
- ArgumentCaptor.forClass(FlagReaderPlugin.Listener.class);
-
+ ArgumentCaptor<FlagReader.Listener> pluginListenerCaptor =
+ ArgumentCaptor.forClass(FlagReader.Listener.class);
verify(mFeatureFlagReader).addListener(pluginListenerCaptor.capture());
- FlagReaderPlugin.Listener pluginListener = pluginListenerCaptor.getValue();
+ FlagReader.Listener pluginListener = pluginListenerCaptor.getValue();
// Signal a change. No listeners, so no real effect.
pluginListener.onFlagChanged(flag.getId());
@@ -81,11 +79,10 @@
mFeatureFlags.addFlag(flag);
// Assert and capture that a plugin listener was added.
- ArgumentCaptor<FlagReaderPlugin.Listener> pluginListenerCaptor =
- ArgumentCaptor.forClass(FlagReaderPlugin.Listener.class);
-
+ ArgumentCaptor<FlagReader.Listener> pluginListenerCaptor =
+ ArgumentCaptor.forClass(FlagReader.Listener.class);
verify(mFeatureFlagReader).addListener(pluginListenerCaptor.capture());
- FlagReaderPlugin.Listener pluginListener = pluginListenerCaptor.getValue();
+ FlagReader.Listener pluginListener = pluginListenerCaptor.getValue();
// Add a listener for the flag
final Flag<?>[] changedFlag = {null};