From aaa33c983d51fce3ba39836efb14f1b4db62a00b Mon Sep 17 00:00:00 2001 From: Strycher Date: Mon, 10 Aug 2026 12:01:06 -0400 Subject: [PATCH] feat(#553): move 7-tap Experimental unlock from About row to Build row Follow-up to #509. Settings is post-connect, so About had no availability edge, and wrapping the About version subtitle fought the About dialog's onTap. The 7-tap unlock now anchors on the Build (BuildInfo.stamp) row in Device Info, mirroring Android's build-number gesture; About reverts to a plain row. The countdown/unlock hint renders inline under the Build row. Co-located on the #524 test branch so the owner tests one APK; will be split to its own PR off dev at land time. Agent: QuietSnow (session 31eaba02) --- lib/screens/settings_screen.dart | 46 +++++++++++++------------------- 1 file changed, 18 insertions(+), 28 deletions(-) diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 3f34969..5cd326d 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -88,7 +88,7 @@ class _SettingsScreenState extends State { }); } - void _handleVersionTap() { + void _handleUnlockTap() { final l10n = context.l10n; final settingsService = context.read(); @@ -621,11 +621,25 @@ class _SettingsScreenState extends State { // #397: identity of the running binary, injected at build time and // independent of the marketing version. Its own line so "which build // am I on" is answerable at a glance; copyable for bug reports. + // Also the hidden 7-tap Experimental unlock anchor (#509/#553), + // mirroring Android's Software-info build-number gesture. _buildInfoRow( l10n.settings_infoBuild, BuildInfo.stamp, copyValue: BuildInfo.stamp, + onTap: _handleUnlockTap, ), + if (_versionHint != null) + Padding( + padding: const EdgeInsets.only(top: 2, bottom: 6), + child: Text( + _versionHint!, + style: TextStyle( + fontSize: 12, + color: Theme.of(context).colorScheme.primary, + ), + ), + ), ], ), ), @@ -754,33 +768,9 @@ class _SettingsScreenState extends State { child: ListTile( leading: const Icon(Icons.info_outline), title: Text(l10n.settings_about), - // Tapping the version number counts toward the #509 unlock and is - // absorbed here; tapping elsewhere on the row still opens the dialog. - // Progress is shown inline (below), never as a snackbar. - subtitle: GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: _handleVersionTap, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisSize: MainAxisSize.min, - children: [ - Text( - l10n.settings_aboutVersion( - _appVersion.isEmpty ? l10n.common_loading : _appVersion, - ), - ), - if (_versionHint != null) - Padding( - padding: const EdgeInsets.only(top: 2), - child: Text( - _versionHint!, - style: TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.primary, - ), - ), - ), - ], + subtitle: Text( + l10n.settings_aboutVersion( + _appVersion.isEmpty ? l10n.common_loading : _appVersion, ), ), onTap: () => _showAbout(context),