Merge "Add haptic feedback on the kg lock icon" into sc-dev
This commit is contained in:
@@ -28,6 +28,9 @@ import android.graphics.drawable.AnimatedVectorDrawable;
|
|||||||
import android.graphics.drawable.Drawable;
|
import android.graphics.drawable.Drawable;
|
||||||
import android.hardware.biometrics.BiometricSourceType;
|
import android.hardware.biometrics.BiometricSourceType;
|
||||||
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
|
||||||
|
import android.media.AudioAttributes;
|
||||||
|
import android.os.Process;
|
||||||
|
import android.os.Vibrator;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.view.GestureDetector;
|
import android.view.GestureDetector;
|
||||||
import android.view.GestureDetector.SimpleOnGestureListener;
|
import android.view.GestureDetector.SimpleOnGestureListener;
|
||||||
@@ -43,6 +46,7 @@ import androidx.core.view.accessibility.AccessibilityNodeInfoCompat;
|
|||||||
import com.android.systemui.Dumpable;
|
import com.android.systemui.Dumpable;
|
||||||
import com.android.systemui.R;
|
import com.android.systemui.R;
|
||||||
import com.android.systemui.biometrics.AuthController;
|
import com.android.systemui.biometrics.AuthController;
|
||||||
|
import com.android.systemui.biometrics.UdfpsController;
|
||||||
import com.android.systemui.dagger.qualifiers.Main;
|
import com.android.systemui.dagger.qualifiers.Main;
|
||||||
import com.android.systemui.dump.DumpManager;
|
import com.android.systemui.dump.DumpManager;
|
||||||
import com.android.systemui.plugins.FalsingManager;
|
import com.android.systemui.plugins.FalsingManager;
|
||||||
@@ -67,6 +71,13 @@ import javax.inject.Inject;
|
|||||||
*/
|
*/
|
||||||
@StatusBarComponent.StatusBarScope
|
@StatusBarComponent.StatusBarScope
|
||||||
public class LockIconViewController extends ViewController<LockIconView> implements Dumpable {
|
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 KeyguardUpdateMonitor mKeyguardUpdateMonitor;
|
||||||
@NonNull private final KeyguardViewController mKeyguardViewController;
|
@NonNull private final KeyguardViewController mKeyguardViewController;
|
||||||
@NonNull private final StatusBarStateController mStatusBarStateController;
|
@NonNull private final StatusBarStateController mStatusBarStateController;
|
||||||
@@ -83,6 +94,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
@NonNull private final Drawable mLockIcon;
|
@NonNull private final Drawable mLockIcon;
|
||||||
@NonNull private final CharSequence mUnlockedLabel;
|
@NonNull private final CharSequence mUnlockedLabel;
|
||||||
@NonNull private final CharSequence mLockedLabel;
|
@NonNull private final CharSequence mLockedLabel;
|
||||||
|
@Nullable private final Vibrator mVibrator;
|
||||||
|
|
||||||
private boolean mIsDozing;
|
private boolean mIsDozing;
|
||||||
private boolean mIsBouncerShowing;
|
private boolean mIsBouncerShowing;
|
||||||
@@ -119,7 +131,8 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
@NonNull DumpManager dumpManager,
|
@NonNull DumpManager dumpManager,
|
||||||
@NonNull AccessibilityManager accessibilityManager,
|
@NonNull AccessibilityManager accessibilityManager,
|
||||||
@NonNull ConfigurationController configurationController,
|
@NonNull ConfigurationController configurationController,
|
||||||
@NonNull @Main DelayableExecutor executor
|
@NonNull @Main DelayableExecutor executor,
|
||||||
|
@Nullable Vibrator vibrator
|
||||||
) {
|
) {
|
||||||
super(view);
|
super(view);
|
||||||
mStatusBarStateController = statusBarStateController;
|
mStatusBarStateController = statusBarStateController;
|
||||||
@@ -131,6 +144,7 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
mAccessibilityManager = accessibilityManager;
|
mAccessibilityManager = accessibilityManager;
|
||||||
mConfigurationController = configurationController;
|
mConfigurationController = configurationController;
|
||||||
mExecutor = executor;
|
mExecutor = executor;
|
||||||
|
mVibrator = vibrator;
|
||||||
|
|
||||||
final Context context = view.getContext();
|
final Context context = view.getContext();
|
||||||
mLockIcon = mView.getContext().getResources().getDrawable(
|
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
|
// intercept all following touches until we see MotionEvent.ACTION_CANCEL UP or
|
||||||
// MotionEvent.ACTION_UP (see #onTouchEvent)
|
// MotionEvent.ACTION_UP (see #onTouchEvent)
|
||||||
mDownDetected = true;
|
mDownDetected = true;
|
||||||
|
if (mVibrator != null) {
|
||||||
|
mVibrator.vibrate(
|
||||||
|
Process.myUid(),
|
||||||
|
getContext().getOpPackageName(),
|
||||||
|
UdfpsController.EFFECT_CLICK,
|
||||||
|
"lockIcon-onDown",
|
||||||
|
VIBRATION_SONIFICATION_ATTRIBUTES);
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -467,6 +489,14 @@ public class LockIconViewController extends ViewController<LockIconView> impleme
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mVibrator != null) {
|
||||||
|
mVibrator.vibrate(
|
||||||
|
Process.myUid(),
|
||||||
|
getContext().getOpPackageName(),
|
||||||
|
UdfpsController.EFFECT_CLICK,
|
||||||
|
"lockIcon-onLongPress",
|
||||||
|
VIBRATION_SONIFICATION_ATTRIBUTES);
|
||||||
|
}
|
||||||
onAffordanceClick();
|
onAffordanceClick();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import android.media.AudioAttributes;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.os.PowerManager;
|
import android.os.PowerManager;
|
||||||
|
import android.os.Process;
|
||||||
import android.os.RemoteException;
|
import android.os.RemoteException;
|
||||||
import android.os.SystemClock;
|
import android.os.SystemClock;
|
||||||
import android.os.Trace;
|
import android.os.Trace;
|
||||||
@@ -569,7 +570,12 @@ public class UdfpsController implements DozeReceiver {
|
|||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public void playStartHaptic() {
|
public void playStartHaptic() {
|
||||||
if (mVibrator != null) {
|
if (mVibrator != null) {
|
||||||
mVibrator.vibrate(EFFECT_CLICK, VIBRATION_SONIFICATION_ATTRIBUTES);
|
mVibrator.vibrate(
|
||||||
|
Process.myUid(),
|
||||||
|
mContext.getOpPackageName(),
|
||||||
|
EFFECT_CLICK,
|
||||||
|
"udfps-onStart",
|
||||||
|
VIBRATION_SONIFICATION_ATTRIBUTES);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ import static junit.framework.Assert.assertTrue;
|
|||||||
import static org.mockito.ArgumentMatchers.any;
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
import static org.mockito.ArgumentMatchers.anyBoolean;
|
import static org.mockito.ArgumentMatchers.anyBoolean;
|
||||||
import static org.mockito.ArgumentMatchers.anyFloat;
|
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.ArgumentMatchers.eq;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
@@ -444,7 +446,11 @@ public class UdfpsControllerTest extends SysuiTestCase {
|
|||||||
moveEvent.recycle();
|
moveEvent.recycle();
|
||||||
|
|
||||||
// THEN click haptic is played
|
// THEN click haptic is played
|
||||||
verify(mVibrator).vibrate(mUdfpsController.EFFECT_CLICK,
|
verify(mVibrator).vibrate(
|
||||||
UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES);
|
anyInt(),
|
||||||
|
anyString(),
|
||||||
|
eq(mUdfpsController.EFFECT_CLICK),
|
||||||
|
eq("udfps-onStart"),
|
||||||
|
eq(UdfpsController.VIBRATION_SONIFICATION_ATTRIBUTES));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user