19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.os;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrickimport android.util.Log;
20e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Class that operates the vibrator on the device.
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * If your process exits, any vibration you started with will stop.
25d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown * </p>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class Vibrator
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
29e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick    private static final String TAG = "Vibrator";
30e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick
313a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood    IVibratorService mService;
3218dd5f0d25f1004e123dc265dc498a8bf8897af9Patrick Scott    private final Binder mToken = new Binder();
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /** @hide */
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public Vibrator()
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
373a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood        mService = IVibratorService.Stub.asInterface(
383a32213c4029a03fe39486f3d6ebd0ea18928ee1Mike Lockwood                ServiceManager.getService("vibrator"));
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
42ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn     * Check whether the hardware has a vibrator.  Returns true if a vibrator
43ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn     * exists, else false.
44ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn     */
45ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn    public boolean hasVibrator() {
46ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn        if (mService == null) {
47ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn            Log.w(TAG, "Failed to vibrate; no vibrator service.");
48ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn            return false;
49ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn        }
50ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn        try {
51ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn            return mService.hasVibrator();
52ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn        } catch (RemoteException e) {
53ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn        }
54ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn        return false;
55ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn    }
56ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn
57ea9020e0854427d47e566a1394df6749f3265410Dianne Hackborn    /**
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Turn the vibrator on.
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
60d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * @param milliseconds The number of milliseconds to vibrate.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void vibrate(long milliseconds)
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
64e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick        if (mService == null) {
65e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            Log.w(TAG, "Failed to vibrate; no vibrator service.");
66e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            return;
67e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick        }
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
6918dd5f0d25f1004e123dc265dc498a8bf8897af9Patrick Scott            mService.vibrate(milliseconds, mToken);
7026e9cf38b229b738b4e56c3e08be82a9c0f11e64Brad Fitzpatrick        } catch (RemoteException e) {
71e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            Log.w(TAG, "Failed to vibrate.", e);
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Vibrate with a given pattern.
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * <p>
79d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * Pass in an array of ints that are the durations for which to turn on or off
80d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * the vibrator in milliseconds.  The first value indicates the number of milliseconds
81d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * to wait before turning the vibrator on.  The next value indicates the number of milliseconds
82d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * for which to keep the vibrator on before turning it off.  Subsequent values alternate
83d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * between durations in milliseconds to turn the vibrator off or to turn the vibrator on.
84d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * </p><p>
85d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * To cause the pattern to repeat, pass the index into the pattern array at which
86d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * to start the repeat, or -1 to disable repeating.
87d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * </p>
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
89d10bfe185c336d813845c9beb1f4041c5daa1669Jeff Brown     * @param pattern an array of longs of times for which to turn the vibrator on or off.
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param repeat the index into pattern at which to repeat, or -1 if
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *        you don't want to repeat.
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void vibrate(long[] pattern, int repeat)
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
95e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick        if (mService == null) {
96e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            Log.w(TAG, "Failed to vibrate; no vibrator service.");
97e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            return;
98e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick        }
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // catch this here because the server will do nothing.  pattern may
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // not be null, let that be checked, because the server will drop it
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // anyway
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (repeat < pattern.length) {
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            try {
10418dd5f0d25f1004e123dc265dc498a8bf8897af9Patrick Scott                mService.vibratePattern(pattern, repeat, mToken);
10526e9cf38b229b738b4e56c3e08be82a9c0f11e64Brad Fitzpatrick            } catch (RemoteException e) {
106e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick                Log.w(TAG, "Failed to vibrate.", e);
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            throw new ArrayIndexOutOfBoundsException();
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Turn the vibrator off.
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public void cancel()
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    {
118e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick        if (mService == null) {
119e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            return;
120e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick        }
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        try {
12218dd5f0d25f1004e123dc265dc498a8bf8897af9Patrick Scott            mService.cancelVibrate(mToken);
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } catch (RemoteException e) {
124e331644cb570e74a8739cb21ffcc5875663ffa58Brad Fitzpatrick            Log.w(TAG, "Failed to cancel vibration.", e);
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
128