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

Commit cb8273aa authored by Pavel Grafov's avatar Pavel Grafov Committed by Android (Google) Code Review
Browse files

Merge "Make calls silent when profile is in quiet mode" into udc-dev

parents 5f7b7caf cb2d3b16
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);