Allow background apps to vibrate with communication request usage

The usage COMMUNICATION_REQUEST should be included into the list of
usages allowed for background apps.

Bug: 174758406
Test: VibratorServiceTest
Change-Id: I43f899ac5d96714ddf679882e044ccf77c02d9ac
This commit is contained in:
Lais Andrade
2020-12-10 13:58:38 +00:00
parent 73cc15b505
commit 5e26d7570d
2 changed files with 27 additions and 7 deletions

View File

@@ -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<OnVibratorSettingsChanged> 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<Integer> mProcStatesCache = new SparseArray<>();
public boolean isUidForeground(int uid) {

View File

@@ -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());
}
}