Loading services/core/java/com/android/server/devicestate/DeviceStateManagerService.java +13 −4 Original line number Diff line number Diff line Loading @@ -425,8 +425,14 @@ public final class DeviceStateManagerService extends SystemService { if (!mRequestRecords.isEmpty()) { final OverrideRequestRecord topRequest = mRequestRecords.get(mRequestRecords.size() - 1); if (topRequest.mRequestedState.getIdentifier() == mCommittedState.getIdentifier()) { // The top request could have come in while the service was awaiting callback // from the policy. In that case we only set it to active if it matches the // current committed state, otherwise it will be set to active when its // requested state is committed. topRequest.setStatusLocked(OverrideRequestRecord.STATUS_ACTIVE); } } mPendingState = Optional.empty(); updatePendingStateLocked(); Loading Loading @@ -563,10 +569,13 @@ public final class DeviceStateManagerService extends SystemService { new OverrideRequestRecord(processRecord, token, deviceState.get(), flags); mRequestRecords.add(request); processRecord.mRequestRecords.put(request.mToken, request); // We don't set the status of the new request to ACTIVE here as it will be set in // commitPendingState(). updatePendingStateLocked(); final boolean updatedPendingState = updatePendingStateLocked(); if (!updatedPendingState && !mPendingState.isPresent()) { // We don't set the status of the new request to ACTIVE if the request updated the // pending state as it will be set in commitPendingState(). request.setStatusLocked(OverrideRequestRecord.STATUS_ACTIVE, true /* markDirty */); } } notifyRequestsOfStatusChangeIfNeeded(); Loading services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java +89 −0 Original line number Diff line number Diff line Loading @@ -273,6 +273,87 @@ public final class DeviceStateManagerServiceTest { DEFAULT_DEVICE_STATE.getIdentifier()); } @Test public void requestState_pendingStateAtRequest() throws RemoteException { TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback(); mService.getBinderService().registerCallback(callback); mPolicy.blockConfigure(); final IBinder firstRequestToken = new Binder(); final IBinder secondRequestToken = new Binder(); assertEquals(callback.getLastNotifiedStatus(firstRequestToken), TestDeviceStateManagerCallback.STATUS_UNKNOWN); assertEquals(callback.getLastNotifiedStatus(secondRequestToken), TestDeviceStateManagerCallback.STATUS_UNKNOWN); mService.getBinderService().requestState(firstRequestToken, OTHER_DEVICE_STATE.getIdentifier(), 0 /* flags */); assertEquals(mService.getCommittedState(), DEFAULT_DEVICE_STATE); assertEquals(mService.getPendingState().get(), OTHER_DEVICE_STATE); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), OTHER_DEVICE_STATE.getIdentifier()); mService.getBinderService().requestState(secondRequestToken, DEFAULT_DEVICE_STATE.getIdentifier(), 0 /* flags */); mPolicy.resumeConfigureOnce(); // First request status is now suspended as there is another pending request. assertEquals(callback.getLastNotifiedStatus(firstRequestToken), TestDeviceStateManagerCallback.STATUS_SUSPENDED); // Second request status still unknown because the service is still awaiting policy // callback. assertEquals(callback.getLastNotifiedStatus(secondRequestToken), TestDeviceStateManagerCallback.STATUS_UNKNOWN); assertEquals(mService.getCommittedState(), OTHER_DEVICE_STATE); assertEquals(mService.getPendingState().get(), DEFAULT_DEVICE_STATE); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); mPolicy.resumeConfigure(); assertEquals(mService.getCommittedState(), DEFAULT_DEVICE_STATE); assertEquals(mService.getPendingState(), Optional.empty()); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); // Now cancel the second request to make the first request active. mService.getBinderService().cancelRequest(secondRequestToken); assertEquals(callback.getLastNotifiedStatus(firstRequestToken), TestDeviceStateManagerCallback.STATUS_ACTIVE); assertEquals(callback.getLastNotifiedStatus(secondRequestToken), TestDeviceStateManagerCallback.STATUS_CANCELED); assertEquals(mService.getCommittedState(), OTHER_DEVICE_STATE); assertEquals(mService.getPendingState(), Optional.empty()); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), OTHER_DEVICE_STATE.getIdentifier()); } @Test public void requestState_sameAsBaseState() throws RemoteException { TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback(); mService.getBinderService().registerCallback(callback); final IBinder token = new Binder(); assertEquals(callback.getLastNotifiedStatus(token), TestDeviceStateManagerCallback.STATUS_UNKNOWN); mService.getBinderService().requestState(token, DEFAULT_DEVICE_STATE.getIdentifier(), 0 /* flags */); assertEquals(callback.getLastNotifiedStatus(token), TestDeviceStateManagerCallback.STATUS_ACTIVE); } @Test public void requestState_flagCancelWhenBaseChanges() throws RemoteException { TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback(); Loading Loading @@ -407,6 +488,14 @@ public final class DeviceStateManagerServiceTest { } } public void resumeConfigureOnce() { if (mPendingConfigureCompleteRunnable != null) { Runnable onComplete = mPendingConfigureCompleteRunnable; mPendingConfigureCompleteRunnable = null; onComplete.run(); } } public int getMostRecentRequestedStateToConfigure() { return mLastDeviceStateRequestedToConfigure; } Loading Loading
services/core/java/com/android/server/devicestate/DeviceStateManagerService.java +13 −4 Original line number Diff line number Diff line Loading @@ -425,8 +425,14 @@ public final class DeviceStateManagerService extends SystemService { if (!mRequestRecords.isEmpty()) { final OverrideRequestRecord topRequest = mRequestRecords.get(mRequestRecords.size() - 1); if (topRequest.mRequestedState.getIdentifier() == mCommittedState.getIdentifier()) { // The top request could have come in while the service was awaiting callback // from the policy. In that case we only set it to active if it matches the // current committed state, otherwise it will be set to active when its // requested state is committed. topRequest.setStatusLocked(OverrideRequestRecord.STATUS_ACTIVE); } } mPendingState = Optional.empty(); updatePendingStateLocked(); Loading Loading @@ -563,10 +569,13 @@ public final class DeviceStateManagerService extends SystemService { new OverrideRequestRecord(processRecord, token, deviceState.get(), flags); mRequestRecords.add(request); processRecord.mRequestRecords.put(request.mToken, request); // We don't set the status of the new request to ACTIVE here as it will be set in // commitPendingState(). updatePendingStateLocked(); final boolean updatedPendingState = updatePendingStateLocked(); if (!updatedPendingState && !mPendingState.isPresent()) { // We don't set the status of the new request to ACTIVE if the request updated the // pending state as it will be set in commitPendingState(). request.setStatusLocked(OverrideRequestRecord.STATUS_ACTIVE, true /* markDirty */); } } notifyRequestsOfStatusChangeIfNeeded(); Loading
services/tests/servicestests/src/com/android/server/devicestate/DeviceStateManagerServiceTest.java +89 −0 Original line number Diff line number Diff line Loading @@ -273,6 +273,87 @@ public final class DeviceStateManagerServiceTest { DEFAULT_DEVICE_STATE.getIdentifier()); } @Test public void requestState_pendingStateAtRequest() throws RemoteException { TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback(); mService.getBinderService().registerCallback(callback); mPolicy.blockConfigure(); final IBinder firstRequestToken = new Binder(); final IBinder secondRequestToken = new Binder(); assertEquals(callback.getLastNotifiedStatus(firstRequestToken), TestDeviceStateManagerCallback.STATUS_UNKNOWN); assertEquals(callback.getLastNotifiedStatus(secondRequestToken), TestDeviceStateManagerCallback.STATUS_UNKNOWN); mService.getBinderService().requestState(firstRequestToken, OTHER_DEVICE_STATE.getIdentifier(), 0 /* flags */); assertEquals(mService.getCommittedState(), DEFAULT_DEVICE_STATE); assertEquals(mService.getPendingState().get(), OTHER_DEVICE_STATE); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), OTHER_DEVICE_STATE.getIdentifier()); mService.getBinderService().requestState(secondRequestToken, DEFAULT_DEVICE_STATE.getIdentifier(), 0 /* flags */); mPolicy.resumeConfigureOnce(); // First request status is now suspended as there is another pending request. assertEquals(callback.getLastNotifiedStatus(firstRequestToken), TestDeviceStateManagerCallback.STATUS_SUSPENDED); // Second request status still unknown because the service is still awaiting policy // callback. assertEquals(callback.getLastNotifiedStatus(secondRequestToken), TestDeviceStateManagerCallback.STATUS_UNKNOWN); assertEquals(mService.getCommittedState(), OTHER_DEVICE_STATE); assertEquals(mService.getPendingState().get(), DEFAULT_DEVICE_STATE); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); mPolicy.resumeConfigure(); assertEquals(mService.getCommittedState(), DEFAULT_DEVICE_STATE); assertEquals(mService.getPendingState(), Optional.empty()); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), DEFAULT_DEVICE_STATE.getIdentifier()); // Now cancel the second request to make the first request active. mService.getBinderService().cancelRequest(secondRequestToken); assertEquals(callback.getLastNotifiedStatus(firstRequestToken), TestDeviceStateManagerCallback.STATUS_ACTIVE); assertEquals(callback.getLastNotifiedStatus(secondRequestToken), TestDeviceStateManagerCallback.STATUS_CANCELED); assertEquals(mService.getCommittedState(), OTHER_DEVICE_STATE); assertEquals(mService.getPendingState(), Optional.empty()); assertEquals(mService.getBaseState(), DEFAULT_DEVICE_STATE); assertEquals(mPolicy.getMostRecentRequestedStateToConfigure(), OTHER_DEVICE_STATE.getIdentifier()); } @Test public void requestState_sameAsBaseState() throws RemoteException { TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback(); mService.getBinderService().registerCallback(callback); final IBinder token = new Binder(); assertEquals(callback.getLastNotifiedStatus(token), TestDeviceStateManagerCallback.STATUS_UNKNOWN); mService.getBinderService().requestState(token, DEFAULT_DEVICE_STATE.getIdentifier(), 0 /* flags */); assertEquals(callback.getLastNotifiedStatus(token), TestDeviceStateManagerCallback.STATUS_ACTIVE); } @Test public void requestState_flagCancelWhenBaseChanges() throws RemoteException { TestDeviceStateManagerCallback callback = new TestDeviceStateManagerCallback(); Loading Loading @@ -407,6 +488,14 @@ public final class DeviceStateManagerServiceTest { } } public void resumeConfigureOnce() { if (mPendingConfigureCompleteRunnable != null) { Runnable onComplete = mPendingConfigureCompleteRunnable; mPendingConfigureCompleteRunnable = null; onComplete.run(); } } public int getMostRecentRequestedStateToConfigure() { return mLastDeviceStateRequestedToConfigure; } Loading