diff options
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) { |