summaryrefslogtreecommitdiff
path: root/packages
diff options
context:
space:
mode:
author Juan Sebastian Martinez <juansmartinez@google.com> 2024-09-30 15:36:00 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2024-09-30 15:36:00 +0000
commit8f58d8e262b77f3006a2307083d131b25348aa81 (patch)
treeb4746ded1175e415875a2fbe5ad773d226d2fddf /packages
parent4bbcccd2d7a209a798c60107a6d57b6cbb4f7738 (diff)
parent864d1d1daf8584fb2bed67e576fec303dc4cf1ec (diff)
Merge "Adding MSDL feedback to NPVC" into main
Diffstat (limited to 'packages')
-rw-r--r--packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java31
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java26
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java22
-rw-r--r--packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt5
4 files changed, 63 insertions, 21 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
index 0c05dbde6117..5896659e9898 100644
--- a/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/shade/NotificationPanelViewController.java
@@ -23,6 +23,7 @@ import static com.android.app.animation.Interpolators.EMPHASIZED_ACCELERATE;
import static com.android.app.animation.Interpolators.EMPHASIZED_DECELERATE;
import static com.android.keyguard.KeyguardClockSwitch.LARGE;
import static com.android.keyguard.KeyguardClockSwitch.SMALL;
+import static com.android.systemui.Flags.msdlFeedback;
import static com.android.systemui.Flags.predictiveBackAnimateShade;
import static com.android.systemui.Flags.smartspaceRelocateToBottom;
import static com.android.systemui.classifier.Classifier.BOUNCER_UNLOCK;
@@ -236,6 +237,9 @@ import com.android.wm.shell.animation.FlingAnimationUtils;
import dalvik.annotation.optimization.NeverCompile;
+import com.google.android.msdl.data.model.MSDLToken;
+import com.google.android.msdl.domain.MSDLPlayer;
+
import kotlin.Unit;
import kotlinx.coroutines.CoroutineDispatcher;
@@ -312,6 +316,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
private final StatusBarStateListener mStatusBarStateListener = new StatusBarStateListener();
private final NotificationPanelView mView;
private final VibratorHelper mVibratorHelper;
+ private final MSDLPlayer mMSDLPlayer;
private final MetricsLogger mMetricsLogger;
private final ConfigurationController mConfigurationController;
private final Provider<FlingAnimationUtils.Builder> mFlingAnimationUtilsBuilder;
@@ -777,7 +782,8 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
SplitShadeStateController splitShadeStateController,
PowerInteractor powerInteractor,
KeyguardClockPositionAlgorithm keyguardClockPositionAlgorithm,
- NaturalScrollingSettingObserver naturalScrollingSettingObserver) {
+ NaturalScrollingSettingObserver naturalScrollingSettingObserver,
+ MSDLPlayer msdlPlayer) {
SceneContainerFlag.assertInLegacyMode();
keyguardStateController.addCallback(new KeyguardStateController.Callback() {
@Override
@@ -855,6 +861,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
mNotificationsDragEnabled = mResources.getBoolean(
R.bool.config_enableNotificationShadeDrag);
mVibratorHelper = vibratorHelper;
+ mMSDLPlayer = msdlPlayer;
mVibrateOnOpening = mResources.getBoolean(R.bool.config_vibrateOnIconAnimation);
mStatusBarTouchableRegionManager = statusBarTouchableRegionManager;
mSystemClock = systemClock;
@@ -2911,7 +2918,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
}
if (!mStatusBarStateController.isDozing()) {
- mVibratorHelper.performHapticFeedback(mView, HapticFeedbackConstants.REJECT);
+ performHapticFeedback(HapticFeedbackConstants.REJECT);
}
}
@@ -3279,7 +3286,20 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
}
public void performHapticFeedback(int constant) {
- mVibratorHelper.performHapticFeedback(mView, constant);
+ if (msdlFeedback()) {
+ MSDLToken token;
+ switch (constant) {
+ case HapticFeedbackConstants.GESTURE_START ->
+ token = MSDLToken.SWIPE_THRESHOLD_INDICATOR;
+ case HapticFeedbackConstants.REJECT -> token = MSDLToken.FAILURE;
+ default -> token = null;
+ }
+ if (token != null) {
+ mMSDLPlayer.playToken(token, null);
+ }
+ } else {
+ mVibratorHelper.performHapticFeedback(mView, constant);
+ }
}
private class ShadeHeadsUpTrackerImpl implements ShadeHeadsUpTracker {
@@ -3736,10 +3756,7 @@ public final class NotificationPanelViewController implements ShadeSurface, Dump
private void maybeVibrateOnOpening(boolean openingWithTouch) {
if (mVibrateOnOpening && mBarState != KEYGUARD && mBarState != SHADE_LOCKED) {
if (!openingWithTouch || !mHasVibratedOnOpen) {
- mVibratorHelper.performHapticFeedback(
- mView,
- HapticFeedbackConstants.GESTURE_START
- );
+ performHapticFeedback(HapticFeedbackConstants.GESTURE_START);
mHasVibratedOnOpen = true;
mShadeLog.v("Vibrating on opening, mHasVibratedOnOpen=true");
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
index a6afd0e499f4..f5a901963f05 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerBaseTest.java
@@ -22,10 +22,6 @@ import static com.android.systemui.log.LogBufferHelperKt.logcatLogBuffer;
import static com.google.common.truth.Truth.assertThat;
-import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
-import static kotlinx.coroutines.flow.SharedFlowKt.MutableSharedFlow;
-import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
-
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyFloat;
@@ -40,6 +36,10 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import static kotlinx.coroutines.flow.FlowKt.emptyFlow;
+import static kotlinx.coroutines.flow.SharedFlowKt.MutableSharedFlow;
+import static kotlinx.coroutines.flow.StateFlowKt.MutableStateFlow;
+
import android.animation.Animator;
import android.annotation.IdRes;
import android.content.ContentResolver;
@@ -95,6 +95,7 @@ import com.android.systemui.flags.FakeFeatureFlagsClassic;
import com.android.systemui.flags.Flags;
import com.android.systemui.fragments.FragmentHostManager;
import com.android.systemui.fragments.FragmentService;
+import com.android.systemui.haptics.msdl.FakeMSDLPlayer;
import com.android.systemui.keyguard.KeyguardUnlockAnimationController;
import com.android.systemui.keyguard.KeyguardViewConfigurator;
import com.android.systemui.keyguard.data.repository.FakeKeyguardClockRepository;
@@ -151,6 +152,7 @@ import com.android.systemui.statusbar.VibratorHelper;
import com.android.systemui.statusbar.disableflags.data.repository.FakeDisableFlagsRepository;
import com.android.systemui.statusbar.notification.ConversationNotificationManager;
import com.android.systemui.statusbar.notification.DynamicPrivacyController;
+import com.android.systemui.statusbar.notification.HeadsUpTouchHelper;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator;
import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinatorLogger;
import com.android.systemui.statusbar.notification.data.repository.NotificationsKeyguardViewStateRepository;
@@ -167,7 +169,6 @@ import com.android.systemui.statusbar.phone.CentralSurfaces;
import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
import com.android.systemui.statusbar.phone.DozeParameters;
import com.android.systemui.statusbar.phone.HeadsUpAppearanceController;
-import com.android.systemui.statusbar.notification.HeadsUpTouchHelper;
import com.android.systemui.statusbar.phone.KeyguardBottomAreaView;
import com.android.systemui.statusbar.phone.KeyguardBottomAreaViewController;
import com.android.systemui.statusbar.phone.KeyguardBypassController;
@@ -200,12 +201,6 @@ import com.android.systemui.util.time.FakeSystemClock;
import com.android.systemui.util.time.SystemClock;
import com.android.wm.shell.animation.FlingAnimationUtils;
-import dagger.Lazy;
-
-import kotlinx.coroutines.CoroutineDispatcher;
-import kotlinx.coroutines.channels.BufferOverflow;
-import kotlinx.coroutines.test.TestScope;
-
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
@@ -220,6 +215,11 @@ import java.util.HashSet;
import java.util.List;
import java.util.Optional;
+import dagger.Lazy;
+import kotlinx.coroutines.CoroutineDispatcher;
+import kotlinx.coroutines.channels.BufferOverflow;
+import kotlinx.coroutines.test.TestScope;
+
public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
protected static final int SPLIT_SHADE_FULL_TRANSITION_DISTANCE = 400;
@@ -374,6 +374,7 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
protected View.OnLayoutChangeListener mLayoutChangeListener;
protected KeyguardStatusViewController mKeyguardStatusViewController;
protected ShadeRepository mShadeRepository;
+ protected FakeMSDLPlayer mMSDLPlayer = mKosmos.getMsdlPlayer();
protected final FalsingManagerFake mFalsingManager = new FalsingManagerFake();
protected final Optional<SysUIUnfoldComponent> mSysUIUnfoldComponent = Optional.empty();
@@ -761,7 +762,8 @@ public class NotificationPanelViewControllerBaseTest extends SysuiTestCase {
new ResourcesSplitShadeStateController(),
mPowerInteractor,
mKeyguardClockPositionAlgorithm,
- mNaturalScrollingSettingObserver);
+ mNaturalScrollingSettingObserver,
+ mMSDLPlayer);
mNotificationPanelViewController.initDependencies(
mCentralSurfaces,
null,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
index a7fd1609d1ca..43dbb40d7721 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerTest.java
@@ -49,6 +49,7 @@ import android.os.PowerManager;
import android.platform.test.annotations.DisableFlags;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
+import android.view.HapticFeedbackConstants;
import android.view.MotionEvent;
import android.view.View;
import android.view.accessibility.AccessibilityNodeInfo;
@@ -69,6 +70,8 @@ import com.android.systemui.statusbar.notification.stack.AmbientState;
import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
import com.android.systemui.statusbar.phone.KeyguardClockPositionAlgorithm;
+import com.google.android.msdl.data.model.MSDLToken;
+
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -1458,4 +1461,23 @@ public class NotificationPanelViewControllerTest extends NotificationPanelViewCo
assertThat(mNotificationPanelViewController.getFalsingThreshold()).isGreaterThan(14);
}
+
+ @Test
+ @EnableFlags(com.android.systemui.Flags.FLAG_MSDL_FEEDBACK)
+ public void performHapticFeedback_withMSDL_forGestureStart_deliversDragThresholdToken() {
+ mNotificationPanelViewController
+ .performHapticFeedback(HapticFeedbackConstants.GESTURE_START);
+
+ assertThat(mMSDLPlayer.getLatestTokenPlayed())
+ .isEqualTo(MSDLToken.SWIPE_THRESHOLD_INDICATOR);
+ }
+
+ @Test
+ @EnableFlags(com.android.systemui.Flags.FLAG_MSDL_FEEDBACK)
+ public void performHapticFeedback_withMSDL_forReject_deliversFailureToken() {
+ mNotificationPanelViewController
+ .performHapticFeedback(HapticFeedbackConstants.REJECT);
+
+ assertThat(mMSDLPlayer.getLatestTokenPlayed()).isEqualTo(MSDLToken.FAILURE);
+ }
}
diff --git a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt
index 90655c3cf4b3..97441f01bcf5 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt
+++ b/packages/SystemUI/tests/src/com/android/systemui/shade/NotificationPanelViewControllerWithCoroutinesTest.kt
@@ -33,7 +33,6 @@ import com.android.systemui.res.R
import com.android.systemui.statusbar.StatusBarState.KEYGUARD
import com.android.systemui.statusbar.StatusBarState.SHADE
import com.android.systemui.statusbar.StatusBarState.SHADE_LOCKED
-import com.android.systemui.statusbar.notification.data.repository.FakeHeadsUpRowRepository
import com.android.systemui.util.mockito.eq
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
@@ -157,6 +156,7 @@ class NotificationPanelViewControllerWithCoroutinesTest :
}
@Test
+ @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
fun doubleTapRequired_onKeyguard_usesPerformHapticFeedback() = runTest {
launch(Dispatchers.Main.immediate) {
val listener = getFalsingTapListener()
@@ -184,6 +184,7 @@ class NotificationPanelViewControllerWithCoroutinesTest :
}
@Test
+ @DisableFlags(Flags.FLAG_MSDL_FEEDBACK)
fun doubleTapRequired_shadeLocked_usesPerformHapticFeedback() = runTest {
launch(Dispatchers.Main.immediate) {
val listener = getFalsingTapListener()
@@ -209,7 +210,7 @@ class NotificationPanelViewControllerWithCoroutinesTest :
KEYGUARD /*statusBarState*/,
false /*keyguardFadingAway*/,
false /*goingToFullShade*/,
- SHADE /*oldStatusBarState*/
+ SHADE, /*oldStatusBarState*/
)
}
advanceUntilIdle()