Merge "Allow flags to be marked as overriden." into tm-qpr-dev

This commit is contained in:
Dave Mankoff
2022-07-21 16:29:26 +00:00
committed by Android (Google) Code Review
3 changed files with 66 additions and 28 deletions

View File

@@ -29,6 +29,7 @@ interface Flag<T> {
interface ParcelableFlag<T> : Flag<T>, Parcelable { interface ParcelableFlag<T> : Flag<T>, Parcelable {
val default: T val default: T
val overridden: Boolean
override fun describeContents() = 0 override fun describeContents() = 0
} }
@@ -52,7 +53,8 @@ interface SysPropFlag<T> : Flag<T> {
data class BooleanFlag @JvmOverloads constructor( data class BooleanFlag @JvmOverloads constructor(
override val id: Int, override val id: Int,
override val default: Boolean = false, override val default: Boolean = false,
override val teamfood: Boolean = false override val teamfood: Boolean = false,
override val overridden: Boolean = false
) : ParcelableFlag<Boolean> { ) : ParcelableFlag<Boolean> {
companion object { companion object {
@@ -65,12 +67,16 @@ data class BooleanFlag @JvmOverloads constructor(
private constructor(parcel: Parcel) : this( private constructor(parcel: Parcel) : this(
id = parcel.readInt(), id = parcel.readInt(),
default = parcel.readBoolean() default = parcel.readBoolean(),
teamfood = parcel.readBoolean(),
overridden = parcel.readBoolean()
) )
override fun writeToParcel(parcel: Parcel, flags: Int) { override fun writeToParcel(parcel: Parcel, flags: Int) {
parcel.writeInt(id) parcel.writeInt(id)
parcel.writeBoolean(default) parcel.writeBoolean(default)
parcel.writeBoolean(teamfood)
parcel.writeBoolean(overridden)
} }
} }
@@ -100,7 +106,8 @@ data class SysPropBooleanFlag @JvmOverloads constructor(
data class StringFlag @JvmOverloads constructor( data class StringFlag @JvmOverloads constructor(
override val id: Int, override val id: Int,
override val default: String = "", override val default: String = "",
override val teamfood: Boolean = false override val teamfood: Boolean = false,
override val overridden: Boolean = false
) : ParcelableFlag<String> { ) : ParcelableFlag<String> {
companion object { companion object {
@JvmField @JvmField
@@ -130,7 +137,8 @@ data class ResourceStringFlag @JvmOverloads constructor(
data class IntFlag @JvmOverloads constructor( data class IntFlag @JvmOverloads constructor(
override val id: Int, override val id: Int,
override val default: Int = 0, override val default: Int = 0,
override val teamfood: Boolean = false override val teamfood: Boolean = false,
override val overridden: Boolean = false
) : ParcelableFlag<Int> { ) : ParcelableFlag<Int> {
companion object { companion object {
@@ -161,7 +169,8 @@ data class ResourceIntFlag @JvmOverloads constructor(
data class LongFlag @JvmOverloads constructor( data class LongFlag @JvmOverloads constructor(
override val id: Int, override val id: Int,
override val default: Long = 0, override val default: Long = 0,
override val teamfood: Boolean = false override val teamfood: Boolean = false,
override val overridden: Boolean = false
) : ParcelableFlag<Long> { ) : ParcelableFlag<Long> {
companion object { companion object {
@@ -186,7 +195,8 @@ data class LongFlag @JvmOverloads constructor(
data class FloatFlag @JvmOverloads constructor( data class FloatFlag @JvmOverloads constructor(
override val id: Int, override val id: Int,
override val default: Float = 0f, override val default: Float = 0f,
override val teamfood: Boolean = false override val teamfood: Boolean = false,
override val overridden: Boolean = false
) : ParcelableFlag<Float> { ) : ParcelableFlag<Float> {
companion object { companion object {
@@ -217,7 +227,8 @@ data class ResourceFloatFlag @JvmOverloads constructor(
data class DoubleFlag @JvmOverloads constructor( data class DoubleFlag @JvmOverloads constructor(
override val id: Int, override val id: Int,
override val default: Double = 0.0, override val default: Double = 0.0,
override val teamfood: Boolean = false override val teamfood: Boolean = false,
override val overridden: Boolean = false
) : ParcelableFlag<Double> { ) : ParcelableFlag<Double> {
companion object { companion object {

View File

@@ -65,19 +65,28 @@ class FlagManager constructor(
return CallbackToFutureAdapter.getFuture { return CallbackToFutureAdapter.getFuture {
completer: CallbackToFutureAdapter.Completer<Collection<Flag<*>>> -> completer: CallbackToFutureAdapter.Completer<Collection<Flag<*>>> ->
context.sendOrderedBroadcast(intent, null, context.sendOrderedBroadcast(
intent,
null,
object : BroadcastReceiver() { object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) { override fun onReceive(context: Context, intent: Intent) {
val extras: Bundle? = getResultExtras(false) val extras: Bundle? = getResultExtras(false)
val listOfFlags: java.util.ArrayList<ParcelableFlag<*>>? = val listOfFlags: java.util.ArrayList<ParcelableFlag<*>>? =
extras?.getParcelableArrayList(EXTRA_FLAGS) extras?.getParcelableArrayList(
EXTRA_FLAGS, ParcelableFlag::class.java
)
if (listOfFlags != null) { if (listOfFlags != null) {
completer.set(listOfFlags) completer.set(listOfFlags)
} else { } else {
completer.setException(NoFlagResultsException()) completer.setException(NoFlagResultsException())
} }
} }
}, null, Activity.RESULT_OK, "extra data", null) },
null,
Activity.RESULT_OK,
"extra data",
null
)
"QueryingFlags" "QueryingFlags"
} }
} }
@@ -152,7 +161,11 @@ class FlagManager constructor(
} }
val parts = uri.pathSegments val parts = uri.pathSegments
val idStr = parts[parts.size - 1] 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) clearCacheAction?.accept(id)
dispatchListenersAndMaybeRestart(id, onSettingsChangedAction) dispatchListenersAndMaybeRestart(id, onSettingsChangedAction)
} }
@@ -188,4 +201,5 @@ class FlagManager constructor(
} }
class NoFlagResultsException : Exception( class NoFlagResultsException : Exception(
"SystemUI failed to communicate its flags back successfully") "SystemUI failed to communicate its flags back successfully"
)

View File

@@ -32,7 +32,6 @@ import android.content.res.Resources;
import android.os.Bundle; import android.os.Bundle;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.DeviceConfig;
import android.util.Log; import android.util.Log;
import androidx.annotation.NonNull; 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.*/ /** Specific override for Boolean flags that checks against the teamfood list.*/
private boolean readFlagValue(int id, boolean defaultValue) { 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. // Only check for teamfood if the default is false.
if (!defaultValue && result == null && id != Flags.TEAMFOOD.getId()) { if (!defaultValue && result == null && id != Flags.TEAMFOOD.getId()) {
if (mAllFlags.containsKey(id) && mAllFlags.get(id).getTeamfood()) { if (mAllFlags.containsKey(id) && mAllFlags.get(id).getTeamfood()) {
@@ -208,6 +207,10 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {
return result == null ? defaultValue : result; return result == null ? defaultValue : result;
} }
private Boolean readBooleanFlagOverride(int id) {
return readFlagValueInternal(id, BooleanFlagSerializer.INSTANCE);
}
@NonNull @NonNull
private <T> T readFlagValue(int id, @NonNull T defaultValue, FlagSerializer<T> serializer) { private <T> T readFlagValue(int id, @NonNull T defaultValue, FlagSerializer<T> serializer) {
requireNonNull(defaultValue, "defaultValue"); requireNonNull(defaultValue, "defaultValue");
@@ -407,11 +410,18 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {
@Nullable @Nullable
private ParcelableFlag<?> toParcelableFlag(Flag<?> f) { private ParcelableFlag<?> toParcelableFlag(Flag<?> f) {
if (f instanceof BooleanFlag) { 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) { if (f instanceof ResourceBooleanFlag) {
return new BooleanFlag( 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) { if (f instanceof DeviceConfigBooleanFlag) {
return new BooleanFlag( return new BooleanFlag(
@@ -420,7 +430,10 @@ public class FeatureFlagsDebug implements FeatureFlags, Dumpable {
if (f instanceof SysPropBooleanFlag) { if (f instanceof SysPropBooleanFlag) {
// TODO(b/223379190): Teamfood not supported for sysprop flags yet. // TODO(b/223379190): Teamfood not supported for sysprop flags yet.
return new BooleanFlag( 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. // TODO: add support for other flag types.