Loading core/java/android/hardware/devicestate/feature/flags.aconfig +13 −1 Original line number Diff line number Diff line Loading @@ -39,3 +39,15 @@ flag { bug: "372486634" is_fixed_read_only: true } flag { name: "device_state_configuration_flag" is_exported: true namespace: "windowing_sdk" description: "Re-add flag parsing for device_state_configuration.xml configuration for devices that didn't update vendor images." bug: "388366842" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } } services/core/java/com/android/server/policy/DeviceStateProviderImpl.java +56 −4 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.server.devicestate.DeviceStateProvider; import com.android.server.input.InputManagerInternal; import com.android.server.policy.devicestate.config.Conditions; import com.android.server.policy.devicestate.config.DeviceStateConfig; import com.android.server.policy.devicestate.config.Flags; import com.android.server.policy.devicestate.config.LidSwitchCondition; import com.android.server.policy.devicestate.config.NumericRange; import com.android.server.policy.devicestate.config.Properties; Loading Loading @@ -140,7 +141,16 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, private static final String PROPERTY_FEATURE_REAR_DISPLAY_OUTER_DEFAULT = "com.android.server.policy.PROPERTY_FEATURE_REAR_DISPLAY_OUTER_DEFAULT"; // Deprecated flag definitions to maintain backwards compatibility. private static final String FLAG_CANCEL_OVERRIDE_REQUESTS = "FLAG_CANCEL_OVERRIDE_REQUESTS"; private static final String FLAG_APP_INACCESSIBLE = "FLAG_APP_INACCESSIBLE"; private static final String FLAG_EMULATED_ONLY = "FLAG_EMULATED_ONLY"; private static final String FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP = "FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP"; private static final String FLAG_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL = "FLAG_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL"; private static final String FLAG_UNSUPPORTED_WHEN_POWER_SAVE_MODE = "FLAG_UNSUPPORTED_WHEN_POWER_SAVE_MODE"; /** Interface that allows reading the device state configuration. */ interface ReadableConfig { Loading Loading @@ -185,15 +195,29 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, new HashSet<>(); Set<@DeviceState.DeviceStateProperties Integer> physicalProperties = new HashSet<>(); final Properties configFlags = stateConfig.getProperties(); if (configFlags != null) { List<String> configPropertyStrings = configFlags.getProperty(); final Properties configProperties = stateConfig.getProperties(); if (configProperties != null) { List<String> configPropertyStrings = configProperties.getProperty(); for (int i = 0; i < configPropertyStrings.size(); i++) { final String configPropertyString = configPropertyStrings.get(i); addPropertyByString(configPropertyString, systemProperties, physicalProperties); } } if (android.hardware.devicestate.feature.flags .Flags.deviceStateConfigurationFlag()) { // Parse through the deprecated flag configuration to keep compatibility. final Flags configFlags = stateConfig.getFlags(); if (configFlags != null) { List<String> configFlagStrings = configFlags.getFlag(); for (int i = 0; i < configFlagStrings.size(); i++) { final String configFlagString = configFlagStrings.get(i); addFlagByString(configFlagString, systemProperties); } } } DeviceState.Configuration deviceStateConfiguration = new DeviceState.Configuration.Builder(state, name) .setSystemProperties(systemProperties) Loading Loading @@ -292,6 +316,34 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, } } private static void addFlagByString(String flagString, Set<@DeviceState.SystemDeviceStateProperties Integer> systemProperties) { switch (flagString) { case FLAG_APP_INACCESSIBLE: systemProperties.add(DeviceState.PROPERTY_APP_INACCESSIBLE); break; case FLAG_EMULATED_ONLY: systemProperties.add(DeviceState.PROPERTY_EMULATED_ONLY); break; case FLAG_CANCEL_OVERRIDE_REQUESTS: systemProperties.add(DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS); break; case FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP: systemProperties.add(DeviceState.PROPERTY_POLICY_CANCEL_WHEN_REQUESTER_NOT_ON_TOP); break; case FLAG_UNSUPPORTED_WHEN_POWER_SAVE_MODE: systemProperties.add(DeviceState.PROPERTY_POLICY_UNSUPPORTED_WHEN_POWER_SAVE_MODE); break; case FLAG_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL: systemProperties.add( DeviceState.PROPERTY_POLICY_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL); break; default: Slog.w(TAG, "Parsed unknown flag with name: " + flagString); break; } } // Lock for internal state. private final Object mLock = new Object(); private final Context mContext; Loading services/core/xsd/device-state-config/device-state-config.xsd +9 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ <xs:annotation name="nullable" /> </xs:element> <xs:element name="properties" type="properties" /> <xs:element name="flags" type="flags" /> <xs:element name="conditions" type="conditions" /> </xs:sequence> </xs:complexType> Loading @@ -53,6 +54,14 @@ </xs:sequence> </xs:complexType> <xs:complexType name="flags"> <xs:sequence> <xs:element name="flag" type="xs:string" minOccurs="0" maxOccurs="unbounded"> <xs:annotation name="nullable" /> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="conditions"> <xs:sequence> <xs:element name="lid-switch" type="lidSwitchCondition" minOccurs="0"> Loading services/core/xsd/device-state-config/schema/current.txt +7 −0 Original line number Diff line number Diff line Loading @@ -11,10 +11,12 @@ package com.android.server.policy.devicestate.config { public class DeviceState { ctor public DeviceState(); method public com.android.server.policy.devicestate.config.Conditions getConditions(); method public com.android.server.policy.devicestate.config.Flags getFlags(); method public java.math.BigInteger getIdentifier(); method @Nullable public String getName(); method public com.android.server.policy.devicestate.config.Properties getProperties(); method public void setConditions(com.android.server.policy.devicestate.config.Conditions); method public void setFlags(com.android.server.policy.devicestate.config.Flags); method public void setIdentifier(java.math.BigInteger); method public void setName(@Nullable String); method public void setProperties(com.android.server.policy.devicestate.config.Properties); Loading @@ -25,6 +27,11 @@ package com.android.server.policy.devicestate.config { method public java.util.List<com.android.server.policy.devicestate.config.DeviceState> getDeviceState(); } public class Flags { ctor public Flags(); method @Nullable public java.util.List<java.lang.String> getFlag(); } public class LidSwitchCondition { ctor public LidSwitchCondition(); method public boolean getOpen(); Loading services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java +40 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.policy; import static android.content.Context.SENSOR_SERVICE; import static android.hardware.devicestate.feature.flags.Flags.FLAG_DEVICE_STATE_CONFIGURATION_FLAG; import static com.android.server.devicestate.DeviceStateProvider.SUPPORTED_DEVICE_STATES_CHANGED_INITIALIZED; import static com.android.server.devicestate.DeviceStateProvider.SUPPORTED_DEVICE_STATES_CHANGED_POWER_SAVE_DISABLED; Loading @@ -42,6 +43,9 @@ import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.hardware.devicestate.DeviceState; import android.os.PowerManager; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import androidx.annotation.NonNull; Loading @@ -51,6 +55,7 @@ import com.android.server.input.InputManagerInternal; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; Loading Loading @@ -84,6 +89,10 @@ public final class DeviceStateProviderImplTest { private Context mContext; private SensorManager mSensorManager; @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Before public void setup() { LocalServices.addService(InputManagerInternal.class, mock(InputManagerInternal.class)); Loading Loading @@ -605,6 +614,37 @@ public final class DeviceStateProviderImplTest { verify(listener, never()).onStateChanged(mIntegerCaptor.capture()); } @RequiresFlagsEnabled(FLAG_DEVICE_STATE_CONFIGURATION_FLAG) @Test public void test_createConfigWithFlags() { String configString = "<device-state-config>\n" + " <device-state>\n" + " <identifier>1</identifier>\n" + " <flags>\n" + " <flag>FLAG_CANCEL_OVERRIDE_REQUESTS</flag>\n" + " </flags>\n" + " </device-state>\n" + " <device-state>\n" + " <identifier>2</identifier>\n" + " <name>CLOSED</name>\n" + " </device-state>\n" + "</device-state-config>\n"; DeviceStateProviderImpl.ReadableConfig config = new TestReadableConfig(configString); DeviceStateProviderImpl provider = DeviceStateProviderImpl.createFromConfig(mContext, config); DeviceStateProvider.Listener listener = mock(DeviceStateProvider.Listener.class); provider.setListener(listener); verify(listener).onSupportedDeviceStatesChanged(mDeviceStateArrayCaptor.capture(), eq(SUPPORTED_DEVICE_STATES_CHANGED_INITIALIZED)); final DeviceState[] expectedStates = new DeviceState[]{ createDeviceState(1, "", Set.of(DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS)), createDeviceState(2, "CLOSED", EMPTY_PROPERTY_SET)}; assertArrayEquals(expectedStates, mDeviceStateArrayCaptor.getValue()); } private DeviceState createDeviceState(int identifier, @NonNull String name, @NonNull Set<@DeviceState.DeviceStateProperties Integer> systemProperties) { DeviceState.Configuration configuration = new DeviceState.Configuration.Builder(identifier, Loading Loading
core/java/android/hardware/devicestate/feature/flags.aconfig +13 −1 Original line number Diff line number Diff line Loading @@ -39,3 +39,15 @@ flag { bug: "372486634" is_fixed_read_only: true } flag { name: "device_state_configuration_flag" is_exported: true namespace: "windowing_sdk" description: "Re-add flag parsing for device_state_configuration.xml configuration for devices that didn't update vendor images." bug: "388366842" is_fixed_read_only: true metadata { purpose: PURPOSE_BUGFIX } }
services/core/java/com/android/server/policy/DeviceStateProviderImpl.java +56 −4 Original line number Diff line number Diff line Loading @@ -45,6 +45,7 @@ import com.android.server.devicestate.DeviceStateProvider; import com.android.server.input.InputManagerInternal; import com.android.server.policy.devicestate.config.Conditions; import com.android.server.policy.devicestate.config.DeviceStateConfig; import com.android.server.policy.devicestate.config.Flags; import com.android.server.policy.devicestate.config.LidSwitchCondition; import com.android.server.policy.devicestate.config.NumericRange; import com.android.server.policy.devicestate.config.Properties; Loading Loading @@ -140,7 +141,16 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, private static final String PROPERTY_FEATURE_REAR_DISPLAY_OUTER_DEFAULT = "com.android.server.policy.PROPERTY_FEATURE_REAR_DISPLAY_OUTER_DEFAULT"; // Deprecated flag definitions to maintain backwards compatibility. private static final String FLAG_CANCEL_OVERRIDE_REQUESTS = "FLAG_CANCEL_OVERRIDE_REQUESTS"; private static final String FLAG_APP_INACCESSIBLE = "FLAG_APP_INACCESSIBLE"; private static final String FLAG_EMULATED_ONLY = "FLAG_EMULATED_ONLY"; private static final String FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP = "FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP"; private static final String FLAG_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL = "FLAG_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL"; private static final String FLAG_UNSUPPORTED_WHEN_POWER_SAVE_MODE = "FLAG_UNSUPPORTED_WHEN_POWER_SAVE_MODE"; /** Interface that allows reading the device state configuration. */ interface ReadableConfig { Loading Loading @@ -185,15 +195,29 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, new HashSet<>(); Set<@DeviceState.DeviceStateProperties Integer> physicalProperties = new HashSet<>(); final Properties configFlags = stateConfig.getProperties(); if (configFlags != null) { List<String> configPropertyStrings = configFlags.getProperty(); final Properties configProperties = stateConfig.getProperties(); if (configProperties != null) { List<String> configPropertyStrings = configProperties.getProperty(); for (int i = 0; i < configPropertyStrings.size(); i++) { final String configPropertyString = configPropertyStrings.get(i); addPropertyByString(configPropertyString, systemProperties, physicalProperties); } } if (android.hardware.devicestate.feature.flags .Flags.deviceStateConfigurationFlag()) { // Parse through the deprecated flag configuration to keep compatibility. final Flags configFlags = stateConfig.getFlags(); if (configFlags != null) { List<String> configFlagStrings = configFlags.getFlag(); for (int i = 0; i < configFlagStrings.size(); i++) { final String configFlagString = configFlagStrings.get(i); addFlagByString(configFlagString, systemProperties); } } } DeviceState.Configuration deviceStateConfiguration = new DeviceState.Configuration.Builder(state, name) .setSystemProperties(systemProperties) Loading Loading @@ -292,6 +316,34 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, } } private static void addFlagByString(String flagString, Set<@DeviceState.SystemDeviceStateProperties Integer> systemProperties) { switch (flagString) { case FLAG_APP_INACCESSIBLE: systemProperties.add(DeviceState.PROPERTY_APP_INACCESSIBLE); break; case FLAG_EMULATED_ONLY: systemProperties.add(DeviceState.PROPERTY_EMULATED_ONLY); break; case FLAG_CANCEL_OVERRIDE_REQUESTS: systemProperties.add(DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS); break; case FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP: systemProperties.add(DeviceState.PROPERTY_POLICY_CANCEL_WHEN_REQUESTER_NOT_ON_TOP); break; case FLAG_UNSUPPORTED_WHEN_POWER_SAVE_MODE: systemProperties.add(DeviceState.PROPERTY_POLICY_UNSUPPORTED_WHEN_POWER_SAVE_MODE); break; case FLAG_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL: systemProperties.add( DeviceState.PROPERTY_POLICY_UNSUPPORTED_WHEN_THERMAL_STATUS_CRITICAL); break; default: Slog.w(TAG, "Parsed unknown flag with name: " + flagString); break; } } // Lock for internal state. private final Object mLock = new Object(); private final Context mContext; Loading
services/core/xsd/device-state-config/device-state-config.xsd +9 −0 Original line number Diff line number Diff line Loading @@ -41,6 +41,7 @@ <xs:annotation name="nullable" /> </xs:element> <xs:element name="properties" type="properties" /> <xs:element name="flags" type="flags" /> <xs:element name="conditions" type="conditions" /> </xs:sequence> </xs:complexType> Loading @@ -53,6 +54,14 @@ </xs:sequence> </xs:complexType> <xs:complexType name="flags"> <xs:sequence> <xs:element name="flag" type="xs:string" minOccurs="0" maxOccurs="unbounded"> <xs:annotation name="nullable" /> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="conditions"> <xs:sequence> <xs:element name="lid-switch" type="lidSwitchCondition" minOccurs="0"> Loading
services/core/xsd/device-state-config/schema/current.txt +7 −0 Original line number Diff line number Diff line Loading @@ -11,10 +11,12 @@ package com.android.server.policy.devicestate.config { public class DeviceState { ctor public DeviceState(); method public com.android.server.policy.devicestate.config.Conditions getConditions(); method public com.android.server.policy.devicestate.config.Flags getFlags(); method public java.math.BigInteger getIdentifier(); method @Nullable public String getName(); method public com.android.server.policy.devicestate.config.Properties getProperties(); method public void setConditions(com.android.server.policy.devicestate.config.Conditions); method public void setFlags(com.android.server.policy.devicestate.config.Flags); method public void setIdentifier(java.math.BigInteger); method public void setName(@Nullable String); method public void setProperties(com.android.server.policy.devicestate.config.Properties); Loading @@ -25,6 +27,11 @@ package com.android.server.policy.devicestate.config { method public java.util.List<com.android.server.policy.devicestate.config.DeviceState> getDeviceState(); } public class Flags { ctor public Flags(); method @Nullable public java.util.List<java.lang.String> getFlag(); } public class LidSwitchCondition { ctor public LidSwitchCondition(); method public boolean getOpen(); Loading
services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java +40 −0 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.policy; import static android.content.Context.SENSOR_SERVICE; import static android.hardware.devicestate.feature.flags.Flags.FLAG_DEVICE_STATE_CONFIGURATION_FLAG; import static com.android.server.devicestate.DeviceStateProvider.SUPPORTED_DEVICE_STATES_CHANGED_INITIALIZED; import static com.android.server.devicestate.DeviceStateProvider.SUPPORTED_DEVICE_STATES_CHANGED_POWER_SAVE_DISABLED; Loading @@ -42,6 +43,9 @@ import android.hardware.SensorEvent; import android.hardware.SensorManager; import android.hardware.devicestate.DeviceState; import android.os.PowerManager; import android.platform.test.annotations.RequiresFlagsEnabled; import android.platform.test.flag.junit.CheckFlagsRule; import android.platform.test.flag.junit.DeviceFlagsValueProvider; import androidx.annotation.NonNull; Loading @@ -51,6 +55,7 @@ import com.android.server.input.InputManagerInternal; import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.Mockito; Loading Loading @@ -84,6 +89,10 @@ public final class DeviceStateProviderImplTest { private Context mContext; private SensorManager mSensorManager; @Rule public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); @Before public void setup() { LocalServices.addService(InputManagerInternal.class, mock(InputManagerInternal.class)); Loading Loading @@ -605,6 +614,37 @@ public final class DeviceStateProviderImplTest { verify(listener, never()).onStateChanged(mIntegerCaptor.capture()); } @RequiresFlagsEnabled(FLAG_DEVICE_STATE_CONFIGURATION_FLAG) @Test public void test_createConfigWithFlags() { String configString = "<device-state-config>\n" + " <device-state>\n" + " <identifier>1</identifier>\n" + " <flags>\n" + " <flag>FLAG_CANCEL_OVERRIDE_REQUESTS</flag>\n" + " </flags>\n" + " </device-state>\n" + " <device-state>\n" + " <identifier>2</identifier>\n" + " <name>CLOSED</name>\n" + " </device-state>\n" + "</device-state-config>\n"; DeviceStateProviderImpl.ReadableConfig config = new TestReadableConfig(configString); DeviceStateProviderImpl provider = DeviceStateProviderImpl.createFromConfig(mContext, config); DeviceStateProvider.Listener listener = mock(DeviceStateProvider.Listener.class); provider.setListener(listener); verify(listener).onSupportedDeviceStatesChanged(mDeviceStateArrayCaptor.capture(), eq(SUPPORTED_DEVICE_STATES_CHANGED_INITIALIZED)); final DeviceState[] expectedStates = new DeviceState[]{ createDeviceState(1, "", Set.of(DeviceState.PROPERTY_POLICY_CANCEL_OVERRIDE_REQUESTS)), createDeviceState(2, "CLOSED", EMPTY_PROPERTY_SET)}; assertArrayEquals(expectedStates, mDeviceStateArrayCaptor.getValue()); } private DeviceState createDeviceState(int identifier, @NonNull String name, @NonNull Set<@DeviceState.DeviceStateProperties Integer> systemProperties) { DeviceState.Configuration configuration = new DeviceState.Configuration.Builder(identifier, Loading