Updating the Monkey commands due to framework changes.

bug:5664337

Change-Id: I7093fb8a646b9363dde6eee87955330bedec117b
This commit is contained in:
Svetoslav Ganov
2011-11-30 17:48:42 -08:00
parent a96a7c6040
commit bdf03ad735
2 changed files with 56 additions and 23 deletions

View File

@@ -529,8 +529,8 @@ public class MonkeySourceNetwork implements MonkeyEventSource {
switch(event) { switch(event) {
case ON_WINDOW_STATE_CHANGE: case ON_WINDOW_STATE_CHANGE:
try { try {
synchronized(MonkeySourceNetworkViews.sConnection) { synchronized(MonkeySourceNetworkViews.class) {
MonkeySourceNetworkViews.sConnection.wait(timeout); MonkeySourceNetworkViews.class.wait(timeout);
} }
} catch(InterruptedException e) { } catch(InterruptedException e) {
Log.d(TAG, "Deferral interrupted: " + e.getMessage()); Log.d(TAG, "Deferral interrupted: " + e.getMessage());

View File

@@ -20,13 +20,13 @@ import static com.android.commands.monkey.MonkeySourceNetwork.EARG;
import android.accessibilityservice.IAccessibilityServiceConnection; import android.accessibilityservice.IAccessibilityServiceConnection;
import android.accessibilityservice.IEventListener; import android.accessibilityservice.IEventListener;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.content.Context; import android.content.Context;
import android.content.pm.IPackageManager; import android.content.pm.IPackageManager;
import android.content.pm.ApplicationInfo; import android.content.pm.ApplicationInfo;
import android.graphics.Rect; import android.graphics.Rect;
import android.os.ServiceManager; import android.os.ServiceManager;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock;
import android.util.Log; import android.util.Log;
import android.view.accessibility.AccessibilityInteractionClient; import android.view.accessibility.AccessibilityInteractionClient;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
@@ -54,9 +54,13 @@ import java.util.ArrayList;
public class MonkeySourceNetworkViews { public class MonkeySourceNetworkViews {
private static final String TAG = "MonkeyViews"; private static final String TAG = "MonkeyViews";
private static final int TIMEOUT_REGISTER_EVENT_LISTENER = 2000;
private static final int NO_ID = -1;
private static volatile AtomicReference<AccessibilityEvent> sLastAccessibilityEvent private static volatile AtomicReference<AccessibilityEvent> sLastAccessibilityEvent
= new AtomicReference<AccessibilityEvent>(); = new AtomicReference<AccessibilityEvent>();
protected static IAccessibilityServiceConnection sConnection; protected static int sConnectionId;
private static IPackageManager sPm = private static IPackageManager sPm =
IPackageManager.Stub.asInterface(ServiceManager.getService("package")); IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
private static Map<String, Class<?>> sClassMap = new HashMap<String, Class<?>>(); private static Map<String, Class<?>> sClassMap = new HashMap<String, Class<?>>();
@@ -96,17 +100,23 @@ public class MonkeySourceNetworkViews {
COMMAND_MAP.put("getaccessibilityids", new GetAccessibilityIds()); COMMAND_MAP.put("getaccessibilityids", new GetAccessibilityIds());
} }
/* This registers our listener with accessibility services, and gives us a connection object */ private static int getConnection() throws RemoteException {
private static IAccessibilityServiceConnection getConnection() throws RemoteException { if (sConnectionId != NO_ID) {
return sConnectionId;
}
IEventListener listener = new IEventListener.Stub() { IEventListener listener = new IEventListener.Stub() {
public void setConnection(IAccessibilityServiceConnection connection) public void setConnection(IAccessibilityServiceConnection connection,
throws RemoteException { int connectionId) {
AccessibilityServiceInfo info = new AccessibilityServiceInfo(); sConnectionId = connectionId;
info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; if (connection != null) {
info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; AccessibilityInteractionClient.getInstance().addConnection(connectionId,
info.notificationTimeout = 0; connection);
info.flags = AccessibilityServiceInfo.DEFAULT; } else {
connection.setServiceInfo(info); AccessibilityInteractionClient.getInstance().removeConnection(connectionId);
}
synchronized (MonkeySourceNetworkViews.class) {
notifyAll();
}
} }
public void onInterrupt() {} public void onInterrupt() {}
@@ -114,14 +124,37 @@ public class MonkeySourceNetworkViews {
public void onAccessibilityEvent(AccessibilityEvent event) { public void onAccessibilityEvent(AccessibilityEvent event) {
Log.d(TAG, "Accessibility Event"); Log.d(TAG, "Accessibility Event");
sLastAccessibilityEvent.set(AccessibilityEvent.obtain(event)); sLastAccessibilityEvent.set(AccessibilityEvent.obtain(event));
synchronized(sConnection) { synchronized (MonkeySourceNetworkViews.class) {
sConnection.notifyAll(); notifyAll();
} }
} }
}; };
IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface( IAccessibilityManager manager = IAccessibilityManager.Stub.asInterface(
ServiceManager.getService(Context.ACCESSIBILITY_SERVICE)); ServiceManager.getService(Context.ACCESSIBILITY_SERVICE));
return manager.registerEventListener(listener);
final long beginTime = SystemClock.uptimeMillis();
synchronized (MonkeySourceNetworkViews.class) {
manager.registerEventListener(listener);
while (true) {
if (sConnectionId != NO_ID) {
return sConnectionId;
}
final long elapsedTime = (SystemClock.uptimeMillis() - beginTime);
final long remainingTime = TIMEOUT_REGISTER_EVENT_LISTENER - elapsedTime;
if (remainingTime <= 0) {
if (sConnectionId == NO_ID) {
throw new IllegalStateException("Cound not register IEventListener.");
}
return sConnectionId;
}
try {
MonkeySourceNetworkViews.class.wait(remainingTime);
} catch (InterruptedException ie) {
/* ignore */
}
}
}
} }
/** /**
@@ -131,7 +164,7 @@ public class MonkeySourceNetworkViews {
*/ */
public static void setup() { public static void setup() {
try { try {
sConnection = getConnection(); sConnectionId = getConnection();
} catch (RemoteException re) { } catch (RemoteException re) {
Log.e(TAG,"Remote Exception encountered when" Log.e(TAG,"Remote Exception encountered when"
+ " attempting to connect to Accessibility Service"); + " attempting to connect to Accessibility Service");
@@ -208,14 +241,14 @@ public class MonkeySourceNetworkViews {
int windowId = Integer.parseInt(windowString); int windowId = Integer.parseInt(windowString);
int viewId = Integer.parseInt(viewString); int viewId = Integer.parseInt(viewString);
return AccessibilityInteractionClient.getInstance() return AccessibilityInteractionClient.getInstance()
.findAccessibilityNodeInfoByAccessibilityId(sConnection, windowId, viewId); .findAccessibilityNodeInfoByAccessibilityId(sConnectionId, windowId, viewId);
} }
private static AccessibilityNodeInfo getNodeByViewId(String viewId, AccessibilityEvent event) private static AccessibilityNodeInfo getNodeByViewId(String viewId, AccessibilityEvent event)
throws MonkeyViewException { throws MonkeyViewException {
int id = getId(viewId, event); int id = getId(viewId, event);
return AccessibilityInteractionClient.getInstance() return AccessibilityInteractionClient.getInstance()
.findAccessibilityNodeInfoByViewIdInActiveWindow(sConnection, id); .findAccessibilityNodeInfoByViewIdInActiveWindow(sConnectionId, id);
} }
/** /**
@@ -267,7 +300,7 @@ public class MonkeySourceNetworkViews {
public MonkeyCommandReturn translateCommand(List<String> command, public MonkeyCommandReturn translateCommand(List<String> command,
CommandQueue queue) { CommandQueue queue) {
if (command.size() > 2) { if (command.size() > 2) {
if (sConnection == null) { if (sConnectionId < 0) {
return new MonkeyCommandReturn(false, NO_CONNECTION); return new MonkeyCommandReturn(false, NO_CONNECTION);
} }
AccessibilityEvent lastEvent = sLastAccessibilityEvent.get(); AccessibilityEvent lastEvent = sLastAccessibilityEvent.get();
@@ -339,13 +372,13 @@ public class MonkeySourceNetworkViews {
// getviewswithtext "some text here" // getviewswithtext "some text here"
public MonkeyCommandReturn translateCommand(List<String> command, public MonkeyCommandReturn translateCommand(List<String> command,
CommandQueue queue) { CommandQueue queue) {
if (sConnection == null) { if (sConnectionId < 0) {
return new MonkeyCommandReturn(false, NO_CONNECTION); return new MonkeyCommandReturn(false, NO_CONNECTION);
} }
if (command.size() == 2) { if (command.size() == 2) {
String text = command.get(1); String text = command.get(1);
List<AccessibilityNodeInfo> nodes = AccessibilityInteractionClient.getInstance() List<AccessibilityNodeInfo> nodes = AccessibilityInteractionClient.getInstance()
.findAccessibilityNodeInfosByViewTextInActiveWindow(sConnection, text); .findAccessibilityNodeInfosByViewTextInActiveWindow(sConnectionId, text);
ViewIntrospectionCommand idGetter = new GetAccessibilityIds(); ViewIntrospectionCommand idGetter = new GetAccessibilityIds();
List<String> emptyArgs = new ArrayList<String>(); List<String> emptyArgs = new ArrayList<String>();
StringBuilder ids = new StringBuilder(); StringBuilder ids = new StringBuilder();