1998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler/*
2998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * Copyright (C) 2015 The Android Open Source Project
3998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler *
4998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * in compliance with the License. You may obtain a copy of the License at
6998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler *
7998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * http://www.apache.org/licenses/LICENSE-2.0
8998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler *
9998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * Unless required by applicable law or agreed to in writing, software distributed under the License
10998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * or implied. See the License for the specific language governing permissions and limitations under
12998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler * the License.
13998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler */
14998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
15c7652a82774f7587b7dacd2f9a38e7f428533855Adrian Roospackage com.android.tests.accessibilityeventlogger;
16998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
17998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerimport android.accessibilityservice.AccessibilityService;
18998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerimport android.accessibilityservice.AccessibilityServiceInfo;
19998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerimport android.util.Log;
20998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerimport android.view.accessibility.AccessibilityEvent;
21998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerimport android.widget.Toast;
22998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
23998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerimport java.util.Locale;
24998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
25998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandlerpublic class AELogger extends AccessibilityService {
26c7652a82774f7587b7dacd2f9a38e7f428533855Adrian Roos    private static final String TAG = AELogger.class.getSimpleName();
27998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
28998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    private static final int TOAST_EVENT_TYPES =
29998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler            AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_LONG_CLICKED;
30998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
31998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    @Override
32998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    public void onServiceConnected() {
33998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler      super.onServiceConnected();
34998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler      Log.v(TAG, "Service connected.");
35998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    }
36998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
37998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
38998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    @Override
39998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    public void onInterrupt() {
40998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler        // Do nothing
41998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    }
42998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
43998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    @Override
44998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    public void onAccessibilityEvent(AccessibilityEvent event) {
45c7652a82774f7587b7dacd2f9a38e7f428533855Adrian Roos        final String eventClass = event.getClassName() != null
46c7652a82774f7587b7dacd2f9a38e7f428533855Adrian Roos                ? event.getClassName().toString() : null;
47c7652a82774f7587b7dacd2f9a38e7f428533855Adrian Roos        final String eventText = event.getText() != null
48c7652a82774f7587b7dacd2f9a38e7f428533855Adrian Roos                ? String.valueOf(event.getText()).toLowerCase(Locale.getDefault()) : null;
49998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler        final String eventType = AccessibilityEvent.eventTypeToString(event.getEventType());
50998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
51998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler        Log.d(TAG, String.format(
52998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    "typ=%s cls=%s pkg=%s txt=%s dsc=%s",
53998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    eventType,
54998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    eventClass,
55998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    event.getPackageName(),
56998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    eventText,
57998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    event.getContentDescription()
58998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    ));
59998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler
60998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler        // Show selected event types
61998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler        if (0 != (TOAST_EVENT_TYPES & event.getEventType())) {
62998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler            final Toast toast = Toast.makeText(this,
63998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler                    eventType + ": " + eventClass, Toast.LENGTH_SHORT);
64998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler            toast.show();
65998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler        }
66998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler    }
67998e32db1f5aaf6bdb42c44029f5b44a31dc48d5Dan Sandler}
68