12da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu/* 22da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Copyright (C) 2012 The Android Open Source Project 32da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * 42da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 52da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * you may not use this file except in compliance with the License. 62da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * You may obtain a copy of the License at 72da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * 82da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * http://www.apache.org/licenses/LICENSE-2.0 92da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * 102da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Unless required by applicable law or agreed to in writing, software 112da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 122da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * See the License for the specific language governing permissions and 142da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * limitations under the License. 152da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu */ 162da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 172da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhupackage com.android.commands.uiautomator; 182da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 1989f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovimport android.app.UiAutomation.OnAccessibilityEventListener; 202da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport android.view.accessibility.AccessibilityEvent; 212da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 222da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport com.android.commands.uiautomator.Launcher.Command; 2389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganovimport com.android.uiautomator.core.UiAutomationShellWrapper; 242da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 252da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport java.text.SimpleDateFormat; 262da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport java.util.Date; 272da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 282da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu/** 292da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Implementation of the events subcommand 302da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * 312da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Prints out accessibility events until process is stopped. 322da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu */ 332da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhupublic class EventsCommand extends Command { 342da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 352da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu private Object mQuitLock = new Object(); 362da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 372da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public EventsCommand() { 382da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu super("events"); 392da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 402da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 412da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 422da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public String shortHelp() { 432da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu return "prints out accessibility events until terminated"; 442da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 452da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 462da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 472da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public String detailedOptions() { 482da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu return null; 492da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 502da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 512da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 522da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public void run(String[] args) { 5389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov UiAutomationShellWrapper automationWrapper = new UiAutomationShellWrapper(); 5489f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov automationWrapper.connect(); 5589f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov automationWrapper.getUiAutomation().setOnAccessibilityEventListener( 5689f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov new OnAccessibilityEventListener() { 572da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 582da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public void onAccessibilityEvent(AccessibilityEvent event) { 592da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); 602da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu System.out.println(String.format("%s %s", 612da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu formatter.format(new Date()), event.toString())); 622da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 6389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov }); 642da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu // there's really no way to stop, essentially we just block indefinitely here and wait 652da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu // for user to press Ctrl+C 662da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu synchronized (mQuitLock) { 672da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu try { 682da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu mQuitLock.wait(); 692da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } catch (InterruptedException e) { 702da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu e.printStackTrace(); 712da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 722da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 7389f6117cb1fbeab3770106cf54e05af1f597be81Svetoslav Ganov automationWrapper.disconnect(); 742da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 752da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu} 76