1c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown/* 2c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * Copyright (C) 2012 The Android Open Source Project 3c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * 4c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * you may not use this file except in compliance with the License. 6c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * You may obtain a copy of the License at 7c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * 8c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * 10c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * Unless required by applicable law or agreed to in writing, software 11c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * See the License for the specific language governing permissions and 14c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * limitations under the License. 15c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown */ 16c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 17c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownpackage android.os; 18c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 19a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context; 207b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlockimport android.media.AudioAttributes; 21c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownimport android.util.Log; 22c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 23c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown/** 24c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * Vibrator implementation that controls the main system vibrator. 25c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * 26c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown * @hide 27c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown */ 28c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brownpublic class SystemVibrator extends Vibrator { 29c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown private static final String TAG = "Vibrator"; 30c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 31c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown private final IVibratorService mService; 32c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown private final Binder mToken = new Binder(); 33c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 34c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public SystemVibrator() { 35a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService = IVibratorService.Stub.asInterface( 36a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn ServiceManager.getService("vibrator")); 37a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 38a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 39a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public SystemVibrator(Context context) { 401af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock super(context); 41c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown mService = IVibratorService.Stub.asInterface( 42c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown ServiceManager.getService("vibrator")); 43c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 44c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 45c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 46c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public boolean hasVibrator() { 47c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 48c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate; no vibrator service."); 49c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return false; 50c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 51c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 52c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return mService.hasVibrator(); 53c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 54c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 55c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return false; 56c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 57c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 58f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 59f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * @hide 60f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 61f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn @Override 627b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock public void vibrate(int uid, String opPkg, long milliseconds, AudioAttributes attributes) { 63c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 64c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate; no vibrator service."); 65c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return; 66c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 67c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 687b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock mService.vibrate(uid, opPkg, milliseconds, usageForAttributes(attributes), mToken); 69c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 70c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate.", e); 71c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 72c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 73c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 74f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 75f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * @hide 76f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 77c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 788fd7f1ed7c11d35b3f2a97878e68ee38a551dd15Christoph Studer public void vibrate(int uid, String opPkg, long[] pattern, int repeat, 797b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock AudioAttributes attributes) { 80c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 81c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate; no vibrator service."); 82c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return; 83c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 84c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown // catch this here because the server will do nothing. pattern may 85c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown // not be null, let that be checked, because the server will drop it 86c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown // anyway 87c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (repeat < pattern.length) { 88c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 897b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock mService.vibratePattern(uid, opPkg, pattern, repeat, usageForAttributes(attributes), 901af30c7ac480e5d335f267a3ac3b2e6c748ce240John Spurlock mToken); 91c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 92c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate.", e); 93c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 94c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } else { 95c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown throw new ArrayIndexOutOfBoundsException(); 96c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 97c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 98c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 997b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock private static int usageForAttributes(AudioAttributes attributes) { 1007b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock return attributes != null ? attributes.getUsage() : AudioAttributes.USAGE_UNKNOWN; 1017b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock } 1027b41467704f941b11af6aace3e40993afc7f6c6fJohn Spurlock 103c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 104c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public void cancel() { 105c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 106c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return; 107c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 108c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 109c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown mService.cancelVibrate(mToken); 110c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 111c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to cancel vibration.", e); 112c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 113c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 114c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown} 115