Loading packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java +27 −1 Original line number Diff line number Diff line Loading @@ -21,16 +21,23 @@ 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.dump.DumpManager; import com.android.systemui.plugins.FlagReaderPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; 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 Loading @@ -55,7 +62,7 @@ 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; Loading @@ -68,6 +75,7 @@ public class FeatureFlagReader { public FeatureFlagReader( @Main Resources resources, BuildInfo build, DumpManager dumpManager, PluginManager pluginManager, SystemPropertiesHelper systemPropertiesHelper) { mResources = resources; Loading @@ -76,6 +84,7 @@ public class FeatureFlagReader { mAreFlagsOverrideable = build.isDebuggable() && mResources.getBoolean(R.bool.are_flags_overrideable); dumpManager.registerDumpable("FeatureFlags", this); mPluginManager.addPluginListener(mPluginListener, FlagReaderPlugin.class); } Loading Loading @@ -172,6 +181,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/tests/src/com/android/systemui/flags/FeatureFlagReaderTest.java +35 −2 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.systemui.flags; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -32,6 +35,7 @@ import androidx.test.filters.SmallTest; 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; Loading @@ -40,10 +44,15 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.StringWriter; @SmallTest public class FeatureFlagReaderTest extends SysuiTestCase { @Mock private Resources mResources; @Mock private BuildInfo mBuildInfo; @Mock private DumpManager mDumpManager; @Mock private PluginManager mPluginManager; @Mock private SystemPropertiesHelper mSystemPropertiesHelper; Loading @@ -66,7 +75,7 @@ public class FeatureFlagReaderTest extends SysuiTestCase { 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, mPluginManager, mSystemPropertiesHelper); } @Test Loading Loading @@ -127,9 +136,29 @@ public class FeatureFlagReaderTest extends SysuiTestCase { .getBoolean(fakeStorageKey(FLAG_RESID_0), false); } @Test public void testDump() { // GIVEN that the flag 0 (by override) and 1 (by default) are both true overrideFlag(FLAG_RESID_0, true); // WHEN the flags have been accessed assertTrue(mReader.isEnabled(FLAG_RESID_0)); assertTrue(mReader.isEnabled(FLAG_RESID_1)); // THEN the dump contains the flags and their correct values StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); mReader.dump(mock(FileDescriptor.class), pw, new String[0]); pw.flush(); String dump = sw.toString(); assertThat(dump).contains(" flag_testname_" + FLAG_RESID_0 + ": true\n"); assertThat(dump).contains(" flag_testname_" + FLAG_RESID_1 + ": true\n"); assertThat(dump).contains("AreFlagsOverrideable: true\n"); } private void defineFlag(int resId, boolean value) { when(mResources.getBoolean(resId)).thenReturn(value); when(mResources.getResourceEntryName(resId)).thenReturn(fakeStorageKey(resId)); when(mResources.getResourceEntryName(resId)).thenReturn(fakeResourceEntryName(resId)); } private void overrideFlag(int resId, boolean value) { Loading @@ -137,6 +166,10 @@ public class FeatureFlagReaderTest extends SysuiTestCase { .thenReturn(value); } private String fakeResourceEntryName(@BoolRes int resId) { return "flag_testname_" + resId; } private String fakeStorageKey(@BoolRes int resId) { return "persist.systemui.flag_testname_" + resId; } Loading Loading
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagReader.java +27 −1 Original line number Diff line number Diff line Loading @@ -21,16 +21,23 @@ 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.dump.DumpManager; import com.android.systemui.plugins.FlagReaderPlugin; import com.android.systemui.plugins.PluginListener; import com.android.systemui.shared.plugins.PluginManager; 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 Loading @@ -55,7 +62,7 @@ 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; Loading @@ -68,6 +75,7 @@ public class FeatureFlagReader { public FeatureFlagReader( @Main Resources resources, BuildInfo build, DumpManager dumpManager, PluginManager pluginManager, SystemPropertiesHelper systemPropertiesHelper) { mResources = resources; Loading @@ -76,6 +84,7 @@ public class FeatureFlagReader { mAreFlagsOverrideable = build.isDebuggable() && mResources.getBoolean(R.bool.are_flags_overrideable); dumpManager.registerDumpable("FeatureFlags", this); mPluginManager.addPluginListener(mPluginListener, FlagReaderPlugin.class); } Loading Loading @@ -172,6 +181,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/tests/src/com/android/systemui/flags/FeatureFlagReaderTest.java +35 −2 Original line number Diff line number Diff line Loading @@ -16,11 +16,14 @@ package com.android.systemui.flags; import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; Loading @@ -32,6 +35,7 @@ import androidx.test.filters.SmallTest; 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; Loading @@ -40,10 +44,15 @@ import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import java.io.FileDescriptor; import java.io.PrintWriter; import java.io.StringWriter; @SmallTest public class FeatureFlagReaderTest extends SysuiTestCase { @Mock private Resources mResources; @Mock private BuildInfo mBuildInfo; @Mock private DumpManager mDumpManager; @Mock private PluginManager mPluginManager; @Mock private SystemPropertiesHelper mSystemPropertiesHelper; Loading @@ -66,7 +75,7 @@ public class FeatureFlagReaderTest extends SysuiTestCase { 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, mPluginManager, mSystemPropertiesHelper); } @Test Loading Loading @@ -127,9 +136,29 @@ public class FeatureFlagReaderTest extends SysuiTestCase { .getBoolean(fakeStorageKey(FLAG_RESID_0), false); } @Test public void testDump() { // GIVEN that the flag 0 (by override) and 1 (by default) are both true overrideFlag(FLAG_RESID_0, true); // WHEN the flags have been accessed assertTrue(mReader.isEnabled(FLAG_RESID_0)); assertTrue(mReader.isEnabled(FLAG_RESID_1)); // THEN the dump contains the flags and their correct values StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); mReader.dump(mock(FileDescriptor.class), pw, new String[0]); pw.flush(); String dump = sw.toString(); assertThat(dump).contains(" flag_testname_" + FLAG_RESID_0 + ": true\n"); assertThat(dump).contains(" flag_testname_" + FLAG_RESID_1 + ": true\n"); assertThat(dump).contains("AreFlagsOverrideable: true\n"); } private void defineFlag(int resId, boolean value) { when(mResources.getBoolean(resId)).thenReturn(value); when(mResources.getResourceEntryName(resId)).thenReturn(fakeStorageKey(resId)); when(mResources.getResourceEntryName(resId)).thenReturn(fakeResourceEntryName(resId)); } private void overrideFlag(int resId, boolean value) { Loading @@ -137,6 +166,10 @@ public class FeatureFlagReaderTest extends SysuiTestCase { .thenReturn(value); } private String fakeResourceEntryName(@BoolRes int resId) { return "flag_testname_" + resId; } private String fakeStorageKey(@BoolRes int resId) { return "persist.systemui.flag_testname_" + resId; } Loading