summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java34
-rw-r--r--services/core/java/com/android/server/vr/VrManagerInternal.java15
-rw-r--r--services/core/java/com/android/server/vr/VrManagerService.java12
3 files changed, 52 insertions, 9 deletions
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index 63f122b4523c..2c7ef7e5eab7 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -2292,11 +2292,8 @@ public final class ActivityManagerService extends ActivityManagerNative
final ActivityRecord r = (ActivityRecord) msg.obj;
final boolean needsVrMode = r != null && r.requestedVrComponent != null;
if (needsVrMode) {
- VrManagerInternal vrService =
- LocalServices.getService(VrManagerInternal.class);
- boolean enable = msg.arg1 == 1;
- vrService.setVrMode(enable, r.requestedVrComponent, r.userId,
- r.info.getComponentName());
+ applyVrMode(msg.arg1 == 1, r.requestedVrComponent, r.userId,
+ r.info.getComponentName(), false);
}
} break;
}
@@ -3084,6 +3081,17 @@ public final class ActivityManagerService extends ActivityManagerNative
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);
+ }
+ }
+
final void showAskCompatModeDialogLocked(ActivityRecord r) {
Message msg = Message.obtain();
msg.what = SHOW_COMPAT_MODE_DIALOG_UI_MSG;
@@ -21420,11 +21428,25 @@ public final class ActivityManagerService extends ActivityManagerNative
public SleepToken acquireSleepToken(String tag) {
Preconditions.checkNotNull(tag);
+ ComponentName requestedVrService = null;
+ ComponentName callingVrActivity = null;
+ int userId = -1;
+ synchronized (ActivityManagerService.this) {
+ if (mFocusedActivity != null) {
+ requestedVrService = mFocusedActivity.requestedVrComponent;
+ callingVrActivity = mFocusedActivity.info.getComponentName();
+ userId = mFocusedActivity.userId;
+ }
+ }
+
+ if (requestedVrService != null) {
+ applyVrMode(false, requestedVrService, userId, callingVrActivity, true);
+ }
+
synchronized (ActivityManagerService.this) {
SleepTokenImpl token = new SleepTokenImpl(tag);
mSleepTokens.add(token);
updateSleepIfNeededLocked();
- applyVrModeIfNeededLocked(mFocusedActivity, false);
return token;
}
}
diff --git a/services/core/java/com/android/server/vr/VrManagerInternal.java b/services/core/java/com/android/server/vr/VrManagerInternal.java
index 1bbb9f52c818..ad87a885348e 100644
--- a/services/core/java/com/android/server/vr/VrManagerInternal.java
+++ b/services/core/java/com/android/server/vr/VrManagerInternal.java
@@ -43,6 +43,9 @@ public abstract class VrManagerInternal {
/**
* Set the current VR mode state.
+ * <p/>
+ * This may delay the mode change slightly during application transitions to avoid frequently
+ * tearing down VrListenerServices unless necessary.
*
* @param enabled {@code true} to enable VR mode.
* @param packageName The package name of the requested VrListenerService to bind.
@@ -52,6 +55,18 @@ public abstract class VrManagerInternal {
public abstract void setVrMode(boolean enabled, @NonNull ComponentName packageName,
int userId, @NonNull ComponentName calling);
+ /**
+ * Set the current VR mode state immediately.
+ *
+ * @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 setVrModeImmediate(boolean enabled, @NonNull ComponentName packageName,
+ int userId, @NonNull ComponentName calling);
+
+
/**
* 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.
diff --git a/services/core/java/com/android/server/vr/VrManagerService.java b/services/core/java/com/android/server/vr/VrManagerService.java
index b4c4bd8daa76..2ac7e08f1ca2 100644
--- a/services/core/java/com/android/server/vr/VrManagerService.java
+++ b/services/core/java/com/android/server/vr/VrManagerService.java
@@ -373,7 +373,13 @@ public class VrManagerService extends SystemService implements EnabledComponentC
@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 setVrModeImmediate(boolean enabled, ComponentName packageName, int userId,
+ ComponentName callingPackage) {
+ VrManagerService.this.setVrMode(enabled, packageName, userId, callingPackage, true);
}
@Override
@@ -916,11 +922,11 @@ public class VrManagerService extends SystemService implements EnabledComponentC
*/
private void setVrMode(boolean enabled, @NonNull ComponentName targetPackageName,
- int userId, @NonNull ComponentName callingPackage) {
+ int userId, @NonNull ComponentName callingPackage, boolean immediate) {
synchronized (mLock) {
- 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) {