From 3166593f4e8e7ccfdecfca010fd8d22b5e219487 Mon Sep 17 00:00:00 2001 From: Dan Sandler Date: Wed, 13 Apr 2016 13:22:44 -0400 Subject: [PATCH] Fix NPE when the vr manager isn't around at first. 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 --- .../policy/ImmersiveModeConfirmation.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index 27077f2f74f75..553c5de76cbac 100644 --- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -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) {