Merge "Make all Vibrator calls async"
This commit is contained in:
@@ -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<LockIconView> 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<LockIconView> 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<LockIconView> 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<LockIconView> 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<LockIconView> 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;
|
||||
|
||||
@@ -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<UdfpsHbmProvider> 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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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<TaskViewFactory>,
|
||||
private val broadcastDispatcher: BroadcastDispatcher,
|
||||
private val lazyUiController: Lazy<ControlsUiController>,
|
||||
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<String>()
|
||||
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) {
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Vibrator> 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<Vibrator> 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)) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<ControlsUiController>
|
||||
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<TaskViewFactory>
|
||||
@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)
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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<Runnable>
|
||||
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)
|
||||
}
|
||||
}
|
||||
@@ -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<Vibrator> optionalVibrator,
|
||||
VibratorHelper optionalVibrator,
|
||||
IAudioService iAudioService,
|
||||
AccessibilityManager accessibilityManager,
|
||||
PackageManager packageManager,
|
||||
|
||||
Reference in New Issue
Block a user