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