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

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

Merge "Vibrate as system instead of as an app" into sc-dev

parents dc8cf313 e1386616
Loading
Loading
Loading
Loading
+12 −11
Original line number Diff line number Diff line
@@ -7376,15 +7376,7 @@ public class NotificationManagerService extends SystemService {
                    // so need to check the notification still valide for vibrate.
                    synchronized (mNotificationLock) {
                        if (mNotificationsByKey.get(record.getKey()) != null) {
                            // Vibrator checks the appops for the op package, not the caller,
                            // so we need to add the bypass dnd flag to be heard. it's ok to
                            // always add this flag here because we've already checked that we can
                            // bypass dnd
                            AudioAttributes.Builder aab =
                                    new AudioAttributes.Builder(record.getAudioAttributes())
                                    .setFlags(FLAG_BYPASS_INTERRUPTION_POLICY);
                            mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getOpPkg(),
                                    effect, "Notification (delayed)", aab.build());
                            vibrate(record, effect, true);
                        } else {
                            Slog.e(TAG, "No vibration for canceled notification : "
                                    + record.getKey());
@@ -7392,8 +7384,7 @@ public class NotificationManagerService extends SystemService {
                    }
                }).start();
            } else {
                mVibrator.vibrate(record.getSbn().getUid(), record.getSbn().getPackageName(),
                        effect, "Notification", record.getAudioAttributes());
                vibrate(record, effect, false);
            }
            return true;
        } finally{
@@ -7401,6 +7392,16 @@ public class NotificationManagerService extends SystemService {
        }
    }

    private void vibrate(NotificationRecord record, VibrationEffect effect, boolean delayed) {
        // We need to vibrate as "android" so we can breakthrough DND. VibratorManagerService
        // doesn't have a concept of vibrating on an app's behalf, so add the app information
        // to the reason so we can still debug from bugreports
        String reason = "Notification (" + record.getSbn().getOpPkg() + " "
                + record.getSbn().getUid() + ") " + (delayed ? "(Delayed)" : "");
        mVibrator.vibrate(Process.SYSTEM_UID, PackageManagerService.PLATFORM_PACKAGE_NAME,
                effect, reason, record.getAudioAttributes());
    }

    private boolean isNotificationForCurrentUser(NotificationRecord record) {
        final int currentUser;
        final long token = Binder.clearCallingIdentity();
+9 −2
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ import android.media.AudioAttributes;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Handler;
import android.os.Process;
import android.os.RemoteException;
import android.os.UserHandle;
import android.os.VibrationEffect;
@@ -81,10 +82,12 @@ import com.android.internal.logging.InstanceIdSequenceFake;
import com.android.internal.util.IntPair;
import com.android.server.UiServiceTestCase;
import com.android.server.lights.LogicalLight;
import com.android.server.pm.PackageManagerService;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
import org.mockito.Mockito;
@@ -412,12 +415,16 @@ public class BuzzBeepBlinkTest extends UiServiceTestCase {
    }

    private void verifyVibrate() {
        ArgumentCaptor<AudioAttributes> captor = ArgumentCaptor.forClass(AudioAttributes.class);
        verify(mVibrator, times(1)).vibrate(anyInt(), anyString(), argThat(mVibrateOnceMatcher),
                anyString(), any(AudioAttributes.class));
                anyString(), captor.capture());
        assertEquals(0, (captor.getValue().getAllFlags()
                & AudioAttributes.FLAG_BYPASS_INTERRUPTION_POLICY));
    }

    private void verifyVibrate(int times) {
        verify(mVibrator, times(times)).vibrate(anyInt(), anyString(), any(), anyString(),
        verify(mVibrator, times(times)).vibrate(eq(Process.SYSTEM_UID),
                eq(PackageManagerService.PLATFORM_PACKAGE_NAME), any(), anyString(),
                any(AudioAttributes.class));
    }