Merge "AOD: Fix WakeLock leak" into pi-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
888a82fdb3
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user