Merge "Fix deadlock between VrManager, ActivityManager and WindowManager" into nyc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
1d66995f47
@@ -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;
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user