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
This commit is contained in:
Dan Sandler
2016-04-13 13:22:44 -04:00
parent a6dea121e8
commit 3166593f4e

View 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) {