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

Commit 738afc5c authored by Konstantin Lopyrev's avatar Konstantin Lopyrev Committed by Android Git Automerger
Browse files

am 975ecddc: am 6e0f65fd: Adding focus change notification

Merge commit '975ecddc'

* commit '975ecddc':
  Adding focus change notification
parents 3f4c2cb8 975ecddc
Loading
Loading
Loading
Loading
+29 −4
Original line number Diff line number Diff line
@@ -216,8 +216,11 @@ class ViewServer implements Runnable {
    class ViewServerWorker implements Runnable, WindowManagerService.WindowChangeListener {
        private Socket mClient;
        private boolean mNeedWindowListUpdate;
        private boolean mNeedFocusedWindowUpdate;
        public ViewServerWorker(Socket client) {
            mClient = client;
            mNeedWindowListUpdate = false;
            mNeedFocusedWindowUpdate = false;
        }

        public void run() {
@@ -285,21 +288,43 @@ class ViewServer implements Runnable {
            }
        }

        public void focusChanged() {
            synchronized(this) {
                mNeedFocusedWindowUpdate = true;
                notifyAll();
            }
        }

        private boolean windowManagerAutolistLoop() {
            mWindowManager.addWindowChangeListener(this);
            BufferedWriter out = null;
            try {
                out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream()));
                while (!Thread.interrupted()) {
                    boolean needWindowListUpdate = false;
                    boolean needFocusedWindowUpdate = false;
                    synchronized (this) {
                        while (!mNeedWindowListUpdate) {
                        while (!mNeedWindowListUpdate && !mNeedFocusedWindowUpdate) {
                            wait();
                        }
                        if (mNeedWindowListUpdate) {
                            mNeedWindowListUpdate = false;
                            needWindowListUpdate = true;
                        }
                    out.write("UPDATE\n");
                        if (mNeedFocusedWindowUpdate) {
                            mNeedFocusedWindowUpdate = false;
                            needFocusedWindowUpdate = true;
                        }
                    }
                    if(needWindowListUpdate) {
                        out.write("LIST UPDATE\n");
                        out.flush();
                    }
                    if(needFocusedWindowUpdate) {
                        out.write("FOCUS UPDATE\n");
                        out.flush();
                    }
                }
            } catch (Exception e) {
                Slog.w(LOG_TAG, "Connection error: ", e);
            } finally {
+21 −4
Original line number Diff line number Diff line
@@ -494,6 +494,7 @@ public class WindowManagerService extends IWindowManager.Stub

    public interface WindowChangeListener {
        public void windowsChanged();
        public void focusChanged();
    }

    final Configuration mTempConfiguration = new Configuration();
@@ -4829,6 +4830,21 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

    private void notifyFocusChanged() {
        WindowChangeListener[] windowChangeListeners;
        synchronized(mWindowMap) {
            if(mWindowChangeListeners.isEmpty()) {
                return;
            }
            windowChangeListeners = new WindowChangeListener[mWindowChangeListeners.size()];
            windowChangeListeners = mWindowChangeListeners.toArray(windowChangeListeners);
        }
        int N = windowChangeListeners.length;
        for(int i = 0; i < N; i++) {
            windowChangeListeners[i].focusChanged();
        }
    }

    private WindowState findWindow(int hashCode) {
        if (hashCode == -1) {
            return getFocusedWindow();
@@ -7716,7 +7732,7 @@ public class WindowManagerService extends IWindowManager.Stub
        public static final int ENABLE_SCREEN = 16;
        public static final int APP_FREEZE_TIMEOUT = 17;
        public static final int SEND_NEW_CONFIGURATION = 18;
        public static final int WINDOWS_CHANGED = 19;
        public static final int REPORT_WINDOWS_CHANGE = 19;

        private Session mLastReportedHold;

@@ -7768,6 +7784,7 @@ public class WindowManagerService extends IWindowManager.Stub
                                // Ignore if process has died.
                            }
                        }
                        notifyFocusChanged();
                    }
                } break;

@@ -8048,7 +8065,7 @@ public class WindowManagerService extends IWindowManager.Stub
                    break;
                }

                case WINDOWS_CHANGED: {
                case REPORT_WINDOWS_CHANGE: {
                    if (mWindowsChanged) {
                        synchronized (mWindowMap) {
                            mWindowsChanged = false;
@@ -8279,8 +8296,8 @@ public class WindowManagerService extends IWindowManager.Stub
                }
            }
            if (mWindowsChanged && !mWindowChangeListeners.isEmpty()) {
                mH.removeMessages(H.WINDOWS_CHANGED);
                mH.sendMessage(mH.obtainMessage(H.WINDOWS_CHANGED));
                mH.removeMessages(H.REPORT_WINDOWS_CHANGE);
                mH.sendMessage(mH.obtainMessage(H.REPORT_WINDOWS_CHANGE));
            }
        } catch (RuntimeException e) {
            mInLayout = false;