Loading src/com/android/server/telecom/Ringer.java +47 −45 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.Person; import android.content.Context; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.Ringtone; import android.media.VolumeShaper; Loading @@ -28,6 +27,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; import android.telecom.Log; Loading Loading @@ -119,12 +119,9 @@ public class Ringer { private static final float EPSILON = 1e-6f; private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) .build(); private static final VibrationAttributes VIBRATION_ATTRIBUTES = new VibrationAttributes.Builder().setUsage(VibrationAttributes.USAGE_RINGTONE).build(); private static VibrationEffect mRampingRingerVibrationEffect; private static VolumeShaper.Configuration mVolumeShaperConfig; /** Loading Loading @@ -167,6 +164,12 @@ public class Ringer { private Handler mHandler = null; /** * Use lock different from the Telecom sync because ringing process is asynchronous outside that * lock */ private final Object mLock; /** Initializes the Ringer. */ @VisibleForTesting public Ringer( Loading @@ -179,6 +182,7 @@ public class Ringer { VibrationEffectProxy vibrationEffectProxy, InCallController inCallController) { mLock = new Object(); mSystemSettingsUtil = systemSettingsUtil; mPlayerFactory = playerFactory; mContext = context; Loading Loading @@ -346,22 +350,32 @@ public class Ringer { private void maybeStartVibration(Call foregroundCall, boolean shouldRingForContact, VibrationEffect effect, boolean isVibrationEnabled, boolean isRingerAudible) { synchronized (mLock) { if (isVibrationEnabled && !mIsVibrating && shouldRingForContact) { Log.addEvent(foregroundCall, LogUtils.Events.START_VIBRATOR, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); if (mSystemSettingsUtil.applyRampingRinger(mContext) && isRingerAudible) { Log.i(this, "start vibration for ramping ringer."); mIsVibrating = true; mVibrator.vibrate(effect, VIBRATION_ATTRIBUTES); } else { Log.i(this, "start normal vibration."); } mIsVibrating = true; mVibrator.vibrate(effect, VIBRATION_ATTRIBUTES); } } else if (mIsVibrating) { } else { Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "already vibrating"); } } } private VibrationEffect getVibrationEffectForCall(RingtoneFactory factory, Call call) { VibrationEffect effect = null; Loading Loading @@ -419,6 +433,7 @@ public class Ringer { } public void stopRinging() { synchronized (mLock) { if (mRingingCall != null) { Log.addEvent(mRingingCall, LogUtils.Events.STOP_RINGER); mRingingCall = null; Loading @@ -439,6 +454,7 @@ public class Ringer { mVibratingCall = null; } } } public void stopCallWaiting() { Log.v(this, "stop call waiting."); Loading Loading @@ -488,20 +504,6 @@ public class Ringer { shouldVibrate = ringerMode == AudioManager.RINGER_MODE_VIBRATE; } // Technically this should be in the calling method, but it seemed a little odd to pass // around a whole bunch of state just for logging purposes. if (shouldVibrate) { Log.addEvent(call, LogUtils.Events.START_VIBRATOR, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(context), ringerMode, mIsVibrating); } else { Log.addEvent(call, LogUtils.Events.SKIP_VIBRATION, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(context), ringerMode, mIsVibrating); } return shouldVibrate; } Loading tests/src/com/android/server/telecom/tests/RingerTest.java +16 −15 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.os.Parcel; import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; import android.telecom.TelecomManager; Loading Loading @@ -177,7 +178,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -195,7 +196,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading Loading @@ -228,7 +229,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -244,7 +245,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -263,7 +264,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -280,7 +281,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class), isNull(), eq(true) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); verify(mockVibrator, never()).vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -299,7 +300,7 @@ public class RingerTest extends TelecomTestCase { eq(false) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); // Play default vibration when future completes with no audio coupled haptics verify(mockVibrator).vibrate(eq(mRingerUnderTest.mDefaultVibrationEffect), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -320,7 +321,7 @@ public class RingerTest extends TelecomTestCase { eq(false) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); // Play default vibration when future completes with no audio coupled haptics verify(mockVibrator).vibrate(eq(mRingerUnderTest.mDefaultVibrationEffect), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -341,7 +342,7 @@ public class RingerTest extends TelecomTestCase { eq(false) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); // Skip vibration for audio coupled haptics verify(mockVibrator, never()).vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -357,7 +358,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(nullable(RingtoneFactory.class), nullable(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()).vibrate(nullable(VibrationEffect.class), nullable(AudioAttributes.class)); nullable(VibrationAttributes.class)); // Simulate something stopping the ringer mRingerUnderTest.stopRinging(); verify(mockRingtonePlayer).stop(); Loading @@ -366,7 +367,7 @@ public class RingerTest extends TelecomTestCase { mFuture.complete(false); // Then make sure that we don't actually start vibrating. verify(mockVibrator, never()).vibrate(nullable(VibrationEffect.class), nullable(AudioAttributes.class)); nullable(VibrationAttributes.class)); } @SmallTest Loading @@ -385,7 +386,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class), eq(null), eq(true) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); verify(mockVibrator).vibrate(eq(spyVibrationEffectProxy.get(FAKE_RINGTONE_URI, mContext)), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -401,7 +402,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class), eq(null), eq(true) /* isRingerAudible */, eq(false) /* isVibrationEnabled */); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading Loading @@ -436,7 +437,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -454,7 +455,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } private void ensureRingerIsAudible() { Loading Loading
src/com/android/server/telecom/Ringer.java +47 −45 Original line number Diff line number Diff line Loading @@ -20,7 +20,6 @@ import android.app.Notification; import android.app.NotificationManager; import android.app.Person; import android.content.Context; import android.media.AudioAttributes; import android.media.AudioManager; import android.media.Ringtone; import android.media.VolumeShaper; Loading @@ -28,6 +27,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.HandlerThread; import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; import android.telecom.Log; Loading Loading @@ -119,12 +119,9 @@ public class Ringer { private static final float EPSILON = 1e-6f; private static final AudioAttributes VIBRATION_ATTRIBUTES = new AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE) .build(); private static final VibrationAttributes VIBRATION_ATTRIBUTES = new VibrationAttributes.Builder().setUsage(VibrationAttributes.USAGE_RINGTONE).build(); private static VibrationEffect mRampingRingerVibrationEffect; private static VolumeShaper.Configuration mVolumeShaperConfig; /** Loading Loading @@ -167,6 +164,12 @@ public class Ringer { private Handler mHandler = null; /** * Use lock different from the Telecom sync because ringing process is asynchronous outside that * lock */ private final Object mLock; /** Initializes the Ringer. */ @VisibleForTesting public Ringer( Loading @@ -179,6 +182,7 @@ public class Ringer { VibrationEffectProxy vibrationEffectProxy, InCallController inCallController) { mLock = new Object(); mSystemSettingsUtil = systemSettingsUtil; mPlayerFactory = playerFactory; mContext = context; Loading Loading @@ -346,22 +350,32 @@ public class Ringer { private void maybeStartVibration(Call foregroundCall, boolean shouldRingForContact, VibrationEffect effect, boolean isVibrationEnabled, boolean isRingerAudible) { synchronized (mLock) { if (isVibrationEnabled && !mIsVibrating && shouldRingForContact) { Log.addEvent(foregroundCall, LogUtils.Events.START_VIBRATOR, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); if (mSystemSettingsUtil.applyRampingRinger(mContext) && isRingerAudible) { Log.i(this, "start vibration for ramping ringer."); mIsVibrating = true; mVibrator.vibrate(effect, VIBRATION_ATTRIBUTES); } else { Log.i(this, "start normal vibration."); } mIsVibrating = true; mVibrator.vibrate(effect, VIBRATION_ATTRIBUTES); } } else if (mIsVibrating) { } else { Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(mContext), mAudioManager.getRingerModeInternal(), mIsVibrating); Log.addEvent(foregroundCall, LogUtils.Events.SKIP_VIBRATION, "already vibrating"); } } } private VibrationEffect getVibrationEffectForCall(RingtoneFactory factory, Call call) { VibrationEffect effect = null; Loading Loading @@ -419,6 +433,7 @@ public class Ringer { } public void stopRinging() { synchronized (mLock) { if (mRingingCall != null) { Log.addEvent(mRingingCall, LogUtils.Events.STOP_RINGER); mRingingCall = null; Loading @@ -439,6 +454,7 @@ public class Ringer { mVibratingCall = null; } } } public void stopCallWaiting() { Log.v(this, "stop call waiting."); Loading Loading @@ -488,20 +504,6 @@ public class Ringer { shouldVibrate = ringerMode == AudioManager.RINGER_MODE_VIBRATE; } // Technically this should be in the calling method, but it seemed a little odd to pass // around a whole bunch of state just for logging purposes. if (shouldVibrate) { Log.addEvent(call, LogUtils.Events.START_VIBRATOR, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(context), ringerMode, mIsVibrating); } else { Log.addEvent(call, LogUtils.Events.SKIP_VIBRATION, "hasVibrator=%b, userRequestsVibrate=%b, ringerMode=%d, isVibrating=%b", mVibrator.hasVibrator(), mSystemSettingsUtil.canVibrateWhenRinging(context), ringerMode, mIsVibrating); } return shouldVibrate; } Loading
tests/src/com/android/server/telecom/tests/RingerTest.java +16 −15 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Looper; import android.os.Parcel; import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; import android.telecom.TelecomManager; Loading Loading @@ -177,7 +178,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -195,7 +196,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading Loading @@ -228,7 +229,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -244,7 +245,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -263,7 +264,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -280,7 +281,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class), isNull(), eq(true) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); verify(mockVibrator, never()).vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -299,7 +300,7 @@ public class RingerTest extends TelecomTestCase { eq(false) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); // Play default vibration when future completes with no audio coupled haptics verify(mockVibrator).vibrate(eq(mRingerUnderTest.mDefaultVibrationEffect), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -320,7 +321,7 @@ public class RingerTest extends TelecomTestCase { eq(false) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); // Play default vibration when future completes with no audio coupled haptics verify(mockVibrator).vibrate(eq(mRingerUnderTest.mDefaultVibrationEffect), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -341,7 +342,7 @@ public class RingerTest extends TelecomTestCase { eq(false) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); // Skip vibration for audio coupled haptics verify(mockVibrator, never()).vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -357,7 +358,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(nullable(RingtoneFactory.class), nullable(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()).vibrate(nullable(VibrationEffect.class), nullable(AudioAttributes.class)); nullable(VibrationAttributes.class)); // Simulate something stopping the ringer mRingerUnderTest.stopRinging(); verify(mockRingtonePlayer).stop(); Loading @@ -366,7 +367,7 @@ public class RingerTest extends TelecomTestCase { mFuture.complete(false); // Then make sure that we don't actually start vibrating. verify(mockVibrator, never()).vibrate(nullable(VibrationEffect.class), nullable(AudioAttributes.class)); nullable(VibrationAttributes.class)); } @SmallTest Loading @@ -385,7 +386,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class), eq(null), eq(true) /* isRingerAudible */, eq(true) /* isVibrationEnabled */); verify(mockVibrator).vibrate(eq(spyVibrationEffectProxy.get(FAKE_RINGTONE_URI, mContext)), any(AudioAttributes.class)); any(VibrationAttributes.class)); } @SmallTest Loading @@ -401,7 +402,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class), eq(null), eq(true) /* isRingerAudible */, eq(false) /* isVibrationEnabled */); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading Loading @@ -436,7 +437,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } @SmallTest Loading @@ -454,7 +455,7 @@ public class RingerTest extends TelecomTestCase { verify(mockRingtonePlayer, never()).play(any(RingtoneFactory.class), any(Call.class), nullable(VolumeShaper.Configuration.class), anyBoolean(), anyBoolean()); verify(mockVibrator, never()) .vibrate(any(VibrationEffect.class), any(AudioAttributes.class)); .vibrate(any(VibrationEffect.class), any(VibrationAttributes.class)); } private void ensureRingerIsAudible() { Loading