From f9624764711f9806cd8a8a95c4a0613995bab04a Mon Sep 17 00:00:00 2001 From: Konstantin Lopyrev Date: Wed, 14 Jul 2010 17:02:37 -0700 Subject: [PATCH] Adding a way for Hierarchy Viewer to get the focused window. Change-Id: I01e6ab4aa24d632fba586cb9e112d8d9df1a681a --- .../java/com/android/server/ViewServer.java | 4 ++ .../android/server/WindowManagerService.java | 45 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/services/java/com/android/server/ViewServer.java b/services/java/com/android/server/ViewServer.java index b369f716c7c55..7b5d18ac8b2c1 100644 --- a/services/java/com/android/server/ViewServer.java +++ b/services/java/com/android/server/ViewServer.java @@ -60,6 +60,8 @@ class ViewServer implements Runnable { private static final String COMMAND_WINDOW_MANAGER_LIST = "LIST"; // Keeps a connection open and notifies when the list of windows changes private static final String COMMAND_WINDOW_MANAGER_AUTOLIST = "AUTOLIST"; + // Returns the focused window + private static final String COMMAND_WINDOW_MANAGER_GET_FOCUS = "GET_FOCUS"; private ServerSocket mServer; private Thread mThread; @@ -250,6 +252,8 @@ class ViewServer implements Runnable { result = writeValue(mClient, VALUE_SERVER_VERSION); } else if (COMMAND_WINDOW_MANAGER_LIST.equalsIgnoreCase(command)) { result = mWindowManager.viewServerListWindows(mClient); + } else if (COMMAND_WINDOW_MANAGER_GET_FOCUS.equalsIgnoreCase(command)) { + result = mWindowManager.viewServerGetFocusedWindow(mClient); } else if(COMMAND_WINDOW_MANAGER_AUTOLIST.equalsIgnoreCase(command)) { result = windowManagerAutolistLoop(); } else { diff --git a/services/java/com/android/server/WindowManagerService.java b/services/java/com/android/server/WindowManagerService.java index cd687da1eac03..d666523ce5d2a 100644 --- a/services/java/com/android/server/WindowManagerService.java +++ b/services/java/com/android/server/WindowManagerService.java @@ -4729,6 +4729,51 @@ public class WindowManagerService extends IWindowManager.Stub return result; } + /** + * Returns the focused window in the following format: + * windowHashCodeInHexadecimal windowName + * + * @param client The remote client to send the listing to. + * @return False if an error occurred, true otherwise. + */ + boolean viewServerGetFocusedWindow(Socket client) { + if (isSystemSecure()) { + return false; + } + + boolean result = true; + + WindowState focusedWindow = getFocusedWindow(); + + BufferedWriter out = null; + + // Any uncaught exception will crash the system process + try { + OutputStream clientStream = client.getOutputStream(); + out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024); + + if(focusedWindow != null) { + out.write(Integer.toHexString(System.identityHashCode(focusedWindow))); + out.write(' '); + out.append(focusedWindow.mAttrs.getTitle()); + } + out.write('\n'); + out.flush(); + } catch (Exception e) { + result = false; + } finally { + if (out != null) { + try { + out.close(); + } catch (IOException e) { + result = false; + } + } + } + + return result; + } + /** * Sends a command to a target window. The result of the command, if any, will be * written in the output stream of the specified socket.