118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/* 218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Copyright (C) 2012 The Android Open Source Project 318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Licensed under the Apache License, Version 2.0 (the "License"); 518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * you may not use this file except in compliance with the License. 618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * You may obtain a copy of the License at 718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * http://www.apache.org/licenses/LICENSE-2.0 918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 1018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Unless required by applicable law or agreed to in writing, software 1118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * distributed under the License is distributed on an "AS IS" BASIS, 1218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * See the License for the specific language governing permissions and 1418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * limitations under the License. 1518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 1618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupackage com.android.commands.uiautomator; 1818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 1918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.app.UiAutomation.OnAccessibilityEventListener; 2018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport android.view.accessibility.AccessibilityEvent; 2118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport com.android.commands.uiautomator.Launcher.Command; 2318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport com.android.uiautomator.core.UiAutomationShellWrapper; 2418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport java.text.SimpleDateFormat; 2618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhuimport java.util.Date; 2718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 2818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu/** 2918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Implementation of the events subcommand 3018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * 3118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu * Prints out accessibility events until process is stopped. 3218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu */ 3318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhupublic class EventsCommand extends Command { 3418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu private Object mQuitLock = new Object(); 3618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 3718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public EventsCommand() { 3818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu super("events"); 3918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 4018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 4218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public String shortHelp() { 4318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return "prints out accessibility events until terminated"; 4418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 4518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 4618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 4718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public String detailedOptions() { 4818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu return null; 4918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 5018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu 5118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 5218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void run(String[] args) { 5318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu UiAutomationShellWrapper automationWrapper = new UiAutomationShellWrapper(); 5418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu automationWrapper.connect(); 5518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu automationWrapper.getUiAutomation().setOnAccessibilityEventListener( 5618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu new OnAccessibilityEventListener() { 5718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu @Override 5818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu public void onAccessibilityEvent(AccessibilityEvent event) { 5918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu SimpleDateFormat formatter = new SimpleDateFormat("MM-dd HH:mm:ss.SSS"); 6018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu System.out.println(String.format("%s %s", 6118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu formatter.format(new Date()), event.toString())); 6218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 6318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu }); 6418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // there's really no way to stop, essentially we just block indefinitely here and wait 6518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu // for user to press Ctrl+C 6618b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu synchronized (mQuitLock) { 6718b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu try { 6818b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu mQuitLock.wait(); 6918b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } catch (InterruptedException e) { 7018b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu e.printStackTrace(); 7118b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7218b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7318b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu automationWrapper.disconnect(); 7418b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu } 7518b892c723e812a7e111f102d2b0c0782b116bb6Guang Zhu} 76