Merge "Add ability to read and write flags to sysprops." into sc-v2-dev

This commit is contained in:
Dave Mankoff
2021-10-14 21:14:17 +00:00
committed by Android (Google) Code Review
4 changed files with 109 additions and 13 deletions

View File

@@ -18,6 +18,12 @@ package com.android.systemui.flags;
/**
* List of {@link Flag} objects for use in SystemUI.
*
* Flag Ids are integers. They must be unique.
*
* On public release builds, flags will always return their default value. There is no way to
* change their value on release builds.
*/
public class Flags {
public static final BooleanFlag THE_FIRST_FLAG = new BooleanFlag(1, false);
}

View File

@@ -18,6 +18,9 @@ package com.android.systemui.flags;
import com.android.systemui.dagger.SysUISingleton;
import org.json.JSONException;
import org.json.JSONObject;
import javax.inject.Inject;
/**
@@ -25,28 +28,61 @@ import javax.inject.Inject;
*/
@SysUISingleton
public class FeatureFlagManager implements FlagReader, FlagWriter {
@Inject
public FeatureFlagManager() {}
private static final String SYSPROP_PREFIX = "persist.systemui.flag_";
private static final String FIELD_TYPE = "type";
private static final String FIELD_VALUE = "value";
private static final String TYPE_BOOLEAN = "boolean";
private final SystemPropertiesHelper mSystemPropertiesHelper;
public boolean isEnabled(int key, boolean defaultValue) {
return isEnabled(Integer.toString(key), defaultValue);
@Inject
public FeatureFlagManager(SystemPropertiesHelper systemPropertiesHelper) {
mSystemPropertiesHelper = systemPropertiesHelper;
}
public boolean isEnabled(String key, boolean defaultValue) {
// TODO
return false;
/** Return a {@link BooleanFlag}'s value. */
public boolean isEnabled(int key, boolean defaultValue) {
String data = mSystemPropertiesHelper.get(keyToSysPropKey(key));
if (data.isEmpty()) {
return defaultValue;
}
JSONObject json;
try {
json = new JSONObject(data);
if (!assertType(json, TYPE_BOOLEAN)) {
return defaultValue;
}
return json.getBoolean(FIELD_VALUE);
} catch (JSONException e) {
// TODO: delete the property
return defaultValue;
}
}
public void setEnabled(int key, boolean value) {
setEnabled(Integer.toString(key), value);
}
public void setEnabled(String key, boolean value) {
// TODO
JSONObject json = new JSONObject();
try {
json.put(FIELD_TYPE, TYPE_BOOLEAN);
json.put(FIELD_VALUE, value);
mSystemPropertiesHelper.set(keyToSysPropKey(key), json.toString());
} catch (JSONException e) {
// no-op
}
}
public void addListener(Listener run) {}
public void removeListener(Listener run) {}
private static String keyToSysPropKey(int key) {
return SYSPROP_PREFIX + key;
}
private static boolean assertType(JSONObject json, String type) {
try {
return json.getString(FIELD_TYPE).equals(TYPE_BOOLEAN);
} catch (JSONException e) {
return false;
}
}
}

View File

@@ -26,11 +26,19 @@ import javax.inject.Inject
*/
@SysUISingleton
open class SystemPropertiesHelper @Inject constructor() {
fun get(name: String): String {
return SystemProperties.get(name)
}
fun getBoolean(name: String, default: Boolean): Boolean {
return SystemProperties.getBoolean(name, default)
}
fun set(name: String, value: String) {
SystemProperties.set(name, value)
}
fun set(name: String, value: Int) {
SystemProperties.set(name, value.toString())
set(name, value.toString())
}
}

View File

@@ -0,0 +1,46 @@
/*
* Copyright (C) 2021 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 static com.google.common.truth.Truth.assertThat;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import org.junit.Before;
import org.junit.Test;
import org.mockito.MockitoAnnotations;
@SmallTest
public class FeatureFlagManagerTest extends SysuiTestCase {
FeatureFlagManager mFeatureFlagManager;
@Before
public void setup() {
MockitoAnnotations.initMocks(this);
mFeatureFlagManager = new FeatureFlagManager();
}
@Test
public void testIsEnabled() {
mFeatureFlagManager.setEnabled(1, true);
// Again, nothing changes.
assertThat(mFeatureFlagManager.isEnabled(1, false)).isFalse();
}
}