Merge "AOD: Fix WakeLock leak" into pi-dev

This commit is contained in:
TreeHugger Robot
2018-04-23 18:09:09 +00:00
committed by Android (Google) Code Review
2 changed files with 31 additions and 16 deletions

View File

@@ -21,6 +21,7 @@ import android.util.Log;
import android.view.Display; import android.view.Display;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.SettableWakeLock;
import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.util.wakelock.WakeLock;
/** /**
@@ -43,15 +44,14 @@ public class DozeScreenState implements DozeMachine.Part {
private final DozeParameters mParameters; private final DozeParameters mParameters;
private int mPendingScreenState = Display.STATE_UNKNOWN; private int mPendingScreenState = Display.STATE_UNKNOWN;
private boolean mWakeLockHeld; private SettableWakeLock mWakeLock;
private WakeLock mWakeLock;
public DozeScreenState(DozeMachine.Service service, Handler handler, public DozeScreenState(DozeMachine.Service service, Handler handler,
DozeParameters parameters, WakeLock wakeLock) { DozeParameters parameters, WakeLock wakeLock) {
mDozeService = service; mDozeService = service;
mHandler = handler; mHandler = handler;
mParameters = parameters; mParameters = parameters;
mWakeLock = wakeLock; mWakeLock = new SettableWakeLock(wakeLock);
} }
@Override @Override
@@ -64,6 +64,7 @@ public class DozeScreenState implements DozeMachine.Part {
mHandler.removeCallbacks(mApplyPendingScreenState); mHandler.removeCallbacks(mApplyPendingScreenState);
applyScreenState(screenState); applyScreenState(screenState);
mWakeLock.setAcquired(false);
return; return;
} }
@@ -84,9 +85,8 @@ public class DozeScreenState implements DozeMachine.Part {
boolean shouldDelayTransition = newState == DozeMachine.State.DOZE_AOD boolean shouldDelayTransition = newState == DozeMachine.State.DOZE_AOD
&& mParameters.shouldControlScreenOff(); && mParameters.shouldControlScreenOff();
if (!mWakeLockHeld && shouldDelayTransition) { if (shouldDelayTransition) {
mWakeLockHeld = true; mWakeLock.setAcquired(true);
mWakeLock.acquire();
} }
if (!messagePending) { if (!messagePending) {
@@ -118,10 +118,7 @@ public class DozeScreenState implements DozeMachine.Part {
if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")"); if (DEBUG) Log.d(TAG, "setDozeScreenState(" + screenState + ")");
mDozeService.setDozeScreenState(screenState); mDozeService.setDozeScreenState(screenState);
mPendingScreenState = Display.STATE_UNKNOWN; mPendingScreenState = Display.STATE_UNKNOWN;
if (mWakeLockHeld) { mWakeLock.setAcquired(false);
mWakeLockHeld = false;
mWakeLock.release();
}
} }
} }
} }

View File

@@ -25,8 +25,10 @@ import static com.android.systemui.doze.DozeMachine.State.INITIALIZED;
import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED; import static com.android.systemui.doze.DozeMachine.State.UNINITIALIZED;
import static com.android.systemui.utils.os.FakeHandler.Mode.QUEUEING; import static com.android.systemui.utils.os.FakeHandler.Mode.QUEUEING;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.never; import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset; import static org.mockito.Mockito.reset;
@@ -41,6 +43,7 @@ import android.view.Display;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.util.wakelock.WakeLock; import com.android.systemui.util.wakelock.WakeLock;
import com.android.systemui.util.wakelock.WakeLockFake;
import com.android.systemui.utils.os.FakeHandler; import com.android.systemui.utils.os.FakeHandler;
import org.junit.Before; import org.junit.Before;
@@ -58,8 +61,7 @@ public class DozeScreenStateTest extends SysuiTestCase {
FakeHandler mHandlerFake; FakeHandler mHandlerFake;
@Mock @Mock
DozeParameters mDozeParameters; DozeParameters mDozeParameters;
@Mock WakeLockFake mWakeLock;
WakeLock mWakeLock;
@Before @Before
public void setUp() throws Exception { public void setUp() throws Exception {
@@ -68,6 +70,7 @@ public class DozeScreenStateTest extends SysuiTestCase {
when(mDozeParameters.getAlwaysOn()).thenReturn(true); when(mDozeParameters.getAlwaysOn()).thenReturn(true);
mServiceFake = new DozeServiceFake(); mServiceFake = new DozeServiceFake();
mHandlerFake = new FakeHandler(Looper.getMainLooper()); mHandlerFake = new FakeHandler(Looper.getMainLooper());
mWakeLock = new WakeLockFake();
mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeParameters, mWakeLock); mScreen = new DozeScreenState(mServiceFake, mHandlerFake, mDozeParameters, mWakeLock);
} }
@@ -158,14 +161,29 @@ public class DozeScreenStateTest extends SysuiTestCase {
mScreen.transitionTo(UNINITIALIZED, INITIALIZED); mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mHandlerFake.dispatchQueuedMessages(); mHandlerFake.dispatchQueuedMessages();
reset(mWakeLock);
mScreen.transitionTo(INITIALIZED, DOZE_AOD); mScreen.transitionTo(INITIALIZED, DOZE_AOD);
verify(mWakeLock).acquire(); assertThat(mWakeLock.isHeld(), is(true));
verify(mWakeLock, never()).release();
mHandlerFake.dispatchQueuedMessages(); mHandlerFake.dispatchQueuedMessages();
verify(mWakeLock).release(); assertThat(mWakeLock.isHeld(), is(false));
}
@Test
public void test_releasesWakeLock_abortingLowPowerDelayed() {
// Transition to low power mode will be delayed to let
// animations play at 60 fps.
when(mDozeParameters.shouldControlScreenOff()).thenReturn(true);
mHandlerFake.setMode(QUEUEING);
mScreen.transitionTo(UNINITIALIZED, INITIALIZED);
mHandlerFake.dispatchQueuedMessages();
mScreen.transitionTo(INITIALIZED, DOZE_AOD);
assertThat(mWakeLock.isHeld(), is(true));
mScreen.transitionTo(DOZE_AOD, FINISH);
assertThat(mWakeLock.isHeld(), is(false));
} }
} }