Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5e26d757 authored by Lais Andrade's avatar Lais Andrade
Browse files

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
parent 73cc15b5
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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) {
+16 −3
Original line number Diff line number Diff line
@@ -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());
    }

}