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

Commit 01c78c69 authored by Tyler Gunn's avatar Tyler Gunn
Browse files

Refactor dependency on SystemVibrator.

SystemVibrator is a hidden framework class that extends the base
Vibrator class.  It has an implementation that essentially wraps all
the APIs in VibratorManager.

To refactor this dependency, created a VibratorAdapter in Ringer which
exposes the method signatures used in Ringer.java; we will either wrap
SystemVibrator or the equivalent calls to VibratorManager.

Test: Manual vibration testing.
Test: Re-run existing tests with flag on and off.
Flag: com.android.server.telecom.flags.resolve_hidden_dependencies_two
Bug: 308205987
Change-Id: Ic333df273d02ac4e75dfc9580053ebce58859c3b
parent 5b334230
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -78,7 +78,6 @@ import android.os.Process;
import android.os.ResultReceiver;
import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.SystemVibrator;
import android.os.UserHandle;
import android.os.UserManager;
import android.provider.BlockedNumberContract;
@@ -664,7 +663,8 @@ public class CallsManager extends Call.ListenerBase
            FeatureFlags featureFlags,
            com.android.internal.telephony.flags.FeatureFlags telephonyFlags,
            IncomingCallFilterGraphProvider incomingCallFilterGraphProvider,
            TelecomMetricsController metricsController) {
            TelecomMetricsController metricsController,
            Ringer.VibratorAdapter vibratorAdapter) {

        mContext = context;
        mLock = lock;
@@ -768,7 +768,7 @@ public class CallsManager extends Call.ListenerBase

        SystemSettingsUtil systemSettingsUtil = new SystemSettingsUtil();
        RingtoneFactory ringtoneFactory = new RingtoneFactory(this, context, featureFlags);
        SystemVibrator systemVibrator = new SystemVibrator(context);

        mInCallController = inCallControllerFactory.create(context, mLock, this,
                systemStateHelper, defaultDialerCache, mTimeoutsAdapter,
                emergencyCallHelper);
@@ -776,7 +776,7 @@ public class CallsManager extends Call.ListenerBase
        mCallDiagnosticServiceController = callDiagnosticServiceController;
        mCallDiagnosticServiceController.setInCallTonePlayerFactory(playerFactory);
        mRinger = new Ringer(playerFactory, context, systemSettingsUtil, asyncRingtonePlayer,
                ringtoneFactory, systemVibrator,
                ringtoneFactory, vibratorAdapter,
                new Ringer.VibrationEffectProxy(), mInCallController,
                mContext.getSystemService(NotificationManager.class),
                accessibilityManagerAdapter, featureFlags, mAnomalyReporter);
+15 −3
Original line number Diff line number Diff line
@@ -76,6 +76,18 @@ import java.util.function.Supplier;
public class Ringer {
    private static final String TAG = "TelecomRinger";

    /**
     * Abstraction of vibration.  We used to leverage SystemVibrator which implements the abstract
     * Vibrator class.  However, the Vibrator class has a bunch of abstract @hide methods we can
     * not implement, so we just abstract out a base interface here with only what we need.
     */
    public interface VibratorAdapter {
        boolean hasVibrator();
        void vibrate(VibrationEffect vibe, VibrationAttributes attributes);
        void cancel();
        Vibrator getVibrator();
    }

    public interface AccessibilityManagerAdapter {
        boolean startFlashNotificationSequence(@NonNull Context context,
                @AccessibilityManager.FlashNotificationReason int reason);
@@ -192,7 +204,7 @@ public class Ringer {
    private final InCallTonePlayer.Factory mPlayerFactory;
    private final AsyncRingtonePlayer mRingtonePlayer;
    private final Context mContext;
    private final Vibrator mVibrator;
    private final VibratorAdapter mVibrator;
    private final InCallController mInCallController;
    private final VibrationEffectProxy mVibrationEffectProxy;
    private final boolean mIsHapticPlaybackSupportedByDevice;
@@ -241,7 +253,7 @@ public class Ringer {
            SystemSettingsUtil systemSettingsUtil,
            AsyncRingtonePlayer asyncRingtonePlayer,
            RingtoneFactory ringtoneFactory,
            Vibrator vibrator,
            VibratorAdapter vibrator,
            VibrationEffectProxy vibrationEffectProxy,
            InCallController inCallController,
            NotificationManager notificationManager,
@@ -266,7 +278,7 @@ public class Ringer {

        mDefaultVibrationEffect =
                loadDefaultRingVibrationEffect(
                        mContext, mVibrator, mVibrationEffectProxy, featureFlags);
                        mContext, mVibrator.getVibrator(), mVibrationEffectProxy, featureFlags);

        mIsHapticPlaybackSupportedByDevice =
                mSystemSettingsUtil.isHapticPlaybackSupported(mContext);
+4 −2
Original line number Diff line number Diff line
@@ -233,7 +233,8 @@ public class TelecomSystem {
            BlockedNumbersAdapter blockedNumbersAdapter,
            FeatureFlags featureFlags,
            com.android.internal.telephony.flags.FeatureFlags telephonyFlags,
            Looper looper) {
            Looper looper,
            Ringer.VibratorAdapter vibratorAdapter) {
        mContext = context.getApplicationContext();
        mFeatureFlags = featureFlags;
        LogUtils.initLogging(mContext);
@@ -438,7 +439,8 @@ public class TelecomSystem {
                    featureFlags,
                    telephonyFlags,
                    IncomingCallFilterGraph::new,
                    metricsController);
                    metricsController,
                    vibratorAdapter);

            mIncomingCallNotifier = incomingCallNotifier;
            incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
+63 −1
Original line number Diff line number Diff line
@@ -20,13 +20,20 @@ import android.app.Service;
import android.app.role.RoleManager;
import android.content.Context;
import android.content.Intent;
import android.media.AudioAttributes;
import android.media.IAudioService;
import android.media.ToneGenerator;
import android.os.CombinedVibration;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.SystemVibrator;
import android.os.VibrationAttributes;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.os.VibratorManager;
import android.provider.BlockedNumberContract;
import android.provider.BlockedNumbersManager;
import android.telecom.Log;
@@ -115,6 +122,60 @@ public class TelecomService extends Service implements TelecomSystem.Component {
            HandlerThread handlerThread = new HandlerThread("TelecomSystem");
            handlerThread.start();

            Ringer.VibratorAdapter vibratorAdapter;
            if (featureFlags.resolveHiddenDependenciesTwo()) {
                final VibratorManager vibratorManager =
                        context.getSystemService(VibratorManager.class);
                vibratorAdapter = new Ringer.VibratorAdapter() {
                    @Override
                    public boolean hasVibrator() {
                        int[] vibratorIds = vibratorManager.getVibratorIds();
                        return vibratorIds != null && vibratorIds.length > 0;
                    }

                    @Override
                    public void vibrate(VibrationEffect vibe, VibrationAttributes attributes) {
                        // This is what SystemVibrator does.
                        CombinedVibration combinedEffect = CombinedVibration.createParallel(vibe);
                        vibratorManager.vibrate(combinedEffect, attributes);
                    }

                    @Override
                    public void cancel() {
                        vibratorManager.cancel();
                    }

                    @Override
                    public Vibrator getVibrator() {
                        return vibratorManager.getDefaultVibrator();
                    }
                };
            } else {
                // SystemVibrator extends Vibrator
                final SystemVibrator systemVibrator = new SystemVibrator(context);
                vibratorAdapter = new Ringer.VibratorAdapter() {
                    @Override
                    public boolean hasVibrator() {
                        return systemVibrator.hasVibrator();
                    }

                    @Override
                    public void vibrate(VibrationEffect vibe, VibrationAttributes attributes) {
                        systemVibrator.vibrate(vibe, attributes);
                    }

                    @Override
                    public void cancel() {
                        systemVibrator.cancel();
                    }

                    @Override
                    public Vibrator getVibrator() {
                        return systemVibrator;
                    }
                };
            }

            TelecomSystem.setInstance(
                    new TelecomSystem(
                            context,
@@ -247,7 +308,8 @@ public class TelecomService extends Service implements TelecomSystem.Component {
                            },
                            featureFlags,
                            new com.android.internal.telephony.flags.FeatureFlagsImpl(),
                            handlerThread.getLooper()));
                            handlerThread.getLooper(),
                            vibratorAdapter));
        }
    }

+4 −1
Original line number Diff line number Diff line
@@ -324,6 +324,7 @@ public class CallsManagerTest extends TelecomTestCase {
    @Mock private UserManager mMockCurrentUserManager;
    @Mock private IConnectionService mIConnectionService;
    @Mock private TelecomMetricsController mMockTelecomMetricsController;
    @Mock private Ringer.VibratorAdapter mMockVibratorAdapter;
    private CallsManager mCallsManager;

    @Override
@@ -357,6 +358,7 @@ public class CallsManagerTest extends TelecomTestCase {
        when(mTimeoutsAdapter.getNonVoipCallTransitoryStateTimeoutMillis())
                .thenReturn(STATE_TIMEOUT);
        when(mClockProxy.elapsedRealtime()).thenReturn(0L);
        when(mMockVibratorAdapter.hasVibrator()).thenReturn(true);
        mCallsManager = new CallsManager(
                mComponentContextFixture.getTestDouble().getApplicationContext(),
                mLock,
@@ -404,7 +406,8 @@ public class CallsManagerTest extends TelecomTestCase {
                mTelephonyFlags,
                (call, listener, context, timeoutsAdapter,
                        mFeatureFlags, lock) -> mIncomingCallFilterGraph,
                mMockTelecomMetricsController);
                mMockTelecomMetricsController,
                mMockVibratorAdapter);

        when(mPhoneAccountRegistrar.getPhoneAccount(
                eq(SELF_MANAGED_HANDLE), any())).thenReturn(SELF_MANAGED_ACCOUNT);
Loading