Fix crash when using VibratorManagerService before system ready
VibratorManagerService depends on some system services like Vibrator, AudioManager and InputManager, which can only be initialized onBootPhase. Move only the initialization of these services to the onBootPhase and allow the VibratorManagerService to be used before that without crashing. Fix: 180699899 Test: VibratorManagerServiceTest Change-Id: Id6406373d7a7f15265aa6c1ce5b7ef39bb949eed
This commit is contained in:
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.server.vibrator;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.content.Context;
|
||||
import android.hardware.input.InputManager;
|
||||
import android.os.CombinedVibrationEffect;
|
||||
@@ -33,7 +34,11 @@ final class InputDeviceDelegate implements InputManager.InputDeviceListener {
|
||||
|
||||
private final Object mLock = new Object();
|
||||
private final Handler mHandler;
|
||||
private final InputManager mInputManager;
|
||||
private final Context mContext;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
@Nullable
|
||||
private InputManager mInputManager;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private final SparseArray<VibratorManager> mInputDeviceVibrators = new SparseArray<>();
|
||||
@@ -47,7 +52,13 @@ final class InputDeviceDelegate implements InputManager.InputDeviceListener {
|
||||
|
||||
InputDeviceDelegate(Context context, Handler handler) {
|
||||
mHandler = handler;
|
||||
mInputManager = context.getSystemService(InputManager.class);
|
||||
mContext = context;
|
||||
}
|
||||
|
||||
public void onSystemReady() {
|
||||
synchronized (mLock) {
|
||||
mInputManager = mContext.getSystemService(InputManager.class);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -116,6 +127,10 @@ final class InputDeviceDelegate implements InputManager.InputDeviceListener {
|
||||
*/
|
||||
public boolean updateInputDeviceVibrators(boolean vibrateInputDevices) {
|
||||
synchronized (mLock) {
|
||||
if (mInputManager == null) {
|
||||
// Ignore update, service not loaded yet so change cannot be applied.
|
||||
return false;
|
||||
}
|
||||
if (vibrateInputDevices == mShouldVibrateInputDevices) {
|
||||
// No need to update if settings haven't changed.
|
||||
return false;
|
||||
@@ -150,6 +165,10 @@ final class InputDeviceDelegate implements InputManager.InputDeviceListener {
|
||||
|
||||
private void updateInputDevice(int deviceId) {
|
||||
synchronized (mLock) {
|
||||
if (mInputManager == null) {
|
||||
// Ignore update, service not loaded yet so change cannot be applied.
|
||||
return;
|
||||
}
|
||||
if (!mShouldVibrateInputDevices) {
|
||||
// No need to keep this device vibrator if setting is off.
|
||||
return;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
package com.android.server.vibrator;
|
||||
|
||||
import android.annotation.Nullable;
|
||||
import android.app.ActivityManager;
|
||||
import android.app.IUidObserver;
|
||||
import android.content.Context;
|
||||
@@ -57,8 +58,6 @@ final class VibrationSettings {
|
||||
|
||||
private final Object mLock = new Object();
|
||||
private final Context mContext;
|
||||
private final Vibrator mVibrator;
|
||||
private final AudioManager mAudioManager;
|
||||
private final SettingsObserver mSettingObserver;
|
||||
@VisibleForTesting
|
||||
final UidObserver mUidObserver;
|
||||
@@ -67,6 +66,13 @@ final class VibrationSettings {
|
||||
private final List<OnVibratorSettingsChanged> mListeners = new ArrayList<>();
|
||||
private final SparseArray<VibrationEffect> mFallbackEffects;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
@Nullable
|
||||
private Vibrator mVibrator;
|
||||
@GuardedBy("mLock")
|
||||
@Nullable
|
||||
private AudioManager mAudioManager;
|
||||
|
||||
@GuardedBy("mLock")
|
||||
private boolean mVibrateInputDevices;
|
||||
@GuardedBy("mLock")
|
||||
@@ -86,22 +92,9 @@ final class VibrationSettings {
|
||||
|
||||
VibrationSettings(Context context, Handler handler) {
|
||||
mContext = context;
|
||||
mVibrator = context.getSystemService(Vibrator.class);
|
||||
mAudioManager = context.getSystemService(AudioManager.class);
|
||||
mSettingObserver = new SettingsObserver(handler);
|
||||
mUidObserver = new UidObserver();
|
||||
|
||||
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES));
|
||||
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING));
|
||||
registerSettingsObserver(Settings.Global.getUriFor(Settings.Global.APPLY_RAMPING_RINGER));
|
||||
registerSettingsObserver(Settings.Global.getUriFor(Settings.Global.ZEN_MODE));
|
||||
registerSettingsObserver(
|
||||
Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY));
|
||||
registerSettingsObserver(
|
||||
Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY));
|
||||
registerSettingsObserver(
|
||||
Settings.System.getUriFor(Settings.System.RING_VIBRATION_INTENSITY));
|
||||
|
||||
VibrationEffect clickEffect = createEffectFromResource(
|
||||
com.android.internal.R.array.config_virtualKeyVibePattern);
|
||||
VibrationEffect doubleClickEffect = VibrationEffect.createWaveform(
|
||||
@@ -119,6 +112,15 @@ final class VibrationSettings {
|
||||
mFallbackEffects.put(VibrationEffect.EFFECT_TEXTURE_TICK,
|
||||
VibrationEffect.get(VibrationEffect.EFFECT_TICK, false));
|
||||
|
||||
// Update with current values from settings.
|
||||
updateSettings();
|
||||
}
|
||||
|
||||
public void onSystemReady() {
|
||||
synchronized (mLock) {
|
||||
mVibrator = mContext.getSystemService(Vibrator.class);
|
||||
mAudioManager = mContext.getSystemService(AudioManager.class);
|
||||
}
|
||||
try {
|
||||
ActivityManager.getService().registerUidObserver(mUidObserver,
|
||||
ActivityManager.UID_OBSERVER_PROCSTATE | ActivityManager.UID_OBSERVER_GONE,
|
||||
@@ -148,7 +150,18 @@ final class VibrationSettings {
|
||||
}
|
||||
});
|
||||
|
||||
// Update with current values from settings.
|
||||
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_INPUT_DEVICES));
|
||||
registerSettingsObserver(Settings.System.getUriFor(Settings.System.VIBRATE_WHEN_RINGING));
|
||||
registerSettingsObserver(Settings.Global.getUriFor(Settings.Global.APPLY_RAMPING_RINGER));
|
||||
registerSettingsObserver(Settings.Global.getUriFor(Settings.Global.ZEN_MODE));
|
||||
registerSettingsObserver(
|
||||
Settings.System.getUriFor(Settings.System.HAPTIC_FEEDBACK_INTENSITY));
|
||||
registerSettingsObserver(
|
||||
Settings.System.getUriFor(Settings.System.NOTIFICATION_VIBRATION_INTENSITY));
|
||||
registerSettingsObserver(
|
||||
Settings.System.getUriFor(Settings.System.RING_VIBRATION_INTENSITY));
|
||||
|
||||
// Update with newly loaded services.
|
||||
updateSettings();
|
||||
}
|
||||
|
||||
@@ -178,17 +191,21 @@ final class VibrationSettings {
|
||||
* @return The vibration intensity, one of Vibrator.VIBRATION_INTENSITY_*
|
||||
*/
|
||||
public int getDefaultIntensity(int usageHint) {
|
||||
if (isRingtone(usageHint)) {
|
||||
return mVibrator.getDefaultRingVibrationIntensity();
|
||||
} else if (isNotification(usageHint)) {
|
||||
return mVibrator.getDefaultNotificationVibrationIntensity();
|
||||
} else if (isHapticFeedback(usageHint)) {
|
||||
return mVibrator.getDefaultHapticFeedbackIntensity();
|
||||
} else if (isAlarm(usageHint)) {
|
||||
if (isAlarm(usageHint)) {
|
||||
return Vibrator.VIBRATION_INTENSITY_HIGH;
|
||||
} else {
|
||||
return Vibrator.VIBRATION_INTENSITY_MEDIUM;
|
||||
}
|
||||
synchronized (mLock) {
|
||||
if (mVibrator != null) {
|
||||
if (isRingtone(usageHint)) {
|
||||
return mVibrator.getDefaultRingVibrationIntensity();
|
||||
} else if (isNotification(usageHint)) {
|
||||
return mVibrator.getDefaultNotificationVibrationIntensity();
|
||||
} else if (isHapticFeedback(usageHint)) {
|
||||
return mVibrator.getDefaultHapticFeedbackIntensity();
|
||||
}
|
||||
}
|
||||
}
|
||||
return Vibrator.VIBRATION_INTENSITY_MEDIUM;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -234,8 +251,11 @@ final class VibrationSettings {
|
||||
if (!isRingtone(usageHint)) {
|
||||
return true;
|
||||
}
|
||||
int ringerMode = mAudioManager.getRingerModeInternal();
|
||||
synchronized (mLock) {
|
||||
if (mAudioManager == null) {
|
||||
return false;
|
||||
}
|
||||
int ringerMode = mAudioManager.getRingerModeInternal();
|
||||
if (mVibrateWhenRinging) {
|
||||
return ringerMode != AudioManager.RINGER_MODE_SILENT;
|
||||
} else if (mApplyRampingRinger) {
|
||||
@@ -304,12 +324,12 @@ final class VibrationSettings {
|
||||
mVibrateWhenRinging = getSystemSetting(Settings.System.VIBRATE_WHEN_RINGING, 0) != 0;
|
||||
mApplyRampingRinger = getGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0) != 0;
|
||||
mHapticFeedbackIntensity = getSystemSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
|
||||
mVibrator.getDefaultHapticFeedbackIntensity());
|
||||
getDefaultIntensity(VibrationAttributes.USAGE_TOUCH));
|
||||
mNotificationIntensity = getSystemSetting(
|
||||
Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
|
||||
mVibrator.getDefaultNotificationVibrationIntensity());
|
||||
getDefaultIntensity(VibrationAttributes.USAGE_NOTIFICATION));
|
||||
mRingIntensity = getSystemSetting(Settings.System.RING_VIBRATION_INTENSITY,
|
||||
mVibrator.getDefaultRingVibrationIntensity());
|
||||
getDefaultIntensity(VibrationAttributes.USAGE_RINGTONE));
|
||||
mVibrateInputDevices = getSystemSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0) > 0;
|
||||
mZenMode = getGlobalSetting(Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_OFF);
|
||||
}
|
||||
@@ -346,15 +366,15 @@ final class VibrationSettings {
|
||||
proto.write(VibratorManagerServiceDumpProto.HAPTIC_FEEDBACK_INTENSITY,
|
||||
mHapticFeedbackIntensity);
|
||||
proto.write(VibratorManagerServiceDumpProto.HAPTIC_FEEDBACK_DEFAULT_INTENSITY,
|
||||
mVibrator.getDefaultHapticFeedbackIntensity());
|
||||
getDefaultIntensity(VibrationAttributes.USAGE_TOUCH));
|
||||
proto.write(VibratorManagerServiceDumpProto.NOTIFICATION_INTENSITY,
|
||||
mNotificationIntensity);
|
||||
proto.write(VibratorManagerServiceDumpProto.NOTIFICATION_DEFAULT_INTENSITY,
|
||||
mVibrator.getDefaultNotificationVibrationIntensity());
|
||||
getDefaultIntensity(VibrationAttributes.USAGE_NOTIFICATION));
|
||||
proto.write(VibratorManagerServiceDumpProto.RING_INTENSITY,
|
||||
mRingIntensity);
|
||||
proto.write(VibratorManagerServiceDumpProto.RING_DEFAULT_INTENSITY,
|
||||
mVibrator.getDefaultRingVibrationIntensity());
|
||||
getDefaultIntensity(VibrationAttributes.USAGE_RINGTONE));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -127,9 +127,9 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
@GuardedBy("mLock")
|
||||
private ExternalVibrationHolder mCurrentExternalVibration;
|
||||
|
||||
private VibrationSettings mVibrationSettings;
|
||||
private VibrationScaler mVibrationScaler;
|
||||
private InputDeviceDelegate mInputDeviceDelegate;
|
||||
private final VibrationSettings mVibrationSettings;
|
||||
private final VibrationScaler mVibrationScaler;
|
||||
private final InputDeviceDelegate mInputDeviceDelegate;
|
||||
|
||||
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
|
||||
@Override
|
||||
@@ -170,6 +170,10 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
mContext = context;
|
||||
mHandler = injector.createHandler(Looper.myLooper());
|
||||
|
||||
mVibrationSettings = new VibrationSettings(mContext, mHandler);
|
||||
mVibrationScaler = new VibrationScaler(mContext, mVibrationSettings);
|
||||
mInputDeviceDelegate = new InputDeviceDelegate(mContext, mHandler);
|
||||
|
||||
VibrationCompleteListener listener = new VibrationCompleteListener(this);
|
||||
mNativeWrapper = injector.getNativeWrapper();
|
||||
mNativeWrapper.init(listener);
|
||||
@@ -224,12 +228,12 @@ public class VibratorManagerService extends IVibratorManagerService.Stub {
|
||||
Slog.v(TAG, "Initializing VibratorManager service...");
|
||||
Trace.traceBegin(Trace.TRACE_TAG_VIBRATOR, "systemReady");
|
||||
try {
|
||||
mVibrationSettings = new VibrationSettings(mContext, mHandler);
|
||||
mVibrationScaler = new VibrationScaler(mContext, mVibrationSettings);
|
||||
mInputDeviceDelegate = new InputDeviceDelegate(mContext, mHandler);
|
||||
mVibrationSettings.onSystemReady();
|
||||
mInputDeviceDelegate.onSystemReady();
|
||||
|
||||
mVibrationSettings.addListener(this::updateServiceState);
|
||||
|
||||
// Will update settings and input devices.
|
||||
updateServiceState();
|
||||
} finally {
|
||||
Slog.v(TAG, "VibratorManager service initialized");
|
||||
|
||||
@@ -91,6 +91,7 @@ public class InputDeviceDelegateTest {
|
||||
|
||||
mInputDeviceDelegate = new InputDeviceDelegate(
|
||||
mContextSpy, new Handler(mTestLooper.getLooper()));
|
||||
mInputDeviceDelegate.onSystemReady();
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -98,6 +99,24 @@ public class InputDeviceDelegateTest {
|
||||
InputManager.clearInstance();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void beforeSystemReady_ignoresAnyUpdate() throws Exception {
|
||||
when(mIInputManagerMock.getInputDeviceIds()).thenReturn(new int[0]);
|
||||
InputDeviceDelegate inputDeviceDelegate = new InputDeviceDelegate(
|
||||
mContextSpy, new Handler(mTestLooper.getLooper()));
|
||||
|
||||
inputDeviceDelegate.updateInputDeviceVibrators(/* vibrateInputDevices= */ true);
|
||||
assertFalse(inputDeviceDelegate.isAvailable());
|
||||
|
||||
inputDeviceDelegate.onInputDeviceAdded(1);
|
||||
assertFalse(inputDeviceDelegate.isAvailable());
|
||||
|
||||
updateInputDevices(new int[]{1});
|
||||
assertFalse(inputDeviceDelegate.isAvailable());
|
||||
|
||||
verify(mIInputManagerMock, never()).getInputDevice(anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void onInputDeviceAdded_withSettingsDisabled_ignoresNewDevice() throws Exception {
|
||||
when(mIInputManagerMock.getInputDeviceIds()).thenReturn(new int[0]);
|
||||
|
||||
@@ -88,6 +88,7 @@ public class VibrationScalerTest {
|
||||
mVibrationSettings = new VibrationSettings(
|
||||
mContextSpy, new Handler(mTestLooper.getLooper()));
|
||||
mVibrationScaler = new VibrationScaler(mContextSpy, mVibrationSettings);
|
||||
mVibrationSettings.onSystemReady();
|
||||
}
|
||||
|
||||
@After
|
||||
|
||||
@@ -106,6 +106,7 @@ public class VibrationSettingsTest {
|
||||
mAudioManager = mContextSpy.getSystemService(AudioManager.class);
|
||||
mVibrationSettings = new VibrationSettings(mContextSpy,
|
||||
new Handler(mTestLooper.getLooper()));
|
||||
mVibrationSettings.onSystemReady();
|
||||
|
||||
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 0);
|
||||
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
|
||||
@@ -161,6 +162,23 @@ public class VibrationSettingsTest {
|
||||
setGlobalSetting(Settings.Global.ZEN_MODE, Settings.Global.ZEN_MODE_ALARMS);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldVibrateForRingerMode_beforeSystemReady_returnsFalseOnlyForRingtone() {
|
||||
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
|
||||
setRingerMode(AudioManager.RINGER_MODE_MAX);
|
||||
VibrationSettings vibrationSettings = new VibrationSettings(mContextSpy,
|
||||
new Handler(mTestLooper.getLooper()));
|
||||
|
||||
assertFalse(vibrationSettings.shouldVibrateForRingerMode(
|
||||
VibrationAttributes.USAGE_RINGTONE));
|
||||
assertTrue(mVibrationSettings.shouldVibrateForRingerMode(VibrationAttributes.USAGE_ALARM));
|
||||
assertTrue(mVibrationSettings.shouldVibrateForRingerMode(VibrationAttributes.USAGE_TOUCH));
|
||||
assertTrue(mVibrationSettings.shouldVibrateForRingerMode(
|
||||
VibrationAttributes.USAGE_NOTIFICATION));
|
||||
assertTrue(mVibrationSettings.shouldVibrateForRingerMode(
|
||||
VibrationAttributes.USAGE_COMMUNICATION_REQUEST));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void shouldVibrateForRingerMode_withoutRingtoneUsage_returnsTrue() {
|
||||
assertTrue(mVibrationSettings.shouldVibrateForRingerMode(VibrationAttributes.USAGE_ALARM));
|
||||
@@ -302,6 +320,37 @@ public class VibrationSettingsTest {
|
||||
assertTrue(mVibrationSettings.isInZenMode());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDefaultIntensity_beforeSystemReady_returnsMediumToAllExceptAlarm() {
|
||||
mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
|
||||
mFakeVibrator.setDefaultNotificationVibrationIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
|
||||
mFakeVibrator.setDefaultRingVibrationIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
|
||||
|
||||
setUserSetting(Settings.System.NOTIFICATION_VIBRATION_INTENSITY,
|
||||
Vibrator.VIBRATION_INTENSITY_OFF);
|
||||
setUserSetting(Settings.System.RING_VIBRATION_INTENSITY,
|
||||
Vibrator.VIBRATION_INTENSITY_OFF);
|
||||
setUserSetting(Settings.System.HAPTIC_FEEDBACK_INTENSITY,
|
||||
Vibrator.VIBRATION_INTENSITY_OFF);
|
||||
|
||||
VibrationSettings vibrationSettings = new VibrationSettings(mContextSpy,
|
||||
new Handler(mTestLooper.getLooper()));
|
||||
|
||||
assertEquals(Vibrator.VIBRATION_INTENSITY_HIGH,
|
||||
vibrationSettings.getDefaultIntensity(VibrationAttributes.USAGE_ALARM));
|
||||
assertEquals(Vibrator.VIBRATION_INTENSITY_MEDIUM,
|
||||
vibrationSettings.getDefaultIntensity(VibrationAttributes.USAGE_TOUCH));
|
||||
assertEquals(Vibrator.VIBRATION_INTENSITY_MEDIUM,
|
||||
vibrationSettings.getDefaultIntensity(VibrationAttributes.USAGE_NOTIFICATION));
|
||||
assertEquals(Vibrator.VIBRATION_INTENSITY_MEDIUM,
|
||||
vibrationSettings.getDefaultIntensity(VibrationAttributes.USAGE_UNKNOWN));
|
||||
assertEquals(Vibrator.VIBRATION_INTENSITY_MEDIUM,
|
||||
vibrationSettings.getDefaultIntensity(
|
||||
VibrationAttributes.USAGE_PHYSICAL_EMULATION));
|
||||
assertEquals(Vibrator.VIBRATION_INTENSITY_MEDIUM,
|
||||
vibrationSettings.getDefaultIntensity(VibrationAttributes.USAGE_RINGTONE));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getDefaultIntensity_returnsIntensityFromVibratorService() {
|
||||
mFakeVibrator.setDefaultHapticFeedbackIntensity(Vibrator.VIBRATION_INTENSITY_HIGH);
|
||||
|
||||
@@ -176,8 +176,14 @@ public class VibratorManagerServiceTest {
|
||||
LocalServices.removeServiceForTest(PowerManagerInternal.class);
|
||||
}
|
||||
|
||||
private VibratorManagerService createSystemReadyService() {
|
||||
VibratorManagerService service = createService();
|
||||
service.systemReady();
|
||||
return service;
|
||||
}
|
||||
|
||||
private VibratorManagerService createService() {
|
||||
VibratorManagerService service = new VibratorManagerService(
|
||||
return new VibratorManagerService(
|
||||
mContextSpy,
|
||||
new VibratorManagerService.Injector() {
|
||||
@Override
|
||||
@@ -201,8 +207,6 @@ public class VibratorManagerServiceTest {
|
||||
void addService(String name, IBinder service) {
|
||||
}
|
||||
});
|
||||
service.systemReady();
|
||||
return service;
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -214,22 +218,45 @@ public class VibratorManagerServiceTest {
|
||||
assertTrue(mVibratorProviders.get(2).isInitialized());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void createService_doNotCrashIfUsedBeforeSystemReady() {
|
||||
mockVibrators(1, 2);
|
||||
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
|
||||
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_ALWAYS_ON_CONTROL);
|
||||
VibratorManagerService service = createService();
|
||||
|
||||
assertNotNull(service.getVibratorIds());
|
||||
assertNotNull(service.getVibratorInfo(1));
|
||||
assertFalse(service.isVibrating(1));
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
|
||||
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
|
||||
vibrate(service, effect, HAPTIC_FEEDBACK_ATTRS);
|
||||
service.cancelVibrate(service);
|
||||
|
||||
assertTrue(service.setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
|
||||
IVibratorStateListener listener = mockVibratorStateListener();
|
||||
assertTrue(service.registerVibratorStateListener(1, listener));
|
||||
assertTrue(service.unregisterVibratorStateListener(1, listener));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getVibratorIds_withNullResultFromNative_returnsEmptyArray() {
|
||||
when(mNativeWrapperMock.getVibratorIds()).thenReturn(null);
|
||||
assertArrayEquals(new int[0], createService().getVibratorIds());
|
||||
assertArrayEquals(new int[0], createSystemReadyService().getVibratorIds());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getVibratorIds_withNonEmptyResultFromNative_returnsSameArray() {
|
||||
mockVibrators(2, 1);
|
||||
assertArrayEquals(new int[]{2, 1}, createService().getVibratorIds());
|
||||
assertArrayEquals(new int[]{2, 1}, createSystemReadyService().getVibratorIds());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getVibratorInfo_withMissingVibratorId_returnsNull() {
|
||||
mockVibrators(1);
|
||||
assertNull(createService().getVibratorInfo(2));
|
||||
assertNull(createSystemReadyService().getVibratorInfo(2));
|
||||
}
|
||||
|
||||
@Test
|
||||
@@ -239,7 +266,7 @@ public class VibratorManagerServiceTest {
|
||||
vibrator.setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS, IVibrator.CAP_AMPLITUDE_CONTROL);
|
||||
vibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
|
||||
vibrator.setSupportedPrimitives(VibrationEffect.Composition.PRIMITIVE_CLICK);
|
||||
VibratorInfo info = createService().getVibratorInfo(1);
|
||||
VibratorInfo info = createSystemReadyService().getVibratorInfo(1);
|
||||
|
||||
assertNotNull(info);
|
||||
assertEquals(1, info.getId());
|
||||
@@ -257,7 +284,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void registerVibratorStateListener_callbacksAreTriggered() throws Exception {
|
||||
mockVibrators(1);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
IVibratorStateListener listenerMock = mockVibratorStateListener();
|
||||
service.registerVibratorStateListener(1, listenerMock);
|
||||
|
||||
@@ -278,7 +305,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void unregisterVibratorStateListener_callbackNotTriggeredAfter() throws Exception {
|
||||
mockVibrators(1);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
IVibratorStateListener listenerMock = mockVibratorStateListener();
|
||||
service.registerVibratorStateListener(1, listenerMock);
|
||||
|
||||
@@ -303,7 +330,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void registerVibratorStateListener_multipleVibratorsAreTriggered() throws Exception {
|
||||
mockVibrators(0, 1, 2);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
IVibratorStateListener[] listeners = new IVibratorStateListener[3];
|
||||
for (int i = 0; i < 3; i++) {
|
||||
listeners[i] = mockVibratorStateListener();
|
||||
@@ -330,7 +357,8 @@ public class VibratorManagerServiceTest {
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
|
||||
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
|
||||
assertTrue(createService().setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
assertTrue(createSystemReadyService().setAlwaysOnEffect(
|
||||
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
|
||||
VibrationEffect.Prebaked expectedEffect = new VibrationEffect.Prebaked(
|
||||
VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
|
||||
@@ -353,7 +381,8 @@ public class VibratorManagerServiceTest {
|
||||
.addVibrator(2, VibrationEffect.createPredefined(VibrationEffect.EFFECT_TICK))
|
||||
.addVibrator(3, VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK))
|
||||
.combine();
|
||||
assertTrue(createService().setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
assertTrue(createSystemReadyService().setAlwaysOnEffect(
|
||||
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
|
||||
VibrationEffect.Prebaked expectedClick = new VibrationEffect.Prebaked(
|
||||
VibrationEffect.EFFECT_CLICK, false, VibrationEffect.EFFECT_STRENGTH_STRONG);
|
||||
@@ -376,9 +405,11 @@ public class VibratorManagerServiceTest {
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
|
||||
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
|
||||
assertTrue(createService().setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
assertTrue(createSystemReadyService().setAlwaysOnEffect(
|
||||
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
|
||||
assertTrue(createService().setAlwaysOnEffect(UID, PACKAGE_NAME, 1, null, ALARM_ATTRS));
|
||||
assertTrue(createSystemReadyService().setAlwaysOnEffect(
|
||||
UID, PACKAGE_NAME, 1, null, ALARM_ATTRS));
|
||||
|
||||
assertNull(mVibratorProviders.get(1).getAlwaysOnEffect(1));
|
||||
assertNull(mVibratorProviders.get(2).getAlwaysOnEffect(1));
|
||||
@@ -392,7 +423,8 @@ public class VibratorManagerServiceTest {
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
|
||||
VibrationEffect.createOneShot(100, VibrationEffect.DEFAULT_AMPLITUDE));
|
||||
assertFalse(createService().setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
assertFalse(createSystemReadyService().setAlwaysOnEffect(
|
||||
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
|
||||
assertNull(mVibratorProviders.get(1).getAlwaysOnEffect(1));
|
||||
}
|
||||
@@ -405,7 +437,8 @@ public class VibratorManagerServiceTest {
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.startSequential()
|
||||
.addNext(0, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
|
||||
.combine();
|
||||
assertFalse(createService().setAlwaysOnEffect(UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
assertFalse(createSystemReadyService().setAlwaysOnEffect(
|
||||
UID, PACKAGE_NAME, 1, effect, ALARM_ATTRS));
|
||||
|
||||
assertNull(mVibratorProviders.get(1).getAlwaysOnEffect(1));
|
||||
}
|
||||
@@ -413,7 +446,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void setAlwaysOnEffect_withNoVibratorWithCapability_ignoresEffect() {
|
||||
mockVibrators(1);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
CombinedVibrationEffect mono = CombinedVibrationEffect.createSynced(
|
||||
VibrationEffect.createPredefined(VibrationEffect.EFFECT_CLICK));
|
||||
@@ -435,18 +468,18 @@ public class VibratorManagerServiceTest {
|
||||
setRingerMode(AudioManager.RINGER_MODE_NORMAL);
|
||||
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
|
||||
setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
vibrate(service, VibrationEffect.createOneShot(40, 1), RINGTONE_ATTRS);
|
||||
|
||||
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 0);
|
||||
setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 1);
|
||||
service = createService();
|
||||
service = createSystemReadyService();
|
||||
vibrate(service, VibrationEffect.createOneShot(40, 10), RINGTONE_ATTRS);
|
||||
assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
|
||||
|
||||
setUserSetting(Settings.System.VIBRATE_WHEN_RINGING, 1);
|
||||
setGlobalSetting(Settings.Global.APPLY_RAMPING_RINGER, 0);
|
||||
service = createService();
|
||||
service = createSystemReadyService();
|
||||
vibrate(service, VibrationEffect.createOneShot(40, 100), RINGTONE_ATTRS);
|
||||
assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
|
||||
|
||||
@@ -459,7 +492,7 @@ public class VibratorManagerServiceTest {
|
||||
mockVibrators(1);
|
||||
FakeVibratorControllerProvider fakeVibrator = mVibratorProviders.get(1);
|
||||
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
mRegisteredPowerModeListener.onLowPowerModeChanged(LOW_POWER_STATE);
|
||||
vibrate(service, VibrationEffect.createOneShot(1, 1), HAPTIC_FEEDBACK_ATTRS);
|
||||
vibrate(service, VibrationEffect.createOneShot(2, 2), RINGTONE_ATTRS);
|
||||
@@ -480,7 +513,7 @@ public class VibratorManagerServiceTest {
|
||||
|
||||
@Test
|
||||
public void vibrate_withAudioAttributes_usesOriginalAudioUsageInAppOpsManager() {
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
VibrationEffect effect = VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
|
||||
AudioAttributes audioAttributes = new AudioAttributes.Builder()
|
||||
@@ -496,7 +529,7 @@ public class VibratorManagerServiceTest {
|
||||
|
||||
@Test
|
||||
public void vibrate_withVibrationAttributes_usesCorrespondingAudioUsageInAppOpsManager() {
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_CLICK), ALARM_ATTRS);
|
||||
vibrate(service, VibrationEffect.get(VibrationEffect.EFFECT_TICK), NOTIFICATION_ATTRS);
|
||||
@@ -534,7 +567,7 @@ public class VibratorManagerServiceTest {
|
||||
when(mIInputManagerMock.getVibratorIds(eq(1))).thenReturn(new int[]{1});
|
||||
when(mIInputManagerMock.getInputDevice(eq(1))).thenReturn(createInputDeviceWithVibrator(1));
|
||||
setUserSetting(Settings.System.VIBRATE_INPUT_DEVICES, 1);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.createSynced(
|
||||
VibrationEffect.createOneShot(10, 10));
|
||||
@@ -550,7 +583,7 @@ public class VibratorManagerServiceTest {
|
||||
public void vibrate_withNativeCallbackTriggered_finishesVibration() throws Exception {
|
||||
mockVibrators(1);
|
||||
mVibratorProviders.get(1).setSupportedEffects(VibrationEffect.EFFECT_CLICK);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
// The native callback will be dispatched manually in this test.
|
||||
mTestLooper.stopAutoDispatchAndIgnoreExceptions();
|
||||
|
||||
@@ -573,7 +606,7 @@ public class VibratorManagerServiceTest {
|
||||
mockVibrators(1, 2);
|
||||
mVibratorProviders.get(1).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
|
||||
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
// The native callback will be dispatched manually in this test.
|
||||
mTestLooper.stopAutoDispatchAndIgnoreExceptions();
|
||||
|
||||
@@ -619,7 +652,7 @@ public class VibratorManagerServiceTest {
|
||||
FakeVibratorControllerProvider fakeVibrator1 = mVibratorProviders.get(1);
|
||||
fakeVibrator1.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
|
||||
mVibratorProviders.get(2).setCapabilities(IVibrator.CAP_COMPOSE_EFFECTS);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
|
||||
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
|
||||
@@ -645,7 +678,7 @@ public class VibratorManagerServiceTest {
|
||||
mockVibrators(1, 2);
|
||||
FakeVibratorControllerProvider fakeVibrator1 = mVibratorProviders.get(1);
|
||||
fakeVibrator1.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
|
||||
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
|
||||
@@ -665,7 +698,7 @@ public class VibratorManagerServiceTest {
|
||||
mockCapabilities(IVibratorManager.CAP_SYNC, IVibratorManager.CAP_PREPARE_ON);
|
||||
mockVibrators(1, 2);
|
||||
when(mNativeWrapperMock.prepareSynced(any())).thenReturn(false);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
|
||||
.addVibrator(1, VibrationEffect.createOneShot(10, 50))
|
||||
@@ -686,7 +719,7 @@ public class VibratorManagerServiceTest {
|
||||
mockVibrators(1, 2);
|
||||
when(mNativeWrapperMock.prepareSynced(eq(new int[]{1, 2}))).thenReturn(true);
|
||||
when(mNativeWrapperMock.triggerSynced(anyLong())).thenReturn(false);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
CombinedVibrationEffect effect = CombinedVibrationEffect.startSynced()
|
||||
.addVibrator(1, VibrationEffect.createOneShot(10, 50))
|
||||
@@ -716,7 +749,7 @@ public class VibratorManagerServiceTest {
|
||||
fakeVibrator.setCapabilities(IVibrator.CAP_AMPLITUDE_CONTROL,
|
||||
IVibrator.CAP_COMPOSE_EFFECTS);
|
||||
fakeVibrator.setSupportedEffects(VibrationEffect.EFFECT_CLICK);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
vibrate(service, CombinedVibrationEffect.startSynced()
|
||||
.addVibrator(1, VibrationEffect.get(VibrationEffect.EFFECT_CLICK))
|
||||
@@ -762,7 +795,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void vibrate_withPowerModeChange_cancelVibrationIfNotAllowed() throws Exception {
|
||||
mockVibrators(1, 2);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
vibrate(service,
|
||||
CombinedVibrationEffect.startSynced()
|
||||
.addVibrator(1, VibrationEffect.createOneShot(1000, 100))
|
||||
@@ -780,7 +813,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void vibrate_withSettingsChange_doNotCancelVibration() throws Exception {
|
||||
mockVibrators(1);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
vibrate(service, VibrationEffect.createOneShot(1000, 100), HAPTIC_FEEDBACK_ATTRS);
|
||||
assertTrue(waitUntil(s -> s.isVibrating(1), service, TEST_TIMEOUT_MILLIS));
|
||||
@@ -793,7 +826,7 @@ public class VibratorManagerServiceTest {
|
||||
@Test
|
||||
public void cancelVibrate_stopsVibrating() throws Exception {
|
||||
mockVibrators(1);
|
||||
VibratorManagerService service = createService();
|
||||
VibratorManagerService service = createSystemReadyService();
|
||||
|
||||
service.cancelVibrate(service);
|
||||
assertFalse(service.isVibrating(1));
|
||||
|
||||
Reference in New Issue
Block a user