OSDN Git Service

Fix VR mode handling when the screen blanks and unblanks.
authorCraig Donner <cdonner@google.com>
Wed, 13 Apr 2016 17:19:04 +0000 (10:19 -0700)
committerCraig Donner <cdonner@google.com>
Fri, 15 Apr 2016 05:18:20 +0000 (22:18 -0700)
When blanking the screen, turn off VR mode if it's enabled, and when waking up
after the keyboard goes away, turn it on if the top activity has requested VR
mode.

Bug: 26751056
Change-Id: Ib57b1c59e083e3615a02408d922c8c7be645ce92

services/core/java/com/android/server/am/ActivityManagerService.java

index 3ec51e3..bf1cb79 100644 (file)
@@ -1468,6 +1468,7 @@ public final class ActivityManagerService extends ActivityManagerNative
     static final int NOTIFY_PINNED_STACK_ANIMATION_ENDED_LISTENERS_MSG = 66;
     static final int NOTIFY_FORCED_RESIZABLE_MSG = 67;
     static final int NOTIFY_ACTIVITY_DISMISSING_DOCKED_STACK_MSG = 68;
+    static final int VR_MODE_APPLY_IF_NEEDED_MSG = 69;
 
     static final int FIRST_ACTIVITY_STACK_MSG = 100;
     static final int FIRST_BROADCAST_QUEUE_MSG = 200;
@@ -2238,6 +2239,17 @@ public final class ActivityManagerService extends ActivityManagerNative
                 }
                 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) {
+                    VrManagerInternal vrService =
+                            LocalServices.getService(VrManagerInternal.class);
+                    boolean enable = msg.arg1 == 1;
+                    vrService.setVrMode(enable, r.requestedVrComponent, r.userId,
+                            r.info.getComponentName());
+                }
+            } break;
             }
         }
     };
@@ -3018,6 +3030,11 @@ public final class ActivityManagerService extends ActivityManagerNative
                 mHandler.obtainMessage(VR_MODE_CHANGE_MSG, 0, 0, r));
     }
 
+    private void applyVrModeIfNeededLocked(ActivityRecord r, boolean enable) {
+        mHandler.sendMessage(
+                mHandler.obtainMessage(VR_MODE_APPLY_IF_NEEDED_MSG, enable ? 1 : 0, 0, r));
+    }
+
     final void showAskCompatModeDialogLocked(ActivityRecord r) {
         Message msg = Message.obtain();
         msg.what = SHOW_COMPAT_MODE_DIALOG_UI_MSG;
@@ -6534,6 +6551,7 @@ public final class ActivityManagerService extends ActivityManagerNative
 
                     // Some stack visibility might change (e.g. docked stack)
                     mStackSupervisor.ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);
+                    applyVrModeIfNeededLocked(mFocusedActivity, true);
                 }
             }
         } finally {
@@ -20905,6 +20923,7 @@ public final class ActivityManagerService extends ActivityManagerNative
                 SleepTokenImpl token = new SleepTokenImpl(tag);
                 mSleepTokens.add(token);
                 updateSleepIfNeededLocked();
+                applyVrModeIfNeededLocked(mFocusedActivity, false);
                 return token;
             }
         }