Loading src/com/android/server/telecom/Ringer.java +21 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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: Loading @@ -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) { Loading @@ -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"); Loading src/com/android/server/telecom/RingerAttributes.java +15 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading @@ -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; Loading @@ -86,6 +94,7 @@ public class RingerAttributes { mInaudibleReason = inaudibleReason; mShouldRingForContact = shouldRingForContact; mSilentRingingRequested = silentRingingRequested; mWorkProfileQuietMode = workProfileQuietMode; } public boolean isEndEarly() { Loading Loading @@ -115,4 +124,8 @@ public class RingerAttributes { public boolean isSilentRingingRequested() { return mSilentRingingRequested; } public boolean isWorkProfileInQuietMode() { return mWorkProfileQuietMode; } } tests/src/com/android/server/telecom/tests/RingerTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading Loading
src/com/android/server/telecom/Ringer.java +21 −5 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } Loading Loading @@ -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: Loading @@ -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) { Loading @@ -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"); Loading
src/com/android/server/telecom/RingerAttributes.java +15 −2 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); } } Loading @@ -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; Loading @@ -86,6 +94,7 @@ public class RingerAttributes { mInaudibleReason = inaudibleReason; mShouldRingForContact = shouldRingForContact; mSilentRingingRequested = silentRingingRequested; mWorkProfileQuietMode = workProfileQuietMode; } public boolean isEndEarly() { Loading Loading @@ -115,4 +124,8 @@ public class RingerAttributes { public boolean isSilentRingingRequested() { return mSilentRingingRequested; } public boolean isWorkProfileInQuietMode() { return mWorkProfileQuietMode; } }
tests/src/com/android/server/telecom/tests/RingerTest.java +16 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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); Loading