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

Commit 09cefc02 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Allow background apps to vibrate with communication request usage"

parents a687d49a 5e26d757
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());
    }

}