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

Commit 5eac15cf authored by Jay Aliomer's avatar Jay Aliomer Committed by Dave Mankoff
Browse files

Remove flag plugin with flag manager with DI

Test: FeatureFlagsTest
Bug: 196602427
Change-Id: I43961a091f0f10ebd1a168f40703f0067d9f8a18
Merged-In: I43961a091f0f10ebd1a168f40703f0067d9f8a18
parent 2a482869
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -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 class FeatureFlagManager {
    public void setEnabled(String key, boolean value) {
        // TODO
    }

    public void addListener(Listener run) {}

    public void removeListener(Listener run) {}

}
+9 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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();

+9 −7
Original line number Diff line number Diff line
@@ -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) {}
}
+37 −49
Original line number Diff line number Diff line
@@ -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 @@ 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);
    }

    /**
@@ -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;
+1 −39
Original line number Diff line number Diff line
@@ -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;
@@ -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)));
        }
@@ -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