Merge "Fix deadlock between VrManager, ActivityManager and WindowManager" into nyc-dev
am: 1d66995
* commit '1d66995f47d548efe7863e88a8cc7bd2c66661a0':
Fix deadlock between VrManager, ActivityManager and WindowManager
Change-Id: I26ea57a0a49e78e063117f71b0f6fede8b413e7c
This commit is contained in:
@@ -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;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user