Home | History | Annotate | Download | only in os
      1 /*
      2  * Copyright (C) 2006 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.os;
     18 
     19 import android.annotation.RequiresPermission;
     20 import android.annotation.SystemService;
     21 import android.app.ActivityThread;
     22 import android.content.Context;
     23 import android.media.AudioAttributes;
     24 import android.util.Log;
     25 
     26 /**
     27  * Class that operates the vibrator on the device.
     28  * <p>
     29  * If your process exits, any vibration you started will stop.
     30  * </p>
     31  */
     32 @SystemService(Context.VIBRATOR_SERVICE)
     33 public abstract class Vibrator {
     34     private static final String TAG = "Vibrator";
     35 
     36     private final String mPackageName;
     37 
     38     /**
     39      * @hide to prevent subclassing from outside of the framework
     40      */
     41     public Vibrator() {
     42         mPackageName = ActivityThread.currentPackageName();
     43     }
     44 
     45     /**
     46      * @hide to prevent subclassing from outside of the framework
     47      */
     48     protected Vibrator(Context context) {
     49         mPackageName = context.getOpPackageName();
     50     }
     51 
     52     /**
     53      * Check whether the hardware has a vibrator.
     54      *
     55      * @return True if the hardware has a vibrator, else false.
     56      */
     57     public abstract boolean hasVibrator();
     58 
     59     /**
     60      * Check whether the vibrator has amplitude control.
     61      *
     62      * @return True if the hardware can control the amplitude of the vibrations, otherwise false.
     63      */
     64     public abstract boolean hasAmplitudeControl();
     65 
     66     /**
     67      * Vibrate constantly for the specified period of time.
     68      *
     69      * @param milliseconds The number of milliseconds to vibrate.
     70      *
     71      * @deprecated Use {@link #vibrate(VibrationEffect)} instead.
     72      */
     73     @Deprecated
     74     @RequiresPermission(android.Manifest.permission.VIBRATE)
     75     public void vibrate(long milliseconds) {
     76         vibrate(milliseconds, null);
     77     }
     78 
     79     /**
     80      * Vibrate constantly for the specified period of time.
     81      *
     82      * @param milliseconds The number of milliseconds to vibrate.
     83      * @param attributes {@link AudioAttributes} corresponding to the vibration. For example,
     84      *        specify {@link AudioAttributes#USAGE_ALARM} for alarm vibrations or
     85      *        {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE} for
     86      *        vibrations associated with incoming calls.
     87      *
     88      * @deprecated Use {@link #vibrate(VibrationEffect, AudioAttributes)} instead.
     89      */
     90     @Deprecated
     91     @RequiresPermission(android.Manifest.permission.VIBRATE)
     92     public void vibrate(long milliseconds, AudioAttributes attributes) {
     93         try {
     94             // This ignores all exceptions to stay compatible with pre-O implementations.
     95             VibrationEffect effect =
     96                     VibrationEffect.createOneShot(milliseconds, VibrationEffect.DEFAULT_AMPLITUDE);
     97             vibrate(effect, attributes);
     98         } catch (IllegalArgumentException iae) {
     99             Log.e(TAG, "Failed to create VibrationEffect", iae);
    100         }
    101     }
    102 
    103     /**
    104      * Vibrate with a given pattern.
    105      *
    106      * <p>
    107      * Pass in an array of ints that are the durations for which to turn on or off
    108      * the vibrator in milliseconds.  The first value indicates the number of milliseconds
    109      * to wait before turning the vibrator on.  The next value indicates the number of milliseconds
    110      * for which to keep the vibrator on before turning it off.  Subsequent values alternate
    111      * between durations in milliseconds to turn the vibrator off or to turn the vibrator on.
    112      * </p><p>
    113      * To cause the pattern to repeat, pass the index into the pattern array at which
    114      * to start the repeat, or -1 to disable repeating.
    115      * </p>
    116      *
    117      * @param pattern an array of longs of times for which to turn the vibrator on or off.
    118      * @param repeat the index into pattern at which to repeat, or -1 if
    119      *        you don't want to repeat.
    120      *
    121      * @deprecated Use {@link #vibrate(VibrationEffect)} instead.
    122      */
    123     @Deprecated
    124     @RequiresPermission(android.Manifest.permission.VIBRATE)
    125     public void vibrate(long[] pattern, int repeat) {
    126         vibrate(pattern, repeat, null);
    127     }
    128 
    129     /**
    130      * Vibrate with a given pattern.
    131      *
    132      * <p>
    133      * Pass in an array of ints that are the durations for which to turn on or off
    134      * the vibrator in milliseconds.  The first value indicates the number of milliseconds
    135      * to wait before turning the vibrator on.  The next value indicates the number of milliseconds
    136      * for which to keep the vibrator on before turning it off.  Subsequent values alternate
    137      * between durations in milliseconds to turn the vibrator off or to turn the vibrator on.
    138      * </p><p>
    139      * To cause the pattern to repeat, pass the index into the pattern array at which
    140      * to start the repeat, or -1 to disable repeating.
    141      * </p>
    142      *
    143      * @param pattern an array of longs of times for which to turn the vibrator on or off.
    144      * @param repeat the index into pattern at which to repeat, or -1 if
    145      *        you don't want to repeat.
    146      * @param attributes {@link AudioAttributes} corresponding to the vibration. For example,
    147      *        specify {@link AudioAttributes#USAGE_ALARM} for alarm vibrations or
    148      *        {@link AudioAttributes#USAGE_NOTIFICATION_RINGTONE} for
    149      *        vibrations associated with incoming calls.
    150      *
    151      * @deprecated Use {@link #vibrate(VibrationEffect, AudioAttributes)} instead.
    152      */
    153     @Deprecated
    154     @RequiresPermission(android.Manifest.permission.VIBRATE)
    155     public void vibrate(long[] pattern, int repeat, AudioAttributes attributes) {
    156         // This call needs to continue throwing ArrayIndexOutOfBoundsException but ignore all other
    157         // exceptions for compatibility purposes
    158         if (repeat < -1 || repeat >= pattern.length) {
    159             Log.e(TAG, "vibrate called with repeat index out of bounds" +
    160                     " (pattern.length=" + pattern.length + ", index=" + repeat + ")");
    161             throw new ArrayIndexOutOfBoundsException();
    162         }
    163 
    164         try {
    165             vibrate(VibrationEffect.createWaveform(pattern, repeat), attributes);
    166         } catch (IllegalArgumentException iae) {
    167             Log.e(TAG, "Failed to create VibrationEffect", iae);
    168         }
    169     }
    170 
    171     @RequiresPermission(android.Manifest.permission.VIBRATE)
    172     public void vibrate(VibrationEffect vibe) {
    173         vibrate(vibe, null);
    174     }
    175 
    176     @RequiresPermission(android.Manifest.permission.VIBRATE)
    177     public void vibrate(VibrationEffect vibe, AudioAttributes attributes) {
    178         vibrate(Process.myUid(), mPackageName, vibe, attributes);
    179     }
    180 
    181     /**
    182      * Like {@link #vibrate(VibrationEffect, AudioAttributes)}, but allowing the caller to specify
    183      * that the vibration is owned by someone else.
    184      * @hide
    185      */
    186     @RequiresPermission(android.Manifest.permission.VIBRATE)
    187     public abstract void vibrate(int uid, String opPkg,
    188             VibrationEffect vibe, AudioAttributes attributes);
    189 
    190     /**
    191      * Turn the vibrator off.
    192      */
    193     @RequiresPermission(android.Manifest.permission.VIBRATE)
    194     public abstract void cancel();
    195 }
    196