Merge "Fix deadlock between VrManager, ActivityManager and WindowManager" into nyc-dev

This commit is contained in:
Amith Yamasani
2016-04-25 21:37:16 +00:00
committed by Android (Google) Code Review
2 changed files with 22 additions and 14 deletions

View File

@@ -32,6 +32,7 @@ import android.os.ServiceManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.provider.Settings; import android.provider.Settings;
import android.service.vr.IVrManager; import android.service.vr.IVrManager;
import android.service.vr.IVrStateCallbacks;
import android.util.DisplayMetrics; import android.util.DisplayMetrics;
import android.util.Slog; import android.util.Slog;
import android.util.SparseBooleanArray; import android.util.SparseBooleanArray;
@@ -70,7 +71,9 @@ public class ImmersiveModeConfirmation {
private long mPanicTime; private long mPanicTime;
private WindowManager mWindowManager; private WindowManager mWindowManager;
private int mCurrentUserId; 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) { public ImmersiveModeConfirmation(Context context) {
mContext = context; mContext = context;
@@ -117,22 +120,19 @@ public class ImmersiveModeConfirmation {
} }
} }
private boolean getVrMode() { void systemReady() {
boolean vrMode = false; IVrManager vrManager = IVrManager.Stub.asInterface(
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)); ServiceManager.getService(VrManagerService.VR_MANAGER_BINDER_SERVICE));
} if (vrManager != null) {
if (mVrManager != null) {
try { try {
vrMode = mVrManager.getVrModeState(); vrManager.registerListener(mVrStateCallbacks);
} catch (RemoteException ex) { } mVrModeEnabled = vrManager.getVrModeState();
} catch (RemoteException re) {
}
} }
return vrMode;
} }
public void immersiveModeChanged(String pkg, boolean isImmersiveMode, public void immersiveModeChangedLw(String pkg, boolean isImmersiveMode,
boolean userSetupComplete) { boolean userSetupComplete) {
mHandler.removeMessages(H.SHOW); mHandler.removeMessages(H.SHOW);
if (isImmersiveMode) { if (isImmersiveMode) {
@@ -142,7 +142,7 @@ public class ImmersiveModeConfirmation {
if (!disabled if (!disabled
&& (DEBUG_SHOW_EVERY_TIME || !mConfirmed) && (DEBUG_SHOW_EVERY_TIME || !mConfirmed)
&& userSetupComplete && userSetupComplete
&& !getVrMode()) { && !mVrModeEnabled) {
mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs); mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs);
} }
} else { } 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;
}
};
} }

View File

@@ -6653,6 +6653,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mKeyguardDelegate.onBootCompleted(); mKeyguardDelegate.onBootCompleted();
} }
mSystemGestures.systemReady(); mSystemGestures.systemReady();
mImmersiveModeConfirmation.systemReady();
} }
/** {@inheritDoc} */ /** {@inheritDoc} */
@@ -7357,7 +7358,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
boolean newImmersiveMode = isImmersiveMode(vis); boolean newImmersiveMode = isImmersiveMode(vis);
if (win != null && oldImmersiveMode != newImmersiveMode) { if (win != null && oldImmersiveMode != newImmersiveMode) {
final String pkg = win.getOwningPackage(); final String pkg = win.getOwningPackage();
mImmersiveModeConfirmation.immersiveModeChanged(pkg, newImmersiveMode, mImmersiveModeConfirmation.immersiveModeChangedLw(pkg, newImmersiveMode,
isUserSetupComplete()); isUserSetupComplete());
} }