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 19f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackbornimport android.app.ActivityThread; 20a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackbornimport android.content.Context; 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 31a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn private final String mPackageName; 32c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown private final IVibratorService mService; 33c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown private final Binder mToken = new Binder(); 34c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 35c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public SystemVibrator() { 36f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn mPackageName = ActivityThread.currentPackageName(); 37a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn mService = IVibratorService.Stub.asInterface( 38a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn ServiceManager.getService("vibrator")); 39a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn } 40a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn 41a06de0f29b58df9246779cc4bfd8f06f7205ddb6Dianne Hackborn public SystemVibrator(Context context) { 4295d785346b4dae808a2d8f77356175e55a572d96Dianne Hackborn mPackageName = context.getOpPackageName(); 43c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown mService = IVibratorService.Stub.asInterface( 44c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown ServiceManager.getService("vibrator")); 45c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 46c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 47c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 48c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public boolean hasVibrator() { 49c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 50c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate; no vibrator service."); 51c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return false; 52c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 53c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 54c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return mService.hasVibrator(); 55c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 56c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 57c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return false; 58c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 59c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 60c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 61c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public void vibrate(long milliseconds) { 62f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn vibrate(Process.myUid(), mPackageName, milliseconds); 63f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn } 64f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 65f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn @Override 66f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public void vibrate(long[] pattern, int repeat) { 67f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn vibrate(Process.myUid(), mPackageName, pattern, repeat); 68f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn } 69f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn 70f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 71f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * @hide 72f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 73f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn @Override 74f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public void vibrate(int owningUid, String owningPackage, long milliseconds) { 75c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 76c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate; no vibrator service."); 77c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return; 78c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 79c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 80f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn mService.vibrate(owningUid, owningPackage, milliseconds, mToken); 81c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 82c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate.", e); 83c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 84c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 85c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 86f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn /** 87f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn * @hide 88f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn */ 89c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 90f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn public void vibrate(int owningUid, String owningPackage, long[] pattern, int repeat) { 91c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 92c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate; no vibrator service."); 93c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return; 94c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 95c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown // catch this here because the server will do nothing. pattern may 96c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown // not be null, let that be checked, because the server will drop it 97c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown // anyway 98c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (repeat < pattern.length) { 99c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 100f265ea9d8307282ff1da3915978625a94fc2859eDianne Hackborn mService.vibratePattern(owningUid, owningPackage, pattern, repeat, mToken); 101c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 102c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to vibrate.", e); 103c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 104c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } else { 105c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown throw new ArrayIndexOutOfBoundsException(); 106c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 107c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 108c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown 109c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown @Override 110c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown public void cancel() { 111c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown if (mService == null) { 112c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown return; 113c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 114c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown try { 115c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown mService.cancelVibrate(mToken); 116c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } catch (RemoteException e) { 117c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown Log.w(TAG, "Failed to cancel vibration.", e); 118c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 119c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown } 120c2346134bb519a54d50655cbef940fc3fdec60a9Jeff Brown} 121