Merge "Fix PowerManager#dream API by partially rolling back ag/19763724" into tm-qpr-dev
This commit is contained in:
@@ -20,13 +20,13 @@ import android.content.ComponentName;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.os.RemoteException;
|
||||||
|
import android.os.ServiceManager;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
import com.android.server.LocalServices;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal helper for launching dreams to ensure consistency between the
|
* Internal helper for launching dreams to ensure consistency between the
|
||||||
* <code>UiModeManagerService</code> system service and the <code>Somnambulator</code> activity.
|
* <code>UiModeManagerService</code> system service and the <code>Somnambulator</code> activity.
|
||||||
@@ -75,28 +75,32 @@ public final class Sandman {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void startDream(Context context, boolean docked) {
|
private static void startDream(Context context, boolean docked) {
|
||||||
DreamManagerInternal dreamManagerService =
|
try {
|
||||||
LocalServices.getService(DreamManagerInternal.class);
|
IDreamManager dreamManagerService = IDreamManager.Stub.asInterface(
|
||||||
if (dreamManagerService != null && !dreamManagerService.isDreaming()) {
|
ServiceManager.getService(DreamService.DREAM_SERVICE));
|
||||||
if (docked) {
|
if (dreamManagerService != null && !dreamManagerService.isDreaming()) {
|
||||||
Slog.i(TAG, "Activating dream while docked.");
|
if (docked) {
|
||||||
|
Slog.i(TAG, "Activating dream while docked.");
|
||||||
|
|
||||||
// Wake up.
|
// Wake up.
|
||||||
// The power manager will wake up the system automatically when it starts
|
// The power manager will wake up the system automatically when it starts
|
||||||
// receiving power from a dock but there is a race between that happening
|
// receiving power from a dock but there is a race between that happening
|
||||||
// and the UI mode manager starting a dream. We want the system to already
|
// and the UI mode manager starting a dream. We want the system to already
|
||||||
// be awake by the time this happens. Otherwise the dream may not start.
|
// be awake by the time this happens. Otherwise the dream may not start.
|
||||||
PowerManager powerManager =
|
PowerManager powerManager =
|
||||||
context.getSystemService(PowerManager.class);
|
context.getSystemService(PowerManager.class);
|
||||||
powerManager.wakeUp(SystemClock.uptimeMillis(),
|
powerManager.wakeUp(SystemClock.uptimeMillis(),
|
||||||
PowerManager.WAKE_REASON_PLUGGED_IN,
|
PowerManager.WAKE_REASON_PLUGGED_IN,
|
||||||
"android.service.dreams:DREAM");
|
"android.service.dreams:DREAM");
|
||||||
} else {
|
} else {
|
||||||
Slog.i(TAG, "Activating dream by user request.");
|
Slog.i(TAG, "Activating dream by user request.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dream.
|
||||||
|
dreamManagerService.dream();
|
||||||
}
|
}
|
||||||
|
} catch (RemoteException ex) {
|
||||||
// Dream.
|
Slog.e(TAG, "Could not start dream when docked.", ex);
|
||||||
dreamManagerService.requestDream();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1831,7 +1831,7 @@ final class UiModeManagerService extends SystemService {
|
|||||||
if (category != null && !dockAppStarted && (mStartDreamImmediatelyOnDock
|
if (category != null && !dockAppStarted && (mStartDreamImmediatelyOnDock
|
||||||
|| mWindowManager.isKeyguardShowingAndNotOccluded()
|
|| mWindowManager.isKeyguardShowingAndNotOccluded()
|
||||||
|| !mPowerManager.isInteractive())) {
|
|| !mPowerManager.isInteractive())) {
|
||||||
Sandman.startDreamWhenDockedIfAppropriate(getContext());
|
mInjector.startDreamWhenDockedIfAppropriate(getContext());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2145,5 +2145,9 @@ final class UiModeManagerService extends SystemService {
|
|||||||
public int getCallingUid() {
|
public int getCallingUid() {
|
||||||
return Binder.getCallingUid();
|
return Binder.getCallingUid();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void startDreamWhenDockedIfAppropriate(Context context) {
|
||||||
|
Sandman.startDreamWhenDockedIfAppropriate(context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ import static org.mockito.Mockito.doReturn;
|
|||||||
import static org.mockito.Mockito.doThrow;
|
import static org.mockito.Mockito.doThrow;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
|
import static org.mockito.Mockito.spy;
|
||||||
import static org.mockito.Mockito.times;
|
import static org.mockito.Mockito.times;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
@@ -83,7 +84,6 @@ import android.os.Process;
|
|||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.service.dreams.DreamManagerInternal;
|
|
||||||
import android.test.mock.MockContentResolver;
|
import android.test.mock.MockContentResolver;
|
||||||
import android.testing.AndroidTestingRunner;
|
import android.testing.AndroidTestingRunner;
|
||||||
import android.testing.TestableLooper;
|
import android.testing.TestableLooper;
|
||||||
@@ -101,6 +101,7 @@ import org.junit.runner.RunWith;
|
|||||||
import org.mockito.ArgumentCaptor;
|
import org.mockito.ArgumentCaptor;
|
||||||
import org.mockito.Captor;
|
import org.mockito.Captor;
|
||||||
import org.mockito.Mock;
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.Spy;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
@@ -137,8 +138,8 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
|
|||||||
private PackageManager mPackageManager;
|
private PackageManager mPackageManager;
|
||||||
@Mock
|
@Mock
|
||||||
private IBinder mBinder;
|
private IBinder mBinder;
|
||||||
@Mock
|
@Spy
|
||||||
private DreamManagerInternal mDreamManager;
|
private TestInjector mInjector;
|
||||||
@Captor
|
@Captor
|
||||||
private ArgumentCaptor<Intent> mOrderedBroadcastIntent;
|
private ArgumentCaptor<Intent> mOrderedBroadcastIntent;
|
||||||
@Captor
|
@Captor
|
||||||
@@ -207,10 +208,10 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
|
|||||||
addLocalService(WindowManagerInternal.class, mWindowManager);
|
addLocalService(WindowManagerInternal.class, mWindowManager);
|
||||||
addLocalService(PowerManagerInternal.class, mLocalPowerManager);
|
addLocalService(PowerManagerInternal.class, mLocalPowerManager);
|
||||||
addLocalService(TwilightManager.class, mTwilightManager);
|
addLocalService(TwilightManager.class, mTwilightManager);
|
||||||
addLocalService(DreamManagerInternal.class, mDreamManager);
|
|
||||||
|
|
||||||
|
mInjector = spy(new TestInjector());
|
||||||
mUiManagerService = new UiModeManagerService(mContext, /* setupWizardComplete= */ true,
|
mUiManagerService = new UiModeManagerService(mContext, /* setupWizardComplete= */ true,
|
||||||
mTwilightManager, new TestInjector());
|
mTwilightManager, mInjector);
|
||||||
try {
|
try {
|
||||||
mUiManagerService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
|
mUiManagerService.onBootPhase(SystemService.PHASE_SYSTEM_SERVICES_READY);
|
||||||
} catch (SecurityException e) {/* ignore for permission denial */}
|
} catch (SecurityException e) {/* ignore for permission denial */}
|
||||||
@@ -1321,84 +1322,53 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dreamWhenDocked() {
|
public void dreamWhenDocked() {
|
||||||
setScreensaverActivateOnDock(true);
|
|
||||||
setScreensaverEnabled(true);
|
|
||||||
|
|
||||||
triggerDockIntent();
|
triggerDockIntent();
|
||||||
verifyAndSendResultBroadcast();
|
verifyAndSendResultBroadcast();
|
||||||
verify(mDreamManager).requestDream();
|
verify(mInjector).startDreamWhenDockedIfAppropriate(mContext);
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void noDreamWhenDocked_dreamsDisabled() {
|
|
||||||
setScreensaverActivateOnDock(true);
|
|
||||||
setScreensaverEnabled(false);
|
|
||||||
|
|
||||||
triggerDockIntent();
|
|
||||||
verifyAndSendResultBroadcast();
|
|
||||||
verify(mDreamManager, never()).requestDream();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void noDreamWhenDocked_dreamsWhenDockedDisabled() {
|
|
||||||
setScreensaverActivateOnDock(false);
|
|
||||||
setScreensaverEnabled(true);
|
|
||||||
|
|
||||||
triggerDockIntent();
|
|
||||||
verifyAndSendResultBroadcast();
|
|
||||||
verify(mDreamManager, never()).requestDream();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void noDreamWhenDocked_keyguardNotShowing_interactive() {
|
public void noDreamWhenDocked_keyguardNotShowing_interactive() {
|
||||||
setScreensaverActivateOnDock(true);
|
|
||||||
setScreensaverEnabled(true);
|
|
||||||
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
||||||
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(false);
|
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(false);
|
||||||
when(mPowerManager.isInteractive()).thenReturn(true);
|
when(mPowerManager.isInteractive()).thenReturn(true);
|
||||||
|
|
||||||
triggerDockIntent();
|
triggerDockIntent();
|
||||||
verifyAndSendResultBroadcast();
|
verifyAndSendResultBroadcast();
|
||||||
verify(mDreamManager, never()).requestDream();
|
verify(mInjector, never()).startDreamWhenDockedIfAppropriate(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dreamWhenDocked_keyguardShowing_interactive() {
|
public void dreamWhenDocked_keyguardShowing_interactive() {
|
||||||
setScreensaverActivateOnDock(true);
|
|
||||||
setScreensaverEnabled(true);
|
|
||||||
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
||||||
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(true);
|
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(true);
|
||||||
when(mPowerManager.isInteractive()).thenReturn(false);
|
when(mPowerManager.isInteractive()).thenReturn(false);
|
||||||
|
|
||||||
triggerDockIntent();
|
triggerDockIntent();
|
||||||
verifyAndSendResultBroadcast();
|
verifyAndSendResultBroadcast();
|
||||||
verify(mDreamManager).requestDream();
|
verify(mInjector).startDreamWhenDockedIfAppropriate(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dreamWhenDocked_keyguardNotShowing_notInteractive() {
|
public void dreamWhenDocked_keyguardNotShowing_notInteractive() {
|
||||||
setScreensaverActivateOnDock(true);
|
|
||||||
setScreensaverEnabled(true);
|
|
||||||
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
||||||
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(false);
|
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(false);
|
||||||
when(mPowerManager.isInteractive()).thenReturn(false);
|
when(mPowerManager.isInteractive()).thenReturn(false);
|
||||||
|
|
||||||
triggerDockIntent();
|
triggerDockIntent();
|
||||||
verifyAndSendResultBroadcast();
|
verifyAndSendResultBroadcast();
|
||||||
verify(mDreamManager).requestDream();
|
verify(mInjector).startDreamWhenDockedIfAppropriate(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void dreamWhenDocked_keyguardShowing_notInteractive() {
|
public void dreamWhenDocked_keyguardShowing_notInteractive() {
|
||||||
setScreensaverActivateOnDock(true);
|
|
||||||
setScreensaverEnabled(true);
|
|
||||||
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
mUiManagerService.setStartDreamImmediatelyOnDock(false);
|
||||||
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(true);
|
when(mWindowManager.isKeyguardShowingAndNotOccluded()).thenReturn(true);
|
||||||
when(mPowerManager.isInteractive()).thenReturn(false);
|
when(mPowerManager.isInteractive()).thenReturn(false);
|
||||||
|
|
||||||
triggerDockIntent();
|
triggerDockIntent();
|
||||||
verifyAndSendResultBroadcast();
|
verifyAndSendResultBroadcast();
|
||||||
verify(mDreamManager).requestDream();
|
verify(mInjector).startDreamWhenDockedIfAppropriate(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void triggerDockIntent() {
|
private void triggerDockIntent() {
|
||||||
@@ -1435,22 +1405,6 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
|
|||||||
mOrderedBroadcastIntent.getValue());
|
mOrderedBroadcastIntent.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setScreensaverEnabled(boolean enable) {
|
|
||||||
Settings.Secure.putIntForUser(
|
|
||||||
mContentResolver,
|
|
||||||
Settings.Secure.SCREENSAVER_ENABLED,
|
|
||||||
enable ? 1 : 0,
|
|
||||||
UserHandle.USER_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setScreensaverActivateOnDock(boolean enable) {
|
|
||||||
Settings.Secure.putIntForUser(
|
|
||||||
mContentResolver,
|
|
||||||
Settings.Secure.SCREENSAVER_ACTIVATE_ON_DOCK,
|
|
||||||
enable ? 1 : 0,
|
|
||||||
UserHandle.USER_CURRENT);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void requestAllPossibleProjectionTypes() throws RemoteException {
|
private void requestAllPossibleProjectionTypes() throws RemoteException {
|
||||||
for (int i = 0; i < Integer.SIZE; ++i) {
|
for (int i = 0; i < Integer.SIZE; ++i) {
|
||||||
mService.requestProjection(mBinder, 1 << i, PACKAGE_NAME);
|
mService.requestProjection(mBinder, 1 << i, PACKAGE_NAME);
|
||||||
@@ -1467,11 +1421,17 @@ public class UiModeManagerServiceTest extends UiServiceTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public TestInjector(int callingUid) {
|
public TestInjector(int callingUid) {
|
||||||
this.callingUid = callingUid;
|
this.callingUid = callingUid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public int getCallingUid() {
|
public int getCallingUid() {
|
||||||
return callingUid;
|
return callingUid;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startDreamWhenDockedIfAppropriate(Context context) {
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user