Add haptic feedback on the kg lock icon

Test: manual, adb shell dumpsys vibrator_manager
Bug: 193089985
Change-Id: I8c3e5d1931a3399d4ecf0aac501cd74e0b7d7bec
This commit is contained in:
Beverly
2021-07-15 12:16:50 -04:00
parent 71089198bf
commit 286813a768
3 changed files with 46 additions and 4 deletions

View File

@@ -28,6 +28,9 @@ import android.graphics.drawable.AnimatedVectorDrawable;
import android.graphics.drawable.Drawable;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
import android.media.AudioAttributes;
import android.os.Process;
import android.os.Vibrator;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
@@ -43,6 +46,7 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
import com.android.systemui.Dumpable;
import com.android.systemui.R;
import com.android.systemui.biometrics.AuthController;
import com.android.systemui.biometrics.UdfpsController;
import com.android.systemui.dagger.qualifiers.Main;
import com.android.systemui.dump.DumpManager;
import com.android.systemui.plugins.FalsingManager;
@@ -67,6 +71,13 @@ import javax.inject.Inject;
*/
@StatusBarComponent.StatusBarScope
public class LockIconViewController extends ViewController<LockIconView> implements Dumpable {
private static final AudioAttributes VIBRATION_SONIFICATION_ATTRIBUTES =
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
.build();
@NonNull private final KeyguardUpdateMonitor mKeyguardUpdateMonitor;
@NonNull private final KeyguardViewController mKeyguardViewController;
@NonNull private final StatusBarStateController mStatusBarStateController;
@@ -83,6 +94,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
@NonNull private final Drawable mLockIcon;
@NonNull private final CharSequence mUnlockedLabel;
@NonNull private final CharSequence mLockedLabel;
@Nullable private final Vibrator mVibrator;
private boolean mIsDozing;
private boolean mIsBouncerShowing;
@@ -119,7 +131,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
@NonNull DumpManager dumpManager,
@NonNull AccessibilityManager accessibilityManager,
@NonNull ConfigurationController configurationController,
@NonNull @Main DelayableExecutor executor
@NonNull @Main DelayableExecutor executor,
@Nullable Vibrator vibrator
) {
super(view);
mStatusBarStateController = statusBarStateController;
@@ -131,6 +144,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
mAccessibilityManager = accessibilityManager;
mConfigurationController = configurationController;
mExecutor = executor;
mVibrator = vibrator;
final Context context = view.getContext();
mLockIcon = mView.getContext().getResources().getDrawable(
@@ -459,6 +473,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
// intercept all following touches until we see MotionEvent.ACTION_CANCEL UP or
// MotionEvent.ACTION_UP (see #onTouchEvent)
mDownDetected = true;
if (mVibrator != null) {
mVibrator.vibrate(
Process.myUid(),
getContext().getOpPackageName(),
UdfpsController.EFFECT_CLICK,
"lockIcon-onDown",
VIBRATION_SONIFICATION_ATTRIBUTES);
}
return true;
}
@@ -467,6 +489,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
return;
}
if (mVibrator != null) {
mVibrator.vibrate(
Process.myUid(),
getContext().getOpPackageName(),
UdfpsController.EFFECT_CLICK,
"lockIcon-onLongPress",
VIBRATION_SONIFICATION_ATTRIBUTES);
}
onAffordanceClick();
}

View File

@@ -40,6 +40,7 @@ import android.media.AudioAttributes;
import android.os.Handler;
import android.os.Looper;
import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.SystemClock;
import android.os.Trace;
@@ -569,7 +570,12 @@ public class UdfpsController implements DozeReceiver {
@VisibleForTesting
public void playStartHaptic() {
if (mVibrator != null) {
mVibrator.vibrate(EFFECT_CLICK, VIBRATION_SONIFICATION_ATTRIBUTES);
mVibrator.vibrate(
Process.myUid(),
mContext.getOpPackageName(),
EFFECT_CLICK,
"udfps-onStart",
VIBRATION_SONIFICATION_ATTRIBUTES);
}
}

View File

@@ -23,6 +23,8 @@ import static junit.framework.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -444,7 +446,11 @@ public class UdfpsControllerTest extends SysuiTestCase {
moveEvent.recycle();
// THEN click haptic is played
verify(mVibrator).vibrate(mUdfpsController.EFFECT_CLICK,
UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES);
verify(mVibrator).vibrate(
anyInt(),
anyString(),
eq(mUdfpsController.EFFECT_CLICK),
eq("udfps-onStart"),
eq(UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES));
}
}