aboutsummaryrefslogtreecommitdiffstats
path: root/chimpchat/src/com/android/chimpchat/ChimpManager.java
diff options
context:
space:
mode:
Diffstat (limited to 'chimpchat/src/com/android/chimpchat/ChimpManager.java')
-rw-r--r--chimpchat/src/com/android/chimpchat/ChimpManager.java455
1 files changed, 0 insertions, 455 deletions
diff --git a/chimpchat/src/com/android/chimpchat/ChimpManager.java b/chimpchat/src/com/android/chimpchat/ChimpManager.java
deleted file mode 100644
index 475c7c1..0000000
--- a/chimpchat/src/com/android/chimpchat/ChimpManager.java
+++ /dev/null
@@ -1,455 +0,0 @@
-
-/*
- * Copyright (C) 2011 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.chimpchat;
-
-import com.android.chimpchat.core.IChimpView;
-import com.android.chimpchat.core.PhysicalButton;
-import com.android.chimpchat.core.ChimpException;
-import com.android.chimpchat.core.ChimpRect;
-import com.android.chimpchat.core.ChimpView;
-
-import com.google.common.collect.Lists;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStreamWriter;
-import java.net.Socket;
-import java.net.SocketException;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.StringTokenizer;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-/**
- * Provides a nicer interface to interacting with the low-level network access protocol for talking
- * to the monkey.
- *
- * This class is thread-safe and can handle being called from multiple threads.
- */
-public class ChimpManager {
- private static Logger LOG = Logger.getLogger(ChimpManager.class.getName());
-
- private Socket monkeySocket;
- private BufferedWriter monkeyWriter;
- private BufferedReader monkeyReader;
-
- /**
- * Create a new ChimpMananger to talk to the specified device.
- *
- * @param monkeySocket the already connected socket on which to send protocol messages.
- * @throws IOException if there is an issue setting up the sockets
- */
- public ChimpManager(Socket monkeySocket) throws IOException {
- this.monkeySocket = monkeySocket;
- monkeyWriter =
- new BufferedWriter(new OutputStreamWriter(monkeySocket.getOutputStream()));
- monkeyReader = new BufferedReader(new InputStreamReader(monkeySocket.getInputStream()));
- }
-
- /* Ensure that everything gets shutdown properly */
- protected void finalize() throws Throwable {
- try {
- quit();
- } finally {
- close();
- super.finalize();
- }
- }
-
- /**
- * Send a touch down event at the specified location.
- *
- * @param x the x coordinate of where to click
- * @param y the y coordinate of where to click
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean touchDown(int x, int y) throws IOException {
- return sendMonkeyEvent("touch down " + x + " " + y);
- }
-
- /**
- * Send a touch down event at the specified location.
- *
- * @param x the x coordinate of where to click
- * @param y the y coordinate of where to click
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean touchUp(int x, int y) throws IOException {
- return sendMonkeyEvent("touch up " + x + " " + y);
- }
-
- /**
- * Send a touch move event at the specified location.
- *
- * @param x the x coordinate of where to click
- * @param y the y coordinate of where to click
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean touchMove(int x, int y) throws IOException {
- return sendMonkeyEvent("touch move " + x + " " + y);
- }
-
- /**
- * Send a touch (down and then up) event at the specified location.
- *
- * @param x the x coordinate of where to click
- * @param y the y coordinate of where to click
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean touch(int x, int y) throws IOException {
- return sendMonkeyEvent("tap " + x + " " + y);
- }
-
- /**
- * Press a physical button on the device.
- *
- * @param name the name of the button (As specified in the protocol)
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean press(String name) throws IOException {
- return sendMonkeyEvent("press " + name);
- }
-
- /**
- * Send a Key Down event for the specified button.
- *
- * @param name the name of the button (As specified in the protocol)
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean keyDown(String name) throws IOException {
- return sendMonkeyEvent("key down " + name);
- }
-
- /**
- * Send a Key Up event for the specified button.
- *
- * @param name the name of the button (As specified in the protocol)
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean keyUp(String name) throws IOException {
- return sendMonkeyEvent("key up " + name);
- }
-
- /**
- * Press a physical button on the device.
- *
- * @param button the button to press
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean press(PhysicalButton button) throws IOException {
- return press(button.getKeyName());
- }
-
- /**
- * This function allows the communication bridge between the host and the device
- * to be invisible to the script for internal needs.
- * It splits a command into monkey events and waits for responses for each over an adb tcp socket.
- * Returns on an error, else continues and sets up last response.
- *
- * @param command the monkey command to send to the device
- * @return the (unparsed) response returned from the monkey.
- * @throws IOException on error communicating with the device
- */
- private String sendMonkeyEventAndGetResponse(String command) throws IOException {
- command = command.trim();
- LOG.info("Monkey Command: " + command + ".");
-
- // send a single command and get the response
- monkeyWriter.write(command + "\n");
- monkeyWriter.flush();
- return monkeyReader.readLine();
- }
-
- /**
- * Parse a monkey response string to see if the command succeeded or not.
- *
- * @param monkeyResponse the response
- * @return true if response code indicated success.
- */
- private boolean parseResponseForSuccess(String monkeyResponse) {
- if (monkeyResponse == null) {
- return false;
- }
- // return on ok
- if(monkeyResponse.startsWith("OK")) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Parse a monkey response string to get the extra data returned.
- *
- * @param monkeyResponse the response
- * @return any extra data that was returned, or empty string if there was nothing.
- */
- private String parseResponseForExtra(String monkeyResponse) {
- int offset = monkeyResponse.indexOf(':');
- if (offset < 0) {
- return "";
- }
- return monkeyResponse.substring(offset + 1);
- }
-
- /**
- * This function allows the communication bridge between the host and the device
- * to be invisible to the script for internal needs.
- * It splits a command into monkey events and waits for responses for each over an
- * adb tcp socket.
- *
- * @param command the monkey command to send to the device
- * @return true on success.
- * @throws IOException on error communicating with the device
- */
- private boolean sendMonkeyEvent(String command) throws IOException {
- synchronized (this) {
- String monkeyResponse = sendMonkeyEventAndGetResponse(command);
- return parseResponseForSuccess(monkeyResponse);
- }
- }
-
- /**
- * Close all open resources related to this device.
- */
- public void close() {
- try {
- monkeySocket.close();
- } catch (IOException e) {
- LOG.log(Level.SEVERE, "Unable to close monkeySocket", e);
- }
- try {
- monkeyReader.close();
- } catch (IOException e) {
- LOG.log(Level.SEVERE, "Unable to close monkeyReader", e);
- }
- try {
- monkeyWriter.close();
- } catch (IOException e) {
- LOG.log(Level.SEVERE, "Unable to close monkeyWriter", e);
- }
- }
-
- /**
- * Function to get a static variable from the device.
- *
- * @param name name of static variable to get
- * @return the value of the variable, or null if there was an error
- * @throws IOException on error communicating with the device
- */
- public String getVariable(String name) throws IOException {
- synchronized (this) {
- String response = sendMonkeyEventAndGetResponse("getvar " + name);
- if (!parseResponseForSuccess(response)) {
- return null;
- }
- return parseResponseForExtra(response);
- }
- }
-
- /**
- * Function to get the list of variables from the device.
- * @return the list of variables as a collection of strings
- * @throws IOException on error communicating with the device
- */
- public Collection<String> listVariable() throws IOException {
- synchronized (this) {
- String response = sendMonkeyEventAndGetResponse("listvar");
- if (!parseResponseForSuccess(response)) {
- Collections.emptyList();
- }
- String extras = parseResponseForExtra(response);
- return Lists.newArrayList(extras.split(" "));
- }
- }
-
- /**
- * Tells the monkey that we are done for this session.
- * @throws IOException on error communicating with the device
- */
- public void done() throws IOException {
- // this command just drops the connection, so handle it here
- synchronized (this) {
- sendMonkeyEventAndGetResponse("done");
- }
- }
-
- /**
- * Tells the monkey that we are done forever.
- * @throws IOException on error communicating with the device
- */
- public void quit() throws IOException {
- // this command drops the connection, so handle it here
- synchronized (this) {
- try {
- sendMonkeyEventAndGetResponse("quit");
- } catch (SocketException e) {
- // flush was called after the call had been written, so it tried flushing to a
- // broken pipe.
- }
- }
- }
-
- /**
- * Send a tap event at the specified location.
- *
- * @param x the x coordinate of where to click
- * @param y the y coordinate of where to click
- * @return success or not
- * @throws IOException on error communicating with the device
- */
- public boolean tap(int x, int y) throws IOException {
- return sendMonkeyEvent("tap " + x + " " + y);
- }
-
- /**
- * Type the following string to the monkey.
- *
- * @param text the string to type
- * @return success
- * @throws IOException on error communicating with the device
- */
- public boolean type(String text) throws IOException {
- // The network protocol can't handle embedded line breaks, so we have to handle it
- // here instead
- StringTokenizer tok = new StringTokenizer(text, "\n", true);
- while (tok.hasMoreTokens()) {
- String line = tok.nextToken();
- if ("\n".equals(line)) {
- boolean success = press(PhysicalButton.ENTER);
- if (!success) {
- return false;
- }
- } else {
- boolean success = sendMonkeyEvent("type " + line);
- if (!success) {
- return false;
- }
- }
- }
- return true;
- }
-
- /**
- * Type the character to the monkey.
- *
- * @param keyChar the character to type.
- * @return success
- * @throws IOException on error communicating with the device
- */
- public boolean type(char keyChar) throws IOException {
- return type(Character.toString(keyChar));
- }
-
- /**
- * Wake the device up from sleep.
- * @throws IOException on error communicating with the device
- */
- public void wake() throws IOException {
- sendMonkeyEvent("wake");
- }
-
-
- /**
- * Retrieves the list of view ids from the current application.
- * @return the list of view ids as a collection of strings
- * @throws IOException on error communicating with the device
- */
- public Collection<String> listViewIds() throws IOException {
- synchronized (this) {
- String response = sendMonkeyEventAndGetResponse("listviews");
- if (!parseResponseForSuccess(response)) {
- Collections.emptyList();
- }
- String extras = parseResponseForExtra(response);
- return Lists.newArrayList(extras.split(" "));
- }
- }
-
- /**
- * Queries the on-screen view with the given id and returns the response.
- * It's up to the calling method to parse the returned String.
- * @param idType The type of ID to query the view by
- * @param id The view id of the view
- * @param query the query
- * @return the response from the query
- * @throws IOException on error communicating with the device
- */
- public String queryView(String idType, List<String> ids, String query) throws IOException {
- StringBuilder monkeyCommand = new StringBuilder("queryview " + idType + " ");
- for(String id : ids) {
- monkeyCommand.append(id).append(" ");
- }
- monkeyCommand.append(query);
- synchronized (this) {
- String response = sendMonkeyEventAndGetResponse(monkeyCommand.toString());
- if (!parseResponseForSuccess(response)) {
- throw new ChimpException(parseResponseForExtra(response));
- }
- return parseResponseForExtra(response);
- }
- }
-
- /**
- * Returns the current root view of the device.
- * @return the root view of the device
- */
- public IChimpView getRootView() throws IOException {
- synchronized(this) {
- String response = sendMonkeyEventAndGetResponse("getrootview");
- String extra = parseResponseForExtra(response);
- List<String> ids = Arrays.asList(extra.split(" "));
- if (!parseResponseForSuccess(response) || ids.size() != 2) {
- throw new ChimpException(extra);
- }
- ChimpView root = new ChimpView(ChimpView.ACCESSIBILITY_IDS, ids);
- root.setManager(this);
- return root;
- }
- }
-
- /**
- * Queries the device for a list of views with the given
- * @return A string containing the accessibility ids of the views with the given text
- */
- public String getViewsWithText(String text) throws IOException {
- synchronized(this) {
- // Monkey has trouble parsing a single word in quotes
- if (text.split(" ").length > 1) {
- text = "\"" + text + "\"";
- }
- String response = sendMonkeyEventAndGetResponse("getviewswithtext " + text);
- if (!parseResponseForSuccess(response)) {
- throw new ChimpException(parseResponseForExtra(response));
- }
- return parseResponseForExtra(response);
- }
- }
-}