Skip to content

Bug 2088788 - Add haptic feedback to onboarding buttons, links, toggl… - #429

Closed
t-p-white wants to merge 1 commit into
mozilla-firefox:autolandfrom
t-p-white:onboarding-haptic-feedback
Closed

t-p-white wants to merge 1 commit into
mozilla-firefox:autolandfrom
t-p-white:onboarding-haptic-feedback

Conversation

@t-p-white

@t-p-white t-p-white commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Gated behind FeatureFlags.onboardingHapticsEnabled (Nightly and debug only) so it can be tried on-device before deciding whether to ship it. Swipes only play when the pager settles after a user drag, so advancing with a button does not buzz twice.

Reviewer notes: To test in debug, enable theFeatureFlag val onboardingFeatureEnabled = Config.channel.isDebug and have fresh install.

Implementation notes: the wrapping helpers (hapticOnClick, hapticOnLinkClick, hapticOnCheckedChange) live in the onboarding package for now. They are the first tap haptics in the tree (existing usages are all long-press, or Confirm on pull-to-refresh), so we should move to android-components compose/base alongside LongPressIconButton if the we move this change into production.


Lando: link
Bugzilla: bug 2088788

⚠️ This pull request has 4 warnings.
🚫 This pull request has 1 blocker.

@t-p-white
t-p-white force-pushed the onboarding-haptic-feedback branch from 9eb8f05 to 808dc10 Compare November 4, 2026 09:27
@t-p-white
t-p-white marked this pull request as ready for review November 4, 2026 09:35
@lando-web
lando-web Bot requested a review from a team November 4, 2026 09:36
@t-p-white
t-p-white force-pushed the onboarding-haptic-feedback branch 3 times, most recently from c852a63 to 684be60 Compare November 4, 2026 10:16
@t-p-white

Copy link
Copy Markdown
Contributor Author

@mozilla-code-review mozilla-code-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

23 issues have been found in this revision.

