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

Commit 63444192 authored by Yeabkal Wubshit's avatar Yeabkal Wubshit
Browse files

Move window-focus change subscription to WindowManagerInternal

WindowManagerService used to have a WindowChangeListener public
interface that allows clients to directly subscribe for focus and window
change events. In this change, we split the focus-change subscription
into a separate interface, and make it available via
WindowManagerInternal. This allows us to provide a better interface
between the service and other system-server components.

Bug: 397832722
Test: n/a mostly a refactor
Flag: EXEMPT trivial refactor
Change-Id: I1a91e409a8d2aa0541c91d6f5a5341f37e35390d
parent da3c41b2
Loading
Loading
Loading
Loading
+7 −2
Original line number Original line Diff line number Diff line
@@ -19,7 +19,10 @@ package com.android.server.wm;


import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerInternal.WindowFocusChangeListener;
import static com.android.server.wm.WindowManagerService.WindowChangeListener;


import android.os.IBinder;
import android.util.Slog;
import android.util.Slog;


import java.net.ServerSocket;
import java.net.ServerSocket;
@@ -206,7 +209,7 @@ class ViewServer implements Runnable {
        return result;
        return result;
    }
    }


    class ViewServerWorker implements Runnable, WindowManagerService.WindowChangeListener {
    class ViewServerWorker implements Runnable, WindowChangeListener, WindowFocusChangeListener {
        private Socket mClient;
        private Socket mClient;
        private boolean mNeedWindowListUpdate;
        private boolean mNeedWindowListUpdate;
        private boolean mNeedFocusedWindowUpdate;
        private boolean mNeedFocusedWindowUpdate;
@@ -284,7 +287,7 @@ class ViewServer implements Runnable {
            }
            }
        }
        }


        public void focusChanged() {
        public void focusChanged(IBinder focusedWindowToken) {
            synchronized(this) {
            synchronized(this) {
                mNeedFocusedWindowUpdate = true;
                mNeedFocusedWindowUpdate = true;
                notifyAll();
                notifyAll();
@@ -293,6 +296,7 @@ class ViewServer implements Runnable {


        private boolean windowManagerAutolistLoop() {
        private boolean windowManagerAutolistLoop() {
            mWindowManager.addWindowChangeListener(this);
            mWindowManager.addWindowChangeListener(this);
            mWindowManager.addWindowFocusChangeListener(this);
            BufferedWriter out = null;
            BufferedWriter out = null;
            try {
            try {
                out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream()));
                out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream()));
@@ -332,6 +336,7 @@ class ViewServer implements Runnable {
                    }
                    }
                }
                }
                mWindowManager.removeWindowChangeListener(this);
                mWindowManager.removeWindowChangeListener(this);
                mWindowManager.removeWindowFocusChangeListener(this);
            }
            }
            return true;
            return true;
        }
        }
+24 −0
Original line number Original line Diff line number Diff line
@@ -152,6 +152,30 @@ public abstract class WindowManagerInternal {
        }
        }
    }
    }


    /** Interface for clients to receive callbacks related to window change. */
    public interface WindowFocusChangeListener {
        /**
         * Notify on focus changed.
         *
         * @param focusedWindowToken the token of the newly focused window.
         */
        void focusChanged(@NonNull IBinder focusedWindowToken);
    }

    /**
     * Registers a listener to be notified about window focus changes.
     *
     * @param listener the {@link WindowFocusChangeListener} to register.
     */
    public abstract void registerWindowFocusChangeListener(WindowFocusChangeListener listener);

    /**
     * Unregisters a listener that was registered via {@link #registerWindowFocusChangeListener}.
     *
     * @param listener the {@link WindowFocusChangeListener} to unregister.
     */
    public abstract void unregisterWindowFocusChangeListener(WindowFocusChangeListener listener);

    /**
    /**
     * Interface to receive a callback when the windows reported for
     * Interface to receive a callback when the windows reported for
     * accessibility changed.
     * accessibility changed.
+36 −14
Original line number Original line Diff line number Diff line
@@ -147,6 +147,7 @@ import static com.android.server.wm.WindowManagerDebugConfig.SHOW_VERBOSE_TRANSA
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WITH_CLASS_NAME;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerDebugConfig.TAG_WM;
import static com.android.server.wm.WindowManagerInternal.OnWindowRemovedListener;
import static com.android.server.wm.WindowManagerInternal.OnWindowRemovedListener;
import static com.android.server.wm.WindowManagerInternal.WindowFocusChangeListener;
import static com.android.server.wm.WindowManagerServiceDumpProto.BACK_NAVIGATION;
import static com.android.server.wm.WindowManagerServiceDumpProto.BACK_NAVIGATION;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_APP;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_APP;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_DISPLAY_ID;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_DISPLAY_ID;
@@ -1080,14 +1081,12 @@ public class WindowManagerService extends IWindowManager.Stub


    private ViewServer mViewServer;
    private ViewServer mViewServer;
    final ArrayList<WindowChangeListener> mWindowChangeListeners = new ArrayList<>();
    final ArrayList<WindowChangeListener> mWindowChangeListeners = new ArrayList<>();
    final ArrayList<WindowFocusChangeListener> mWindowFocusChangeListeners = new ArrayList<>();
    boolean mWindowsChanged = false;
    boolean mWindowsChanged = false;


    public interface WindowChangeListener {
    interface WindowChangeListener {
        /** Notify on windows changed */
        /** Notify on windows changed */
        void windowsChanged();
        void windowsChanged();

        /** Notify on focus changed */
        void focusChanged();
    }
    }


    final HighRefreshRateDenylist mHighRefreshRateDenylist;
    final HighRefreshRateDenylist mHighRefreshRateDenylist;
