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

Commit 57d1b2af authored by Dave Mankoff's avatar Dave Mankoff
Browse files

Define server flag names for all existing flags.

Removes reflection from our flag infrastructure.

Bug: 249121873
Fixes: 258235428
Test: manual
Change-Id: I29bf2065ba5885789e3fe94c0d6cdbae5e42a4d0
parent b3997ca3
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -116,7 +116,6 @@ android_library {
        "androidx.exifinterface_exifinterface",
        "androidx.test.ext.junit",
        "com.google.android.material_material",
        "kotlin-reflect",
        "kotlinx_coroutines_android",
        "kotlinx_coroutines",
        "iconloader_base",
+51 −27
Original line number Diff line number Diff line
@@ -63,9 +63,9 @@ interface SysPropFlag<T> : Flag<T> {
// Consider using the "parcelize" kotlin library.
abstract class BooleanFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val default: Boolean = false,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Boolean> {
@@ -80,6 +80,8 @@ abstract class BooleanFlag constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        name = parcel.readString(),
        namespace = parcel.readString(),
        default = parcel.readBoolean(),
        teamfood = parcel.readBoolean(),
        overridden = parcel.readBoolean()
@@ -87,6 +89,8 @@ abstract class BooleanFlag constructor(

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(namespace)
        parcel.writeBoolean(default)
        parcel.writeBoolean(teamfood)
        parcel.writeBoolean(overridden)
@@ -100,11 +104,11 @@ abstract class BooleanFlag constructor(
 */
data class UnreleasedFlag constructor(
    override val id: Int,
    override val name: String = "",
    override val namespace: String = "",
    override val name: String,
    override val namespace: String,
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : BooleanFlag(id, false, name, namespace, teamfood, overridden)
) : BooleanFlag(id, name, namespace, false, teamfood, overridden)

/**
 * A Flag that is true by default.
@@ -113,11 +117,11 @@ data class UnreleasedFlag constructor(
 */
data class ReleasedFlag constructor(
    override val id: Int,
    override val name: String = "",
    override val namespace: String = "",
    override val name: String,
    override val namespace: String,
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : BooleanFlag(id, true, name, namespace, teamfood, overridden)
) : BooleanFlag(id, name, namespace, true, teamfood, overridden)

/**
 * A Flag that reads its default values from a resource overlay instead of code.
@@ -126,9 +130,9 @@ data class ReleasedFlag constructor(
 */
data class ResourceBooleanFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    @BoolRes override val resourceId: Int,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false
) : ResourceFlag<Boolean>

@@ -157,8 +161,8 @@ data class DeviceConfigBooleanFlag constructor(
data class SysPropBooleanFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val default: Boolean = false,
    override val namespace: String = ""
) : SysPropFlag<Boolean> {
    // TODO(b/223379190): Teamfood not supported for sysprop flags yet.
    override val teamfood: Boolean = false
@@ -166,9 +170,9 @@ data class SysPropBooleanFlag constructor(

data class StringFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val default: String = "",
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<String> {
@@ -182,28 +186,32 @@ data class StringFlag constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        name = parcel.readString(),
        namespace = parcel.readString(),
        default = parcel.readString() ?: ""
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(namespace)
        parcel.writeString(default)
    }
}

data class ResourceStringFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    @StringRes override val resourceId: Int,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false
) : ResourceFlag<String>

data class IntFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val default: Int = 0,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Int> {
@@ -218,20 +226,24 @@ data class IntFlag constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        name = parcel.readString(),
        namespace = parcel.readString(),
        default = parcel.readInt()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(namespace)
        parcel.writeInt(default)
    }
}

data class ResourceIntFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    @IntegerRes override val resourceId: Int,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false
) : ResourceFlag<Int>

@@ -239,8 +251,8 @@ data class LongFlag constructor(
    override val id: Int,
    override val default: Long = 0,
    override val teamfood: Boolean = false,
    override val name: String = "",
    override val namespace: String = "",
    override val name: String,
    override val namespace: String,
    override val overridden: Boolean = false
) : ParcelableFlag<Long> {

@@ -254,20 +266,24 @@ data class LongFlag constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        name = parcel.readString(),
        namespace = parcel.readString(),
        default = parcel.readLong()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(namespace)
        parcel.writeLong(default)
    }
}

data class FloatFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val default: Float = 0f,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false,
    override val overridden: Boolean = false
) : ParcelableFlag<Float> {
@@ -282,29 +298,33 @@ data class FloatFlag constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        name = parcel.readString(),
        namespace = parcel.readString(),
        default = parcel.readFloat()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(namespace)
        parcel.writeFloat(default)
    }
}

data class ResourceFloatFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val resourceId: Int,
    override val name: String = "",
    override val namespace: String = "",
    override val teamfood: Boolean = false,
) : ResourceFlag<Int>

