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

Commit c0e3f245 authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issue #5186318: Can't take multiple screenshots

Locking good.  Races bad.

Change-Id: I59dd0ec2de47973c38fd646c2f441dd174eba444
parent b9784398
Loading
Loading
Loading
Loading
+48 −39
Original line number Diff line number Diff line
@@ -2398,10 +2398,11 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        }
    }

    final Object mScreenshotLock = new Object();
    ServiceConnection mScreenshotConnection = null;
    Runnable mScreenshotTimeout = null;

    void finishScreenshot(ServiceConnection conn) {
    void finishScreenshotLSS(ServiceConnection conn) {
        if (mScreenshotConnection == conn) {
            mContext.unbindService(conn);
            mScreenshotConnection = null;
@@ -2416,6 +2417,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
        mHandler.post(new Runnable() {
            @Override
            public void run() {
                synchronized (mScreenshotLock) {
                    if (mScreenshotConnection != null) {
                        return;
                    }
@@ -2426,6 +2428,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                    ServiceConnection conn = new ServiceConnection() {
                        @Override
                        public void onServiceConnected(ComponentName name, IBinder service) {
                            synchronized (mScreenshotLock) {
                                if (mScreenshotConnection != this) {
                                    return;
                                }
@@ -2435,7 +2438,9 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                                Handler h = new Handler(mHandler.getLooper()) {
                                    @Override
                                    public void handleMessage(Message msg) {
                                finishScreenshot(myConn);
                                        synchronized (mScreenshotLock) {
                                            finishScreenshotLSS(myConn);
                                        }
                                    }
                                };
                                msg.replyTo = new Messenger(h);
@@ -2444,6 +2449,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                                } catch (RemoteException e) {
                                }
                            }
                        }
                        @Override
                        public void onServiceDisconnected(ComponentName name) {}
                    };
@@ -2451,8 +2457,10 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                        mScreenshotConnection = conn;
                        mScreenshotTimeout = new Runnable() {
                            @Override public void run() {
                                synchronized (mScreenshotLock) {
                                    if (mScreenshotConnection != null) {
                                finishScreenshot(mScreenshotConnection);
                                        finishScreenshotLSS(mScreenshotConnection);
                                    }
                                }
                            }
    
@@ -2460,6 +2468,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                        mHandler.postDelayed(mScreenshotTimeout, 10000);
                    }
                }
            }
        });
    }