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