data class DoubleFlag constructor(
    override val id: Int,
    override val name: String,
    override val namespace: String,
    override val default: Double = 0.0,
    override val teamfood: Boolean = false,
    override val name: String = "",
    override val namespace: String = "",
    override val overridden: Boolean = false
) : ParcelableFlag<Double> {

@@ -318,11 +338,15 @@ data class DoubleFlag constructor(

    private constructor(parcel: Parcel) : this(
        id = parcel.readInt(),
        name = parcel.readString(),
        namespace = parcel.readString(),
        default = parcel.readDouble()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeInt(id)
        parcel.writeString(name)
        parcel.writeString(namespace)
        parcel.writeDouble(default)
    }
}
+91 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.flags

import android.annotation.BoolRes

object FlagsFactory {
    private val flagMap = mutableMapOf<String, Flag<*>>()

    val knownFlags: Map<String, Flag<*>>
        get() = flagMap

    fun unreleasedFlag(
        id: Int,
        name: String,
        namespace: String = "systemui",
        teamfood: Boolean = false
    ): UnreleasedFlag {
        val flag = UnreleasedFlag(id = id, name = name, namespace = namespace, teamfood = teamfood)
        FlagsFactory.checkForDupesAndAdd(flag)
        return flag
    }

    fun releasedFlag(
        id: Int,
        name: String,
        namespace: String = "systemui",
        teamfood: Boolean = false
    ): ReleasedFlag {
        val flag = ReleasedFlag(id = id, name = name, namespace = namespace, teamfood = teamfood)
        FlagsFactory.checkForDupesAndAdd(flag)
        return flag
    }

    fun resourceBooleanFlag(
        id: Int,
        @BoolRes resourceId: Int,
        name: String,
        namespace: String = "systemui",
        teamfood: Boolean = false
    ): ResourceBooleanFlag {
        val flag =
            ResourceBooleanFlag(
                id = id,
                name = name,
                namespace = namespace,
                resourceId = resourceId,
                teamfood = teamfood
            )
        FlagsFactory.checkForDupesAndAdd(flag)
        return flag
    }

    fun sysPropBooleanFlag(
        id: Int,
        name: String,
        namespace: String = "systemui",
        default: Boolean = false
    ): SysPropBooleanFlag {
        val flag =
            SysPropBooleanFlag(id = id, name = name, namespace = "systemui", default = default)
        FlagsFactory.checkForDupesAndAdd(flag)
        return flag
    }

    private fun checkForDupesAndAdd(flag: Flag<*>) {
        if (flagMap.containsKey(flag.name)) {
            throw IllegalArgumentException("Name {flag.name} is already registered")
        }
        flagMap.forEach {
            if (it.value.id == flag.id) {
                throw IllegalArgumentException("Name {flag.id} is already registered")
            }
        }
        flagMap[flag.name] = flag
    }
}
+79 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.flags

import android.annotation.BoolRes

object FlagsFactory {
    private val flagMap = mutableMapOf<String, Flag<*>>()

    val knownFlags: Map<String, Flag<*>>
        get() = flagMap

    fun unreleasedFlag(
        id: Int,
        name: String,
        namespace: String = "systemui",
        teamfood: Boolean = false
    ): UnreleasedFlag {
        // Unreleased flags are always false in this build.
        val flag = UnreleasedFlag(id = id, name = "", namespace = "", teamfood = false)
        return flag
    }

    fun releasedFlag(
        id: Int,
        name: String,
        namespace: String = "systemui",
        teamfood: Boolean = false
    ): ReleasedFlag {
        val flag = ReleasedFlag(id = id, name = name, namespace = namespace, teamfood = teamfood)
        flagMap[name] = flag
        return flag
    }

    fun resourceBooleanFlag(
        id: Int,
        @BoolRes resourceId: Int,
        name: String,
        namespace: String = "systemui",
        teamfood: Boolean = false
    ): ResourceBooleanFlag {
        val flag =
            ResourceBooleanFlag(
                id = id,
                name = name,
                namespace = namespace,
                resourceId = resourceId,
                teamfood = teamfood
            )
        flagMap[name] = flag
        return flag
    }

    fun sysPropBooleanFlag(
        id: Int,
        name: String,
        namespace: String = "systemui",
        default: Boolean = false
    ): SysPropBooleanFlag {
        val flag =
            SysPropBooleanFlag(id = id, name = name, namespace = namespace, default = default)
        flagMap[name] = flag
        return flag
    }
}
+4 −4
Original line number Diff line number Diff line
@@ -168,10 +168,10 @@ public class FeatureFlagsRelease implements FeatureFlags {
    @Override
    public void dump(@NonNull PrintWriter pw, @NonNull String[] args) {
        pw.println("can override: false");
        Map<Integer, Flag<?>> knownFlags = Flags.collectFlags();
        for (Map.Entry<Integer, Flag<?>> idToFlag : knownFlags.entrySet()) {
            int id = idToFlag.getKey();
            Flag<?> flag = idToFlag.getValue();
        Map<String, Flag<?>> knownFlags = FlagsFactory.INSTANCE.getKnownFlags();
        for (Map.Entry<String, Flag<?>> nameToFlag : knownFlags.entrySet()) {
            Flag<?> flag = nameToFlag.getValue();
            int id = flag.getId();
            boolean def = false;
            if (mBooleanCache.indexOfKey(flag.getId()) < 0) {
                if (flag instanceof SysPropBooleanFlag) {
Loading