Revert "Fix VR interaction with screen on/off/lockscreen."
This reverts commit dfe0d7157da8e8a40ee86f0875531bfe2d657831.
Reason for revert: 33655854
Change-Id: Ie8573a394dee768859d64493dd8c17ee0c613287
(cherry picked from commit bbb5b6e8db346df613c15447c0697def8a76584d)
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 4ea73e7..7f39b47 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -1220,15 +1220,6 @@
/**
* Set while we are wanting to sleep, to prevent any
* activities from being started/resumed.
- *
- * TODO(b/33594039): Clarify the actual state transitions represented by mSleeping.
- *
- * Currently mSleeping is set to true when transitioning into the sleep state, and remains true
- * while in the sleep state until there is a pending transition out of sleep, in which case
- * mSleeping is set to false, and remains false while awake.
- *
- * Whether mSleeping can quickly toggled between true/false without the device actually
- * display changing states is undefined.
*/
private boolean mSleeping = false;
@@ -1561,9 +1552,10 @@
static final int SYSTEM_USER_UNLOCK_MSG = 59;
static final int LOG_STACK_STATE = 60;
static final int VR_MODE_CHANGE_MSG = 61;
- static final int SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG = 62;
- static final int HANDLE_TRUST_STORAGE_UPDATE_MSG = 63;
- static final int REPORT_LOCKED_BOOT_COMPLETE_MSG = 64;
+ static final int VR_MODE_APPLY_IF_NEEDED_MSG = 62;
+ static final int SHOW_UNSUPPORTED_DISPLAY_SIZE_DIALOG_MSG = 63;
+ static final int HANDLE_TRUST_STORAGE_UPDATE_MSG = 64;
+ static final int REPORT_LOCKED_BOOT_COMPLETE_MSG = 65;
static final int START_USER_SWITCH_FG_MSG = 712;
static final int FIRST_ACTIVITY_STACK_MSG = 100;
@@ -2299,6 +2291,14 @@
}
vrService.setVrMode(vrMode, requestedPackage, userId, callingPackage);
} break;
+ case VR_MODE_APPLY_IF_NEEDED_MSG: {
+ final ActivityRecord r = (ActivityRecord) msg.obj;
+ final boolean needsVrMode = r != null && r.requestedVrComponent != null;
+ if (needsVrMode) {
+ applyVrMode(msg.arg1 == 1, r.requestedVrComponent, r.userId,
+ r.info.getComponentName(), false);
+ }
+ } break;
case HANDLE_TRUST_STORAGE_UPDATE_MSG: {
synchronized (ActivityManagerService.this) {
for (int i = mLruProcesses.size() - 1 ; i >= 0 ; i--) {
@@ -3071,12 +3071,20 @@
mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r));
}
- private void notifyVrManagerOfSleepState(boolean isSleeping) {
- final VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
- if (vrService == null) {
- return;
+ void applyVrModeIfNeededLocked(ActivityRecord r, boolean enable) {
+ mHandler.sendMessage(
+ mHandler.obtainMessage(VR_MODE_APPLY_IF_NEEDED_MSG, enable ? 1 : 0, 0, r));
+ }
+
+ private void applyVrMode(boolean enabled, ComponentName packageName, int userId,
+ ComponentName callingPackage, boolean immediate) {
+ VrManagerInternal vrService =
+ LocalServices.getService(VrManagerInternal.class);
+ if (immediate) {
+ vrService.setVrModeImmediate(enabled, packageName, userId, callingPackage);
+ } else {
+ vrService.setVrMode(enabled, packageName, userId, callingPackage);
}
- vrService.onSleepStateChanged(isSleeping);
}
final void showAskCompatModeDialogLocked(ActivityRecord r) {
@@ -11685,7 +11693,6 @@
startTimeTrackingFocusedActivityLocked();
mTopProcessState = ActivityManager.PROCESS_STATE_TOP;
mStackSupervisor.comeOutOfSleepIfNeededLocked();
- notifyVrManagerOfSleepState(false);
updateOomAdjLocked();
} else if (!mSleeping && shouldSleepLocked()) {
mSleeping = true;
@@ -11694,7 +11701,6 @@
}
mTopProcessState = ActivityManager.PROCESS_STATE_TOP_SLEEPING;
mStackSupervisor.goingToSleepLocked();
- notifyVrManagerOfSleepState(true);
updateOomAdjLocked();
// Initialize the wake times of all processes.
@@ -22231,6 +22237,22 @@
public SleepToken acquireSleepToken(String tag) {
Preconditions.checkNotNull(tag);
+ ComponentName requestedVrService = null;
+ ComponentName callingVrActivity = null;
+ int userId = -1;
+ synchronized (ActivityManagerService.this) {
+ final ActivityRecord resumedActivity = mStackSupervisor.getResumedActivityLocked();
+ if (resumedActivity != null) {
+ requestedVrService = resumedActivity.requestedVrComponent;
+ callingVrActivity = resumedActivity.info.getComponentName();
+ userId = resumedActivity.userId;
+ }
+ }
+
+ if (requestedVrService != null) {
+ applyVrMode(false, requestedVrService, userId, callingVrActivity, true);
+ }
+
synchronized (ActivityManagerService.this) {
SleepTokenImpl token = new SleepTokenImpl(tag);
mSleepTokens.add(token);
diff --git a/services/core/java/com/android/server/am/KeyguardController.java b/services/core/java/com/android/server/am/KeyguardController.java
index cfe2eb0..19bf536 100644
--- a/services/core/java/com/android/server/am/KeyguardController.java
+++ b/services/core/java/com/android/server/am/KeyguardController.java
@@ -121,6 +121,8 @@
// Some stack visibility might change (e.g. docked stack)
mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
mWindowManager.executeAppTransition();
+ mService.applyVrModeIfNeededLocked(mStackSupervisor.getResumedActivityLocked(),
+ true /* enable */);
} finally {
mWindowManager.continueSurfaceLayout();
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 9d4b51f..65fbc55 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -229,7 +229,6 @@
import com.android.server.policy.keyguard.KeyguardStateMonitor.StateCallback;
import com.android.server.statusbar.StatusBarManagerInternal;
import com.android.server.wm.AppTransition;
-import com.android.server.vr.VrManagerInternal;
import java.io.File;
import java.io.FileReader;
@@ -6456,7 +6455,6 @@
mKeyguardDelegate.onScreenTurnedOff();
}
}
- reportScreenStateToVrManager(false);
}
// Called on the DisplayManager's DisplayPowerController thread.
@@ -6492,15 +6490,6 @@
mKeyguardDelegate.onScreenTurnedOn();
}
}
- reportScreenStateToVrManager(true);
- }
-
- private void reportScreenStateToVrManager(boolean isScreenOn) {
- VrManagerInternal vrService = LocalServices.getService(VrManagerInternal.class);
- if (vrService == null) {
- return;
- }
- vrService.onScreenStateChanged(isScreenOn);
}
private void finishWindowsDrawn() {
diff --git a/services/core/java/com/android/server/vr/VrManagerInternal.java b/services/core/java/com/android/server/vr/VrManagerInternal.java
index 0fc1900..ad87a88 100644
--- a/services/core/java/com/android/server/vr/VrManagerInternal.java
+++ b/services/core/java/com/android/server/vr/VrManagerInternal.java
@@ -56,27 +56,25 @@
int userId, @NonNull ComponentName calling);
/**
- * Set whether the system has acquired a sleep token.
+ * Set the current VR mode state immediately.
*
- * @param isAsleep is {@code true} if the device is asleep, or {@code false} otherwise.
+ * @param enabled {@code true} to enable VR mode.
+ * @param packageName The package name of the requested VrListenerService to bind.
+ * @param userId the user requesting the VrListenerService component.
+ * @param calling the component currently using VR mode, or null to leave unchanged.
*/
- public abstract void onSleepStateChanged(boolean isAsleep);
+ public abstract void setVrModeImmediate(boolean enabled, @NonNull ComponentName packageName,
+ int userId, @NonNull ComponentName calling);
- /**
- * Set whether the display used for VR output is on.
- *
- * @param isScreenOn is {@code true} if the display is on and can receive commands,
- * or {@code false} otherwise.
- */
- public abstract void onScreenStateChanged(boolean isScreenOn);
- /**
- * Return NO_ERROR if the given package is installed on the device and enabled as a
- * VrListenerService for the given current user, or a negative error code indicating a failure.
- *
- * @param packageName the name of the package to check, or null to select the default package.
- * @return NO_ERROR if the given package is installed and is enabled, or a negative error code
- * given in {@link android.service.vr.VrModeException} on failure.
- */
+ /**
+ * Return NO_ERROR if the given package is installed on the device and enabled as a
+ * VrListenerService for the given current user, or a negative error code indicating a failure.
+ *
+ * @param packageName the name of the package to check, or null to select the default package.
+ * @return NO_ERROR if the given package is installed and is enabled, or a negative error code
+ * given in {@link android.service.vr.VrModeException} on failure.
+ */
public abstract int hasVrPackage(@NonNull ComponentName packageName, int userId);
+
}
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index 1083e0a..10a0f6f 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -101,14 +101,6 @@
private static final int PENDING_STATE_DELAY_MS = 300;
private static final int EVENT_LOG_SIZE = 32;
private static final int INVALID_APPOPS_MODE = -1;
- /** Null set of sleep sleep flags. */
- private static final int FLAG_NONE = 0;
- /** Flag set when the device is not sleeping. */
- private static final int FLAG_AWAKE = 1;
- /** Flag set when the screen has been turned on. */
- private static final int FLAG_SCREEN_ON = 2;
- /** Flag indicating that all system sleep flags have been set.*/
- private static final int FLAG_ALL = FLAG_AWAKE | FLAG_SCREEN_ON;
private static native void initializeNative();
private static native void setVrModeNative(boolean enabled);
@@ -118,7 +110,6 @@
private final IBinder mOverlayToken = new Binder();
// State protected by mLock
- private boolean mVrModeAllowed;
private boolean mVrModeEnabled;
private EnabledComponentsObserver mComponentObserver;
private ManagedApplicationService mCurrentVrService;
@@ -134,64 +125,10 @@
private VrState mPendingState;
private final ArrayDeque<VrState> mLoggingDeque = new ArrayDeque<>(EVENT_LOG_SIZE);
private final NotificationAccessManager mNotifAccessManager = new NotificationAccessManager();
- /** Tracks the state of the screen and keyguard UI.*/
- private int mSystemSleepFlags = FLAG_NONE;
private static final int MSG_VR_STATE_CHANGE = 0;
private static final int MSG_PENDING_VR_STATE_CHANGE = 1;
- /**
- * Set whether VR mode may be enabled.
- * <p/>
- * If VR mode is not allowed to be enabled, calls to set VR mode will be cached. When VR mode
- * is again allowed to be enabled, the most recent cached state will be applied.
- *
- * @param allowed {@code true} if calling any of the setVrMode methods may cause the device to
- * enter VR mode.
- */
- private void setVrModeAllowedLocked(boolean allowed) {
- if (mVrModeAllowed != allowed) {
- mVrModeAllowed = allowed;
- Slog.i(TAG, "VR mode is " + ((allowed) ? "allowed" : "disallowed"));
- if (mVrModeAllowed) {
- consumeAndApplyPendingStateLocked();
- } else {
- // Set pending state to current state.
- mPendingState = (mVrModeEnabled && mCurrentVrService != null)
- ? new VrState(mVrModeEnabled, mCurrentVrService.getComponent(),
- mCurrentVrService.getUserId(), mCurrentVrModeComponent)
- : null;
-
- // Unbind current VR service and do necessary callbacks.
- updateCurrentVrServiceLocked(false, null, 0, null);
- }
- }
- }
-
- private void setSleepState(boolean isAsleep) {
- synchronized(mLock) {
-
- if (!isAsleep) {
- mSystemSleepFlags |= FLAG_AWAKE;
- } else {
- mSystemSleepFlags &= ~FLAG_AWAKE;
- }
-
- setVrModeAllowedLocked(mSystemSleepFlags == FLAG_ALL);
- }
- }
-
- private void setScreenOn(boolean isScreenOn) {
- synchronized(mLock) {
- if (isScreenOn) {
- mSystemSleepFlags |= FLAG_SCREEN_ON;
- } else {
- mSystemSleepFlags &= ~FLAG_SCREEN_ON;
- }
- setVrModeAllowedLocked(mSystemSleepFlags == FLAG_ALL);
- }
- }
-
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
@@ -211,9 +148,7 @@
} break;
case MSG_PENDING_VR_STATE_CHANGE : {
synchronized(mLock) {
- if (mVrModeAllowed) {
- VrManagerService.this.consumeAndApplyPendingStateLocked();
- }
+ VrManagerService.this.consumeAndApplyPendingStateLocked();
}
} break;
default :
@@ -333,8 +268,8 @@
}
mNotifAccessManager.update(enabledPackages);
- if (!mVrModeAllowed) {
- return; // Don't do anything, we shouldn't be in VR mode.
+ if (mCurrentVrService == null) {
+ return; // No active services
}
// If there is a pending state change, we'd better deal with that first
@@ -386,7 +321,6 @@
return;
}
pw.println("********* Dump of VrManagerService *********");
- pw.println("VR mode is currently: " + ((mVrModeAllowed) ? "allowed" : "disallowed"));
pw.println("Previous state transitions:\n");
String tab = " ";
dumpStateTransitions(pw);
@@ -440,17 +374,13 @@
@Override
public void setVrMode(boolean enabled, ComponentName packageName, int userId,
ComponentName callingPackage) {
- VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage);
+ VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage, false);
}
@Override
- public void onSleepStateChanged(boolean isAsleep) {
- VrManagerService.this.setSleepState(isAsleep);
- }
-
- @Override
- public void onScreenStateChanged(boolean isScreenOn) {
- VrManagerService.this.setScreenOn(isScreenOn);
+ public void setVrModeImmediate(boolean enabled, ComponentName packageName, int userId,
+ ComponentName callingPackage) {
+ VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage, true);
}
@Override
@@ -494,10 +424,6 @@
mComponentObserver.rebuildAll();
}
- } else if (phase == SystemService.PHASE_THIRD_PARTY_APPS_CAN_START) {
- synchronized (mLock) {
- mVrModeAllowed = true;
- }
}
}
@@ -540,16 +466,12 @@
false, mOverlayToken, null, oldUserId);
}
- if (!mVrModeEnabled) {
- return;
- }
-
// Apply the restrictions for the current user based on vr state
String[] exemptions = (exemptedPackage == null) ? new String[0] :
new String[] { exemptedPackage };
appOpsManager.setUserRestrictionForUser(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,
- true, mOverlayToken, exemptions, newUserId);
+ mVrModeEnabled, mOverlayToken, exemptions, newUserId);
}
private void updateDependentAppOpsLocked(String newVrServicePackage, int newUserId,
@@ -590,8 +512,7 @@
boolean validUserComponent = (mComponentObserver.isValid(component, userId) ==
EnabledComponentsObserver.NO_ERROR);
- boolean goingIntoVrMode = validUserComponent && enabled;
- if (!mVrModeEnabled && !goingIntoVrMode) {
+ if (!mVrModeEnabled && !enabled) {
return validUserComponent; // Disabled -> Disabled transition does nothing.
}
@@ -599,37 +520,29 @@
? mCurrentVrService.getComponent().getPackageName() : null;
final int oldUserId = mCurrentVrModeUser;
- // Notify system services and VR HAL of mode change.
- changeVrModeLocked(goingIntoVrMode);
+ // Always send mode change events.
+ changeVrModeLocked(enabled);
- boolean nothingChanged = false;
- if (!goingIntoVrMode) {
- // Not going into VR mode, unbind whatever is running
+ if (!enabled || !validUserComponent) {
+ // Unbind whatever is running
if (mCurrentVrService != null) {
Slog.i(TAG, "Disconnecting " + mCurrentVrService.getComponent() + " for user " +
mCurrentVrService.getUserId());
mCurrentVrService.disconnect();
mCurrentVrService = null;
- } else {
- nothingChanged = true;
}
} else {
- // Going into VR mode
if (mCurrentVrService != null) {
- // Unbind any running service that doesn't match the latest component/user
- // selection.
+ // Unbind any running service that doesn't match the component/user selection
if (mCurrentVrService.disconnectIfNotMatching(component, userId)) {
Slog.i(TAG, "Disconnecting " + mCurrentVrService.getComponent() +
" for user " + mCurrentVrService.getUserId());
createAndConnectService(component, userId);
sendUpdatedCaller = true;
- } else {
- nothingChanged = true;
}
- // The service with the correct component/user is already bound, do nothing.
+ // The service with the correct component/user is bound
} else {
- // Nothing was previously running, bind a new service for the latest
- // component/user selection.
+ // Nothing was previously running, bind a new service
createAndConnectService(component, userId);
sendUpdatedCaller = true;
}
@@ -664,10 +577,7 @@
}
});
}
-
- if (!nothingChanged) {
- logStateLocked();
- }
+ logStateLocked();
return validUserComponent;
} finally {
@@ -874,10 +784,7 @@
mPendingState.targetPackageName, mPendingState.userId,
mPendingState.callingPackage);
mPendingState = null;
- } else {
- updateCurrentVrServiceLocked(false, null, 0, null);
}
-
}
private void logStateLocked() {
@@ -927,20 +834,13 @@
/*
* Implementation of VrManagerInternal calls. These are callable from system services.
*/
+
private void setVrMode(boolean enabled, @NonNull ComponentName targetPackageName,
- int userId, @NonNull ComponentName callingPackage) {
+ int userId, @NonNull ComponentName callingPackage, boolean immediate) {
synchronized (mLock) {
- VrState pending = new VrState(enabled, targetPackageName, userId, callingPackage);
- if (!mVrModeAllowed) {
- // We're not allowed to be in VR mode. Make this state pending. This will be
- // applied the next time we are allowed to enter VR mode unless it is superseded by
- // another call.
- mPendingState = pending;
- return;
- }
- if (!enabled && mCurrentVrService != null) {
+ if (!enabled && mCurrentVrService != null && !immediate) {
// If we're transitioning out of VR mode, delay briefly to avoid expensive HAL calls
// and service bind/unbind in case we are immediately switching to another VR app.
if (mPendingState == null) {
@@ -948,7 +848,7 @@
PENDING_STATE_DELAY_MS);
}
- mPendingState = pending;
+ mPendingState = new VrState(enabled, targetPackageName, userId, callingPackage);
return;
} else {
mHandler.removeMessages(MSG_PENDING_VR_STATE_CHANGE);