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 192da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport android.accessibilityservice.UiTestAutomationBridge; 202da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport android.view.accessibility.AccessibilityEvent; 212da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 222da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport com.android.commands.uiautomator.Launcher.Command; 232da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 242da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport java.text.SimpleDateFormat; 252da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhuimport java.util.Date; 262da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 272da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu/** 282da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Implementation of the events subcommand 292da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * 302da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu * Prints out accessibility events until process is stopped. 312da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu */ 322da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhupublic class EventsCommand extends Command { 332da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 342da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu private Object mQuitLock = new Object(); 352da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 362da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public EventsCommand() { 372da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu super("events"); 382da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 392da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 402da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 412da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public String shortHelp() { 422da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu return "prints out accessibility events until terminated"; 432da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 442da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 452da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 462da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public String detailedOptions() { 472da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu return null; 482da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 492da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu 502da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 512da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public void run(String[] args) { 522da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu final UiTestAutomationBridge bridge = new UiTestAutomationBridge() { 532da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu @Override 542da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu public void onAccessibilityEvent(AccessibilityEvent event) { 552da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); 562da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu System.out.println(String.format("%s %s", 572da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu formatter.format(new Date()), event.toString())); 582da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 592da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu }; 602da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu bridge.connect(); 612da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu // there's really no way to stop, essentially we just block indefinitely here and wait 622da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu // for user to press Ctrl+C 632da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu synchronized (mQuitLock) { 642da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu try { 652da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu mQuitLock.wait(); 662da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } catch (InterruptedException e) { 672da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu e.printStackTrace(); 682da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 692da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 702da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu } 712da677e322f0d46b8ea4f882d780f5ee4e97647aGuang Zhu} 72