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