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

Commit cb2d3b16 authored by Pavel Grafov's avatar Pavel Grafov
Browse files

Make calls silent when profile is in quiet mode

Bug: 269597388
Test: manual
Test: atest com.android.server.telecom.tests.RingerTest
Change-Id: I8c7eaa01113034b329d0e35d30bd7e1ccabbcf5a
parent 5627721c
Loading
Loading
Loading
Loading
+21 −5
Original line number Diff line number Diff line
@@ -33,6 +33,8 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
@@ -292,6 +294,10 @@ public class Ringer {
                Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING, "Silent ringing "
                        + "requested");
            }
            if (attributes.isWorkProfileInQuietMode()) {
                Log.addEvent(foregroundCall, LogUtils.Events.SKIP_RINGING,
                        "Work profile in quiet mode");
            }
            if (mBlockOnRingingFuture != null) {
                mBlockOnRingingFuture.complete(null);
            }
@@ -640,16 +646,20 @@ public class Ringer {
        boolean letDialerHandleRinging = mInCallController.doesConnectedDialerSupportRinging(
                call.getUserHandleFromTargetPhoneAccount());
        timer.record("letDialerHandleRinging");
        boolean isWorkProfileInQuietMode =
                isProfileInQuietMode(call.getUserHandleFromTargetPhoneAccount());
        timer.record("isWorkProfileInQuietMode");

        Log.i(this, "startRinging timings: " + timer);
        boolean endEarly = isTheaterModeOn || letDialerHandleRinging || isSelfManaged ||
                hasExternalRinger || isSilentRingingRequested;
                hasExternalRinger || isSilentRingingRequested || isWorkProfileInQuietMode;

        if (endEarly) {
            Log.i(this, "Ending early -- isTheaterModeOn=%s, letDialerHandleRinging=%s, " +
                            "isSelfManaged=%s, hasExternalRinger=%s, silentRingingRequested=%s",
                            "isSelfManaged=%s, hasExternalRinger=%s, silentRingingRequested=%s, " +
                            "isWorkProfileInQuietMode=%s",
                    isTheaterModeOn, letDialerHandleRinging, isSelfManaged, hasExternalRinger,
                    isSilentRingingRequested);
                    isSilentRingingRequested, isWorkProfileInQuietMode);
        }

        // Acquire audio focus under any of the following conditions:
@@ -657,8 +667,8 @@ public class Ringer {
        // 2. Volume is over zero, we should ring for the contact, and there's a audible ringtone
        //    present. (This check is deferred until ringer knows the ringtone)
        // 3. The call is self-managed.
        boolean shouldAcquireAudioFocus =
            (isHfpDeviceAttached && shouldRingForContact) || isSelfManaged;
        boolean shouldAcquireAudioFocus = !isWorkProfileInQuietMode &&
                ((isHfpDeviceAttached && shouldRingForContact) || isSelfManaged);

        // Set missed reason according to attributes
        if (!isVolumeOverZero) {
@@ -676,9 +686,15 @@ public class Ringer {
                .setInaudibleReason(inaudibleReason)
                .setShouldRingForContact(shouldRingForContact)
                .setSilentRingingRequested(isSilentRingingRequested)
                .setWorkProfileQuietMode(isWorkProfileInQuietMode)
                .build();
    }

    private boolean isProfileInQuietMode(UserHandle user) {
        UserManager um = mContext.getSystemService(UserManager.class);
        return um.isManagedProfile(user.getIdentifier()) && um.isQuietModeEnabled(user);
    }

    private Handler getHandler() {
        if (mHandler == null) {
            HandlerThread handlerThread = new HandlerThread("Ringer");
+15 −2
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ public class RingerAttributes {
        private String mInaudibleReason;
        private boolean mShouldRingForContact;
        private boolean mSilentRingingRequested;
        private boolean mWorkProfileQuietMode;

        public RingerAttributes.Builder setEndEarly(boolean endEarly) {
            mEndEarly = endEarly;
@@ -61,10 +62,15 @@ public class RingerAttributes {
            return this;
        }

        public RingerAttributes.Builder setWorkProfileQuietMode(boolean workProfileQuietMode) {
            mWorkProfileQuietMode = workProfileQuietMode;
            return this;
        }

        public RingerAttributes build() {
            return new RingerAttributes(mEndEarly, mLetDialerHandleRinging, mAcquireAudioFocus,
                    mRingerAudible, mInaudibleReason, mShouldRingForContact,
                    mSilentRingingRequested);
                    mSilentRingingRequested, mWorkProfileQuietMode);
        }
    }

@@ -75,10 +81,12 @@ public class RingerAttributes {
    private String mInaudibleReason;
    private boolean mShouldRingForContact;
    private boolean mSilentRingingRequested;
    private boolean mWorkProfileQuietMode;

    private RingerAttributes(boolean endEarly, boolean letDialerHandleRinging,
            boolean acquireAudioFocus, boolean ringerAudible, String inaudibleReason,
            boolean shouldRingForContact, boolean silentRingingRequested) {
            boolean shouldRingForContact, boolean silentRingingRequested,
            boolean workProfileQuietMode) {
        mEndEarly = endEarly;
        mLetDialerHandleRinging = letDialerHandleRinging;
        mAcquireAudioFocus = acquireAudioFocus;
@@ -86,6 +94,7 @@ public class RingerAttributes {
        mInaudibleReason = inaudibleReason;
        mShouldRingForContact = shouldRingForContact;
        mSilentRingingRequested = silentRingingRequested;
        mWorkProfileQuietMode = workProfileQuietMode;
    }

    public boolean isEndEarly() {
@@ -115,4 +124,8 @@ public class RingerAttributes {
    public boolean isSilentRingingRequested() {
        return mSilentRingingRequested;
    }

    public boolean isWorkProfileInQuietMode() {
        return mWorkProfileQuietMode;
    }
}
+16 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.provider.Settings.Global.ZEN_MODE_IMPORTANT_INTERRUPTIONS;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
@@ -44,6 +45,7 @@ import android.net.Uri;
import android.os.Bundle;
import android.os.Parcel;
import android.os.UserHandle;
import android.os.UserManager;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
@@ -593,6 +595,20 @@ public class RingerTest extends TelecomTestCase {

    }

    @SmallTest
    @Test
    public void testNoRingingForQuietProfile() {
        UserManager um = mContext.getSystemService(UserManager.class);
        when(um.isManagedProfile(PA_HANDLE.getUserHandle().getIdentifier())).thenReturn(true);
        when(um.isQuietModeEnabled(PA_HANDLE.getUserHandle())).thenReturn(true);
        // We don't want to acquire audio focus when self-managed
        assertFalse(mRingerUnderTest.startRinging(mockCall2, true));
        verify(mockTonePlayer, never()).stopTone();
        verify(mockRingtonePlayer, never()).play(any(Ringtone.class));
        verify(mockVibrator, never())
                .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class));
    }

    private void ensureRingerIsAudible() {
        when(mockAudioManager.getRingerMode()).thenReturn(AudioManager.RINGER_MODE_NORMAL);
        when(mockAudioManager.getStreamVolume(AudioManager.STREAM_RING)).thenReturn(100);