diff --git a/assets/icons/ZulipIcons.ttf b/assets/icons/ZulipIcons.ttf index f3a09b8338..57a301f2e8 100644 Binary files a/assets/icons/ZulipIcons.ttf and b/assets/icons/ZulipIcons.ttf differ diff --git a/assets/icons/info.svg b/assets/icons/info.svg new file mode 100644 index 0000000000..4c3130c284 --- /dev/null +++ b/assets/icons/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/widgets/home.dart b/lib/widgets/home.dart index 45c5ea43c1..9616454f30 100644 --- a/lib/widgets/home.dart +++ b/lib/widgets/home.dart @@ -4,6 +4,7 @@ import 'package:flutter/material.dart'; import '../generated/l10n/zulip_localizations.dart'; import '../model/narrow.dart'; +import 'about_zulip.dart'; import 'action_sheet.dart'; import 'app.dart'; import 'app_bar.dart'; @@ -269,6 +270,7 @@ void _showMainMenu(BuildContext context, { // TODO(#97): Settings // TODO(#661): Notifications // const SizedBox(height: 8), + const _AboutZulipButton(), // TODO(#1095): VersionInfo ]; @@ -556,6 +558,23 @@ class _SwitchAccountButton extends _MenuButton { } } +class _AboutZulipButton extends _MenuButton { + const _AboutZulipButton(); + + @override + IconData get icon => ZulipIcons.info; + + @override + String label(ZulipLocalizations zulipLocalizations) { + return zulipLocalizations.aboutPageTitle; + } + + @override + void onPressed(BuildContext context) { + Navigator.of(context).push(AboutZulipPage.buildRoute(context)); + } +} + /// Apply [Transform.scale] to the child widget when tapped, and reset its scale /// when released, while animating the transitions. class AnimatedScaleOnTap extends StatefulWidget { diff --git a/lib/widgets/icons.dart b/lib/widgets/icons.dart index 2bc1621b56..ba21bec42f 100644 --- a/lib/widgets/icons.dart +++ b/lib/widgets/icons.dart @@ -78,53 +78,56 @@ abstract final class ZulipIcons { /// The Zulip custom icon "inbox". static const IconData inbox = IconData(0xf112, fontFamily: "Zulip Icons"); + /// The Zulip custom icon "info". + static const IconData info = IconData(0xf113, fontFamily: "Zulip Icons"); + /// The Zulip custom icon "inherit". - static const IconData inherit = IconData(0xf113, fontFamily: "Zulip Icons"); + static const IconData inherit = IconData(0xf114, fontFamily: "Zulip Icons"); /// The Zulip custom icon "language". - static const IconData language = IconData(0xf114, fontFamily: "Zulip Icons"); + static const IconData language = IconData(0xf115, fontFamily: "Zulip Icons"); /// The Zulip custom icon "lock". - static const IconData lock = IconData(0xf115, fontFamily: "Zulip Icons"); + static const IconData lock = IconData(0xf116, fontFamily: "Zulip Icons"); /// The Zulip custom icon "menu". - static const IconData menu = IconData(0xf116, fontFamily: "Zulip Icons"); + static const IconData menu = IconData(0xf117, fontFamily: "Zulip Icons"); /// The Zulip custom icon "message_feed". - static const IconData message_feed = IconData(0xf117, fontFamily: "Zulip Icons"); + static const IconData message_feed = IconData(0xf118, fontFamily: "Zulip Icons"); /// The Zulip custom icon "mute". - static const IconData mute = IconData(0xf118, fontFamily: "Zulip Icons"); + static const IconData mute = IconData(0xf119, fontFamily: "Zulip Icons"); /// The Zulip custom icon "read_receipts". - static const IconData read_receipts = IconData(0xf119, fontFamily: "Zulip Icons"); + static const IconData read_receipts = IconData(0xf11a, fontFamily: "Zulip Icons"); /// The Zulip custom icon "send". - static const IconData send = IconData(0xf11a, fontFamily: "Zulip Icons"); + static const IconData send = IconData(0xf11b, fontFamily: "Zulip Icons"); /// The Zulip custom icon "share". - static const IconData share = IconData(0xf11b, fontFamily: "Zulip Icons"); + static const IconData share = IconData(0xf11c, fontFamily: "Zulip Icons"); /// The Zulip custom icon "share_ios". - static const IconData share_ios = IconData(0xf11c, fontFamily: "Zulip Icons"); + static const IconData share_ios = IconData(0xf11d, fontFamily: "Zulip Icons"); /// The Zulip custom icon "smile". - static const IconData smile = IconData(0xf11d, fontFamily: "Zulip Icons"); + static const IconData smile = IconData(0xf11e, fontFamily: "Zulip Icons"); /// The Zulip custom icon "star". - static const IconData star = IconData(0xf11e, fontFamily: "Zulip Icons"); + static const IconData star = IconData(0xf11f, fontFamily: "Zulip Icons"); /// The Zulip custom icon "star_filled". - static const IconData star_filled = IconData(0xf11f, fontFamily: "Zulip Icons"); + static const IconData star_filled = IconData(0xf120, fontFamily: "Zulip Icons"); /// The Zulip custom icon "topic". - static const IconData topic = IconData(0xf120, fontFamily: "Zulip Icons"); + static const IconData topic = IconData(0xf121, fontFamily: "Zulip Icons"); /// The Zulip custom icon "unmute". - static const IconData unmute = IconData(0xf121, fontFamily: "Zulip Icons"); + static const IconData unmute = IconData(0xf122, fontFamily: "Zulip Icons"); /// The Zulip custom icon "user". - static const IconData user = IconData(0xf122, fontFamily: "Zulip Icons"); + static const IconData user = IconData(0xf123, fontFamily: "Zulip Icons"); // END GENERATED ICON DATA } diff --git a/test/widgets/home_test.dart b/test/widgets/home_test.dart index 27b3cac8e0..a86bc5c34e 100644 --- a/test/widgets/home_test.dart +++ b/test/widgets/home_test.dart @@ -5,6 +5,7 @@ import 'package:flutter_test/flutter_test.dart'; import 'package:zulip/api/model/events.dart'; import 'package:zulip/model/narrow.dart'; import 'package:zulip/model/store.dart'; +import 'package:zulip/widgets/about_zulip.dart'; import 'package:zulip/widgets/app.dart'; import 'package:zulip/widgets/app_bar.dart'; import 'package:zulip/widgets/home.dart'; @@ -238,6 +239,16 @@ void main () { check(find.byType(ProfilePage)).findsOne(); check(find.text(eg.selfUser.fullName)).findsAny(); }); + + testWidgets('_AboutZulipButton', (tester) async { + await prepare(tester); + await tapOpenMenu(tester); + + await tester.tap(find.byIcon(ZulipIcons.info)); + await tester.pump(Duration.zero); // tap the button + await tester.pump(const Duration(milliseconds: 250)); // wait for animation + check(find.byType(AboutZulipPage)).findsOne(); + }); }); group('_LoadingPlaceholderPage', () {