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

Commit 89e49eea authored by Jeff DeCew's avatar Jeff DeCew Committed by Automerger Merge Worker
Browse files

Make FeatureFlagManager Dumpable am: 4d9465b0

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/16150893

Change-Id: I336f9adf8c966eb3dfdb3cc979ef5c35304fafbb
parents c0876d89 4d9465b0
Loading
Loading
Loading
Loading
+23 −2
Original line number Diff line number Diff line
@@ -23,11 +23,18 @@ import android.content.IntentFilter;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.NonNull;

import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;

import org.json.JSONException;
import org.json.JSONObject;

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

@@ -43,7 +50,7 @@ import javax.inject.Inject;
 * To restore a flag back to its default, leave the `--ez value <0|1>` off of the command.
 */
@SysUISingleton
public class FeatureFlagManager implements FlagReader, FlagWriter {
public class FeatureFlagManager implements FlagReader, FlagWriter, Dumpable {
    private static final String TAG = "SysUIFlags";

    private static final String SYSPROP_PREFIX = "persist.systemui.flag_";
@@ -58,11 +65,13 @@ public class FeatureFlagManager implements FlagReader, FlagWriter {
    private final Map<Integer, Boolean> mBooleanFlagCache = new HashMap<>();

    @Inject
    public FeatureFlagManager(SystemPropertiesHelper systemPropertiesHelper, Context context) {
    public FeatureFlagManager(SystemPropertiesHelper systemPropertiesHelper, Context context,
            DumpManager dumpManager) {
        mSystemPropertiesHelper = systemPropertiesHelper;

        IntentFilter filter = new IntentFilter(ACTION_SET_FLAG);
        context.registerReceiver(mReceiver, filter, FLAGS_PERMISSION, null);
        dumpManager.registerDumpable(TAG, this);
    }

    /** Return a {@link BooleanFlag}'s value. */
@@ -186,4 +195,16 @@ public class FeatureFlagManager implements FlagReader, FlagWriter {
            }
        }
    };

    @Override
    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
        ArrayList<String> flagStrings = new ArrayList<>(mBooleanFlagCache.size());
        for (Map.Entry<Integer, Boolean> entry : mBooleanFlagCache.entrySet()) {
            flagStrings.add("  sysui_flag_" + entry.getKey() + ": " + entry.getValue());
        }
        flagStrings.sort(String.CASE_INSENSITIVE_ORDER);
        for (String flagString : flagStrings) {
            pw.println(flagString);
        }
    }
}
+27 −2
Original line number Diff line number Diff line
@@ -16,23 +16,48 @@

package com.android.systemui.flags;

import android.util.SparseBooleanArray;

import androidx.annotation.NonNull;

import com.android.systemui.Dumpable;
import com.android.systemui.dagger.SysUISingleton;
import com.android.systemui.dump.DumpManager;

import java.io.FileDescriptor;
import java.io.PrintWriter;

import javax.inject.Inject;

/**
 * Default implementation of the a Flag manager that returns default values for release builds
 *
 * There's a version of this file in src-debug which allows overriding, and has documentation about
 * how to set flags.
 */
@SysUISingleton
public class FeatureFlagManager implements FlagReader, FlagWriter {
public class FeatureFlagManager implements FlagReader, FlagWriter, Dumpable {
    SparseBooleanArray mAccessedFlags = new SparseBooleanArray();
    @Inject
    public FeatureFlagManager() {}
    public FeatureFlagManager(DumpManager dumpManager) {
        dumpManager.registerDumpable("SysUIFlags", this);
    }
    public boolean isEnabled(String key, boolean defaultValue) {
        return defaultValue;
    }
    public boolean isEnabled(int key, boolean defaultValue) {
        mAccessedFlags.append(key, defaultValue);
        return defaultValue;
    }
    public void setEnabled(String key, boolean value) {}
    public void setEnabled(int key, boolean value) {}

    @Override
    public void dump(@NonNull FileDescriptor fd, @NonNull PrintWriter pw, @NonNull String[] args) {
        int size = mAccessedFlags.size();
        for (int i = 0; i < size; i++) {
            pw.println("  sysui_flag_" + mAccessedFlags.keyAt(i)
                    + ": " + mAccessedFlags.valueAt(i));
        }
    }
}
+40 −1
Original line number Diff line number Diff line
@@ -18,23 +18,35 @@ 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.Mockito.mock;

import androidx.test.filters.SmallTest;

import com.android.systemui.SysuiTestCase;
import com.android.systemui.dump.DumpManager;

import org.junit.Before;
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 FeatureFlagManagerTest extends SysuiTestCase {
    FeatureFlagManager mFeatureFlagManager;

    @Mock private DumpManager mDumpManager;

    @Before
    public void setup() {
        MockitoAnnotations.initMocks(this);

        mFeatureFlagManager = new FeatureFlagManager();
        mFeatureFlagManager = new FeatureFlagManager(mDumpManager);
    }

    @Test
@@ -43,4 +55,31 @@ public class FeatureFlagManagerTest extends SysuiTestCase {
        // Again, nothing changes.
        assertThat(mFeatureFlagManager.isEnabled(1, false)).isFalse();
    }

    @Test
    public void testDump() {
        // Even if a flag is set before
        mFeatureFlagManager.setEnabled(1, true);

        // WHEN the flags have been accessed
        assertFalse(mFeatureFlagManager.isEnabled(1, false));
        assertTrue(mFeatureFlagManager.isEnabled(2, true));

        // Even if a flag is set after
        mFeatureFlagManager.setEnabled(2, false);

        // THEN the dump contains the flags and the default values
        String dump = dumpToString();
        assertThat(dump).contains(" sysui_flag_1: false\n");
        assertThat(dump).contains(" sysui_flag_2: true\n");
    }

    private String dumpToString() {
        StringWriter sw = new StringWriter();
        PrintWriter pw = new PrintWriter(sw);
        mFeatureFlagManager.dump(mock(FileDescriptor.class), pw, new String[0]);
        pw.flush();
        String dump = sw.toString();
        return dump;
    }
}