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

Commit 9d70f273 authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Allow flags to be marked as overriden.

Bug: 233906828
Test: manual
Change-Id: If8d8cf39683db32295c73946c37b4a6d33bf63a0
Merged-In: If8d8cf39683db32295c73946c37b4a6d33bf63a0
parent a9a4f1e4
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ interface Flag<T> {

interface ParcelableFlag<T> : Flag<T>, Parcelable {
    val default: T
    val overridden: Boolean
    override fun describeContents() = 0
}

@@ -52,7 +53,8 @@ interface SysPropFlag<T> : Flag<T> {
data class BooleanFlag @JvmOverloads constructor(
    override val id: Int,
    override val default: Boolean = false,
    override val teamfood: Boolean = false
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Boolean> {

    companion object {
@@ -65,12 +67,16 @@ data class BooleanFlag @JvmOverloads constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        default = parcel.readBoolean()
        default = parcel.readBoolean(),
        teamfood = parcel.readBoolean(),
        overridden = parcel.readBoolean()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeBoolean(default)
        parcel.writeBoolean(teamfood)
        parcel.writeBoolean(overridden)
    }
}

@@ -100,7 +106,8 @@ data class SysPropBooleanFlag @JvmOverloads constructor(
data class StringFlag @JvmOverloads constructor(
    override val id: Int,
    override val default: String = "",
    override val teamfood: Boolean = false
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<String> {
    companion object {
        @JvmField
@@ -130,7 +137,8 @@ data class ResourceStringFlag @JvmOverloads constructor(
data class IntFlag @JvmOverloads constructor(
    override val id: Int,
    override val default: Int = 0,
    override val teamfood: Boolean = false
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Int> {

    companion object {
@@ -161,7 +169,8 @@ data class ResourceIntFlag @JvmOverloads constructor(
data class LongFlag @JvmOverloads constructor(
    override val id: Int,
    override val default: Long = 0,
    override val teamfood: Boolean = false
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Long> {

    companion object {
@@ -186,7 +195,8 @@ data class LongFlag @JvmOverloads constructor(
data class FloatFlag @JvmOverloads constructor(
    override val id: Int,
    override val default: Float = 0f,
    override val teamfood: Boolean = false
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Float> {

    companion object {
@@ -217,7 +227,8 @@ data class ResourceFloatFlag @JvmOverloads constructor(
data class DoubleFlag @JvmOverloads constructor(
    override val id: Int,
    override val default: Double = 0.0,
    override val teamfood: Boolean = false
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Double> {

    companion object {
+29 −15
Original line number Diff line number Diff line
@@ -65,19 +65,28 @@ class FlagManager constructor(

        return CallbackToFutureAdapter.getFuture {
                completer: CallbackToFutureAdapter.Completer<Collection<Flag<*>>> ->
                context.sendOrderedBroadcast(intent, null,
            context.sendOrderedBroadcast(
                intent,
                null,
                object : BroadcastReceiver() {
                    override fun onReceive(context: Context, intent: Intent) {
                        val extras: Bundle? = getResultExtras(false)
                        val listOfFlags: java.util.ArrayList<ParcelableFlag<*>>? =
                                extras?.getParcelableArrayList(EXTRA_FLAGS)
                            extras?.getParcelableArrayList(
                                EXTRA_FLAGS, ParcelableFlag::class.java
                            )
                        if (listOfFlags != null) {
                            completer.set(listOfFlags)
                        } else {
                            completer.setException(NoFlagResultsException())
                        }
                    }
                    }, null, Activity.RESULT_OK, "extra data", null)
                },
                null,
                Activity.RESULT_OK,
                "extra data",
                null
            )
            "QueryingFlags"
        }
    }
@@ -152,7 +161,11 @@ class FlagManager constructor(
            }
            val parts = uri.pathSegments
            val idStr = parts[parts.size - 1]
            val id = try { idStr.toInt() } catch (e: NumberFormatException) { return }
            val id = try {
                idStr.toInt()
            } catch (e: NumberFormatException) {
                return
            }
            clearCacheAction?.accept(id)
            dispatchListenersAndMaybeRestart(id, onSettingsChangedAction)
        }
@@ -188,4 +201,5 @@ class FlagManager constructor(
}

class NoFlagResultsException : Exception(
    "SystemUI failed to communicate its flags back successfully")
 No newline at end of file
    "SystemUI failed to communicate its flags back successfully"
)
+18 −5
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ import android.content.res.Resources;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.util.Log;

import androidx.annotation.NonNull;
@@ -197,7 +196,7 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {

    /** Specific override for Boolean flags that checks against the teamfood list.*/
    private boolean readFlagValue(int id, boolean defaultValue) {
        Boolean result = readFlagValueInternal(id, BooleanFlagSerializer.INSTANCE);
        Boolean result = readBooleanFlagOverride(id);
        // Only check for teamfood if the default is false.
        if (!defaultValue && result == null && id != Flags.TEAMFOOD.getId()) {
            if (mAllFlags.containsKey(id) && mAllFlags.get(id).getTeamfood()) {
@@ -208,6 +207,10 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {
        return result == null ? defaultValue : result;
    }

    private Boolean readBooleanFlagOverride(int id) {
        return readFlagValueInternal(id, BooleanFlagSerializer.INSTANCE);
    }

    @NonNull
    private <T> T readFlagValue(int id, @NonNull T defaultValue, FlagSerializer<T> serializer) {
        requireNonNull(defaultValue, "defaultValue");
@@ -407,11 +410,18 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {
        @Nullable
        private ParcelableFlag<?> toParcelableFlag(Flag<?> f) {
            if (f instanceof BooleanFlag) {
                return new BooleanFlag(f.getId(), isEnabled((BooleanFlag) f), f.getTeamfood());
                return new BooleanFlag(
                        f.getId(),
                        isEnabled((BooleanFlag) f),
                        f.getTeamfood(),
                        readBooleanFlagOverride(f.getId()) != null);
            }
            if (f instanceof ResourceBooleanFlag) {
                return new BooleanFlag(
                        f.getId(), isEnabled((ResourceBooleanFlag) f), f.getTeamfood());
                        f.getId(),
                        isEnabled((ResourceBooleanFlag) f),
                        f.getTeamfood(),
                        readBooleanFlagOverride(f.getId()) != null);
            }
            if (f instanceof DeviceConfigBooleanFlag) {
                return new BooleanFlag(
@@ -420,7 +430,10 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {
            if (f instanceof SysPropBooleanFlag) {
                // TODO(b/223379190): Teamfood not supported for sysprop flags yet.
                return new BooleanFlag(
                        f.getId(), isEnabled((SysPropBooleanFlag) f), false);
                        f.getId(),
                        ((SysPropBooleanFlag) f).getDefault(),
                        false,
                        !mSystemProperties.get(((SysPropBooleanFlag) f).getName()).isEmpty());
            }

            // TODO: add support for other flag types.