Merge "Restart SystemUI on DeviceConfig changes." into tm-qpr-dev
This commit is contained in:
@@ -18,17 +18,15 @@ package com.android.systemui.flags
|
|||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.os.Handler
|
import android.os.Handler
|
||||||
import com.android.internal.statusbar.IStatusBarService
|
|
||||||
import com.android.systemui.dagger.qualifiers.Main
|
import com.android.systemui.dagger.qualifiers.Main
|
||||||
import com.android.systemui.flags.FeatureFlagsDebug.ALL_FLAGS
|
|
||||||
import com.android.systemui.util.settings.SettingsUtilModule
|
import com.android.systemui.util.settings.SettingsUtilModule
|
||||||
import dagger.Binds
|
import dagger.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
import javax.inject.Named
|
|
||||||
|
|
||||||
@Module(includes = [
|
@Module(includes = [
|
||||||
FeatureFlagsDebugStartableModule::class,
|
FeatureFlagsDebugStartableModule::class,
|
||||||
|
FlagsCommonModule::class,
|
||||||
ServerFlagReaderModule::class,
|
ServerFlagReaderModule::class,
|
||||||
SettingsUtilModule::class,
|
SettingsUtilModule::class,
|
||||||
])
|
])
|
||||||
@@ -43,20 +41,5 @@ abstract class FlagsModule {
|
|||||||
fun provideFlagManager(context: Context, @Main handler: Handler): FlagManager {
|
fun provideFlagManager(context: Context, @Main handler: Handler): FlagManager {
|
||||||
return FlagManager(context, handler)
|
return FlagManager(context, handler)
|
||||||
}
|
}
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
@Provides
|
|
||||||
@Named(ALL_FLAGS)
|
|
||||||
fun providesAllFlags(): Map<Int, Flag<*>> = Flags.collectFlags()
|
|
||||||
|
|
||||||
@JvmStatic
|
|
||||||
@Provides
|
|
||||||
fun providesRestarter(barService: IStatusBarService): Restarter {
|
|
||||||
return object: Restarter {
|
|
||||||
override fun restart() {
|
|
||||||
barService.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,29 +16,15 @@
|
|||||||
|
|
||||||
package com.android.systemui.flags
|
package com.android.systemui.flags
|
||||||
|
|
||||||
import com.android.internal.statusbar.IStatusBarService
|
|
||||||
import dagger.Binds
|
import dagger.Binds
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
|
||||||
|
|
||||||
@Module(includes = [
|
@Module(includes = [
|
||||||
FeatureFlagsReleaseStartableModule::class,
|
FeatureFlagsReleaseStartableModule::class,
|
||||||
|
FlagsCommonModule::class,
|
||||||
ServerFlagReaderModule::class
|
ServerFlagReaderModule::class
|
||||||
])
|
])
|
||||||
abstract class FlagsModule {
|
abstract class FlagsModule {
|
||||||
@Binds
|
@Binds
|
||||||
abstract fun bindsFeatureFlagRelease(impl: FeatureFlagsRelease): FeatureFlags
|
abstract fun bindsFeatureFlagRelease(impl: FeatureFlagsRelease): FeatureFlags
|
||||||
|
|
||||||
@Module
|
|
||||||
companion object {
|
|
||||||
@JvmStatic
|
|
||||||
@Provides
|
|
||||||
fun providesRestarter(barService: IStatusBarService): Restarter {
|
|
||||||
return object: Restarter {
|
|
||||||
override fun restart() {
|
|
||||||
barService.restart()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import static com.android.systemui.flags.FlagManager.ACTION_SET_FLAG;
|
|||||||
import static com.android.systemui.flags.FlagManager.EXTRA_FLAGS;
|
import static com.android.systemui.flags.FlagManager.EXTRA_FLAGS;
|
||||||
import static com.android.systemui.flags.FlagManager.EXTRA_ID;
|
import static com.android.systemui.flags.FlagManager.EXTRA_ID;
|
||||||
import static com.android.systemui.flags.FlagManager.EXTRA_VALUE;
|
import static com.android.systemui.flags.FlagManager.EXTRA_VALUE;
|
||||||
|
import static com.android.systemui.flags.FlagsCommonModule.ALL_FLAGS;
|
||||||
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
@@ -69,9 +70,9 @@ import javax.inject.Named;
|
|||||||
@SysUISingleton
|
@SysUISingleton
|
||||||
public class FeatureFlagsDebug implements FeatureFlags {
|
public class FeatureFlagsDebug implements FeatureFlags {
|
||||||
static final String TAG = "SysUIFlags";
|
static final String TAG = "SysUIFlags";
|
||||||
static final String ALL_FLAGS = "all_flags";
|
|
||||||
|
|
||||||
private final FlagManager mFlagManager;
|
private final FlagManager mFlagManager;
|
||||||
|
private final Context mContext;
|
||||||
private final SecureSettings mSecureSettings;
|
private final SecureSettings mSecureSettings;
|
||||||
private final Resources mResources;
|
private final Resources mResources;
|
||||||
private final SystemPropertiesHelper mSystemProperties;
|
private final SystemPropertiesHelper mSystemProperties;
|
||||||
@@ -82,6 +83,14 @@ public class FeatureFlagsDebug implements FeatureFlags {
|
|||||||
private final Map<Integer, String> mStringFlagCache = new TreeMap<>();
|
private final Map<Integer, String> mStringFlagCache = new TreeMap<>();
|
||||||
private final Restarter mRestarter;
|
private final Restarter mRestarter;
|
||||||
|
|
||||||
|
private final ServerFlagReader.ChangeListener mOnPropertiesChanged =
|
||||||
|
new ServerFlagReader.ChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onChange() {
|
||||||
|
mRestarter.restart();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public FeatureFlagsDebug(
|
public FeatureFlagsDebug(
|
||||||
FlagManager flagManager,
|
FlagManager flagManager,
|
||||||
@@ -92,23 +101,28 @@ public class FeatureFlagsDebug implements FeatureFlags {
|
|||||||
DeviceConfigProxy deviceConfigProxy,
|
DeviceConfigProxy deviceConfigProxy,
|
||||||
ServerFlagReader serverFlagReader,
|
ServerFlagReader serverFlagReader,
|
||||||
@Named(ALL_FLAGS) Map<Integer, Flag<?>> allFlags,
|
@Named(ALL_FLAGS) Map<Integer, Flag<?>> allFlags,
|
||||||
Restarter barService) {
|
Restarter restarter) {
|
||||||
mFlagManager = flagManager;
|
mFlagManager = flagManager;
|
||||||
|
mContext = context;
|
||||||
mSecureSettings = secureSettings;
|
mSecureSettings = secureSettings;
|
||||||
mResources = resources;
|
mResources = resources;
|
||||||
mSystemProperties = systemProperties;
|
mSystemProperties = systemProperties;
|
||||||
mDeviceConfigProxy = deviceConfigProxy;
|
mDeviceConfigProxy = deviceConfigProxy;
|
||||||
mServerFlagReader = serverFlagReader;
|
mServerFlagReader = serverFlagReader;
|
||||||
mAllFlags = allFlags;
|
mAllFlags = allFlags;
|
||||||
mRestarter = barService;
|
mRestarter = restarter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Call after construction to setup listeners. */
|
||||||
|
void init() {
|
||||||
IntentFilter filter = new IntentFilter();
|
IntentFilter filter = new IntentFilter();
|
||||||
filter.addAction(ACTION_SET_FLAG);
|
filter.addAction(ACTION_SET_FLAG);
|
||||||
filter.addAction(ACTION_GET_FLAGS);
|
filter.addAction(ACTION_GET_FLAGS);
|
||||||
flagManager.setOnSettingsChangedAction(this::restartSystemUI);
|
mFlagManager.setOnSettingsChangedAction(this::restartSystemUI);
|
||||||
flagManager.setClearCacheAction(this::removeFromCache);
|
mFlagManager.setClearCacheAction(this::removeFromCache);
|
||||||
context.registerReceiver(mReceiver, filter, null, null,
|
mContext.registerReceiver(mReceiver, filter, null, null,
|
||||||
Context.RECEIVER_EXPORTED_UNAUDITED);
|
Context.RECEIVER_EXPORTED_UNAUDITED);
|
||||||
|
mServerFlagReader.listenForChanges(mAllFlags.values(), mOnPropertiesChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -272,6 +286,7 @@ public class FeatureFlagsDebug implements FeatureFlags {
|
|||||||
private void dispatchListenersAndMaybeRestart(int id, Consumer<Boolean> restartAction) {
|
private void dispatchListenersAndMaybeRestart(int id, Consumer<Boolean> restartAction) {
|
||||||
mFlagManager.dispatchListenersAndMaybeRestart(id, restartAction);
|
mFlagManager.dispatchListenersAndMaybeRestart(id, restartAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Works just like {@link #eraseFlag(int)} except that it doesn't restart SystemUI. */
|
/** Works just like {@link #eraseFlag(int)} except that it doesn't restart SystemUI. */
|
||||||
private void eraseInternal(int id) {
|
private void eraseInternal(int id) {
|
||||||
// We can't actually "erase" things from sysprops, but we can set them to empty!
|
// We can't actually "erase" things from sysprops, but we can set them to empty!
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ constructor(
|
|||||||
dumpManager: DumpManager,
|
dumpManager: DumpManager,
|
||||||
private val commandRegistry: CommandRegistry,
|
private val commandRegistry: CommandRegistry,
|
||||||
private val flagCommand: FlagCommand,
|
private val flagCommand: FlagCommand,
|
||||||
featureFlags: FeatureFlags
|
private val featureFlags: FeatureFlagsDebug
|
||||||
) : CoreStartable {
|
) : CoreStartable {
|
||||||
|
|
||||||
init {
|
init {
|
||||||
@@ -41,6 +41,7 @@ constructor(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun start() {
|
override fun start() {
|
||||||
|
featureFlags.init()
|
||||||
commandRegistry.registerCommand(FlagCommand.FLAG_COMMAND) { flagCommand }
|
commandRegistry.registerCommand(FlagCommand.FLAG_COMMAND) { flagCommand }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.systemui.flags;
|
package com.android.systemui.flags;
|
||||||
|
|
||||||
|
import static com.android.systemui.flags.FlagsCommonModule.ALL_FLAGS;
|
||||||
|
|
||||||
import static java.util.Objects.requireNonNull;
|
import static java.util.Objects.requireNonNull;
|
||||||
|
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
@@ -34,6 +36,7 @@ import java.io.PrintWriter;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Named;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default implementation of the a Flag manager that returns default values for release builds
|
* Default implementation of the a Flag manager that returns default values for release builds
|
||||||
@@ -49,26 +52,47 @@ public class FeatureFlagsRelease implements FeatureFlags {
|
|||||||
private final SystemPropertiesHelper mSystemProperties;
|
private final SystemPropertiesHelper mSystemProperties;
|
||||||
private final DeviceConfigProxy mDeviceConfigProxy;
|
private final DeviceConfigProxy mDeviceConfigProxy;
|
||||||
private final ServerFlagReader mServerFlagReader;
|
private final ServerFlagReader mServerFlagReader;
|
||||||
|
private final Restarter mRestarter;
|
||||||
|
private final Map<Integer, Flag<?>> mAllFlags;
|
||||||
SparseBooleanArray mBooleanCache = new SparseBooleanArray();
|
SparseBooleanArray mBooleanCache = new SparseBooleanArray();
|
||||||
SparseArray<String> mStringCache = new SparseArray<>();
|
SparseArray<String> mStringCache = new SparseArray<>();
|
||||||
|
|
||||||
|
private final ServerFlagReader.ChangeListener mOnPropertiesChanged =
|
||||||
|
new ServerFlagReader.ChangeListener() {
|
||||||
|
@Override
|
||||||
|
public void onChange() {
|
||||||
|
mRestarter.restart();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public FeatureFlagsRelease(
|
public FeatureFlagsRelease(
|
||||||
@Main Resources resources,
|
@Main Resources resources,
|
||||||
SystemPropertiesHelper systemProperties,
|
SystemPropertiesHelper systemProperties,
|
||||||
DeviceConfigProxy deviceConfigProxy,
|
DeviceConfigProxy deviceConfigProxy,
|
||||||
ServerFlagReader serverFlagReader) {
|
ServerFlagReader serverFlagReader,
|
||||||
|
@Named(ALL_FLAGS) Map<Integer, Flag<?>> allFlags,
|
||||||
|
Restarter restarter) {
|
||||||
mResources = resources;
|
mResources = resources;
|
||||||
mSystemProperties = systemProperties;
|
mSystemProperties = systemProperties;
|
||||||
mDeviceConfigProxy = deviceConfigProxy;
|
mDeviceConfigProxy = deviceConfigProxy;
|
||||||
mServerFlagReader = serverFlagReader;
|
mServerFlagReader = serverFlagReader;
|
||||||
|
mAllFlags = allFlags;
|
||||||
|
mRestarter = restarter;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Call after construction to setup listeners. */
|
||||||
|
void init() {
|
||||||
|
mServerFlagReader.listenForChanges(mAllFlags.values(), mOnPropertiesChanged);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addListener(@NonNull Flag<?> flag, @NonNull Listener listener) {}
|
public void addListener(@NonNull Flag<?> flag, @NonNull Listener listener) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeListener(@NonNull Listener listener) {}
|
public void removeListener(@NonNull Listener listener) {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isEnabled(@NotNull UnreleasedFlag flag) {
|
public boolean isEnabled(@NotNull UnreleasedFlag flag) {
|
||||||
|
|||||||
@@ -16,6 +16,8 @@
|
|||||||
|
|
||||||
package com.android.systemui.flags;
|
package com.android.systemui.flags;
|
||||||
|
|
||||||
|
import static com.android.systemui.flags.FlagsCommonModule.ALL_FLAGS;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import com.android.systemui.statusbar.commandline.Command;
|
import com.android.systemui.statusbar.commandline.Command;
|
||||||
@@ -42,7 +44,7 @@ public class FlagCommand implements Command {
|
|||||||
@Inject
|
@Inject
|
||||||
FlagCommand(
|
FlagCommand(
|
||||||
FeatureFlagsDebug featureFlags,
|
FeatureFlagsDebug featureFlags,
|
||||||
@Named(FeatureFlagsDebug.ALL_FLAGS) Map<Integer, Flag<?>> allFlags
|
@Named(ALL_FLAGS) Map<Integer, Flag<?>> allFlags
|
||||||
) {
|
) {
|
||||||
mFeatureFlags = featureFlags;
|
mFeatureFlags = featureFlags;
|
||||||
mAllFlags = allFlags;
|
mAllFlags = allFlags;
|
||||||
|
|||||||
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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 com.android.internal.statusbar.IStatusBarService
|
||||||
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import javax.inject.Named
|
||||||
|
|
||||||
|
/** Module containing shared code for all FeatureFlag implementations. */
|
||||||
|
@Module
|
||||||
|
interface FlagsCommonModule {
|
||||||
|
companion object {
|
||||||
|
const val ALL_FLAGS = "all_flags"
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@Provides
|
||||||
|
@Named(ALL_FLAGS)
|
||||||
|
fun providesAllFlags(): Map<Int, Flag<*>> {
|
||||||
|
return Flags.collectFlags()
|
||||||
|
}
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@Provides
|
||||||
|
fun providesRestarter(barService: IStatusBarService): Restarter {
|
||||||
|
return object : Restarter {
|
||||||
|
override fun restart() {
|
||||||
|
barService.restart()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,9 +16,13 @@
|
|||||||
|
|
||||||
package com.android.systemui.flags
|
package com.android.systemui.flags
|
||||||
|
|
||||||
|
import android.provider.DeviceConfig
|
||||||
|
import com.android.systemui.dagger.SysUISingleton
|
||||||
|
import com.android.systemui.dagger.qualifiers.Background
|
||||||
import com.android.systemui.util.DeviceConfigProxy
|
import com.android.systemui.util.DeviceConfigProxy
|
||||||
import dagger.Binds
|
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
|
import dagger.Provides
|
||||||
|
import java.util.concurrent.Executor
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
interface ServerFlagReader {
|
interface ServerFlagReader {
|
||||||
@@ -27,40 +31,99 @@ interface ServerFlagReader {
|
|||||||
|
|
||||||
/** Returns any stored server-side setting or the default if not set. */
|
/** Returns any stored server-side setting or the default if not set. */
|
||||||
fun readServerOverride(flagId: Int, default: Boolean): Boolean
|
fun readServerOverride(flagId: Int, default: Boolean): Boolean
|
||||||
|
|
||||||
|
/** Register a listener for changes to any of the passed in flags. */
|
||||||
|
fun listenForChanges(values: Collection<Flag<*>>, listener: ChangeListener)
|
||||||
|
|
||||||
|
interface ChangeListener {
|
||||||
|
fun onChange()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ServerFlagReaderImpl @Inject constructor(
|
class ServerFlagReaderImpl @Inject constructor(
|
||||||
private val deviceConfig: DeviceConfigProxy
|
private val namespace: String,
|
||||||
|
private val deviceConfig: DeviceConfigProxy,
|
||||||
|
@Background private val executor: Executor
|
||||||
) : ServerFlagReader {
|
) : ServerFlagReader {
|
||||||
|
|
||||||
|
private val listeners =
|
||||||
|
mutableListOf<Pair<ServerFlagReader.ChangeListener, Collection<Flag<*>>>>()
|
||||||
|
|
||||||
|
private val onPropertiesChangedListener = object : DeviceConfig.OnPropertiesChangedListener {
|
||||||
|
override fun onPropertiesChanged(properties: DeviceConfig.Properties) {
|
||||||
|
if (properties.namespace != namespace) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
for ((listener, flags) in listeners) {
|
||||||
|
propLoop@ for (propName in properties.keyset) {
|
||||||
|
for (flag in flags) {
|
||||||
|
if (propName == getServerOverrideName(flag.id)) {
|
||||||
|
listener.onChange()
|
||||||
|
break@propLoop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override fun hasOverride(flagId: Int): Boolean =
|
override fun hasOverride(flagId: Int): Boolean =
|
||||||
deviceConfig.getProperty(
|
deviceConfig.getProperty(
|
||||||
SYSUI_NAMESPACE,
|
namespace,
|
||||||
getServerOverrideName(flagId)
|
getServerOverrideName(flagId)
|
||||||
) != null
|
) != null
|
||||||
|
|
||||||
override fun readServerOverride(flagId: Int, default: Boolean): Boolean {
|
override fun readServerOverride(flagId: Int, default: Boolean): Boolean {
|
||||||
return deviceConfig.getBoolean(
|
return deviceConfig.getBoolean(
|
||||||
SYSUI_NAMESPACE,
|
namespace,
|
||||||
getServerOverrideName(flagId),
|
getServerOverrideName(flagId),
|
||||||
default
|
default
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun listenForChanges(
|
||||||
|
flags: Collection<Flag<*>>,
|
||||||
|
listener: ServerFlagReader.ChangeListener
|
||||||
|
) {
|
||||||
|
if (listeners.isEmpty()) {
|
||||||
|
deviceConfig.addOnPropertiesChangedListener(
|
||||||
|
namespace,
|
||||||
|
executor,
|
||||||
|
onPropertiesChangedListener
|
||||||
|
)
|
||||||
|
}
|
||||||
|
listeners.add(Pair(listener, flags))
|
||||||
|
}
|
||||||
|
|
||||||
private fun getServerOverrideName(flagId: Int): String {
|
private fun getServerOverrideName(flagId: Int): String {
|
||||||
return "flag_override_$flagId"
|
return "flag_override_$flagId"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private val SYSUI_NAMESPACE = "systemui"
|
|
||||||
|
|
||||||
@Module
|
@Module
|
||||||
interface ServerFlagReaderModule {
|
interface ServerFlagReaderModule {
|
||||||
@Binds
|
companion object {
|
||||||
fun bindsReader(impl: ServerFlagReaderImpl): ServerFlagReader
|
private val SYSUI_NAMESPACE = "systemui"
|
||||||
|
|
||||||
|
@JvmStatic
|
||||||
|
@Provides
|
||||||
|
@SysUISingleton
|
||||||
|
fun bindsReader(
|
||||||
|
deviceConfig: DeviceConfigProxy,
|
||||||
|
@Background executor: Executor
|
||||||
|
): ServerFlagReader {
|
||||||
|
return ServerFlagReaderImpl(
|
||||||
|
SYSUI_NAMESPACE, deviceConfig, executor
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class ServerFlagReaderFake : ServerFlagReader {
|
class ServerFlagReaderFake : ServerFlagReader {
|
||||||
private val flagMap: MutableMap<Int, Boolean> = mutableMapOf()
|
private val flagMap: MutableMap<Int, Boolean> = mutableMapOf()
|
||||||
|
private val listeners =
|
||||||
|
mutableListOf<Pair<ServerFlagReader.ChangeListener, Collection<Flag<*>>>>()
|
||||||
|
|
||||||
override fun hasOverride(flagId: Int): Boolean {
|
override fun hasOverride(flagId: Int): Boolean {
|
||||||
return flagMap.containsKey(flagId)
|
return flagMap.containsKey(flagId)
|
||||||
@@ -72,9 +135,24 @@ class ServerFlagReaderFake : ServerFlagReader {
|
|||||||
|
|
||||||
fun setFlagValue(flagId: Int, value: Boolean) {
|
fun setFlagValue(flagId: Int, value: Boolean) {
|
||||||
flagMap.put(flagId, value)
|
flagMap.put(flagId, value)
|
||||||
|
|
||||||
|
for ((listener, flags) in listeners) {
|
||||||
|
flagLoop@ for (flag in flags) {
|
||||||
|
if (flagId == flag.id) {
|
||||||
|
listener.onChange()
|
||||||
|
break@flagLoop
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun eraseFlag(flagId: Int) {
|
fun eraseFlag(flagId: Int) {
|
||||||
flagMap.remove(flagId)
|
flagMap.remove(flagId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun listenForChanges(
|
||||||
|
flags: Collection<Flag<*>>,
|
||||||
|
listener: ServerFlagReader.ChangeListener
|
||||||
|
) {
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ class FeatureFlagsDebugTest : SysuiTestCase() {
|
|||||||
flagMap,
|
flagMap,
|
||||||
restarter
|
restarter
|
||||||
)
|
)
|
||||||
|
mFeatureFlagsDebug.init()
|
||||||
verify(flagManager).onSettingsChangedAction = any()
|
verify(flagManager).onSettingsChangedAction = any()
|
||||||
broadcastReceiver = withArgCaptor {
|
broadcastReceiver = withArgCaptor {
|
||||||
verify(mockContext).registerReceiver(capture(), any(), nullable(), nullable(),
|
verify(mockContext).registerReceiver(capture(), any(), nullable(), nullable(),
|
||||||
|
|||||||
@@ -38,8 +38,9 @@ class FeatureFlagsReleaseTest : SysuiTestCase() {
|
|||||||
|
|
||||||
@Mock private lateinit var mResources: Resources
|
@Mock private lateinit var mResources: Resources
|
||||||
@Mock private lateinit var mSystemProperties: SystemPropertiesHelper
|
@Mock private lateinit var mSystemProperties: SystemPropertiesHelper
|
||||||
|
@Mock private lateinit var restarter: Restarter
|
||||||
|
private val flagMap = mutableMapOf<Int, Flag<*>>()
|
||||||
private val serverFlagReader = ServerFlagReaderFake()
|
private val serverFlagReader = ServerFlagReaderFake()
|
||||||
|
|
||||||
private val deviceConfig = DeviceConfigProxyFake()
|
private val deviceConfig = DeviceConfigProxyFake()
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -49,7 +50,9 @@ class FeatureFlagsReleaseTest : SysuiTestCase() {
|
|||||||
mResources,
|
mResources,
|
||||||
mSystemProperties,
|
mSystemProperties,
|
||||||
deviceConfig,
|
deviceConfig,
|
||||||
serverFlagReader)
|
serverFlagReader,
|
||||||
|
flagMap,
|
||||||
|
restarter)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* 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.test.suitebuilder.annotation.SmallTest
|
||||||
|
import android.testing.AndroidTestingRunner
|
||||||
|
import com.android.systemui.SysuiTestCase
|
||||||
|
import com.android.systemui.util.DeviceConfigProxyFake
|
||||||
|
import com.android.systemui.util.concurrency.FakeExecutor
|
||||||
|
import com.android.systemui.util.time.FakeSystemClock
|
||||||
|
import org.junit.Before
|
||||||
|
import org.junit.Test
|
||||||
|
import org.junit.runner.RunWith
|
||||||
|
import org.mockito.Mock
|
||||||
|
import org.mockito.Mockito.verify
|
||||||
|
import org.mockito.MockitoAnnotations
|
||||||
|
|
||||||
|
@SmallTest
|
||||||
|
@RunWith(AndroidTestingRunner::class)
|
||||||
|
class ServerFlagReaderImplTest : SysuiTestCase() {
|
||||||
|
|
||||||
|
private val NAMESPACE = "test"
|
||||||
|
|
||||||
|
@Mock private lateinit var changeListener: ServerFlagReader.ChangeListener
|
||||||
|
|
||||||
|
private lateinit var serverFlagReader: ServerFlagReaderImpl
|
||||||
|
private val deviceConfig = DeviceConfigProxyFake()
|
||||||
|
private val executor = FakeExecutor(FakeSystemClock())
|
||||||
|
|
||||||
|
@Before
|
||||||
|
fun setup() {
|
||||||
|
MockitoAnnotations.initMocks(this)
|
||||||
|
|
||||||
|
serverFlagReader = ServerFlagReaderImpl(NAMESPACE, deviceConfig, executor)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun testChange_alertsListener() {
|
||||||
|
val flag = ReleasedFlag(1)
|
||||||
|
serverFlagReader.listenForChanges(listOf(flag), changeListener)
|
||||||
|
|
||||||
|
deviceConfig.setProperty(NAMESPACE, "flag_override_1", "1", false)
|
||||||
|
executor.runAllReady()
|
||||||
|
|
||||||
|
verify(changeListener).onChange()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user