ViewServerpublic class ViewServer extends Object implements RunnableThe ViewServer is local socket server that can be used to communicate with the
views of the opened windows. Communication with the views is ensured by the
{@link com.android.server.WindowManagerService} and is a cross-process operation.
{@hide} |
Fields Summary |
---|
public static final int | VIEW_SERVER_DEFAULT_PORTThe default port used to start view servers. | private static final String | LOG_TAG | private static final String | VALUE_PROTOCOL_VERSION | private static final String | VALUE_SERVER_VERSION | private static final String | COMMAND_PROTOCOL_VERSION | private static final String | COMMAND_SERVER_VERSION | private static final String | COMMAND_WINDOW_MANAGER_LIST | private ServerSocket | mServer | private Thread | mThread | private final WindowManagerService | mWindowManager | private final int | mPort |
Constructors Summary |
---|
ViewServer(WindowManagerService windowManager)Creates a new ViewServer associated with the specified window manager.
The server uses the default port {@link #VIEW_SERVER_DEFAULT_PORT}. The server
is not started by default.
this(windowManager, VIEW_SERVER_DEFAULT_PORT);
| ViewServer(WindowManagerService windowManager, int port)Creates a new ViewServer associated with the specified window manager on the
specified local port. The server is not started by default.
mWindowManager = windowManager;
mPort = port;
|
Methods Summary |
---|
boolean | isRunning()Indicates whether the server is currently running.
return mThread != null && mThread.isAlive();
| public void | run()Main server loop.
final ServerSocket server = mServer;
while (Thread.currentThread() == mThread) {
Socket client = null;
// Any uncaught exception will crash the system process
try {
client = server.accept();
BufferedReader in = null;
try {
in = new BufferedReader(new InputStreamReader(client.getInputStream()), 1024);
final String request = in.readLine();
String command;
String parameters;
int index = request.indexOf(' ");
if (index == -1) {
command = request;
parameters = "";
} else {
command = request.substring(0, index);
parameters = request.substring(index + 1);
}
boolean result;
if (COMMAND_PROTOCOL_VERSION.equalsIgnoreCase(command)) {
result = writeValue(client, VALUE_PROTOCOL_VERSION);
} else if (COMMAND_SERVER_VERSION.equalsIgnoreCase(command)) {
result = writeValue(client, VALUE_SERVER_VERSION);
} else if (COMMAND_WINDOW_MANAGER_LIST.equalsIgnoreCase(command)) {
result = mWindowManager.viewServerListWindows(client);
} else {
result = mWindowManager.viewServerWindowCommand(client,
command, parameters);
}
if (!result) {
Log.w(LOG_TAG, "An error occured with the command: " + command);
}
} finally {
if (in != null) {
in.close();
}
}
} catch (Exception e) {
Log.w(LOG_TAG, "Connection error: ", e);
} finally {
if (client != null) {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
| boolean | start()Starts the server.
if (mThread != null) {
return false;
}
mServer = new ServerSocket(mPort, 1, InetAddress.getLocalHost());
mThread = new Thread(this, "Remote View Server [port=" + mPort + "]");
mThread.start();
return true;
| boolean | stop()Stops the server.
if (mThread != null) {
mThread.interrupt();
mThread = null;
try {
mServer.close();
mServer = null;
return true;
} catch (IOException e) {
Log.w(LOG_TAG, "Could not close the view server");
}
}
return false;
| private static boolean | writeValue(java.net.Socket client, java.lang.String value)
boolean result;
BufferedWriter out = null;
try {
OutputStream clientStream = client.getOutputStream();
out = new BufferedWriter(new OutputStreamWriter(clientStream), 8 * 1024);
out.write(value);
out.write("\n");
out.flush();
result = true;
} catch (Exception e) {
result = false;
} finally {
if (out != null) {
try {
out.close();
} catch (IOException e) {
result = false;
}
}
}
return result;
|
|