Loading packages/SystemUI/shared/src/com/android/systemui/flags/Flag.kt +19 −8 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ interface Flag<T> { interface ParcelableFlag<T> : Flag<T>, Parcelable { val default: T val overridden: Boolean override fun describeContents() = 0 } Loading @@ -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 { Loading @@ -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) } } Loading Loading @@ -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 Loading Loading @@ -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 { Loading Loading @@ -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 { Loading @@ -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 { Loading Loading @@ -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 { Loading packages/SystemUI/shared/src/com/android/systemui/flags/FlagManager.kt +29 −15 Original line number Diff line number Diff line Loading @@ -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" } } Loading Loading @@ -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) } Loading Loading @@ -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" ) packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java +18 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) { Loading @@ -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"); Loading Loading @@ -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( Loading @@ -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. Loading Loading
packages/SystemUI/shared/src/com/android/systemui/flags/Flag.kt +19 −8 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ interface Flag<T> { interface ParcelableFlag<T> : Flag<T>, Parcelable { val default: T val overridden: Boolean override fun describeContents() = 0 } Loading @@ -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 { Loading @@ -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) } } Loading Loading @@ -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 Loading Loading @@ -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 { Loading Loading @@ -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 { Loading @@ -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 { Loading Loading @@ -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 { Loading
packages/SystemUI/shared/src/com/android/systemui/flags/FlagManager.kt +29 −15 Original line number Diff line number Diff line Loading @@ -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" } } Loading Loading @@ -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) } Loading Loading @@ -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" )
packages/SystemUI/src/com/android/systemui/flags/FeatureFlagsDebug.java +18 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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()) { Loading @@ -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"); Loading Loading @@ -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( Loading @@ -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. Loading