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