summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorLais Andrade <lsandrade@google.com>2021-03-30 18:32:29 +0000
committerLais Andrade <lsandrade@google.com>2021-04-13 13:04:05 +0000
commit6e075783ee90c4e539e98e0335c97772d0a49812 (patch)
treeb656e9506dc468ed35ed1d59a4584d7261f0d492 /core/java/android
parentf5195618f89aa76a75df7f33d99775dc8bcc5c7a (diff)
Add Vibrator.cancel method with usage filters
Add a new hidden API to Vibrator and VibratorManager that allows vibrations to be cancelled based on their usage attribute. The new API is used by the NotificationManagerService on volume button press to only cancel ongoing attentional haptics, triggered for alarm, notification or ringtone. Fix: 182440404 Test: VibratorManagerTest & BuzzBeepBlinkTest Change-Id: I4bf55928cf3b7dd79f66d53d570001a5205ce2d0
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/hardware/input/InputDeviceVibrator.java5
-rw-r--r--core/java/android/hardware/input/InputDeviceVibratorManager.java5
-rw-r--r--core/java/android/os/IVibratorManagerService.aidl2
-rw-r--r--core/java/android/os/NullVibrator.java4
-rw-r--r--core/java/android/os/SystemVibrator.java9
-rw-r--r--core/java/android/os/SystemVibratorManager.java67
-rw-r--r--core/java/android/os/Vibrator.java10
-rw-r--r--core/java/android/os/VibratorManager.java10
8 files changed, 71 insertions, 41 deletions
diff --git a/core/java/android/hardware/input/InputDeviceVibrator.java b/core/java/android/hardware/input/InputDeviceVibrator.java
index a4817ae27fa5..1ab183626d2e 100644
--- a/core/java/android/hardware/input/InputDeviceVibrator.java
+++ b/core/java/android/hardware/input/InputDeviceVibrator.java
@@ -175,4 +175,9 @@ final class InputDeviceVibrator extends Vibrator {
public void cancel() {
mInputManager.cancelVibrate(mDeviceId, mToken);
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ cancel();
+ }
}
diff --git a/core/java/android/hardware/input/InputDeviceVibratorManager.java b/core/java/android/hardware/input/InputDeviceVibratorManager.java
index ed0efffbb346..7caff7209cc5 100644
--- a/core/java/android/hardware/input/InputDeviceVibratorManager.java
+++ b/core/java/android/hardware/input/InputDeviceVibratorManager.java
@@ -134,4 +134,9 @@ public class InputDeviceVibratorManager extends VibratorManager
public void cancel() {
mInputManager.cancelVibrate(mDeviceId, mToken);
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ cancel();
+ }
}
diff --git a/core/java/android/os/IVibratorManagerService.aidl b/core/java/android/os/IVibratorManagerService.aidl
index c58cc4f9988f..a0d6ce1ba108 100644
--- a/core/java/android/os/IVibratorManagerService.aidl
+++ b/core/java/android/os/IVibratorManagerService.aidl
@@ -32,5 +32,5 @@ interface IVibratorManagerService {
in CombinedVibration vibration, in VibrationAttributes attributes);
void vibrate(int uid, String opPkg, in CombinedVibration vibration,
in VibrationAttributes attributes, String reason, IBinder token);
- void cancelVibrate(IBinder token);
+ void cancelVibrate(int usageFilter, IBinder token);
}
diff --git a/core/java/android/os/NullVibrator.java b/core/java/android/os/NullVibrator.java
index 6bb016519a84..7859b5cfe5df 100644
--- a/core/java/android/os/NullVibrator.java
+++ b/core/java/android/os/NullVibrator.java
@@ -54,4 +54,8 @@ public class NullVibrator extends Vibrator {
@Override
public void cancel() {
}
+
+ @Override
+ public void cancel(int usageFilter) {
+ }
}
diff --git a/core/java/android/os/SystemVibrator.java b/core/java/android/os/SystemVibrator.java
index 2e8ecb59b0d3..70808594225f 100644
--- a/core/java/android/os/SystemVibrator.java
+++ b/core/java/android/os/SystemVibrator.java
@@ -256,6 +256,15 @@ public class SystemVibrator extends Vibrator {
mVibratorManager.cancel();
}
+ @Override
+ public void cancel(int usageFilter) {
+ if (mVibratorManager == null) {
+ Log.w(TAG, "Failed to cancel vibrate; no vibrator manager.");
+ return;
+ }
+ mVibratorManager.cancel(usageFilter);
+ }
+
/**
* Tries to unregister individual {@link android.os.Vibrator.OnVibratorStateChangedListener}
* that were left registered to vibrators after failures to register them to all vibrators.
diff --git a/core/java/android/os/SystemVibratorManager.java b/core/java/android/os/SystemVibratorManager.java
index 84a1016e3364..ba86c6f9ec1a 100644
--- a/core/java/android/os/SystemVibratorManager.java
+++ b/core/java/android/os/SystemVibratorManager.java
@@ -146,12 +146,21 @@ public class SystemVibratorManager extends VibratorManager {
@Override
public void cancel() {
+ cancelVibration(/* usageFilter= */ -1);
+ }
+
+ @Override
+ public void cancel(int usageFilter) {
+ cancelVibration(usageFilter);
+ }
+
+ private void cancelVibration(int usageFilter) {
if (mService == null) {
Log.w(TAG, "Failed to cancel vibration; no vibrator manager service.");
return;
}
try {
- mService.cancelVibrate(mToken);
+ mService.cancelVibrate(usageFilter, mToken);
} catch (RemoteException e) {
Log.w(TAG, "Failed to cancel vibration.", e);
}
@@ -232,54 +241,32 @@ public class SystemVibratorManager extends VibratorManager {
@Override
public boolean setAlwaysOnEffect(int uid, String opPkg, int alwaysOnId,
@Nullable VibrationEffect effect, @Nullable AudioAttributes attributes) {
- if (mService == null) {
- Log.w(TAG, "Failed to set always-on effect on vibrator " + mVibratorInfo.getId()
- + "; no vibrator manager service.");
- return false;
- }
- try {
- VibrationAttributes attr = new VibrationAttributes.Builder(
- attributes, effect).build();
- CombinedVibration combined = CombinedVibration.startParallel()
- .addVibrator(mVibratorInfo.getId(), effect)
- .combine();
- return mService.setAlwaysOnEffect(uid, opPkg, alwaysOnId, combined, attr);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to set always-on effect on vibrator " + mVibratorInfo.getId());
- }
- return false;
+ VibrationAttributes attr = new VibrationAttributes.Builder(
+ attributes, effect).build();
+ CombinedVibration combined = CombinedVibration.startParallel()
+ .addVibrator(mVibratorInfo.getId(), effect)
+ .combine();
+ return SystemVibratorManager.this.setAlwaysOnEffect(uid, opPkg, alwaysOnId, combined,
+ attr);
}
@Override
public void vibrate(int uid, String opPkg, @NonNull VibrationEffect vibe, String reason,
@NonNull VibrationAttributes attributes) {
- if (mService == null) {
- Log.w(TAG, "Failed to vibrate on vibrator " + mVibratorInfo.getId()
- + "; no vibrator manager service.");
- return;
- }
- try {
- CombinedVibration combined = CombinedVibration.startParallel()
- .addVibrator(mVibratorInfo.getId(), vibe)
- .combine();
- mService.vibrate(uid, opPkg, combined, attributes, reason, mToken);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to vibrate.", e);
- }
+ CombinedVibration combined = CombinedVibration.startParallel()
+ .addVibrator(mVibratorInfo.getId(), vibe)
+ .combine();
+ SystemVibratorManager.this.vibrate(uid, opPkg, combined, reason, attributes);
}
@Override
public void cancel() {
- if (mService == null) {
- Log.w(TAG, "Failed to cancel vibration on vibrator " + mVibratorInfo.getId()
- + "; no vibrator manager service.");
- return;
- }
- try {
- mService.cancelVibrate(mToken);
- } catch (RemoteException e) {
- Log.w(TAG, "Failed to cancel vibration on vibrator " + mVibratorInfo.getId(), e);
- }
+ SystemVibratorManager.this.cancel();
+ }
+
+ @Override
+ public void cancel(int usageFilter) {
+ SystemVibratorManager.this.cancel(usageFilter);
}
@Override
diff --git a/core/java/android/os/Vibrator.java b/core/java/android/os/Vibrator.java
index a0f70c8fa526..54cb83f7caf1 100644
--- a/core/java/android/os/Vibrator.java
+++ b/core/java/android/os/Vibrator.java
@@ -494,6 +494,16 @@ public abstract class Vibrator {
public abstract void cancel();
/**
+ * Cancel specific types of ongoing vibrations.
+ *
+ * @param usageFilter The type of vibration to be cancelled, represented as a bitwise
+ * combination of {@link VibrationAttributes.Usage} values.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.VIBRATE)
+ public abstract void cancel(int usageFilter);
+
+ /**
* Check whether the vibrator is vibrating.
*
* @return True if the hardware is vibrating, otherwise false.
diff --git a/core/java/android/os/VibratorManager.java b/core/java/android/os/VibratorManager.java
index 7c911160dfa6..01cece39b922 100644
--- a/core/java/android/os/VibratorManager.java
+++ b/core/java/android/os/VibratorManager.java
@@ -136,4 +136,14 @@ public abstract class VibratorManager {
*/
@RequiresPermission(android.Manifest.permission.VIBRATE)
public abstract void cancel();
+
+ /**
+ * Cancel specific types of ongoing vibrations.
+ *
+ * @param usageFilter The type of vibration to be cancelled, represented as a bitwise
+ * combination of {@link VibrationAttributes.Usage} values.
+ * @hide
+ */
+ @RequiresPermission(android.Manifest.permission.VIBRATE)
+ public abstract void cancel(int usageFilter);
}