diff --git a/services/core/java/com/android/server/vibrator/VibrationSettings.java b/services/core/java/com/android/server/vibrator/VibrationSettings.java index a34a50737ec5f..536375f1311d6 100644 --- a/services/core/java/com/android/server/vibrator/VibrationSettings.java +++ b/services/core/java/com/android/server/vibrator/VibrationSettings.java @@ -36,6 +36,7 @@ import android.provider.Settings; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; +import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import java.util.ArrayList; @@ -59,7 +60,8 @@ public final class VibrationSettings { private final Vibrator mVibrator; private final AudioManager mAudioManager; private final SettingsObserver mSettingObserver; - private final UidObserver mUidObserver; + @VisibleForTesting + final UidObserver mUidObserver; @GuardedBy("mLock") private final List mListeners = new ArrayList<>(); @@ -251,8 +253,7 @@ public final class VibrationSettings { * allowed to play in the background (i.e. it's a notification, ringtone or alarm vibration). */ public boolean shouldVibrateForUid(int uid, int usageHint) { - return mUidObserver.isUidForeground(uid) || isNotification(usageHint) - || isRingtone(usageHint) || isAlarm(usageHint); + return mUidObserver.isUidForeground(uid) || isClassAlarm(usageHint); } /** @@ -292,6 +293,11 @@ public final class VibrationSettings { return usageHint == VibrationAttributes.USAGE_ALARM; } + private static boolean isClassAlarm(int usageHint) { + return (usageHint & VibrationAttributes.USAGE_CLASS_MASK) + == VibrationAttributes.USAGE_CLASS_ALARM; + } + /** Updates all vibration settings and triggers registered listeners. */ public void updateSettings() { synchronized (mLock) { @@ -414,7 +420,8 @@ public final class VibrationSettings { } /** Implementation of {@link ContentObserver} to be registered to a setting {@link Uri}. */ - private final class UidObserver extends IUidObserver.Stub { + @VisibleForTesting + final class UidObserver extends IUidObserver.Stub { private final SparseArray mProcStatesCache = new SparseArray<>(); public boolean isUidForeground(int uid) { diff --git a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java index ecdb8bc71bd84..1e112da8fe7c7 100644 --- a/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java +++ b/services/tests/servicestests/src/com/android/server/vibrator/VibrationSettingsTest.java @@ -29,6 +29,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; +import android.app.ActivityManager; import android.content.ContentResolver; import android.content.Context; import android.content.ContextWrapper; @@ -36,7 +37,6 @@ import android.media.AudioManager; import android.os.Handler; import android.os.PowerManagerInternal; import android.os.PowerSaveState; -import android.os.RemoteException; import android.os.UserHandle; import android.os.VibrationAttributes; import android.os.VibrationEffect; @@ -229,8 +229,22 @@ public class VibrationSettingsTest { } @Test - public void shouldVibrateForUid_withBackgroundAllowedUsage_returnTrue() throws RemoteException { + public void shouldVibrateForUid_withForegroundOnlyUsage_returnsTrueWhInForeground() { + assertTrue(mVibrationSettings.shouldVibrateForUid(UID, VibrationAttributes.USAGE_TOUCH)); + + mVibrationSettings.mUidObserver.onUidStateChanged( + UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0); + assertFalse(mVibrationSettings.shouldVibrateForUid(UID, VibrationAttributes.USAGE_TOUCH)); + } + + @Test + public void shouldVibrateForUid_withBackgroundAllowedUsage_returnTrue() { + mVibrationSettings.mUidObserver.onUidStateChanged( + UID, ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND, 0, 0); + assertTrue(mVibrationSettings.shouldVibrateForUid(UID, VibrationAttributes.USAGE_ALARM)); + assertTrue(mVibrationSettings.shouldVibrateForUid(UID, + VibrationAttributes.USAGE_COMMUNICATION_REQUEST)); assertTrue(mVibrationSettings.shouldVibrateForUid(UID, VibrationAttributes.USAGE_NOTIFICATION)); assertTrue(mVibrationSettings.shouldVibrateForUid(UID, VibrationAttributes.USAGE_RINGTONE)); @@ -377,5 +391,4 @@ public class VibrationSettingsTest { mAudioManager.setRingerModeInternal(ringerMode); assertEquals(ringerMode, mAudioManager.getRingerModeInternal()); } - }