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