OSDN Git Service

Fix NPE when the vr manager isn't around at first.
authorDan Sandler <dsandler@android.com>
Wed, 13 Apr 2016 17:22:44 +0000 (13:22 -0400)
committerDan Sandler <dsandler@android.com>
Wed, 13 Apr 2016 17:32:11 +0000 (13:32 -0400)
There's a race condition when grabbing the VR service during
ImmersiveModeConfirmation's constructor since the window
manager allocates the ImmersiveModeConfirmation in its own
init(); vr may still be starting up at that time.

Change-Id: Ic0aa0fbf8fd087f01f4690c14e1c68f0670b0bc0
Fixes: 28159168

services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java

index 27077f2..553c5de 100644 (file)
@@ -80,8 +80,6 @@ public class ImmersiveModeConfirmation {
                 .getInteger(R.integer.config_immersive_mode_confirmation_panic);
         mWindowManager = (WindowManager)
                 mContext.getSystemService(Context.WINDOW_SERVICE);
-        mVrManager = (IVrManager) IVrManager.Stub.asInterface(
-                ServiceManager.getService(VrManagerService.VR_MANAGER_BINDER_SERVICE));
     }
 
     private long getNavBarExitDuration() {
@@ -121,11 +119,18 @@ public class ImmersiveModeConfirmation {
 
     private boolean getVrMode() {
         boolean vrMode = false;
-        try {
-            vrMode = mVrManager.getVrModeState();
-        } catch (RemoteException ex) { }
+        if (mVrManager == null) {
+            // lazily grab this service since it may not be available at construction time
+            mVrManager = (IVrManager) IVrManager.Stub.asInterface(
+                ServiceManager.getService(VrManagerService.VR_MANAGER_BINDER_SERVICE));
+        }
+        if (mVrManager != null) {
+            try {
+                vrMode = mVrManager.getVrModeState();
+            } catch (RemoteException ex) { }
+        }
         return vrMode;
-    }        
+    }
 
     public void immersiveModeChanged(String pkg, boolean isImmersiveMode,
             boolean userSetupComplete) {