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

Commit f9538dfd authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Move HalVibrator intialization to HalVibratorManager" into main

parents dd9da20e fc4e4a95
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -32,8 +32,8 @@ interface HalVibratorManager {
        void onVibrationSessionComplete(long sessionId);
    }

    /** Initializes the HAL and set the callback instance for future interactions. */
    void init(@NonNull Callbacks callbacks);
    /** Initializes the HAL and set callback instances for future interactions. */
    void init(@NonNull Callbacks callbacks, @NonNull HalVibrator.Callbacks vibratorCallbacks);

    /** Notifies the boot phase system ready. This might load some HAL static data. */
    void onSystemReady();
+10 −15
Original line number Diff line number Diff line
@@ -274,7 +274,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
        mVibratorManager = Flags.removeHidlSupport()
                ? injector.createHalVibratorManager()
                : injector.createNativeHalVibratorManager();
        mVibratorManager.init(halListener);
        mVibratorManager.init(halListener, halListener);

        int recentDumpSizeLimit = mContext.getResources().getInteger(
                com.android.internal.R.integer.config_recentVibrationsDumpSizeLimit);
@@ -300,11 +300,7 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
        int[] vibratorIds = mVibratorManager.getVibratorIds();
        SparseArray<HalVibrator> availableVibrators = new SparseArray<>(vibratorIds.length);
        for (int vibratorId : vibratorIds) {
            HalVibrator vibrator = mVibratorManager.getVibrator(vibratorId);
            if (vibrator != null) {
                availableVibrators.put(vibratorId, vibrator);
                vibrator.init(halListener);
            }
            availableVibrators.put(vibratorId, mVibratorManager.getVibrator(vibratorId));
        }

        // Load vibrator adapter, that depends on hardware info.
