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

Commit 25972b14 authored by Grace Jia's avatar Grace Jia Committed by Automerger Merge Worker
Browse files

Merge "Fix Telecom vibrator issue." into tm-dev am: fe3a6397

parents 22c00aac fe3a6397
Loading
Loading
Loading
Loading
+47 −45
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;

    /**
@@ -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(
@@ -179,6 +182,7 @@ public class Ringer {
            VibrationEffectProxy vibrationEffectProxy,
            InCallController inCallController) {

        mLock = new Object();
        mSystemSettingsUtil = systemSettingsUtil;
        mPlayerFactory = playerFactory;
        mContext = context;
@@ -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;
@@ -419,6 +433,7 @@ public class Ringer {
    }

    public void stopRinging() {
        synchronized (mLock) {
            if (mRingingCall != null) {
                Log.addEvent(mRingingCall, LogUtils.Events.STOP_RINGER);
                mRingingCall = null;
@@ -439,6 +454,7 @@ public class Ringer {
                mVibratingCall = null;
            }
        }
    }

    public void stopCallWaiting() {
        Log.v(this, "stop call waiting.");
@@ -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;
    }

+16 −15
Original line number Diff line number Diff line
@@ -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;
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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();
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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() {