Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7a7f7f20 authored by Kenneth Ford's avatar Kenneth Ford
Browse files

Cancels device state if process dies

Cancels a device state request if the process
dies and the state has the FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP
flag.

Fixes: 306498716
Test: ExtensionRearDisplayPresentationTest#testStartAndEndRearDisplayPresentationSession_processDies
Test: OverrideRequestControllerTest

Change-Id: I8b5e9e1c95530de651b4315ddde54b5dd9db23a0
parent 99b3bb76
Loading
Loading
Loading
Loading
+19 −12
Original line number Diff line number Diff line
@@ -327,7 +327,7 @@ public final class DeviceStateManagerService extends SystemService {
    Optional<DeviceState> getOverrideState() {
        synchronized (mLock) {
            if (mActiveOverride.isPresent()) {
                return getStateLocked(mActiveOverride.get().getRequestedState());
                return getStateLocked(mActiveOverride.get().getRequestedStateIdentifier());
            }
            return Optional.empty();
        }
@@ -342,7 +342,7 @@ public final class DeviceStateManagerService extends SystemService {
    Optional<DeviceState> getOverrideBaseState() {
        synchronized (mLock) {
            if (mActiveBaseStateOverride.isPresent()) {
                return getStateLocked(mActiveBaseStateOverride.get().getRequestedState());
                return getStateLocked(mActiveBaseStateOverride.get().getRequestedStateIdentifier());
            }
            return Optional.empty();
        }
@@ -499,6 +499,7 @@ public final class DeviceStateManagerService extends SystemService {
     * @return {@code true} if the pending state has changed as a result of this call, {@code false}
     * otherwise.
     */
    @GuardedBy("mLock")
    private boolean updatePendingStateLocked() {
        if (mPendingState.isPresent()) {
            // Have pending state, can not configure a new state until the state is committed.
@@ -507,7 +508,8 @@ public final class DeviceStateManagerService extends SystemService {

        final DeviceState stateToConfigure;
        if (mActiveOverride.isPresent()) {
            stateToConfigure = getStateLocked(mActiveOverride.get().getRequestedState()).get();
            stateToConfigure = getStateLocked(
                    mActiveOverride.get().getRequestedStateIdentifier()).get();
        } else if (mBaseState.isPresent()
                && isSupportedStateLocked(mBaseState.get().getIdentifier())) {
            // Base state could have recently become unsupported after a change in supported states.
@@ -599,7 +601,7 @@ public final class DeviceStateManagerService extends SystemService {
            // requested state is committed.
            OverrideRequest activeRequest = mActiveOverride.orElse(null);
            if (activeRequest != null
                    && activeRequest.getRequestedState() == newState.getIdentifier()) {
                    && activeRequest.getRequestedStateIdentifier() == newState.getIdentifier()) {
                ProcessRecord processRecord = mProcessRecords.get(activeRequest.getPid());
                if (processRecord != null) {
                    processRecord.notifyRequestActiveAsync(activeRequest.getToken());
@@ -666,21 +668,21 @@ public final class DeviceStateManagerService extends SystemService {
                case STATUS_ACTIVE:
                    mActiveOverride = Optional.of(request);
                    mDeviceStateNotificationController.showStateActiveNotificationIfNeeded(
                            request.getRequestedState(), request.getUid());
                            request.getRequestedStateIdentifier(), request.getUid());
                    break;
                case STATUS_CANCELED:
                    if (mActiveOverride.isPresent() && mActiveOverride.get() == request) {
                        mActiveOverride = Optional.empty();
                        mDeviceStateNotificationController.cancelNotification(
                                request.getRequestedState());
                                request.getRequestedStateIdentifier());
                        if ((flags & FLAG_THERMAL_CRITICAL) == FLAG_THERMAL_CRITICAL) {
                            mDeviceStateNotificationController
                                    .showThermalCriticalNotificationIfNeeded(
                                            request.getRequestedState());
                                            request.getRequestedStateIdentifier());
                        } else if ((flags & FLAG_POWER_SAVE_ENABLED) == FLAG_POWER_SAVE_ENABLED) {
                            mDeviceStateNotificationController
                                    .showPowerSaveNotificationIfNeeded(
                                            request.getRequestedState());
                                            request.getRequestedStateIdentifier());
                        }
                    }
                    break;
@@ -723,7 +725,7 @@ public final class DeviceStateManagerService extends SystemService {
     */
    @GuardedBy("mLock")
    private void enableBaseStateRequestLocked(OverrideRequest request) {
        setBaseState(request.getRequestedState());
        setBaseState(request.getRequestedStateIdentifier());
        mActiveBaseStateOverride = Optional.of(request);
        ProcessRecord processRecord = mProcessRecords.get(request.getPid());
        processRecord.notifyRequestActiveAsync(request.getToken());
@@ -762,6 +764,11 @@ public final class DeviceStateManagerService extends SystemService {
        synchronized (mLock) {
            mProcessRecords.remove(processRecord.mPid);
            mOverrideRequestController.handleProcessDied(processRecord.mPid);

            if (shouldCancelOverrideRequestWhenRequesterNotOnTop()) {
                OverrideRequest request = mActiveOverride.get();
                mOverrideRequestController.cancelRequest(request);
            }
        }
    }

@@ -787,7 +794,7 @@ public final class DeviceStateManagerService extends SystemService {
            }

            OverrideRequest request = new OverrideRequest(token, callingPid, callingUid,
                    state, flags, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                    deviceState.get(), flags, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

            // If we don't have the CONTROL_DEVICE_STATE permission, we want to show the overlay
            if (!hasControlDeviceStatePermission && mRearDisplayState != null
@@ -848,7 +855,7 @@ public final class DeviceStateManagerService extends SystemService {
            }

            OverrideRequest request = new OverrideRequest(token, callingPid, callingUid,
                    state, flags, OVERRIDE_REQUEST_TYPE_BASE_STATE);
                    deviceState.get(), flags, OVERRIDE_REQUEST_TYPE_BASE_STATE);
            mOverrideRequestController.addBaseStateRequest(request);
        }
    }
@@ -1318,7 +1325,7 @@ public final class DeviceStateManagerService extends SystemService {
        if (mActiveOverride.isEmpty()) {
            return false;
        }
        int identifier = mActiveOverride.get().getRequestedState();
        int identifier = mActiveOverride.get().getRequestedStateIdentifier();
        DeviceState deviceState = mDeviceStates.get(identifier);
        return deviceState.hasFlag(DeviceState.FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP);
    }
+10 −3
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@
package com.android.server.devicestate;

import android.annotation.IntDef;
import android.annotation.NonNull;
import android.hardware.devicestate.DeviceStateRequest;
import android.os.IBinder;

@@ -32,7 +33,8 @@ final class OverrideRequest {
    private final IBinder mToken;
    private final int mPid;
    private final int mUid;
    private final int mRequestedState;
    @NonNull
    private final DeviceState mRequestedState;
    @DeviceStateRequest.RequestFlags
    private final int mFlags;
    @OverrideRequestType
@@ -69,7 +71,7 @@ final class OverrideRequest {
    @Retention(RetentionPolicy.SOURCE)
    public @interface OverrideRequestType {}

    OverrideRequest(IBinder token, int pid, int uid, int requestedState,
    OverrideRequest(IBinder token, int pid, int uid, @NonNull DeviceState requestedState,
            @DeviceStateRequest.RequestFlags int flags, @OverrideRequestType int requestType) {
        mToken = token;
        mPid = pid;
@@ -91,10 +93,15 @@ final class OverrideRequest {
        return mUid;
    }

    int getRequestedState() {
    @NonNull
    DeviceState getRequestedDeviceState() {
        return mRequestedState;
    }

    int getRequestedStateIdentifier() {
        return mRequestedState.getIdentifier();
    }

    @DeviceStateRequest.RequestFlags
    int getFlags() {
        return mFlags;
+11 −4
Original line number Diff line number Diff line
@@ -204,6 +204,12 @@ final class OverrideRequestController {
        }

        if (mRequest != null && mRequest.getPid() == pid) {
            if (mRequest.getRequestedDeviceState().hasFlag(
                    DeviceState.FLAG_CANCEL_WHEN_REQUESTER_NOT_ON_TOP)) {
                cancelCurrentRequestLocked();
                return;
            }

            if (mStickyRequestsAllowed) {
                // Do not cancel the requests now because sticky requests are allowed. These
                // requests will be cancelled on a call to cancelStickyRequests().
@@ -219,7 +225,7 @@ final class OverrideRequestController {
     * listener of all changes to request status as a result of this change.
     */
    void handleBaseStateChanged(int state) {
        if (mBaseStateRequest != null && state != mBaseStateRequest.getRequestedState()) {
        if (mBaseStateRequest != null && state != mBaseStateRequest.getRequestedStateIdentifier()) {
            cancelBaseStateOverrideRequest();
        }
        if (mRequest == null) {
@@ -246,11 +252,12 @@ final class OverrideRequestController {
        flags |= isThermalCritical ? FLAG_THERMAL_CRITICAL : 0;
        flags |= isPowerSaveEnabled ? FLAG_POWER_SAVE_ENABLED : 0;
        if (mBaseStateRequest != null && !contains(newSupportedStates,
                mBaseStateRequest.getRequestedState())) {
                mBaseStateRequest.getRequestedStateIdentifier())) {
            cancelCurrentBaseStateRequestLocked(flags);
        }

        if (mRequest != null && !contains(newSupportedStates, mRequest.getRequestedState())) {
        if (mRequest != null && !contains(newSupportedStates,
                mRequest.getRequestedStateIdentifier())) {
            cancelCurrentRequestLocked(flags);
        }
    }
@@ -262,7 +269,7 @@ final class OverrideRequestController {
        pw.println("Override Request active: " + requestActive);
        if (requestActive) {
            pw.println("Request: mPid=" + overrideRequest.getPid()
                    + ", mRequestedState=" + overrideRequest.getRequestedState()
                    + ", mRequestedState=" + overrideRequest.getRequestedStateIdentifier()
                    + ", mFlags=" + overrideRequest.getFlags()
                    + ", mStatus=" + statusToString(STATUS_ACTIVE));
        }
+21 −17
Original line number Diff line number Diff line
@@ -47,6 +47,10 @@ import java.util.Map;
@Presubmit
@RunWith(AndroidJUnit4.class)
public final class OverrideRequestControllerTest {

    private static final DeviceState TEST_DEVICE_STATE_ZERO = new DeviceState(0, "TEST_STATE", 0);
    private static final DeviceState TEST_DEVICE_STATE_ONE = new DeviceState(1, "TEST_STATE", 0);

    private TestStatusChangeListener mStatusListener;
    private OverrideRequestController mController;

@@ -59,7 +63,7 @@ public final class OverrideRequestControllerTest {
    @Test
    public void addRequest() {
        OverrideRequest request = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
        assertNull(mStatusListener.getLastStatus(request));

        mController.addRequest(request);
@@ -69,14 +73,14 @@ public final class OverrideRequestControllerTest {
    @Test
    public void addRequest_cancelExistingRequestThroughNewRequest() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
        assertNull(mStatusListener.getLastStatus(firstRequest));

        mController.addRequest(firstRequest);
        assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);

        OverrideRequest secondRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ONE, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
        assertNull(mStatusListener.getLastStatus(secondRequest));

        mController.addRequest(secondRequest);
@@ -87,7 +91,7 @@ public final class OverrideRequestControllerTest {
    @Test
    public void addRequest_cancelActiveRequest() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

        mController.addRequest(firstRequest);

@@ -101,7 +105,7 @@ public final class OverrideRequestControllerTest {
    @Test
    public void addBaseStateRequest() {
        OverrideRequest request = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
        assertNull(mStatusListener.getLastStatus(request));

        mController.addBaseStateRequest(request);
@@ -111,14 +115,14 @@ public final class OverrideRequestControllerTest {
    @Test
    public void addBaseStateRequest_cancelExistingBaseStateRequestThroughNewRequest() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
        assertNull(mStatusListener.getLastStatus(firstRequest));

        mController.addBaseStateRequest(firstRequest);
        assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);

        OverrideRequest secondRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
                TEST_DEVICE_STATE_ONE, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
        assertNull(mStatusListener.getLastStatus(secondRequest));

        mController.addBaseStateRequest(secondRequest);
@@ -129,7 +133,7 @@ public final class OverrideRequestControllerTest {
    @Test
    public void addBaseStateRequest_cancelActiveBaseStateRequest() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);

        mController.addBaseStateRequest(firstRequest);

@@ -143,13 +147,13 @@ public final class OverrideRequestControllerTest {
    @Test
    public void handleBaseStateChanged() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */,
                TEST_DEVICE_STATE_ZERO,
                DeviceStateRequest.FLAG_CANCEL_WHEN_BASE_CHANGES /* flags */,
                OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

        OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
                0 /* uid */,
                0 /* requestedState */,
                TEST_DEVICE_STATE_ZERO,
                0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);

        mController.addRequest(firstRequest);
@@ -169,11 +173,11 @@ public final class OverrideRequestControllerTest {
    @Test
    public void handleProcessDied() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

        OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
                0 /* uid */,
                1 /* requestedState */,
                TEST_DEVICE_STATE_ONE,
                0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);

        mController.addRequest(firstRequest);
@@ -192,11 +196,11 @@ public final class OverrideRequestControllerTest {
        mController.setStickyRequestsAllowed(true);

        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                0 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ZERO, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

        OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
                0 /* uid */,
                1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);
                TEST_DEVICE_STATE_ONE, 0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);

        mController.addRequest(firstRequest);
        assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);
@@ -215,11 +219,11 @@ public final class OverrideRequestControllerTest {
    @Test
    public void handleNewSupportedStates() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ONE, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

        OverrideRequest baseStateRequest = new OverrideRequest(new Binder(), 0 /* pid */,
                0 /* uid */,
                1 /* requestedState */,
                TEST_DEVICE_STATE_ONE,
                0 /* flags */, OVERRIDE_REQUEST_TYPE_BASE_STATE);

        mController.addRequest(firstRequest);
@@ -242,7 +246,7 @@ public final class OverrideRequestControllerTest {
    @Test
    public void cancelOverrideRequestsTest() {
        OverrideRequest firstRequest = new OverrideRequest(new Binder(), 0 /* pid */, 0 /* uid */,
                1 /* requestedState */, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);
                TEST_DEVICE_STATE_ONE, 0 /* flags */, OVERRIDE_REQUEST_TYPE_EMULATED_STATE);

        mController.addRequest(firstRequest);
        assertEquals(mStatusListener.getLastStatus(firstRequest).intValue(), STATUS_ACTIVE);