Loading src/com/android/server/telecom/AsyncRingtonePlayer.java +1 −1 Original line number Diff line number Diff line Loading @@ -209,7 +209,7 @@ public class AsyncRingtonePlayer { isVibrationEnabled); SystemSettingsUtil systemSettingsUtil = new SystemSettingsUtil(); if (hasHaptics && (volumeShaperConfig == null || systemSettingsUtil.enableAudioCoupledVibrationForRampingRinger())) { || systemSettingsUtil.isAudioCoupledVibrationForRampingRingerEnabled())) { AudioAttributes attributes = mRingtone.getAudioAttributes(); Log.d(this, "handlePlay: %s haptic channel", (isVibrationEnabled ? "unmuting" : "muting")); Loading src/com/android/server/telecom/Ringer.java +15 −29 Original line number Diff line number Diff line Loading @@ -275,7 +275,9 @@ public class Ringer { VibrationEffect effect; CompletableFuture<Boolean> hapticsFuture = null; // Determine if the settings and DND mode indicate that the vibrator can be used right now. boolean isVibratorEnabled = isVibratorEnabled(mContext, foregroundCall); boolean isVibratorEnabled = isVibratorEnabled(mContext); boolean shouldApplyRampingRinger = isVibratorEnabled && mSystemSettingsUtil.isRampingRingerEnabled(mContext); if (attributes.isRingerAudible()) { mRingingCall = foregroundCall; Log.addEvent(foregroundCall, LogUtils.Events.START_RINGER); Loading @@ -283,9 +285,9 @@ public class Ringer { // call (for the purposes of direct-to-voicemail), the information about custom // ringtones should be available by the time this code executes. We can safely // request the custom ringtone from the call and expect it to be current. if (mSystemSettingsUtil.applyRampingRinger(mContext)) { if (shouldApplyRampingRinger) { Log.i(this, "start ramping ringer."); if (mSystemSettingsUtil.enableAudioCoupledVibrationForRampingRinger()) { if (mSystemSettingsUtil.isAudioCoupledVibrationForRampingRingerEnabled()) { effect = getVibrationEffectForCall(mRingtoneFactory, foregroundCall); } else { effect = mDefaultVibrationEffect; Loading Loading @@ -331,8 +333,8 @@ public class Ringer { isUsingAudioCoupledHaptics, mIsHapticPlaybackSupportedByDevice); maybeStartVibration(foregroundCall, shouldRingForContact, effect, isVibratorEnabled, isRingerAudible); } else if (mSystemSettingsUtil.applyRampingRinger(mContext) && !mSystemSettingsUtil.enableAudioCoupledVibrationForRampingRinger()) { } else if (shouldApplyRampingRinger && !mSystemSettingsUtil.isAudioCoupledVibrationForRampingRingerEnabled()) { Log.i(this, "startRinging: apply ramping ringer vibration"); maybeStartVibration(foregroundCall, shouldRingForContact, effect, isVibratorEnabled, isRingerAudible); Loading Loading @@ -360,15 +362,13 @@ public class Ringer { VibrationEffect effect, boolean isVibrationEnabled, boolean isRingerAudible) { synchronized (mLock) { mAudioManager = mContext.getSystemService(AudioManager.class); if (isVibrationEnabled && !mIsVibrating && shouldRingForContact) { if (isVibrationEnabled && !mIsVibrating && shouldRingForContact) { Log.addEvent(foregroundCall, LogUtils.Events.START_VIBRATOR, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mSystemSettingsUtil.isRingVibrationEnabled(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); if (mSystemSettingsUtil.applyRampingRinger(mContext) && isRingerAudible) { if (mSystemSettingsUtil.isRampingRingerEnabled(mContext) && isRingerAudible) { Log.i(this, "start vibration for ramping ringer."); } else { Log.i(this, "start normal vibration."); Loading @@ -380,7 +380,7 @@ public class Ringer { Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mSystemSettingsUtil.isRingVibrationEnabled(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); } } Loading Loading @@ -503,25 +503,11 @@ public class Ringer { } } private boolean isVibratorEnabled(Context context, Call call) { private boolean isVibratorEnabled(Context context) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); int ringerMode = audioManager.getRingerModeInternal(); boolean shouldVibrate; if (getVibrateWhenRinging(context)) { shouldVibrate = ringerMode != AudioManager.RINGER_MODE_SILENT; } else { shouldVibrate = ringerMode == AudioManager.RINGER_MODE_VIBRATE; } return shouldVibrate; } private boolean getVibrateWhenRinging(Context context) { if (!mVibrator.hasVibrator()) { return false; } return mSystemSettingsUtil.canVibrateWhenRinging(context) || mSystemSettingsUtil.applyRampingRinger(context); return mVibrator.hasVibrator() && mSystemSettingsUtil.isRingVibrationEnabled(context) && audioManager.getRingerModeInternal() != AudioManager.RINGER_MODE_SILENT; } private RingerAttributes getRingerAttributes(Call call, boolean isHfpDeviceAttached) { Loading src/com/android/server/telecom/SystemSettingsUtil.java +13 −5 Original line number Diff line number Diff line Loading @@ -18,9 +18,10 @@ package com.android.server.telecom; import android.content.Context; import android.media.AudioManager; import android.os.VibrationAttributes; import android.os.Vibrator; import android.provider.DeviceConfig; import android.provider.Settings; import android.telecom.Log; import com.android.internal.annotations.VisibleForTesting; Loading @@ -39,9 +40,16 @@ public class SystemSettingsUtil { 0) == 1; } public boolean canVibrateWhenRinging(Context context) { public boolean isRingVibrationEnabled(Context context) { // VIBRATE_WHEN_RINGING setting was deprecated, only RING_VIBRATION_INTENSITY controls the // ringtone vibrations on/off state now. Ramping ringer should only be applied when ring // vibration intensity is ON, otherwise the ringtone sound should not be delayed as there // will be no ring vibration. return Settings.System.getIntForUser(context.getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0, context.getUserId()) != 0; Settings.System.RING_VIBRATION_INTENSITY, context.getSystemService(Vibrator.class).getDefaultVibrationIntensity( VibrationAttributes.USAGE_RINGTONE), context.getUserId()) != Vibrator.VIBRATION_INTENSITY_OFF; } public boolean isEnhancedCallBlockingEnabled(Context context) { Loading @@ -55,11 +63,11 @@ public class SystemSettingsUtil { context.getUserId()); } public boolean applyRampingRinger(Context context) { public boolean isRampingRingerEnabled(Context context) { return context.getSystemService(AudioManager.class).isRampingRingerEnabled(); } public boolean enableAudioCoupledVibrationForRampingRinger() { public boolean isAudioCoupledVibrationForRampingRingerEnabled() { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TELEPHONY, RAMPING_RINGER_AUDIO_COUPLED_VIBRATION_ENABLED, false); } Loading tests/src/com/android/server/telecom/tests/ComponentContextFixture.java +9 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.os.PersistableBundle; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; import android.os.VibratorManager; import android.permission.PermissionCheckerManager; import android.telecom.ConnectionService; Loading Loading @@ -220,6 +221,8 @@ public class ComponentContextFixture implements TestFixture<Context> { return mTelephonyRegistryManager; case Context.UI_MODE_SERVICE: return mUiModeManager; case Context.VIBRATOR_SERVICE: return mVibrator; case Context.VIBRATOR_MANAGER_SERVICE: return mVibratorManager; case Context.PERMISSION_CHECKER_SERVICE: Loading Loading @@ -249,6 +252,8 @@ public class ComponentContextFixture implements TestFixture<Context> { return Context.TELEPHONY_REGISTRY_SERVICE; } else if (svcClass == UiModeManager.class) { return Context.UI_MODE_SERVICE; } else if (svcClass == Vibrator.class) { return Context.VIBRATOR_SERVICE; } else if (svcClass == VibratorManager.class) { return Context.VIBRATOR_MANAGER_SERVICE; } else if (svcClass == PermissionCheckerManager.class) { Loading Loading @@ -557,6 +562,7 @@ public class ComponentContextFixture implements TestFixture<Context> { private final RoleManager mRoleManager = mock(RoleManager.class); private final TelephonyRegistryManager mTelephonyRegistryManager = mock(TelephonyRegistryManager.class); private final Vibrator mVibrator = mock(Vibrator.class); private final VibratorManager mVibratorManager = mock(VibratorManager.class); private final UiModeManager mUiModeManager = mock(UiModeManager.class); private final PermissionCheckerManager mPermissionCheckerManager = Loading Loading @@ -628,7 +634,10 @@ public class ComponentContextFixture implements TestFixture<Context> { } when(mPermissionInfo.isAppOp()).thenReturn(true); when(mVibrator.getDefaultVibrationIntensity(anyInt())) .thenReturn(Vibrator.VIBRATION_INTENSITY_MEDIUM); when(mVibratorManager.getVibratorIds()).thenReturn(new int[0]); when(mVibratorManager.getDefaultVibrator()).thenReturn(mVibrator); // Used in CreateConnectionProcessor to rank emergency numbers by viability. // For the test, make them all equal to INVALID so that the preferred PhoneAccount will be Loading tests/src/com/android/server/telecom/tests/RingerTest.java +3 −6 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.media.Ringtone; import android.media.VolumeShaper; import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.os.Parcel; import android.os.VibrationAttributes; import android.os.VibrationEffect; Loading @@ -48,8 +47,6 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; Loading Loading @@ -467,15 +464,15 @@ public class RingerTest extends TelecomTestCase { private void enableVibrationWhenRinging() { when(mockVibrator.hasVibrator()).thenReturn(true); when(mockSystemSettingsUtil.canVibrateWhenRinging(any(Context.class))).thenReturn(true); when(mockSystemSettingsUtil.isRingVibrationEnabled(any(Context.class))).thenReturn(true); } private void enableVibrationOnlyWhenNotRinging() { when(mockVibrator.hasVibrator()).thenReturn(true); when(mockSystemSettingsUtil.canVibrateWhenRinging(any(Context.class))).thenReturn(false); when(mockSystemSettingsUtil.isRingVibrationEnabled(any(Context.class))).thenReturn(false); } private void enableRampingRinger() { when(mockSystemSettingsUtil.applyRampingRinger(any(Context.class))).thenReturn(true); when(mockSystemSettingsUtil.isRampingRingerEnabled(any(Context.class))).thenReturn(true); } } Loading
src/com/android/server/telecom/AsyncRingtonePlayer.java +1 −1 Original line number Diff line number Diff line Loading @@ -209,7 +209,7 @@ public class AsyncRingtonePlayer { isVibrationEnabled); SystemSettingsUtil systemSettingsUtil = new SystemSettingsUtil(); if (hasHaptics && (volumeShaperConfig == null || systemSettingsUtil.enableAudioCoupledVibrationForRampingRinger())) { || systemSettingsUtil.isAudioCoupledVibrationForRampingRingerEnabled())) { AudioAttributes attributes = mRingtone.getAudioAttributes(); Log.d(this, "handlePlay: %s haptic channel", (isVibrationEnabled ? "unmuting" : "muting")); Loading
src/com/android/server/telecom/Ringer.java +15 −29 Original line number Diff line number Diff line Loading @@ -275,7 +275,9 @@ public class Ringer { VibrationEffect effect; CompletableFuture<Boolean> hapticsFuture = null; // Determine if the settings and DND mode indicate that the vibrator can be used right now. boolean isVibratorEnabled = isVibratorEnabled(mContext, foregroundCall); boolean isVibratorEnabled = isVibratorEnabled(mContext); boolean shouldApplyRampingRinger = isVibratorEnabled && mSystemSettingsUtil.isRampingRingerEnabled(mContext); if (attributes.isRingerAudible()) { mRingingCall = foregroundCall; Log.addEvent(foregroundCall, LogUtils.Events.START_RINGER); Loading @@ -283,9 +285,9 @@ public class Ringer { // call (for the purposes of direct-to-voicemail), the information about custom // ringtones should be available by the time this code executes. We can safely // request the custom ringtone from the call and expect it to be current. if (mSystemSettingsUtil.applyRampingRinger(mContext)) { if (shouldApplyRampingRinger) { Log.i(this, "start ramping ringer."); if (mSystemSettingsUtil.enableAudioCoupledVibrationForRampingRinger()) { if (mSystemSettingsUtil.isAudioCoupledVibrationForRampingRingerEnabled()) { effect = getVibrationEffectForCall(mRingtoneFactory, foregroundCall); } else { effect = mDefaultVibrationEffect; Loading Loading @@ -331,8 +333,8 @@ public class Ringer { isUsingAudioCoupledHaptics, mIsHapticPlaybackSupportedByDevice); maybeStartVibration(foregroundCall, shouldRingForContact, effect, isVibratorEnabled, isRingerAudible); } else if (mSystemSettingsUtil.applyRampingRinger(mContext) && !mSystemSettingsUtil.enableAudioCoupledVibrationForRampingRinger()) { } else if (shouldApplyRampingRinger && !mSystemSettingsUtil.isAudioCoupledVibrationForRampingRingerEnabled()) { Log.i(this, "startRinging: apply ramping ringer vibration"); maybeStartVibration(foregroundCall, shouldRingForContact, effect, isVibratorEnabled, isRingerAudible); Loading Loading @@ -360,15 +362,13 @@ public class Ringer { VibrationEffect effect, boolean isVibrationEnabled, boolean isRingerAudible) { synchronized (mLock) { mAudioManager = mContext.getSystemService(AudioManager.class); if (isVibrationEnabled && !mIsVibrating && shouldRingForContact) { if (isVibrationEnabled && !mIsVibrating && shouldRingForContact) { Log.addEvent(foregroundCall, LogUtils.Events.START_VIBRATOR, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mSystemSettingsUtil.isRingVibrationEnabled(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); if (mSystemSettingsUtil.applyRampingRinger(mContext) && isRingerAudible) { if (mSystemSettingsUtil.isRampingRingerEnabled(mContext) && isRingerAudible) { Log.i(this, "start vibration for ramping ringer."); } else { Log.i(this, "start normal vibration."); Loading @@ -380,7 +380,7 @@ public class Ringer { Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mSystemSettingsUtil.isRingVibrationEnabled(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); } } Loading Loading @@ -503,25 +503,11 @@ public class Ringer { } } private boolean isVibratorEnabled(Context context, Call call) { private boolean isVibratorEnabled(Context context) { AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); int ringerMode = audioManager.getRingerModeInternal(); boolean shouldVibrate; if (getVibrateWhenRinging(context)) { shouldVibrate = ringerMode != AudioManager.RINGER_MODE_SILENT; } else { shouldVibrate = ringerMode == AudioManager.RINGER_MODE_VIBRATE; } return shouldVibrate; } private boolean getVibrateWhenRinging(Context context) { if (!mVibrator.hasVibrator()) { return false; } return mSystemSettingsUtil.canVibrateWhenRinging(context) || mSystemSettingsUtil.applyRampingRinger(context); return mVibrator.hasVibrator() && mSystemSettingsUtil.isRingVibrationEnabled(context) && audioManager.getRingerModeInternal() != AudioManager.RINGER_MODE_SILENT; } private RingerAttributes getRingerAttributes(Call call, boolean isHfpDeviceAttached) { Loading
src/com/android/server/telecom/SystemSettingsUtil.java +13 −5 Original line number Diff line number Diff line Loading @@ -18,9 +18,10 @@ package com.android.server.telecom; import android.content.Context; import android.media.AudioManager; import android.os.VibrationAttributes; import android.os.Vibrator; import android.provider.DeviceConfig; import android.provider.Settings; import android.telecom.Log; import com.android.internal.annotations.VisibleForTesting; Loading @@ -39,9 +40,16 @@ public class SystemSettingsUtil { 0) == 1; } public boolean canVibrateWhenRinging(Context context) { public boolean isRingVibrationEnabled(Context context) { // VIBRATE_WHEN_RINGING setting was deprecated, only RING_VIBRATION_INTENSITY controls the // ringtone vibrations on/off state now. Ramping ringer should only be applied when ring // vibration intensity is ON, otherwise the ringtone sound should not be delayed as there // will be no ring vibration. return Settings.System.getIntForUser(context.getContentResolver(), Settings.System.VIBRATE_WHEN_RINGING, 0, context.getUserId()) != 0; Settings.System.RING_VIBRATION_INTENSITY, context.getSystemService(Vibrator.class).getDefaultVibrationIntensity( VibrationAttributes.USAGE_RINGTONE), context.getUserId()) != Vibrator.VIBRATION_INTENSITY_OFF; } public boolean isEnhancedCallBlockingEnabled(Context context) { Loading @@ -55,11 +63,11 @@ public class SystemSettingsUtil { context.getUserId()); } public boolean applyRampingRinger(Context context) { public boolean isRampingRingerEnabled(Context context) { return context.getSystemService(AudioManager.class).isRampingRingerEnabled(); } public boolean enableAudioCoupledVibrationForRampingRinger() { public boolean isAudioCoupledVibrationForRampingRingerEnabled() { return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_TELEPHONY, RAMPING_RINGER_AUDIO_COUPLED_VIBRATION_ENABLED, false); } Loading
tests/src/com/android/server/telecom/tests/ComponentContextFixture.java +9 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,7 @@ import android.os.PersistableBundle; import android.os.Process; import android.os.UserHandle; import android.os.UserManager; import android.os.Vibrator; import android.os.VibratorManager; import android.permission.PermissionCheckerManager; import android.telecom.ConnectionService; Loading Loading @@ -220,6 +221,8 @@ public class ComponentContextFixture implements TestFixture<Context> { return mTelephonyRegistryManager; case Context.UI_MODE_SERVICE: return mUiModeManager; case Context.VIBRATOR_SERVICE: return mVibrator; case Context.VIBRATOR_MANAGER_SERVICE: return mVibratorManager; case Context.PERMISSION_CHECKER_SERVICE: Loading Loading @@ -249,6 +252,8 @@ public class ComponentContextFixture implements TestFixture<Context> { return Context.TELEPHONY_REGISTRY_SERVICE; } else if (svcClass == UiModeManager.class) { return Context.UI_MODE_SERVICE; } else if (svcClass == Vibrator.class) { return Context.VIBRATOR_SERVICE; } else if (svcClass == VibratorManager.class) { return Context.VIBRATOR_MANAGER_SERVICE; } else if (svcClass == PermissionCheckerManager.class) { Loading Loading @@ -557,6 +562,7 @@ public class ComponentContextFixture implements TestFixture<Context> { private final RoleManager mRoleManager = mock(RoleManager.class); private final TelephonyRegistryManager mTelephonyRegistryManager = mock(TelephonyRegistryManager.class); private final Vibrator mVibrator = mock(Vibrator.class); private final VibratorManager mVibratorManager = mock(VibratorManager.class); private final UiModeManager mUiModeManager = mock(UiModeManager.class); private final PermissionCheckerManager mPermissionCheckerManager = Loading Loading @@ -628,7 +634,10 @@ public class ComponentContextFixture implements TestFixture<Context> { } when(mPermissionInfo.isAppOp()).thenReturn(true); when(mVibrator.getDefaultVibrationIntensity(anyInt())) .thenReturn(Vibrator.VIBRATION_INTENSITY_MEDIUM); when(mVibratorManager.getVibratorIds()).thenReturn(new int[0]); when(mVibratorManager.getDefaultVibrator()).thenReturn(mVibrator); // Used in CreateConnectionProcessor to rank emergency numbers by viability. // For the test, make them all equal to INVALID so that the preferred PhoneAccount will be Loading
tests/src/com/android/server/telecom/tests/RingerTest.java +3 −6 Original line number Diff line number Diff line Loading @@ -24,7 +24,6 @@ import android.media.Ringtone; import android.media.VolumeShaper; import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.os.Parcel; import android.os.VibrationAttributes; import android.os.VibrationEffect; Loading @@ -48,8 +47,6 @@ import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; Loading Loading @@ -467,15 +464,15 @@ public class RingerTest extends TelecomTestCase { private void enableVibrationWhenRinging() { when(mockVibrator.hasVibrator()).thenReturn(true); when(mockSystemSettingsUtil.canVibrateWhenRinging(any(Context.class))).thenReturn(true); when(mockSystemSettingsUtil.isRingVibrationEnabled(any(Context.class))).thenReturn(true); } private void enableVibrationOnlyWhenNotRinging() { when(mockVibrator.hasVibrator()).thenReturn(true); when(mockSystemSettingsUtil.canVibrateWhenRinging(any(Context.class))).thenReturn(false); when(mockSystemSettingsUtil.isRingVibrationEnabled(any(Context.class))).thenReturn(false); } private void enableRampingRinger() { when(mockSystemSettingsUtil.applyRampingRinger(any(Context.class))).thenReturn(true); when(mockSystemSettingsUtil.isRampingRingerEnabled(any(Context.class))).thenReturn(true); } }