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

Commit d36481ab authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Vibrate as system instead of as an app" into sc-dev am: 14630d09

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/13857410

MUST ONLY BE SUBMITTED BY AUTOMERGER

Change-Id: Ie673fba5b01719a11dfd71f7af006110860ab335
parents 00fa87f1 14630d09
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));
    }