Merge "Fix PowerManager#dream API by partially rolling back ag/19763724" into tm-qpr-dev

This commit is contained in:
Lucas Silva
2022-10-05 14:03:42 +00:00
committed by Android (Google) Code Review
3 changed files with 50 additions and 82 deletions

View File

@@ -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();
} }
} }

View File

@@ -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);
}
} }
} }

View File

@@ -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
}
} }
} }