diff --git a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java index 6626f59aae8c3..80a3a0ebb2503 100644 --- a/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java +++ b/packages/SystemUI/src/com/android/keyguard/LockIconViewController.java @@ -35,7 +35,6 @@ import android.hardware.biometrics.SensorLocationInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.os.Process; import android.os.VibrationAttributes; -import android.os.Vibrator; import android.util.DisplayMetrics; import android.util.Log; import android.util.MathUtils; @@ -60,6 +59,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; @@ -103,7 +103,7 @@ public class LockIconViewController extends ViewController impleme @NonNull private CharSequence mUnlockedLabel; @NonNull private CharSequence mLockedLabel; - @Nullable private final Vibrator mVibrator; + @NonNull private final VibratorHelper mVibrator; @Nullable private final AuthRippleController mAuthRippleController; // Tracks the velocity of a touch to help filter out the touches that move too fast. @@ -154,7 +154,7 @@ public class LockIconViewController extends ViewController impleme @NonNull AccessibilityManager accessibilityManager, @NonNull ConfigurationController configurationController, @NonNull @Main DelayableExecutor executor, - @Nullable Vibrator vibrator, + @NonNull VibratorHelper vibrator, @Nullable AuthRippleController authRippleController, @NonNull @Main Resources resources ) { @@ -560,7 +560,7 @@ public class LockIconViewController extends ViewController impleme switch(event.getActionMasked()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_HOVER_ENTER: - if (mVibrator != null && !mDownDetected) { + if (!mDownDetected) { mVibrator.vibrate( Process.myUid(), getContext().getOpPackageName(), @@ -647,15 +647,13 @@ public class LockIconViewController extends ViewController impleme mOnGestureDetectedRunnable.run(); } - if (mVibrator != null) { - // play device entry haptic (same as biometric success haptic) - mVibrator.vibrate( - Process.myUid(), - getContext().getOpPackageName(), - UdfpsController.EFFECT_CLICK, - "lock-icon-device-entry", - TOUCH_VIBRATION_ATTRIBUTES); - } + // play device entry haptic (same as biometric success haptic) + mVibrator.vibrate( + Process.myUid(), + getContext().getOpPackageName(), + UdfpsController.EFFECT_CLICK, + "lock-icon-device-entry", + TOUCH_VIBRATION_ATTRIBUTES); mKeyguardViewController.showBouncer(/* scrim */ true); } @@ -670,12 +668,9 @@ public class LockIconViewController extends ViewController impleme mVelocityTracker.recycle(); mVelocityTracker = null; } - if (mVibrator != null) { - mVibrator.cancel(); - } + mVibrator.cancel(); } - private boolean inLockIconArea(MotionEvent event) { return mSensorTouchLocation.contains((int) event.getX(), (int) event.getY()) && mView.getVisibility() == View.VISIBLE; diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java index 5ddfd7554ac95..8052c2071d866 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsController.java @@ -42,7 +42,6 @@ import android.os.Process; import android.os.Trace; import android.os.VibrationAttributes; import android.os.VibrationEffect; -import android.os.Vibrator; import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -64,6 +63,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.phone.SystemUIDialogManager; @@ -117,7 +117,7 @@ public class UdfpsController implements DozeReceiver { @NonNull private final DumpManager mDumpManager; @NonNull private final SystemUIDialogManager mDialogManager; @NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor; - @Nullable private final Vibrator mVibrator; + @NonNull private final VibratorHelper mVibrator; @NonNull private final FalsingManager mFalsingManager; @NonNull private final PowerManager mPowerManager; @NonNull private final AccessibilityManager mAccessibilityManager; @@ -506,7 +506,7 @@ public class UdfpsController implements DozeReceiver { @NonNull AccessibilityManager accessibilityManager, @NonNull LockscreenShadeTransitionController lockscreenShadeTransitionController, @NonNull ScreenLifecycle screenLifecycle, - @Nullable Vibrator vibrator, + @NonNull VibratorHelper vibrator, @NonNull UdfpsHapticsSimulator udfpsHapticsSimulator, @NonNull Optional hbmProvider, @NonNull KeyguardStateController keyguardStateController, @@ -577,14 +577,12 @@ public class UdfpsController implements DozeReceiver { */ @VisibleForTesting public void playStartHaptic() { - if (mVibrator != null) { - mVibrator.vibrate( - Process.myUid(), - mContext.getOpPackageName(), - EFFECT_CLICK, - "udfps-onStart-click", - VIBRATION_ATTRIBUTES); - } + mVibrator.vibrate( + Process.myUid(), + mContext.getOpPackageName(), + EFFECT_CLICK, + "udfps-onStart-click", + VIBRATION_ATTRIBUTES); } @Nullable diff --git a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt index e23131069eaba..eaee19aa5dca1 100644 --- a/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt +++ b/packages/SystemUI/src/com/android/systemui/biometrics/UdfpsHapticsSimulator.kt @@ -18,16 +18,12 @@ package com.android.systemui.biometrics import android.media.AudioAttributes import android.os.VibrationEffect -import android.os.Vibrator - import com.android.keyguard.KeyguardUpdateMonitor - import com.android.systemui.dagger.SysUISingleton +import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.commandline.Command import com.android.systemui.statusbar.commandline.CommandRegistry - import java.io.PrintWriter - import javax.inject.Inject /** @@ -36,7 +32,7 @@ import javax.inject.Inject @SysUISingleton class UdfpsHapticsSimulator @Inject constructor( commandRegistry: CommandRegistry, - val vibrator: Vibrator?, + val vibrator: VibratorHelper, val keyguardUpdateMonitor: KeyguardUpdateMonitor ) : Command { val sonificationEffects = @@ -60,13 +56,13 @@ class UdfpsHapticsSimulator @Inject constructor( } "success" -> { // needs to be kept up to date with AcquisitionClient#SUCCESS_VIBRATION_EFFECT - vibrator?.vibrate( + vibrator.vibrate( VibrationEffect.get(VibrationEffect.EFFECT_CLICK), sonificationEffects) } "error" -> { // needs to be kept up to date with AcquisitionClient#ERROR_VIBRATION_EFFECT - vibrator?.vibrate( + vibrator.vibrate( VibrationEffect.get(VibrationEffect.EFFECT_DOUBLE_CLICK), sonificationEffects) } diff --git a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt index a29f3e91f227a..f87fa96dea659 100644 --- a/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/controls/ui/ControlActionCoordinatorImpl.kt @@ -24,7 +24,6 @@ import android.content.Intent import android.content.pm.PackageManager import android.content.pm.ResolveInfo import android.os.VibrationEffect -import android.os.Vibrator import android.service.controls.Control import android.service.controls.actions.BooleanAction import android.service.controls.actions.CommandAction @@ -32,16 +31,14 @@ import android.service.controls.actions.FloatAction import android.util.Log import android.view.HapticFeedbackConstants import com.android.internal.annotations.VisibleForTesting -import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.controls.ControlsMetricsLogger import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.qualifiers.Main -import com.android.systemui.globalactions.GlobalActionsComponent import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor import com.android.wm.shell.TaskViewFactory -import dagger.Lazy import java.util.Optional import javax.inject.Inject @@ -52,14 +49,11 @@ class ControlActionCoordinatorImpl @Inject constructor( @Main private val uiExecutor: DelayableExecutor, private val activityStarter: ActivityStarter, private val keyguardStateController: KeyguardStateController, - private val globalActionsComponent: GlobalActionsComponent, private val taskViewFactory: Optional, - private val broadcastDispatcher: BroadcastDispatcher, - private val lazyUiController: Lazy, - private val controlsMetricsLogger: ControlsMetricsLogger + private val controlsMetricsLogger: ControlsMetricsLogger, + private val vibrator: VibratorHelper ) : ControlActionCoordinator { private var dialog: Dialog? = null - private val vibrator = context.getSystemService(Context.VIBRATOR_SERVICE) as Vibrator private var pendingAction: Action? = null private var actionsInProgress = mutableSetOf() private val isLocked: Boolean @@ -194,7 +188,7 @@ class ControlActionCoordinatorImpl @Inject constructor( } private fun vibrate(effect: VibrationEffect) { - bgExecutor.execute { vibrator.vibrate(effect) } + vibrator.vibrate(effect) } private fun showDetail(cvh: ControlViewHolder, pendingIntent: PendingIntent) { diff --git a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java index 2ebcd8531128c..f0371fc1f0cd5 100644 --- a/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java +++ b/packages/SystemUI/src/com/android/systemui/globalactions/GlobalActionsDialogLite.java @@ -62,7 +62,6 @@ import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; import android.os.UserManager; -import android.os.Vibrator; import android.provider.Settings; import android.service.dreams.IDreamManager; import android.sysprop.TelephonyProperties; @@ -119,6 +118,7 @@ import com.android.systemui.plugins.GlobalActions.GlobalActionsManager; import com.android.systemui.plugins.GlobalActionsPanelPlugin; import com.android.systemui.scrim.ScrimDrawable; import com.android.systemui.statusbar.NotificationShadeWindowController; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.SystemUIDialog; import com.android.systemui.statusbar.phone.SystemUIDialogManager; @@ -327,7 +327,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene TelephonyListenerManager telephonyListenerManager, GlobalSettings globalSettings, SecureSettings secureSettings, - @Nullable Vibrator vibrator, + @NonNull VibratorHelper vibrator, @Main Resources resources, ConfigurationController configurationController, KeyguardStateController keyguardStateController, @@ -397,7 +397,7 @@ public class GlobalActionsDialogLite implements DialogInterface.OnDismissListene mGlobalSettings.registerContentObserver( Settings.Global.getUriFor(Settings.Global.AIRPLANE_MODE_ON), true, mAirplaneModeObserver); - mHasVibrator = vibrator != null && vibrator.hasVibrator(); + mHasVibrator = vibrator.hasVibrator(); mShowSilentToggle = SHOW_SILENT_TOGGLE && !resources.getBoolean( R.bool.config_useFixedVolume); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/VibratorHelper.java b/packages/SystemUI/src/com/android/systemui/statusbar/VibratorHelper.java index 6c3a9093fa987..c74621df94c93 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/VibratorHelper.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/VibratorHelper.java @@ -16,13 +16,19 @@ package com.android.systemui.statusbar; -import android.content.Context; -import android.os.AsyncTask; +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.media.AudioAttributes; import android.os.VibrationAttributes; import android.os.VibrationEffect; import android.os.Vibrator; import com.android.systemui.dagger.SysUISingleton; +import com.android.systemui.dagger.qualifiers.Background; + +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.Executor; import javax.inject.Inject; @@ -32,21 +38,75 @@ import javax.inject.Inject; public class VibratorHelper { private final Vibrator mVibrator; - private final Context mContext; private static final VibrationAttributes TOUCH_VIBRATION_ATTRIBUTES = VibrationAttributes.createForUsage(VibrationAttributes.USAGE_TOUCH); + private final Executor mExecutor; /** */ @Inject - public VibratorHelper(Context context) { - mContext = context; - mVibrator = context.getSystemService(Vibrator.class); + public VibratorHelper(@Nullable Vibrator vibrator, @Background Executor executor) { + mExecutor = executor; + mVibrator = vibrator; } + /** + * @see Vibrator#vibrate(long) + */ public void vibrate(final int effectId) { - AsyncTask.execute(() -> + if (!hasVibrator()) { + return; + } + mExecutor.execute(() -> mVibrator.vibrate(VibrationEffect.get(effectId, false /* fallback */), TOUCH_VIBRATION_ATTRIBUTES)); } + + /** + * @see Vibrator#vibrate(int, String, VibrationEffect, String, VibrationAttributes) + */ + public void vibrate(int uid, String opPkg, @NonNull VibrationEffect vibe, + String reason, @NonNull VibrationAttributes attributes) { + if (!hasVibrator()) { + return; + } + mExecutor.execute(() -> mVibrator.vibrate(uid, opPkg, vibe, reason, attributes)); + } + + /** + * @see Vibrator#vibrate(VibrationEffect, AudioAttributes) + */ + public void vibrate(@NonNull VibrationEffect effect, @NonNull AudioAttributes attributes) { + if (!hasVibrator()) { + return; + } + mExecutor.execute(() -> mVibrator.vibrate(effect, attributes)); + } + + /** + * @see Vibrator#vibrate(VibrationEffect) + */ + public void vibrate(@NotNull VibrationEffect effect) { + if (!hasVibrator()) { + return; + } + mExecutor.execute(() -> mVibrator.vibrate(effect)); + } + + /** + * @see Vibrator#hasVibrator() + */ + public boolean hasVibrator() { + return mVibrator != null && mVibrator.hasVibrator(); + } + + /** + * @see Vibrator#cancel() + */ + public void cancel() { + if (!hasVibrator()) { + return; + } + mExecutor.execute(mVibrator::cancel); + } } diff --git a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java index 11725ef4867e2..57c7f11b752d6 100644 --- a/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/volume/VolumeDialogControllerImpl.java @@ -33,7 +33,6 @@ import android.media.AudioManager; import android.media.AudioSystem; import android.media.IAudioService; import android.media.IVolumeController; -import android.media.MediaRoute2Info; import android.media.MediaRouter2Manager; import android.media.RoutingSessionInfo; import android.media.VolumePolicy; @@ -47,7 +46,6 @@ import android.os.Message; import android.os.RemoteException; import android.os.UserHandle; import android.os.VibrationEffect; -import android.os.Vibrator; import android.provider.Settings; import android.service.notification.Condition; import android.service.notification.ZenModeConfig; @@ -68,6 +66,7 @@ import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.qs.tiles.DndTile; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.util.RingerModeLiveData; import com.android.systemui.util.RingerModeTracker; import com.android.systemui.util.concurrency.ThreadFactory; @@ -78,7 +77,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import javax.inject.Inject; @@ -135,7 +133,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa protected C mCallbacks = new C(); private final State mState = new State(); protected final MediaSessionsCallbacks mMediaSessionsCallbacksW; - private final Optional mVibrator; + private final VibratorHelper mVibrator; private final boolean mHasVibrator; private boolean mShowA11yStream; private boolean mShowVolumeDialog; @@ -173,7 +171,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa ThreadFactory theadFactory, AudioManager audioManager, NotificationManager notificationManager, - Optional optionalVibrator, + VibratorHelper vibrator, IAudioService iAudioService, AccessibilityManager accessibilityManager, PackageManager packageManager, @@ -199,8 +197,8 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa mBroadcastDispatcher = broadcastDispatcher; mObserver.init(); mReceiver.init(); - mVibrator = optionalVibrator; - mHasVibrator = mVibrator.isPresent() && mVibrator.get().hasVibrator(); + mVibrator = vibrator; + mHasVibrator = mVibrator.hasVibrator(); mAudioService = iAudioService; boolean accessibilityVolumeStreamActive = accessibilityManager @@ -393,8 +391,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } public void vibrate(VibrationEffect effect) { - mVibrator.ifPresent( - vibrator -> vibrator.vibrate(effect, SONIFICIATION_VIBRATION_ATTRIBUTES)); + mVibrator.vibrate(effect, SONIFICIATION_VIBRATION_ATTRIBUTES); } public boolean hasVibrator() { @@ -402,7 +399,7 @@ public class VolumeDialogControllerImpl implements VolumeDialogController, Dumpa } private void onNotifyVisibleW(boolean visible) { - if (mDestroyed) return; + if (mDestroyed) return; mAudio.notifyVolumeControllerVisible(mVolumeController, visible); if (!visible) { if (updateActiveStreamW(-1)) { diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java index 159bdbab6d8de..35e838bfca9a4 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsControllerTest.java @@ -44,7 +44,6 @@ import android.os.Handler; import android.os.PowerManager; import android.os.RemoteException; import android.os.VibrationAttributes; -import android.os.Vibrator; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper.RunWithLooper; import android.view.LayoutInflater; @@ -64,6 +63,7 @@ import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.LockscreenShadeTransitionController; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -141,7 +141,7 @@ public class UdfpsControllerTest extends SysuiTestCase { @Mock private ScreenLifecycle mScreenLifecycle; @Mock - private Vibrator mVibrator; + private VibratorHelper mVibrator; @Mock private UdfpsHapticsSimulator mUdfpsHapticsSimulator; @Mock diff --git a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt index 55509d1ae0bdf..9908d44507cdd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/controls/controller/ControlActionCoordinatorImplTest.kt @@ -20,13 +20,11 @@ import android.testing.AndroidTestingRunner import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.controls.ControlsMetricsLogger -import com.android.systemui.globalactions.GlobalActionsComponent import com.android.systemui.plugins.ActivityStarter +import com.android.systemui.statusbar.VibratorHelper import com.android.systemui.statusbar.policy.KeyguardStateController import com.android.systemui.util.concurrency.DelayableExecutor import com.android.wm.shell.TaskViewFactory -import dagger.Lazy -import java.util.Optional import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -41,15 +39,14 @@ import org.mockito.Mockito.reset import org.mockito.Mockito.spy import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations +import java.util.Optional @SmallTest @RunWith(AndroidTestingRunner::class) class ControlActionCoordinatorImplTest : SysuiTestCase() { @Mock - private lateinit var uiController: ControlsUiController - @Mock - private lateinit var lazyUiController: Lazy + private lateinit var vibratorHelper: VibratorHelper @Mock private lateinit var keyguardStateController: KeyguardStateController @Mock @@ -59,8 +56,6 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() { @Mock private lateinit var activityStarter: ActivityStarter @Mock - private lateinit var globalActionsComponent: GlobalActionsComponent - @Mock private lateinit var taskViewFactory: Optional @Mock(answer = Answers.RETURNS_DEEP_STUBS) private lateinit var cvh: ControlViewHolder @@ -86,11 +81,9 @@ class ControlActionCoordinatorImplTest : SysuiTestCase() { uiExecutor, activityStarter, keyguardStateController, - globalActionsComponent, taskViewFactory, - getFakeBroadcastDispatcher(), - lazyUiController, - metricsLogger + metricsLogger, + vibratorHelper )) `when`(cvh.cws.ci.controlId).thenReturn(ID) diff --git a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java index e3a7e3b43b77a..71fc8ee6cce86 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/globalactions/GlobalActionsDialogLiteTest.java @@ -61,6 +61,7 @@ import com.android.systemui.model.SysUiState; import com.android.systemui.plugins.GlobalActions; import com.android.systemui.settings.UserContextProvider; import com.android.systemui.statusbar.NotificationShadeWindowController; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.SystemUIDialogManager; import com.android.systemui.statusbar.policy.ConfigurationController; @@ -115,6 +116,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { @Mock private PackageManager mPackageManager; @Mock private Handler mHandler; @Mock private UserContextProvider mUserContextProvider; + @Mock private VibratorHelper mVibratorHelper; @Mock private StatusBar mStatusBar; @Mock private KeyguardUpdateMonitor mKeyguardUpdateMonitor; @Mock private DialogLaunchAnimator mDialogLaunchAnimator; @@ -143,7 +145,7 @@ public class GlobalActionsDialogLiteTest extends SysuiTestCase { mTelephonyListenerManager, mGlobalSettings, mSecureSettings, - null, + mVibratorHelper, mResources, mConfigurationController, mKeyguardStateController, diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java index d7c00fbe1e85a..5ed1d656a1f5e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/LockIconViewControllerTest.java @@ -38,7 +38,6 @@ import android.graphics.drawable.AnimatedStateListDrawable; import android.hardware.biometrics.BiometricSourceType; import android.hardware.biometrics.SensorLocationInternal; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; -import android.os.Vibrator; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.util.Pair; @@ -62,6 +61,7 @@ import com.android.systemui.dump.DumpManager; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.StatusBarState; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.util.concurrency.FakeExecutor; @@ -104,7 +104,7 @@ public class LockIconViewControllerTest extends SysuiTestCase { private @Mock DumpManager mDumpManager; private @Mock AccessibilityManager mAccessibilityManager; private @Mock ConfigurationController mConfigurationController; - private @Mock Vibrator mVibrator; + private @Mock VibratorHelper mVibrator; private @Mock AuthRippleController mAuthRippleController; private FakeExecutor mDelayableExecutor = new FakeExecutor(new FakeSystemClock()); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/VibratorHelperTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/VibratorHelperTest.kt new file mode 100644 index 0000000000000..ad908e7f80003 --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/VibratorHelperTest.kt @@ -0,0 +1,93 @@ +package com.android.systemui.statusbar + +import android.media.AudioAttributes +import android.os.UserHandle +import android.os.VibrationAttributes +import android.os.VibrationEffect +import android.os.Vibrator +import android.testing.AndroidTestingRunner +import androidx.test.filters.SmallTest +import com.android.systemui.SysuiTestCase +import com.android.systemui.util.mockito.eq +import com.google.common.truth.Truth.assertThat +import org.junit.Before +import org.junit.Rule +import org.junit.Test +import org.junit.runner.RunWith +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.`when` as whenever +import org.mockito.Mockito.any +import org.mockito.Mockito.mock +import org.mockito.Mockito.verify +import org.mockito.junit.MockitoJUnit +import java.util.concurrent.Executor + +@RunWith(AndroidTestingRunner::class) +@SmallTest +class VibratorHelperTest : SysuiTestCase() { + + @JvmField @Rule + var rule = MockitoJUnit.rule() + + @Mock lateinit var vibrator: Vibrator + @Mock lateinit var executor: Executor + @Captor lateinit var backgroundTaskCaptor: ArgumentCaptor + lateinit var vibratorHelper: VibratorHelper + + @Before + fun setup() { + vibratorHelper = VibratorHelper(vibrator, executor) + whenever(vibrator.hasVibrator()).thenReturn(true) + } + + @Test + fun testVibrate() { + vibratorHelper.vibrate(VibrationEffect.EFFECT_CLICK) + verifyAsync().vibrate(any(VibrationEffect::class.java), + any(VibrationAttributes::class.java)) + } + + @Test + fun testVibrate2() { + vibratorHelper.vibrate(UserHandle.USER_CURRENT, "package", + mock(VibrationEffect::class.java), "reason", + mock(VibrationAttributes::class.java)) + verifyAsync().vibrate(eq(UserHandle.USER_CURRENT), eq("package"), + any(VibrationEffect::class.java), eq("reason"), + any(VibrationAttributes::class.java)) + } + + @Test + fun testVibrate3() { + vibratorHelper.vibrate(mock(VibrationEffect::class.java), mock(AudioAttributes::class.java)) + verifyAsync().vibrate(any(VibrationEffect::class.java), any(AudioAttributes::class.java)) + } + + @Test + fun testVibrate4() { + vibratorHelper.vibrate(mock(VibrationEffect::class.java)) + verifyAsync().vibrate(any(VibrationEffect::class.java)) + } + + @Test + fun testHasVibrator() { + assertThat(vibratorHelper.hasVibrator()).isTrue() + verify(vibrator).hasVibrator() + } + + @Test + fun testCancel() { + vibratorHelper.cancel() + verifyAsync().cancel() + } + + private fun verifyAsync(): Vibrator { + verify(executor).execute(backgroundTaskCaptor.capture()) + verify(vibrator).hasVibrator() + backgroundTaskCaptor.value.run() + + return verify(vibrator) + } +} \ No newline at end of file diff --git a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java index c9462d651bc0f..b3805533cabd8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/volume/VolumeDialogControllerImplTest.java @@ -33,7 +33,6 @@ import android.media.IAudioService; import android.media.session.MediaSession; import android.os.Handler; import android.os.Process; -import android.os.Vibrator; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; import android.view.accessibility.AccessibilityManager; @@ -43,6 +42,7 @@ import androidx.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.keyguard.WakefulnessLifecycle; +import com.android.systemui.statusbar.VibratorHelper; import com.android.systemui.util.RingerModeLiveData; import com.android.systemui.util.RingerModeTracker; import com.android.systemui.util.concurrency.FakeExecutor; @@ -57,8 +57,6 @@ import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import java.util.Optional; - @RunWith(AndroidTestingRunner.class) @SmallTest @TestableLooper.RunWithLooper @@ -81,7 +79,7 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { @Mock private NotificationManager mNotificationManager; @Mock - private Vibrator mVibrator; + private VibratorHelper mVibrator; @Mock private IAudioService mIAudioService; @Mock @@ -110,7 +108,7 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { mThreadFactory.setLooper(TestableLooper.get(this).getLooper()); mVolumeController = new TestableVolumeDialogControllerImpl(mContext, mBroadcastDispatcher, mRingerModeTracker, mThreadFactory, mAudioManager, - mNotificationManager, Optional.of(mVibrator), mIAudioService, mAccessibilityManager, + mNotificationManager, mVibrator, mIAudioService, mAccessibilityManager, mPackageManager, mWakefullnessLifcycle, mCallback); mVolumeController.setEnableDialogs(true, true); } @@ -181,7 +179,7 @@ public class VolumeDialogControllerImplTest extends SysuiTestCase { ThreadFactory theadFactory, AudioManager audioManager, NotificationManager notificationManager, - Optional optionalVibrator, + VibratorHelper optionalVibrator, IAudioService iAudioService, AccessibilityManager accessibilityManager, PackageManager packageManager,