Merge "Allow background apps to vibrate with communication request usage"
This commit is contained in:
committed by
Android (Google) Code Review
commit
09cefc0283
@@ -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) {
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user