Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7581b74 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Don't cache simple BooleanFlags.

Caching them doesn't offer any performance wins. It does prevent
the compiler/proguard from inlining any function calls to them.

Bug: 204319780
Test: manual
Change-Id: I0057fd4b399731d6ac96ed0ad59c1be12ab3ca73
parent be091340
Loading
Loading
Loading
Loading
+20 −5
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import com.android.systemui.dump.DumpManager;

import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.Map;

import javax.inject.Inject;

@@ -65,7 +66,7 @@ public class FeatureFlagsRelease implements FeatureFlags, Dumpable {

    @Override
    public boolean isEnabled(BooleanFlag flag) {
        return isEnabled(flag.getId(), flag.getDefault());
        return flag.getDefault();
    }

    @Override
@@ -120,10 +121,24 @@ public class FeatureFlagsRelease implements FeatureFlags, Dumpable {
    @Override
    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
        pw.println("can override: false");
        int numBooleans = mBooleanCache.size();
        pw.println("booleans: " + numBooleans);
        for (int i = 0; i < numBooleans; i++) {
            pw.println("  sysui_flag_" + mBooleanCache.keyAt(i) + ": " + mBooleanCache.valueAt(i));
        Map<Integer, Flag<?>> knownFlags = Flags.collectFlags();
        for (Map.Entry<Integer, Flag<?>> idToFlag : knownFlags.entrySet()) {
            int id = idToFlag.getKey();
            Flag<?> flag = idToFlag.getValue();
            boolean def = false;
            if (mBooleanCache.indexOfKey(flag.getId()) < 0) {
                if (flag instanceof SysPropBooleanFlag) {
                    SysPropBooleanFlag f = (SysPropBooleanFlag) flag;
                    def = mSystemProperties.getBoolean(f.getName(), f.getDefault());
                } else if (flag instanceof ResourceBooleanFlag) {
                    ResourceBooleanFlag f = (ResourceBooleanFlag) flag;
                    def = mResources.getBoolean(f.getResourceId());
                } else if (flag instanceof BooleanFlag) {
                    BooleanFlag f = (BooleanFlag) flag;
                    def = f.getDefault();
                }
            }
            pw.println("  sysui_flag_" + id + ": " + (mBooleanCache.get(id, def)));
        }
        int numStrings = mStringCache.size();
        pw.println("Strings: " + numStrings);
+0 −42
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@ import android.test.suitebuilder.annotation.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.util.mockito.any
import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat
import org.junit.After
import org.junit.Assert.assertThrows
@@ -31,8 +30,6 @@ import org.mockito.Mock
import org.mockito.Mockito.verify
import org.mockito.Mockito.verifyNoMoreInteractions
import org.mockito.MockitoAnnotations
import java.io.PrintWriter
import java.io.StringWriter
import org.mockito.Mockito.`when` as whenever

/**
@@ -97,43 +94,4 @@ class FeatureFlagsReleaseTest : SysuiTestCase() {
        whenever(mSystemProperties.getBoolean(flagName, flagDefault)).thenReturn(flagDefault)
        assertThat(mFeatureFlagsRelease.isEnabled(flag)).isEqualTo(flagDefault)
    }

    @Test
    fun testDump() {
        val flag1 = BooleanFlag(1, true)
        val flag2 = ResourceBooleanFlag(2, 1002)
        val flag3 = BooleanFlag(3, false)
        val flag4 = StringFlag(4, "")
        val flag5 = StringFlag(5, "flag5default")
        val flag6 = ResourceStringFlag(6, 1006)

        whenever(mResources.getBoolean(1002)).thenReturn(true)
        whenever(mResources.getString(1006)).thenReturn("resource1006")
        whenever(mResources.getString(1007)).thenReturn("resource1007")

        // WHEN the flags have been accessed
        assertThat(mFeatureFlagsRelease.isEnabled(flag1)).isTrue()
        assertThat(mFeatureFlagsRelease.isEnabled(flag2)).isTrue()
        assertThat(mFeatureFlagsRelease.isEnabled(flag3)).isFalse()
        assertThat(mFeatureFlagsRelease.getString(flag4)).isEmpty()
        assertThat(mFeatureFlagsRelease.getString(flag5)).isEqualTo("flag5default")
        assertThat(mFeatureFlagsRelease.getString(flag6)).isEqualTo("resource1006")

        // THEN the dump contains the flags and the default values
        val dump = dumpToString()
        assertThat(dump).contains(" sysui_flag_1: true\n")
        assertThat(dump).contains(" sysui_flag_2: true\n")
        assertThat(dump).contains(" sysui_flag_3: false\n")
        assertThat(dump).contains(" sysui_flag_4: [length=0] \"\"\n")
        assertThat(dump).contains(" sysui_flag_5: [length=12] \"flag5default\"\n")
        assertThat(dump).contains(" sysui_flag_6: [length=12] \"resource1006\"\n")
    }

    private fun dumpToString(): String {
        val sw = StringWriter()
        val pw = PrintWriter(sw)
        mFeatureFlagsRelease.dump(mock(), pw, emptyArray())
        pw.flush()
        return sw.toString()
    }
}
 No newline at end of file