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

Commit 8abed643 authored by Miranda Kephart's avatar Miranda Kephart Committed by Anis Assi
Browse files

[DO NOT MERGE] Close screenshot process on user switched

Currently, we keep the process up even if the user switches,
meaning that in some cases (if the user is switched while the
screenshot UI is up) we will save images to the wrong profile.
This change makes ScreenshotHelper listen for user switches and
close the screenshot service, so that a new screenshot is
guaranteed to be constructed with the correct user's context.

Bug: 170474245
Fix: 170474245
Test: manual -- verified bad state occurs if user switches within
the timeout period, ensured that screenshots work immediately
after switching with this change.

Change-Id: I9d32d0928e6c2bda161d04555438d0dd7afef0ba
(cherry picked from commit 7ef1a5dd)
(cherry picked from commit 8a2656d4)
parent 7d142d2a
Loading
Loading
Loading
Loading
+19 −6
Original line number Diff line number Diff line
@@ -5837,8 +5837,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        @Override public void run() {
            synchronized (mScreenshotLock) {
                if (mScreenshotConnection != null) {
                    mContext.unbindService(mScreenshotConnection);
                    mScreenshotConnection = null;
                    resetScreenshotConnection();
                    notifyScreenshotError();
                }
            }
@@ -5870,8 +5869,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                            public void handleMessage(Message msg) {
                                synchronized (mScreenshotLock) {
                                    if (mScreenshotConnection == myConn) {
                                        mContext.unbindService(mScreenshotConnection);
                                        mScreenshotConnection = null;
                                        resetScreenshotConnection();
                                        mHandler.removeCallbacks(mScreenshotTimeout);
                                    }
                                }
@@ -5894,8 +5892,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                public void onServiceDisconnected(ComponentName name) {
                    synchronized (mScreenshotLock) {
                        if (mScreenshotConnection != null) {
                            mContext.unbindService(mScreenshotConnection);
                            mScreenshotConnection = null;
                            resetScreenshotConnection();
                            mHandler.removeCallbacks(mScreenshotTimeout);
                            notifyScreenshotError();
                        }
@@ -5925,6 +5922,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mContext.sendBroadcastAsUser(errorIntent, UserHandle.CURRENT);
    }

    /**
     * Reset the screenshot connection.
     */
    private void resetScreenshotConnection() {
        if (mScreenshotConnection != null) {
            mContext.unbindService(mScreenshotConnection);
            mScreenshotConnection = null;
        }
    }

    /** {@inheritDoc} */
    @Override
    public int interceptKeyBeforeQueueing(KeyEvent event, int policyFlags) {
@@ -6605,6 +6612,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    mLastSystemUiFlags = 0;
                    updateSystemUiVisibilityLw();
                }

                // close the screenshot connection on user switch so that screenshots
                // are always started with the correct user's context
                synchronized(mScreenshotLock) {
                  resetScreenshotConnection();
                }
            }
        }
    };