From 082a59a1cc916b76b7c1f61ffdeb3bf8f5a23923 Mon Sep 17 00:00:00 2001 From: Alexey Kuzmin Date: Thu, 4 Apr 2019 12:01:48 +0100 Subject: [PATCH] Don't ban background vibration with USAGE_ALARM Test: manual, schedule a vibration-only alarm and see it vibrates Bug: 129297051 Change-Id: I3e0b8551b47196964168731061630362b5b17558 --- .../com/android/server/VibratorService.java | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/VibratorService.java b/services/core/java/com/android/server/VibratorService.java index 5d0fa26f640ed..a1e388a7555c6 100644 --- a/services/core/java/com/android/server/VibratorService.java +++ b/services/core/java/com/android/server/VibratorService.java @@ -113,6 +113,7 @@ public class VibratorService extends IVibratorService.Stub private final SparseArray mScaleLevels; private final LinkedList mPreviousRingVibrations; private final LinkedList mPreviousNotificationVibrations; + private final LinkedList mPreviousAlarmVibrations; private final LinkedList mPreviousVibrations; private final int mPreviousVibrationsLimit; private final boolean mAllowPriorityVibrationsInLowPowerMode; @@ -258,6 +259,10 @@ public class VibratorService extends IVibratorService.Stub return VibratorService.this.isRingtone(usageHint); } + public boolean isAlarm() { + return VibratorService.this.isAlarm(usageHint); + } + public boolean isFromSystem() { return uid == Process.SYSTEM_UID || uid == 0 || SYSTEM_UI_PACKAGE.equals(opPkg); } @@ -358,6 +363,7 @@ public class VibratorService extends IVibratorService.Stub mPreviousRingVibrations = new LinkedList<>(); mPreviousNotificationVibrations = new LinkedList<>(); + mPreviousAlarmVibrations = new LinkedList<>(); mPreviousVibrations = new LinkedList<>(); IntentFilter filter = new IntentFilter(); @@ -597,7 +603,7 @@ public class VibratorService extends IVibratorService.Stub Vibration vib = new Vibration(token, effect, usageHint, uid, opPkg, reason); if (mProcStatesCache.get(uid, ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND - && !vib.isNotification() && !vib.isRingtone()) { + && !vib.isNotification() && !vib.isRingtone() && !vib.isAlarm()) { Slog.e(TAG, "Ignoring incoming vibration as process with" + " uid = " + uid + " is background," + " usage = " + AudioAttributes.usageToString(vib.usageHint)); @@ -629,6 +635,8 @@ public class VibratorService extends IVibratorService.Stub previousVibrations = mPreviousRingVibrations; } else if (vib.isNotification()) { previousVibrations = mPreviousNotificationVibrations; + } else if (vib.isAlarm()) { + previousVibrations = mPreviousAlarmVibrations; } else { previousVibrations = mPreviousVibrations; } @@ -793,6 +801,8 @@ public class VibratorService extends IVibratorService.Stub return mNotificationIntensity; } else if (vib.isHapticFeedback()) { return mHapticFeedbackIntensity; + } else if (vib.isAlarm()) { + return Vibrator.VIBRATION_INTENSITY_HIGH; } else { return Vibrator.VIBRATION_INTENSITY_MEDIUM; } @@ -817,6 +827,8 @@ public class VibratorService extends IVibratorService.Stub defaultIntensity = mVibrator.getDefaultNotificationVibrationIntensity(); } else if (vib.isHapticFeedback()) { defaultIntensity = mVibrator.getDefaultHapticFeedbackIntensity(); + } else if (vib.isAlarm()) { + defaultIntensity = Vibrator.VIBRATION_INTENSITY_HIGH; } else { // If we don't know what kind of vibration we're playing then just skip scaling for // now. @@ -1149,6 +1161,10 @@ public class VibratorService extends IVibratorService.Stub return usageHint == AudioAttributes.USAGE_ASSISTANCE_SONIFICATION; } + private static boolean isAlarm(int usageHint) { + return usageHint == AudioAttributes.USAGE_ALARM; + } + private void noteVibratorOnLocked(int uid, long millis) { try { mBatteryStatsService.noteVibratorOn(uid, millis); @@ -1380,6 +1396,12 @@ public class VibratorService extends IVibratorService.Stub pw.println(info.toString()); } + pw.println(" Previous alarm vibrations:"); + for (VibrationInfo info : mPreviousAlarmVibrations) { + pw.print(" "); + pw.println(info.toString()); + } + pw.println(" Previous vibrations:"); for (VibrationInfo info : mPreviousVibrations) { pw.print(" "); @@ -1445,6 +1467,9 @@ public class VibratorService extends IVibratorService.Stub } else if (isHapticFeedback(usage)) { defaultIntensity = mVibrator.getDefaultHapticFeedbackIntensity(); currentIntensity = mHapticFeedbackIntensity; + } else if (isAlarm(usage)) { + defaultIntensity = Vibrator.VIBRATION_INTENSITY_HIGH; + currentIntensity = Vibrator.VIBRATION_INTENSITY_HIGH; } else { defaultIntensity = 0; currentIntensity = 0;