/*
* Copyright (C) 2011 Baidu.com Inc
*
* 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.baidu.cafe.remote;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.InetSocketAddress;
import java.net.Socket;
/**
* One MonkeyNetwork object can only send one monkey event!
*
* @author chengzhenyu@baidu.com
* @date 2012-3-30
* @version
* @todo
*/
public class MonkeyNetwork {
public final static String DOWN = "down";
public final static String MOVE = "move";
public final static String UP = "up";
private final static String MONKEY_SERVER_IP = "127.0.0.1";
private final static int MONKEY_PORT = 4938;
private final static int EVENT_TIMEOUT = 10 * 1000;
private BufferedReader mIn = null;
private BufferedWriter mOut = null;
private Socket mSocket = null;
private boolean mIsDone = false;
public MonkeyNetwork() {
}
/**
* Command to send touch events to the input system. format: touch
* [down|up|move] [x] [y] example: touch down 120 120; touch move 140 140;
* touch up 140 140
*
* @param type
* touch type: down, up, or move
* @param x
* x-coordinates
* @param y
* y-coordinates
*/
public void touch(String type, int x, int y) {
String command = String.format("%s %s %s %s", "touch", type, x, y);
sendCommand(command);
}
/**
* Command to send Key events to the input system. format: key [down|up]
* [keycode] example:key down 82 key up 82
*
* @param type
* key type: down or up
* @param keyCode
* key code
*/
public void key(String type, int keyCode) {
String command = String.format("%s %s %s", "key", type, keyCode);
sendCommand(command);
}
public void type(String str) {
String command = String.format("%s %s", "type", str);
sendCommand(command);
}
public void done() {
sendCommand("done");
}
private void sendCommand(final String command) {
new Thread(new Runnable() {
public void run() {
mSocket = new Socket();
try {
mSocket.connect(new InetSocketAddress(MONKEY_SERVER_IP, MONKEY_PORT));
mOut = new BufferedWriter(new OutputStreamWriter(mSocket.getOutputStream()));
mIn = new BufferedReader(new InputStreamReader(mSocket.getInputStream(),
"utf-8"));
if (mOut == null || mIn == null) {
Log.print("ERROR! mOut or mIn is null.");
return;
}
mOut.write(command);
mOut.newLine();
mOut.flush();
while (true) {
String line;
if ((line = mIn.readLine()) == null || "OK".equalsIgnoreCase(line)) {
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (mSocket != null) {
try {
mSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
mIsDone = true;
}
}
},"sendCommandToMonkeyServer").start();
waitForDone();
}
private void waitForDone() {
long timeout = System.currentTimeMillis() + EVENT_TIMEOUT;
while (true) {
try {
if (mIsDone) {
break;
}
if (System.currentTimeMillis() > timeout) {
Log.print("waitForDone timeout !");
break;
}
Thread.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// Start monkey requires android.permission.SET_ACTIVITY_WATCHER which is owned by shell not app_xx
private void start(final int port) {
new Thread(new Runnable() {
public void run() {
// ShellExecute.execute(new String[] { "monkey", "--port", String.format("%s", port), "-v", "-v" }, "/");
}
}).start();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}