diff --git a/services/core/java/com/android/server/devicestate/DeviceState.java b/services/core/java/com/android/server/devicestate/DeviceState.java index 7fe24ff1f069b..78d55b92eb806 100644 --- a/services/core/java/com/android/server/devicestate/DeviceState.java +++ b/services/core/java/com/android/server/devicestate/DeviceState.java @@ -43,14 +43,14 @@ import java.util.Objects; */ public final class DeviceState { /** - * Flag that indicates sticky requests should be cancelled when this device state becomes the + * Flag that indicates override requests should be cancelled when this device state becomes the * base device state. */ - public static final int FLAG_CANCEL_STICKY_REQUESTS = 1 << 0; + public static final int FLAG_CANCEL_OVERRIDE_REQUESTS = 1 << 0; /** @hide */ @IntDef(prefix = {"FLAG_"}, flag = true, value = { - FLAG_CANCEL_STICKY_REQUESTS, + FLAG_CANCEL_OVERRIDE_REQUESTS, }) @Retention(RetentionPolicy.SOURCE) public @interface DeviceStateFlags {} @@ -114,4 +114,10 @@ public final class DeviceState { public int hashCode() { return Objects.hash(mIdentifier, mName, mFlags); } + + /** Checks if a specific flag is set + */ + public boolean hasFlag(int flagToCheckFor) { + return (mFlags & flagToCheckFor) == flagToCheckFor; + } } diff --git a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java index 792feea01e27a..709af91262c25 100644 --- a/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java +++ b/services/core/java/com/android/server/devicestate/DeviceStateManagerService.java @@ -20,6 +20,7 @@ import static android.Manifest.permission.CONTROL_DEVICE_STATE; import static android.hardware.devicestate.DeviceStateManager.MAXIMUM_DEVICE_STATE; import static android.hardware.devicestate.DeviceStateManager.MINIMUM_DEVICE_STATE; +import static com.android.server.devicestate.DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS; import static com.android.server.devicestate.OverrideRequestController.STATUS_ACTIVE; import static com.android.server.devicestate.OverrideRequestController.STATUS_CANCELED; import static com.android.server.devicestate.OverrideRequestController.STATUS_SUSPENDED; @@ -273,14 +274,14 @@ public final class DeviceStateManagerService extends SystemService { synchronized (mLock) { final int[] oldStateIdentifiers = getSupportedStateIdentifiersLocked(); - // Whether or not at least one device state has the flag FLAG_CANCEL_STICKY_REQUESTS + // Whether or not at least one device state has the flag FLAG_CANCEL_OVERRIDE_REQUESTS // set. If set to true, the OverrideRequestController will be configured to allow sticky // requests. boolean hasTerminalDeviceState = false; mDeviceStates.clear(); for (int i = 0; i < supportedDeviceStates.length; i++) { DeviceState state = supportedDeviceStates[i]; - if ((state.getFlags() & DeviceState.FLAG_CANCEL_STICKY_REQUESTS) != 0) { + if (state.hasFlag(FLAG_CANCEL_OVERRIDE_REQUESTS)) { hasTerminalDeviceState = true; } mDeviceStates.put(state.getIdentifier(), state); @@ -345,8 +346,8 @@ public final class DeviceStateManagerService extends SystemService { } mBaseState = Optional.of(baseState); - if ((baseState.getFlags() & DeviceState.FLAG_CANCEL_STICKY_REQUESTS) != 0) { - mOverrideRequestController.cancelStickyRequests(); + if (baseState.hasFlag(FLAG_CANCEL_OVERRIDE_REQUESTS)) { + mOverrideRequestController.cancelOverrideRequests(); } mOverrideRequestController.handleBaseStateChanged(); updatePendingStateLocked(); diff --git a/services/core/java/com/android/server/devicestate/OverrideRequestController.java b/services/core/java/com/android/server/devicestate/OverrideRequestController.java index 05c9eb2c5bbe8..36cb4162accc0 100644 --- a/services/core/java/com/android/server/devicestate/OverrideRequestController.java +++ b/services/core/java/com/android/server/devicestate/OverrideRequestController.java @@ -152,6 +152,16 @@ final class OverrideRequestController { cancelRequestsLocked(mTmpRequestsToCancel); } + /** + * Cancels all override requests, this could be due to the device being put + * into a hardware state that declares the flag "FLAG_CANCEL_OVERRIDE_REQUESTS" + */ + void cancelOverrideRequests() { + mTmpRequestsToCancel.clear(); + mTmpRequestsToCancel.addAll(mRequests); + cancelRequestsLocked(mTmpRequestsToCancel); + } + /** * Returns {@code true} if this controller is current managing a request with the specified * {@code token}, {@code false} otherwise. diff --git a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java index 27a16e9bfdda3..17a5fd07f9202 100644 --- a/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java +++ b/services/core/java/com/android/server/policy/DeviceStateProviderImpl.java @@ -94,6 +94,7 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, private static final String VENDOR_CONFIG_FILE_PATH = "etc/devicestate/"; private static final String DATA_CONFIG_FILE_PATH = "system/devicestate/"; private static final String CONFIG_FILE_NAME = "device_state_configuration.xml"; + private static final String FLAG_CANCEL_OVERRIDE_REQUESTS = "FLAG_CANCEL_OVERRIDE_REQUESTS"; /** Interface that allows reading the device state configuration. */ interface ReadableConfig { @@ -141,8 +142,8 @@ public final class DeviceStateProviderImpl implements DeviceStateProvider, for (int i = 0; i < configFlagStrings.size(); i++) { final String configFlagString = configFlagStrings.get(i); switch (configFlagString) { - case "FLAG_CANCEL_STICKY_REQUESTS": - flags |= DeviceState.FLAG_CANCEL_STICKY_REQUESTS; + case FLAG_CANCEL_OVERRIDE_REQUESTS: + flags |= DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS; break; default: Slog.w(TAG, "Parsed unknown flag with name: " diff --git a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateTest.java b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateTest.java index e286cb27cc418..d54524e94139e 100644 --- a/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateTest.java +++ b/services/tests/servicestests/src/com/android/server/devicestate/DeviceStateTest.java @@ -41,10 +41,10 @@ public final class DeviceStateTest { @Test public void testConstruct() { final DeviceState state = new DeviceState(MINIMUM_DEVICE_STATE /* identifier */, - "CLOSED" /* name */, DeviceState.FLAG_CANCEL_STICKY_REQUESTS /* flags */); + "TEST_CLOSED" /* name */, DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS /* flags */); assertEquals(state.getIdentifier(), MINIMUM_DEVICE_STATE); - assertEquals(state.getName(), "CLOSED"); - assertEquals(state.getFlags(), DeviceState.FLAG_CANCEL_STICKY_REQUESTS); + assertEquals(state.getName(), "TEST_CLOSED"); + assertEquals(state.getFlags(), DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS); } @Test diff --git a/services/tests/servicestests/src/com/android/server/devicestate/OverrideRequestControllerTest.java b/services/tests/servicestests/src/com/android/server/devicestate/OverrideRequestControllerTest.java index c9cf2f06640d8..b94fc4308ce22 100644 --- a/services/tests/servicestests/src/com/android/server/devicestate/OverrideRequestControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/devicestate/OverrideRequestControllerTest.java @@ -213,6 +213,25 @@ public final class OverrideRequestControllerTest { assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED); } + @Test + public void cancelOverrideRequestsTest() { + OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, + 1 /* requestedState */, 0 /* flags */); + OverrideRequest secondRequest = new OverrideRequest(new Binder(), 0 /* pid */, + 2 /* requestedState */, 0 /* flags */); + + mController.addRequest(firstRequest); + mController.addRequest(secondRequest); + + assertEquals(mStatusListener.getLastStatus(secondRequest).intValue(), STATUS_ACTIVE); + assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_SUSPENDED); + + mController.cancelOverrideRequests(); + + assertEquals(mStatusListener.getLastStatus(secondRequest).intValue(), STATUS_CANCELED); + assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_CANCELED); + } + private static final class TestStatusChangeListener implements OverrideRequestController.StatusChangeListener { private Map mLastStatusMap = new HashMap<>(); diff --git a/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java b/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java index 761cea79df28d..90b19a450f483 100644 --- a/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java +++ b/services/tests/servicestests/src/com/android/server/policy/DeviceStateProviderImplTest.java @@ -160,12 +160,12 @@ public final class DeviceStateProviderImplTest { } @Test - public void create_stateWithCancelStickyRequestFlag() { + public void create_stateWithCancelOverrideRequestFlag() { String configString = "\n" + " \n" + " 1\n" + " \n" - + " FLAG_CANCEL_STICKY_REQUESTS\n" + + " FLAG_CANCEL_OVERRIDE_REQUESTS\n" + " \n" + " \n" + " \n" @@ -183,7 +183,7 @@ public final class DeviceStateProviderImplTest { verify(listener).onSupportedDeviceStatesChanged(mDeviceStateArrayCaptor.capture()); final DeviceState[] expectedStates = new DeviceState[]{ - new DeviceState(1, "", DeviceState.FLAG_CANCEL_STICKY_REQUESTS), + new DeviceState(1, "", DeviceState.FLAG_CANCEL_OVERRIDE_REQUESTS), new DeviceState(2, "", 0 /* flags */) }; assertArrayEquals(expectedStates, mDeviceStateArrayCaptor.getValue()); }