Merge "WM: Clean up InputTarget interface"
diff --git a/services/core/java/com/android/server/wm/AnrController.java b/services/core/java/com/android/server/wm/AnrController.java
index 91f650f..38e1c99 100644
--- a/services/core/java/com/android/server/wm/AnrController.java
+++ b/services/core/java/com/android/server/wm/AnrController.java
@@ -87,16 +87,12 @@
                 return;
             }
 
-            WindowState windowState = target.asWindowState();
+            WindowState windowState = target.getWindowState();
             pid = target.getPid();
-            if (windowState != null) {
-                activity = windowState.mActivityRecord;
-            } else {
-                // Don't blame the host process, instead blame the embedded pid.
-                activity = null;
-                // Use host WindowState for logging and z-order test.
-                windowState = target.asEmbeddedWindow().mHostWindowState;
-            }
+            // Blame the activity if the input token belongs to the window. If the target is
+            // embedded, then we will blame the pid instead.
+            activity = (windowState.mInputChannelToken == inputToken)
+                    ? windowState.mActivityRecord : null;
             Slog.i(TAG_WM, "ANR in " + target + ". Reason:" + reason);
             aboveSystem = isWindowAboveSystem(windowState);
             dumpAnrStateLocked(activity, windowState, reason);
diff --git a/services/core/java/com/android/server/wm/EmbeddedWindowController.java b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
index dcd1148..fc317a1 100644
--- a/services/core/java/com/android/server/wm/EmbeddedWindowController.java
+++ b/services/core/java/com/android/server/wm/EmbeddedWindowController.java
@@ -198,8 +198,8 @@
         }
 
         @Override
-        public EmbeddedWindow asEmbeddedWindow() {
-            return this;
+        public WindowState getWindowState() {
+            return mHostWindowState;
         }
 
         @Override
diff --git a/services/core/java/com/android/server/wm/InputTarget.java b/services/core/java/com/android/server/wm/InputTarget.java
index fec7cc9..c7d328a 100644
--- a/services/core/java/com/android/server/wm/InputTarget.java
+++ b/services/core/java/com/android/server/wm/InputTarget.java
@@ -25,13 +25,8 @@
  * of both targets.
  */
 interface InputTarget {
-    default WindowState asWindowState() {
-        return null;
-    }
-
-    default EmbeddedWindowController.EmbeddedWindow asEmbeddedWindow() {
-        return null;
-    }
+    /* Get the WindowState associated with the target. */
+    WindowState getWindowState();
 
     /* Display id of the target. */
     int getDisplayId();
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 27182fe..f11fa16 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -5018,16 +5018,17 @@
             ProtoLog.i(WM_DEBUG_FOCUS_LIGHT, "Focus changing: %s -> %s", lastTarget, newTarget);
         }
 
-        if (newTarget != null && newTarget.asWindowState() != null) {
-            WindowState newFocus = newTarget.asWindowState();
-            mAnrController.onFocusChanged(newFocus);
-            newFocus.reportFocusChangedSerialized(true);
+        // Call WindowState focus change observers
+        WindowState newFocusedWindow = newTarget != null ? newTarget.getWindowState() : null;
+        if (newFocusedWindow != null && newFocusedWindow.mInputChannelToken == newToken) {
+            mAnrController.onFocusChanged(newFocusedWindow);
+            newFocusedWindow.reportFocusChangedSerialized(true);
             notifyFocusChanged();
         }
 
-        if (lastTarget != null && lastTarget.asWindowState() != null) {
-            WindowState lastFocus = lastTarget.asWindowState();
-            lastFocus.reportFocusChangedSerialized(false);
+        WindowState lastFocusedWindow = lastTarget != null ? lastTarget.getWindowState() : null;
+        if (lastFocusedWindow != null && lastFocusedWindow.mInputChannelToken == oldToken) {
+            lastFocusedWindow.reportFocusChangedSerialized(false);
         }
     }
 
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index a3d1378..9a43f6b 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -1727,7 +1727,7 @@
     }
 
     @Override
-    public WindowState asWindowState() {
+    public WindowState getWindowState() {
         return this;
     }