/* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.android.talkback.eventprocessor; import android.annotation.TargetApi; import android.os.Build; import android.os.Handler; import android.support.v4.view.accessibility.AccessibilityEventCompat; import android.view.accessibility.AccessibilityEvent; import com.android.talkback.R; import com.android.talkback.controller.FeedbackController; import com.android.utils.AccessibilityEventListener; /** * Produces continuous vibration feedback during framework gesture recognition. * <p> * Requires API 17+ (JB MR1). * </p> */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public class ProcessorGestureVibrator implements AccessibilityEventListener { /** The minimum API level required to use this class. */ public static final int MIN_API_LEVEL = Build.VERSION_CODES.JELLY_BEAN_MR1; /** Delay after a gesture starts before feedback begins. */ private static final int FEEDBACK_DELAY = 70; /** Feedback controller, used to vibrate and play sounds. */ private final FeedbackController mFeedbackController; public ProcessorGestureVibrator(FeedbackController feedbackController) { if (feedbackController == null) throw new IllegalStateException(); mFeedbackController = feedbackController; } @Override public void onAccessibilityEvent(AccessibilityEvent event) { switch (event.getEventType()) { case AccessibilityEventCompat.TYPE_GESTURE_DETECTION_START: mHandler.postDelayed(mFeedbackRunnable, FEEDBACK_DELAY); break; case AccessibilityEventCompat.TYPE_GESTURE_DETECTION_END: mHandler.removeCallbacks(mFeedbackRunnable); mFeedbackController.interrupt(); break; } } private final Handler mHandler = new Handler(); private final Runnable mFeedbackRunnable = new Runnable() { @Override public void run() { mFeedbackController.playHaptic(R.array.gesture_detection_repeated_pattern); mFeedbackController.playAuditory(R.raw.gesture_begin, 1.0f, 0.5f); } }; }