OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 package org.chromium.device.vibration; | 5 package org.chromium.device.vibration; |
6 | 6 |
7 import android.content.Context; | 7 import android.content.Context; |
8 import android.content.pm.PackageManager; | 8 import android.content.pm.PackageManager; |
9 import android.media.AudioManager; | 9 import android.media.AudioManager; |
10 import android.os.Vibrator; | 10 import android.os.Vibrator; |
11 import android.util.Log; | 11 import android.util.Log; |
12 | 12 |
| 13 import org.chromium.base.VisibleForTesting; |
13 import org.chromium.mojo.system.MojoException; | 14 import org.chromium.mojo.system.MojoException; |
14 import org.chromium.mojom.device.VibrationManager; | 15 import org.chromium.mojom.device.VibrationManager; |
15 | 16 |
16 /** | 17 /** |
17 * Android implementation of the vibration manager service defined in | 18 * Android implementation of the vibration manager service defined in |
18 * device/vibration/vibration_manager.mojom. | 19 * device/vibration/vibration_manager.mojom. |
19 */ | 20 */ |
20 public class VibrationManagerImpl implements VibrationManager { | 21 public class VibrationManagerImpl implements VibrationManager { |
21 private static final String TAG = "VibrationManagerImpl"; | 22 private static final String TAG = "VibrationManagerImpl"; |
22 | 23 |
23 private static final long MINIMUM_VIBRATION_DURATION_MS = 1; // 1 millisecon
d | 24 private static final long MINIMUM_VIBRATION_DURATION_MS = 1; // 1 millisecon
d |
24 private static final long MAXIMUM_VIBRATION_DURATION_MS = 10000; // 10 secon
ds | 25 private static final long MAXIMUM_VIBRATION_DURATION_MS = 10000; // 10 secon
ds |
25 | 26 |
26 private final AudioManager mAudioManager; | 27 private final AudioManager mAudioManager; |
27 private final Vibrator mVibrator; | 28 private final Vibrator mVibrator; |
28 private final boolean mHasVibratePermission; | 29 private final boolean mHasVibratePermission; |
29 | 30 |
| 31 private static AndroidVibratorWrapper sVibratorWrapper; |
| 32 |
| 33 /** |
| 34 * Android Vibrator wrapper class provided to test code to extend. |
| 35 */ |
| 36 @VisibleForTesting |
| 37 public static class AndroidVibratorWrapper { |
| 38 protected AndroidVibratorWrapper() {} |
| 39 |
| 40 public void vibrate(Vibrator vibrator, long milliseconds) { |
| 41 vibrator.vibrate(milliseconds); |
| 42 } |
| 43 |
| 44 public void cancel(Vibrator vibrator) { |
| 45 vibrator.cancel(); |
| 46 } |
| 47 } |
| 48 |
| 49 // Test code can use this function to inject other wrapper for testing. |
| 50 public static void setVibratorWrapperForTesting(AndroidVibratorWrapper wrapp
er) { |
| 51 sVibratorWrapper = wrapper; |
| 52 } |
| 53 |
30 public VibrationManagerImpl(Context context) { | 54 public VibrationManagerImpl(Context context) { |
31 mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SE
RVICE); | 55 mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SE
RVICE); |
32 mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE
); | 56 mVibrator = (Vibrator) context.getSystemService(Context.VIBRATOR_SERVICE
); |
| 57 if (sVibratorWrapper == null) { |
| 58 sVibratorWrapper = new AndroidVibratorWrapper(); |
| 59 } |
33 mHasVibratePermission = | 60 mHasVibratePermission = |
34 context.checkCallingOrSelfPermission(android.Manifest.permission
.VIBRATE) | 61 context.checkCallingOrSelfPermission(android.Manifest.permission
.VIBRATE) |
35 == PackageManager.PERMISSION_GRANTED; | 62 == PackageManager.PERMISSION_GRANTED; |
36 if (!mHasVibratePermission) { | 63 if (!mHasVibratePermission) { |
37 Log.w(TAG, "Failed to use vibrate API, requires VIBRATE permission."
); | 64 Log.w(TAG, "Failed to use vibrate API, requires VIBRATE permission."
); |
38 } | 65 } |
39 } | 66 } |
40 | 67 |
41 @Override | 68 @Override |
42 public void close() {} | 69 public void close() {} |
43 | 70 |
44 @Override | 71 @Override |
45 public void onConnectionError(MojoException e) {} | 72 public void onConnectionError(MojoException e) {} |
46 | 73 |
47 @Override | 74 @Override |
48 public void vibrate(long milliseconds) { | 75 public void vibrate(long milliseconds) { |
49 // Though the Blink implementation already sanitizes vibration times, do
n't | 76 // Though the Blink implementation already sanitizes vibration times, do
n't |
50 // trust any values passed from the client. | 77 // trust any values passed from the client. |
51 long sanitizedMilliseconds = Math.max(MINIMUM_VIBRATION_DURATION_MS, | 78 long sanitizedMilliseconds = Math.max(MINIMUM_VIBRATION_DURATION_MS, |
52 Math.min(milliseconds, MAXIMUM_VIBRATION_DURATION_MS)); | 79 Math.min(milliseconds, MAXIMUM_VIBRATION_DURATION_MS)); |
53 | 80 |
54 if (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT | 81 if (mAudioManager.getRingerMode() != AudioManager.RINGER_MODE_SILENT |
55 && mHasVibratePermission) { | 82 && mHasVibratePermission) { |
56 mVibrator.vibrate(sanitizedMilliseconds); | 83 sVibratorWrapper.vibrate(mVibrator, sanitizedMilliseconds); |
57 } | 84 } |
58 } | 85 } |
59 | 86 |
60 @Override | 87 @Override |
61 public void cancel() { | 88 public void cancel() { |
62 if (mHasVibratePermission) mVibrator.cancel(); | 89 if (mHasVibratePermission) sVibratorWrapper.cancel(mVibrator); |
63 } | 90 } |
64 } | 91 } |
OLD | NEW |