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

Commit cf264117 authored by Yeabkal Wubshit's avatar Yeabkal Wubshit Committed by Android (Google) Code Review
Browse files

Merge "Move window-focus change subscription to WindowManagerInternal" into main

parents 6d5cc4fc 63444192
Loading
Loading
Loading
Loading
+7 −2
Original line number 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_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 java.net.ServerSocket;
@@ -206,7 +209,7 @@ class ViewServer implements Runnable {
        return result;
    }

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

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

        private boolean windowManagerAutolistLoop() {
            mWindowManager.addWindowChangeListener(this);
            mWindowManager.addWindowFocusChangeListener(this);
            BufferedWriter out = null;
            try {
                out = new BufferedWriter(new OutputStreamWriter(mClient.getOutputStream()));
@@ -332,6 +336,7 @@ class ViewServer implements Runnable {
                    }
                }
                mWindowManager.removeWindowChangeListener(this);
                mWindowManager.removeWindowFocusChangeListener(this);
            }
            return true;
        }
+24 −0
Original line number 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
     * accessibility changed.
+36 −14
Original line number Diff line number Diff line
@@ -145,6 +145,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_WM;
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.FOCUSED_APP;
import static com.android.server.wm.WindowManagerServiceDumpProto.FOCUSED_DISPLAY_ID;
@@ -1078,14 +1079,12 @@ public class WindowManagerService extends IWindowManager.Stub

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

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

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

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

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

    public void removeWindowChangeListener(WindowChangeListener listener) {
    void removeWindowChangeListener(WindowChangeListener listener) {
        synchronized (mGlobalLock) {
            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) {
        OnWindowRemovedListener[] windowRemovedListeners;
        synchronized (mGlobalLock) {
@@ -5350,18 +5361,19 @@ public class WindowManagerService extends IWindowManager.Stub
        }
    }

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

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

        WindowState lastFocusedWindow = lastTarget != null ? lastTarget.getWindowState() : null;
@@ -8649,6 +8661,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
        public void registerOnWindowRemovedListener(OnWindowRemovedListener listener) {
            synchronized (mGlobalLock) {
+1 −0
Original line number Diff line number Diff line
@@ -59,6 +59,7 @@

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

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