Loading services/core/java/com/android/server/vibrator/HalVibratorManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading services/core/java/com/android/server/vibrator/VibratorManagerService.java +10 −15 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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. Loading @@ -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); Loading Loading @@ -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 Loading @@ -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); } } Loading @@ -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 Loading services/core/java/com/android/server/vibrator/VintfHalVibratorManager.java +15 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. Loading @@ -135,6 +137,9 @@ class VintfHalVibratorManager { @Override public void onSystemReady() { for (int i = 0; i < mVibrators.size(); i++) { mVibrators.valueAt(i).onSystemReady(); } } @Override Loading Loading @@ -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 Loading services/tests/vibrator/src/com/android/server/vibrator/DeviceAdapterTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading services/tests/vibrator/src/com/android/server/vibrator/HalVibratorManagerTestCase.java +39 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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()); Loading @@ -47,7 +49,7 @@ public abstract class HalVibratorManagerTestCase { HalVibratorManager newInitializedVibratorManager() { HalVibratorManager manager = newVibratorManager(); manager.init(mHalCallbackMock); manager.init(mHalCallbackMock, mHalVibratorCallbackMock); manager.onSystemReady(); return manager; } Loading @@ -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); Loading @@ -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); Loading @@ -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 Loading
services/core/java/com/android/server/vibrator/HalVibratorManager.java +2 −2 Original line number Diff line number Diff line Loading @@ -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(); Loading
services/core/java/com/android/server/vibrator/VibratorManagerService.java +10 −15 Original line number Diff line number Diff line Loading @@ -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); Loading @@ -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. Loading @@ -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); Loading Loading @@ -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 Loading @@ -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); } } Loading @@ -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 Loading
services/core/java/com/android/server/vibrator/VintfHalVibratorManager.java +15 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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. Loading @@ -135,6 +137,9 @@ class VintfHalVibratorManager { @Override public void onSystemReady() { for (int i = 0; i < mVibrators.size(); i++) { mVibrators.valueAt(i).onSystemReady(); } } @Override Loading Loading @@ -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 Loading
services/tests/vibrator/src/com/android/server/vibrator/DeviceAdapterTest.java +5 −5 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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); Loading
services/tests/vibrator/src/com/android/server/vibrator/HalVibratorManagerTestCase.java +39 −4 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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()); Loading @@ -47,7 +49,7 @@ public abstract class HalVibratorManagerTestCase { HalVibratorManager newInitializedVibratorManager() { HalVibratorManager manager = newVibratorManager(); manager.init(mHalCallbackMock); manager.init(mHalCallbackMock, mHalVibratorCallbackMock); manager.onSystemReady(); return manager; } Loading @@ -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); Loading @@ -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); Loading @@ -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