23 issues are located outside of the files touched by the patch:

  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:339 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsINode' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:421 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:327 Error: Static assertion failed due to requirement 'std::integral_constant<bool, false>::value': nsCOMPtr only works for types with IIDs. Either use RefPtr; add an IID to your type with NS_INLINE_DECL_STATIC_IID/ ;or make the nsCOMPtr point to a base class with an IID. [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsIPrincipal' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • memory/replace/dmd/DMD.h:85 Error: Use of undeclared identifier 'MOZ_ASSERT' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: Non-const lvalue reference to type 'nsAString' (aka 'nsTSubstring<char16_t>') cannot bind to a temporary of type 'Span<element_type, dynamic_extent>' (aka 'Span<char16_t, dynamic_extent>') [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: No member named 'EnsureUtf16ValiditySpan' in namespace 'mozilla'; did you mean 'EnsureUTF16Validity'? [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:411 Error: No member named 'Utf16ValidUpTo' in namespace 'mozilla' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsTSubstring.h:22 Error: "Using XPCOM strings is limited to code linked into libxul." [clang-tidy: clang-diagnostic-error]
  • xpcom/threads/TimerThreadMonitor.h:68 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:70 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:69 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:71 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:72 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.

@mozilla-code-review mozilla-code-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

23 issues have been found in this revision.

23 issues are located outside of the files touched by the patch:

  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:339 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsINode' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:421 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:327 Error: Static assertion failed due to requirement 'std::integral_constant<bool, false>::value': nsCOMPtr only works for types with IIDs. Either use RefPtr; add an IID to your type with NS_INLINE_DECL_STATIC_IID/ ;or make the nsCOMPtr point to a base class with an IID. [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsIPrincipal' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • memory/replace/dmd/DMD.h:85 Error: Use of undeclared identifier 'MOZ_ASSERT' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: Non-const lvalue reference to type 'nsAString' (aka 'nsTSubstring<char16_t>') cannot bind to a temporary of type 'Span<element_type, dynamic_extent>' (aka 'Span<char16_t, dynamic_extent>') [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: No member named 'EnsureUtf16ValiditySpan' in namespace 'mozilla'; did you mean 'EnsureUTF16Validity'? [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:411 Error: No member named 'Utf16ValidUpTo' in namespace 'mozilla' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsTSubstring.h:22 Error: "Using XPCOM strings is limited to code linked into libxul." [clang-tidy: clang-diagnostic-error]
  • xpcom/threads/TimerThreadMonitor.h:68 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:70 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:69 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:71 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:72 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.

@t-p-white
t-p-white force-pushed the onboarding-haptic-feedback branch from 684be60 to f378290 Compare November 4, 2026 13:07
@lando-web
lando-web Bot requested a review from a team November 4, 2026 13:07
…es and page swipes.

Gated behind FeatureFlags.onboardingHapticsEnabled (Nightly and debug only) so it can be tried on-device before deciding whether to ship it. Swipes only play when the pager settles after a user drag, so advancing with a button does not buzz twice.
@t-p-white
t-p-white force-pushed the onboarding-haptic-feedback branch from f378290 to f515186 Compare November 4, 2026 14:52
@lando-web
lando-web Bot requested a review from a team November 4, 2026 14:52
lando-worker Bot pushed a commit that referenced this pull request Nov 4, 2026
…… r=lottie,corentin

Gated behind `FeatureFlags.onboardingHapticsEnabled` (Nightly and debug only) so it can be tried on-device before deciding whether to ship it. Swipes only play when the pager settles after a user drag, so advancing with a button does not buzz twice.

**Reviewer notes**: To test in debug, enable the`FeatureFlag` ` val onboardingFeatureEnabled = Config.channel.isDebug` and have fresh install.

**Implementation notes**: the wrapping helpers (`hapticOnClick`, `hapticOnLinkClick`, `hapticOnCheckedChange`) live in the onboarding package for now. They are the first tap haptics in the tree (existing usages are all long-press, or Confirm on pull-to-refresh), so we should move to android-components compose/base alongside `LongPressIconButton` if the we move this change into production.

Pull request: #429
@lando-worker

lando-worker Bot commented Nov 4, 2026

Copy link
Copy Markdown

Pull request closed by commit ea0a0b1

@lando-worker lando-worker Bot closed this Nov 4, 2026

@mozilla-code-review mozilla-code-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

23 issues have been found in this revision.

23 issues are located outside of the files touched by the patch:

  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:327 Error: Static assertion failed due to requirement 'std::integral_constant<bool, false>::value': nsCOMPtr only works for types with IIDs. Either use RefPtr; add an IID to your type with NS_INLINE_DECL_STATIC_IID/ ;or make the nsCOMPtr point to a base class with an IID. [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsIPrincipal' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:339 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsINode' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:421 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • memory/replace/dmd/DMD.h:85 Error: Use of undeclared identifier 'MOZ_ASSERT' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: Non-const lvalue reference to type 'nsAString' (aka 'nsTSubstring<char16_t>') cannot bind to a temporary of type 'Span<element_type, dynamic_extent>' (aka 'Span<char16_t, dynamic_extent>') [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:411 Error: No member named 'Utf16ValidUpTo' in namespace 'mozilla' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: No member named 'EnsureUtf16ValiditySpan' in namespace 'mozilla'; did you mean 'EnsureUTF16Validity'? [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsTSubstring.h:22 Error: "Using XPCOM strings is limited to code linked into libxul." [clang-tidy: clang-diagnostic-error]
  • xpcom/threads/TimerThreadMonitor.h:69 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:72 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:70 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:68 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:71 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.

@mozilla-code-review mozilla-code-review Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

23 issues have been found in this revision.

23 issues are located outside of the files touched by the patch:

  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:48 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • mfbt/RefPtr.h:49 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:327 Error: Static assertion failed due to requirement 'std::integral_constant<bool, false>::value': nsCOMPtr only works for types with IIDs. Either use RefPtr; add an IID to your type with NS_INLINE_DECL_STATIC_IID/ ;or make the nsCOMPtr point to a base class with an IID. [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsIPrincipal' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:339 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Member access into incomplete type 'nsIPrincipal' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:361 Error: Member access into incomplete type 'nsINode' [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:358 Error: Incomplete type 'nsINode' named in nested name specifier [clang-tidy: clang-diagnostic-error]
  • xpcom/base/nsCOMPtr.h:421 Error: No matching function for call to 'ToSupports' [clang-tidy: clang-diagnostic-error]
  • memory/replace/dmd/DMD.h:85 Error: Use of undeclared identifier 'MOZ_ASSERT' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: Non-const lvalue reference to type 'nsAString' (aka 'nsTSubstring<char16_t>') cannot bind to a temporary of type 'Span<element_type, dynamic_extent>' (aka 'Span<char16_t, dynamic_extent>') [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:411 Error: No member named 'Utf16ValidUpTo' in namespace 'mozilla' [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsReadableUtils.h:422 Error: No member named 'EnsureUtf16ValiditySpan' in namespace 'mozilla'; did you mean 'EnsureUTF16Validity'? [clang-tidy: clang-diagnostic-error]
  • xpcom/string/nsTSubstring.h:22 Error: "Using XPCOM strings is limited to code linked into libxul." [clang-tidy: clang-diagnostic-error]
  • xpcom/threads/TimerThreadMonitor.h:69 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:72 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:70 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:68 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.
  • xpcom/threads/TimerThreadMonitor.h:71 Error: Deleted member function should be public [clang-tidy: modernize-use-equals-delete,-warnings-as-errors]
    Checker reliability is high, meaning that the false positive ratio is low.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants