diff options
| author | 2016-04-25 21:37:16 +0000 | |
|---|---|---|
| committer | 2016-04-25 21:37:17 +0000 | |
| commit | 1d66995f47d548efe7863e88a8cc7bd2c66661a0 (patch) | |
| tree | 2bddbbccf326f6dd53919afb4c582087ea26f6de | |
| parent | 98afb342df74a657e69a478b5ace19450b579660 (diff) | |
| parent | 02a0381e516f1782ff5a2170ed3b3e1bda7284fe (diff) | |
Merge "Fix deadlock between VrManager, ActivityManager and WindowManager" into nyc-dev
| -rw-r--r-- | services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java | 33 | ||||
| -rw-r--r-- | services/core/java/com/android/server/policy/PhoneWindowManager.java | 3 |
2 files changed, 22 insertions, 14 deletions
diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java index 553c5de76cba..29b9b92e8183 100644 --- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java +++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java @@ -32,6 +32,7 @@ import android.os.ServiceManager; import android.os.UserHandle; import android.provider.Settings; import android.service.vr.IVrManager; +import android.service.vr.IVrStateCallbacks; import android.util.DisplayMetrics; import android.util.Slog; import android.util.SparseBooleanArray; @@ -70,7 +71,9 @@ public class ImmersiveModeConfirmation { private long mPanicTime; private WindowManager mWindowManager; private int mCurrentUserId; - private IVrManager mVrManager; + // Local copy of vr mode enabled state, to avoid calling into VrManager with + // the lock held. + boolean mVrModeEnabled = false; public ImmersiveModeConfirmation(Context context) { mContext = context; @@ -117,22 +120,19 @@ public class ImmersiveModeConfirmation { } } - private boolean getVrMode() { - boolean vrMode = false; - if (mVrManager == null) { - // lazily grab this service since it may not be available at construction time - mVrManager = (IVrManager) IVrManager.Stub.asInterface( + void systemReady() { + IVrManager vrManager = IVrManager.Stub.asInterface( ServiceManager.getService(VrManagerService.VR_MANAGER_BINDER_SERVICE)); - } - if (mVrManager != null) { + if (vrManager != null) { try { - vrMode = mVrManager.getVrModeState(); - } catch (RemoteException ex) { } + vrManager.registerListener(mVrStateCallbacks); + mVrModeEnabled = vrManager.getVrModeState(); + } catch (RemoteException re) { + } } - return vrMode; } - public void immersiveModeChanged(String pkg, boolean isImmersiveMode, + public void immersiveModeChangedLw(String pkg, boolean isImmersiveMode, boolean userSetupComplete) { mHandler.removeMessages(H.SHOW); if (isImmersiveMode) { @@ -142,7 +142,7 @@ public class ImmersiveModeConfirmation { if (!disabled && (DEBUG_SHOW_EVERY_TIME || !mConfirmed) && userSetupComplete - && !getVrMode()) { + && !mVrModeEnabled) { mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs); } } else { @@ -375,4 +375,11 @@ public class ImmersiveModeConfirmation { } } } + + private final IVrStateCallbacks mVrStateCallbacks = new IVrStateCallbacks.Stub() { + @Override + public void onVrStateChanged(boolean enabled) throws RemoteException { + mVrModeEnabled = enabled; + } + }; } diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java index 9f31f4fb3f59..4e4b2f3b07c5 100644 --- a/services/core/java/com/android/server/policy/PhoneWindowManager.java +++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java @@ -6653,6 +6653,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { mKeyguardDelegate.onBootCompleted(); } mSystemGestures.systemReady(); + mImmersiveModeConfirmation.systemReady(); } /** {@inheritDoc} */ @@ -7357,7 +7358,7 @@ public class PhoneWindowManager implements WindowManagerPolicy { boolean newImmersiveMode = isImmersiveMode(vis); if (win != null && oldImmersiveMode != newImmersiveMode) { final String pkg = win.getOwningPackage(); - mImmersiveModeConfirmation.immersiveModeChanged(pkg, newImmersiveMode, + mImmersiveModeConfirmation.immersiveModeChangedLw(pkg, newImmersiveMode, isUserSetupComplete()); } |