Merge "Allow flags to be marked as overriden." into tm-qpr-dev
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
)
|
||||||
|
|||||||
@@ -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.
|
||||||
|
|||||||
Reference in New Issue
Block a user