@@ -5345,18 +5344,30 @@ public class WindowManagerService extends IWindowManager.Stub
        return success;
        return success;
    }
    }


    public void addWindowChangeListener(WindowChangeListener listener) {
    void addWindowChangeListener(WindowChangeListener listener) {
        synchronized (mGlobalLock) {
        synchronized (mGlobalLock) {
            mWindowChangeListeners.add(listener);
            mWindowChangeListeners.add(listener);
        }
        }
    }
    }


    public void removeWindowChangeListener(WindowChangeListener listener) {
    void removeWindowChangeListener(WindowChangeListener listener) {
        synchronized (mGlobalLock) {
        synchronized (mGlobalLock) {
            mWindowChangeListeners.remove(listener);
            mWindowChangeListeners.remove(listener);
        }
        }
    }
    }


    void addWindowFocusChangeListener(WindowFocusChangeListener listener) {
        synchronized (mGlobalLock) {
            mWindowFocusChangeListeners.add(listener);
        }
    }

    void removeWindowFocusChangeListener(WindowFocusChangeListener listener) {
        synchronized (mGlobalLock) {
            mWindowFocusChangeListeners.remove(listener);
        }
    }

    private void notifyWindowRemovedListeners(IBinder client) {
    private void notifyWindowRemovedListeners(IBinder client) {
        OnWindowRemovedListener[] windowRemovedListeners;
        OnWindowRemovedListener[] windowRemovedListeners;
        synchronized (mGlobalLock) {
        synchronized (mGlobalLock) {
@@ -5389,18 +5400,19 @@ public class WindowManagerService extends IWindowManager.Stub
        }
        }
    }
    }


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


@@ -5675,7 +5687,7 @@ public class WindowManagerService extends IWindowManager.Stub
        if (newFocusedWindow != null && newFocusedWindow.mInputChannelToken == newToken) {
        if (newFocusedWindow != null && newFocusedWindow.mInputChannelToken == newToken) {
            mAnrController.onFocusChanged(newFocusedWindow);
            mAnrController.onFocusChanged(newFocusedWindow);
            newFocusedWindow.reportFocusChangedSerialized(true);
            newFocusedWindow.reportFocusChangedSerialized(true);
            notifyFocusChanged();
            notifyFocusChanged(newTarget.getWindowToken());
        }
        }


        WindowState lastFocusedWindow = lastTarget != null ? lastTarget.getWindowState() : null;
        WindowState lastFocusedWindow = lastTarget != null ? lastTarget.getWindowState() : null;
@@ -8689,6 +8701,16 @@ public class WindowManagerService extends IWindowManager.Stub
            }
            }
        }
        }


        @Override
        public void registerWindowFocusChangeListener(WindowFocusChangeListener listener) {
            WindowManagerService.this.addWindowFocusChangeListener(listener);
        }

        @Override
        public void unregisterWindowFocusChangeListener(WindowFocusChangeListener listener) {
            WindowManagerService.this.removeWindowFocusChangeListener(listener);
        }

        @Override
        @Override
        public void registerOnWindowRemovedListener(OnWindowRemovedListener listener) {
        public void registerOnWindowRemovedListener(OnWindowRemovedListener listener) {
            synchronized (mGlobalLock) {
            synchronized (mGlobalLock) {
+1 −0
Original line number Original line Diff line number Diff line
@@ -59,6 +59,7 @@


# Referenced in wear-service
# Referenced in wear-service
-keep public class com.android.server.wm.WindowManagerInternal { *; }
-keep public class com.android.server.wm.WindowManagerInternal { *; }
-keep public class com.android.server.wm.WindowManagerInternal$WindowFocusChangeListener { *; }


# JNI keep rules
# JNI keep rules
# The global keep rule for native methods allows stripping of such methods if they're unreferenced
# The global keep rule for native methods allows stripping of such methods if they're unreferenced