Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 14d6e5fd authored by Amith Yamasani's avatar Amith Yamasani Committed by android-build-merger
Browse files

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

am: 1d66995f

* commit '1d66995f':
  Fix deadlock between VrManager, ActivityManager and WindowManager

Change-Id: I26ea57a0a49e78e063117f71b0f6fede8b413e7c
parents 86461e69 1d66995f
Loading
Loading
Loading
Loading
+20 −13
Original line number Diff line number Diff line
@@ -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;
        }
    };
}
+2 −1
Original line number Diff line number Diff line
@@ -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());
        }