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

Commit 1d66995f authored by Amith Yamasani's avatar Amith Yamasani Committed by Android (Google) Code Review
Browse files

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

parents 98afb342 02a0381e
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());
        }