@@ -331,12 +327,6 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
        Trace.traceBegin(TRACE_TAG_VIBRATOR, "systemReady");
        try {
            mVibratorManager.onSystemReady();
            for (int vibratorId : mVibratorManager.getVibratorIds()) {
                HalVibrator vibrator = mVibratorManager.getVibrator(vibratorId);
                if (vibrator != null) {
                    vibrator.onSystemReady();
                }
            }

            synchronized (mLock) {
                mVibratorInfos = applyToAllVibratorsLocked(HalVibrator::getInfo);
@@ -2150,8 +2140,8 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
        }

        @Override
        public void init(@NonNull Callbacks callbacks) {
            mNativeWrapper.init(callbacks);
        public void init(@NonNull Callbacks cb, @NonNull HalVibrator.Callbacks vibratorCb) {
            mNativeWrapper.init(cb);

            // Load vibrator hardware info. The vibrator ids and manager capabilities are loaded
            // once and assumed unchanged for the lifecycle of this service. Each vibrator can still
@@ -2162,7 +2152,9 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
            if (vibratorIds != null) {
                mVibratorIds = vibratorIds;
                for (int id : vibratorIds) {
                    mVibrators.put(id, mNativeWrapper.createVibrator(id));
                    HalVibrator vibrator = mNativeWrapper.createVibrator(id);
                    vibrator.init(vibratorCb);
                    mVibrators.put(id, vibrator);
                }
            }

@@ -2176,6 +2168,9 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {

        @Override
        public void onSystemReady() {
            for (int i = 0; i < mVibrators.size(); i++) {
                mVibrators.valueAt(i).onSystemReady();
            }
        }

        @Override
+15 −4
Original line number Diff line number Diff line
@@ -107,8 +107,8 @@ class VintfHalVibratorManager {
        }

        @Override
        public void init(@NonNull Callbacks callbacks) {
            mCallbacks = callbacks;
        public void init(@NonNull Callbacks cb, @NonNull HalVibrator.Callbacks vibratorCb) {
            mCallbacks = cb;

            // Load vibrator hardware info. The vibrator ids and manager capabilities are loaded
            // once and assumed unchanged for the lifecycle of this service. Each vibrator can still
@@ -122,7 +122,9 @@ class VintfHalVibratorManager {
            mCapabilities = capabilities.orElse(0).longValue();
            mVibratorIds = vibratorIds.orElseGet(() -> new int[0]);
            for (int id : mVibratorIds) {
                mVibrators.put(id, mVibratorFactory.apply(id));
                HalVibrator vibrator = mVibratorFactory.apply(id);
                vibrator.init(vibratorCb);
                mVibrators.put(id, vibrator);
            }

            // Reset the hardware to a default state.
@@ -135,6 +137,9 @@ class VintfHalVibratorManager {

        @Override
        public void onSystemReady() {
            for (int i = 0; i < mVibrators.size(); i++) {
                mVibrators.valueAt(i).onSystemReady();
            }
        }

        @Override
@@ -404,11 +409,17 @@ class VintfHalVibratorManager {
        }

        @Override
        public void init(@NonNull Callbacks callbacks) {
        public void init(@NonNull Callbacks cb, @NonNull HalVibrator.Callbacks vibratorCb) {
            for (int i = 0; i < mVibrators.size(); i++) {
                mVibrators.valueAt(i).init(vibratorCb);
            }
        }

        @Override
        public void onSystemReady() {
            for (int i = 0; i < mVibrators.size(); i++) {
                mVibrators.valueAt(i).onSystemReady();
            }
        }

        @Override
+5 −5
Original line number Diff line number Diff line
@@ -142,11 +142,12 @@ public class DeviceAdapterTest {

    @Test
    public void testPrebakedAndPrimitiveSegments_supportedEffects_returnsOriginalSegment() {
        mFallbackEffects.put(EFFECT_THUD, VibrationEffect.createOneShot(10, 100));
        // Fallback ignored, effect supported.
        mFallbackEffects.put(EFFECT_TICK, VibrationEffect.createOneShot(10, 100));
        VibrationEffect.Composed effect = new VibrationEffect.Composed(Arrays.asList(
                new PrebakedSegment(EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_LIGHT),
                new PrimitiveSegment(PRIMITIVE_TICK, 1, 10),
                new PrebakedSegment(EFFECT_THUD, true, VibrationEffect.EFFECT_STRENGTH_STRONG),
                new PrebakedSegment(EFFECT_TICK, true, VibrationEffect.EFFECT_STRENGTH_STRONG),
                new PrimitiveSegment(PRIMITIVE_SPIN, 0.5f, 100)),
                /* repeatIndex= */ -1);

@@ -264,11 +265,10 @@ public class DeviceAdapterTest {

    @Test
    public void testMonoCombinedVibration_returnsSameVibrationWhenEffectsUnchanged() {
        // Only on-off effects are supported by all vibrators.
        VibrationEffect.Composed effect = new VibrationEffect.Composed(Arrays.asList(
                new PrebakedSegment(EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_LIGHT),
                new StepSegment(1, 0, 10),
                new PrebakedSegment(EFFECT_THUD, true, VibrationEffect.EFFECT_STRENGTH_STRONG),
                new StepSegment(1, 0, 10)),
                new StepSegment(1, 0, 100)),
                /* repeatIndex= */ -1);

        CombinedVibration expected = CombinedVibration.createParallel(effect);
+39 −4
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.verify;

import android.hardware.vibrator.IVibrator;
import android.hardware.vibrator.IVibratorManager;
import android.os.test.TestLooper;
import android.os.vibrator.Flags;
@@ -39,6 +40,7 @@ public abstract class HalVibratorManagerTestCase {
    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();

    @Mock HalVibratorManager.Callbacks mHalCallbackMock;
    @Mock HalVibrator.Callbacks mHalVibratorCallbackMock;

    final TestLooper mTestLooper = new TestLooper();
    final HalVibratorManagerHelper mHelper = new HalVibratorManagerHelper(mTestLooper.getLooper());
@@ -47,7 +49,7 @@ public abstract class HalVibratorManagerTestCase {

    HalVibratorManager newInitializedVibratorManager() {
        HalVibratorManager manager = newVibratorManager();
        manager.init(mHalCallbackMock);
        manager.init(mHalCallbackMock, mHalVibratorCallbackMock);
        manager.onSystemReady();
        return manager;
    }
@@ -57,7 +59,7 @@ public abstract class HalVibratorManagerTestCase {
        mHelper.setCapabilities(IVibratorManager.CAP_SYNC);
        mHelper.setVibratorIds(new int[] {1, 2});
        HalVibratorManager manager = newVibratorManager();
        manager.init(mHalCallbackMock);
        manager.init(mHalCallbackMock, mHalVibratorCallbackMock);

        assertThat(mHelper.getConnectCount()).isEqualTo(1);
        assertThat(manager.getCapabilities()).isEqualTo(IVibratorManager.CAP_SYNC);
@@ -70,7 +72,7 @@ public abstract class HalVibratorManagerTestCase {
        mHelper.setCapabilities(IVibratorManager.CAP_SYNC, IVibratorManager.CAP_START_SESSIONS);
        mHelper.setVibratorIds(new int[] {1, 2});
        HalVibratorManager manager = newVibratorManager();
        manager.init(mHalCallbackMock);
        manager.init(mHalCallbackMock, mHalVibratorCallbackMock);

        assertThat(mHelper.getConnectCount()).isEqualTo(1);
        assertThat(mHelper.getCancelSyncedCount()).isEqualTo(1);
@@ -81,10 +83,43 @@ public abstract class HalVibratorManagerTestCase {
    public void init_withNullVibratorIds_returnsEmptyArray() {
        mHelper.setVibratorIds(null);
        HalVibratorManager manager = newVibratorManager();
        manager.init(mHalCallbackMock);
        manager.init(mHalCallbackMock, mHalVibratorCallbackMock);
        assertThat(manager.getVibratorIds()).isEmpty();
    }

    @Test
    public void init_initializesAllVibrators() {
        mHelper.setVibratorIds(new int[] {1, 2});
        HalVibratorManager manager = newVibratorManager();
        manager.init(mHalCallbackMock, mHalVibratorCallbackMock);

        assertThat(mHelper.getVibratorHelper(1).isInitialized()).isTrue();
        assertThat(mHelper.getVibratorHelper(2).isInitialized()).isTrue();
    }

    @Test
    public void onSystemReady_triggersAllVibratorsOnSystemReady() {
        mHelper.setVibratorIds(new int[] {1, 2});
        mHelper.getVibratorHelper(1).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
        mHelper.getVibratorHelper(2).setLoadInfoToFail();
        HalVibratorManager manager = newVibratorManager();
        manager.init(mHalCallbackMock, mHalVibratorCallbackMock);

        assertThat(manager.getVibrator(1).getInfo().getCapabilities())
                .isEqualTo(IVibrator.CAP_EXTERNAL_CONTROL);
        assertThat(manager.getVibrator(2).getInfo().getCapabilities())
                .isEqualTo(0);

        mHelper.getVibratorHelper(2).setCapabilities(IVibrator.CAP_EXTERNAL_CONTROL);
        manager.onSystemReady();

        // Capabilities from vibrator 2 reloaded after failure.
        assertThat(manager.getVibrator(1).getInfo().getCapabilities())
                .isEqualTo(IVibrator.CAP_EXTERNAL_CONTROL);
        assertThat(manager.getVibrator(2).getInfo().getCapabilities())
                .isEqualTo(IVibrator.CAP_EXTERNAL_CONTROL);
    }

    @Test
    public void hasCapability_checksAllFlagBits() {
        mHelper.setCapabilities(IVibratorManager.CAP_SYNC, IVibratorManager.CAP_START_SESSIONS);
Loading