package com.oreilly.demo.android.pa.sensordemo; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.app.Service; import android.content.Intent; import android.os.Handler; import android.os.Message; import android.os.Vibrator; import android.speech.tts.TextToSpeech; import android.speech.tts.TextToSpeech.OnInitListener; import android.view.accessibility.AccessibilityEvent; public class Accessibility extends AccessibilityService implements OnInitListener { private static final int STOP = 0; private static final int END = 1; private static final int CLICK = 2; private static final long[] VIBRATEPATTERN = new long[] { 0L, 100L }; private final Handler accessHandler = new Handler() { @Override public void handleMessage(Message msg) { switch(msg.what) { case STOP: stopAccess(); break; case END: endAccess(); break; case CLICK: doClick((AccessibilityEvent) msg.obj); break; } } }; private TextToSpeech tts; private Vibrator vibrate; @Override protected void onServiceConnected () { super.onServiceConnected(); setUpAccessibilityType(); startServices(); } @Override public boolean onUnbind(Intent intent) { accessHandler.sendEmptyMessage(END); return false; } @Override public void onAccessibilityEvent(AccessibilityEvent event) { if(event.getEventType() == AccessibilityEvent.TYPE_VIEW_CLICKED) { Message.obtain(accessHandler, CLICK, event).sendToTarget(); } } @Override public void onInterrupt() { accessHandler.sendEmptyMessage(STOP); } @Override public void onInit(int status) { } private void setUpAccessibilityType() { AccessibilityServiceInfo info = new AccessibilityServiceInfo(); info.eventTypes = AccessibilityEvent.TYPES_ALL_MASK; info.notificationTimeout = 50; info.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC | AccessibilityServiceInfo.FEEDBACK_AUDIBLE | AccessibilityServiceInfo.FEEDBACK_HAPTIC | AccessibilityServiceInfo.FEEDBACK_SPOKEN | AccessibilityServiceInfo.FEEDBACK_VISUAL; info.packageNames = new String[1]; info.packageNames[0] = getPackageName(); // only handle this package setServiceInfo(info); } private void startServices() { tts = new TextToSpeech(this, this); vibrate = (Vibrator) getSystemService(Service.VIBRATOR_SERVICE); } private void stopAccess() { tts.stop(); vibrate.cancel(); } private void endAccess() { vibrate.cancel(); tts.shutdown(); } private void doClick(AccessibilityEvent event) { vibrate.vibrate(VIBRATEPATTERN, -1); tts.speak("Click", 2, null); } }