From 4614f3ae2e983d506f3c5f2a122c4c7cdd11d967 Mon Sep 17 00:00:00 2001 From: Pierre HUBERT Date: Sat, 13 Mar 2021 12:02:24 +0100 Subject: [PATCH] Add call notice on conversations list --- lib/ui/tiles/conversation_tile.dart | 131 ++++++++++++++++------------ 1 file changed, 75 insertions(+), 56 deletions(-) diff --git a/lib/ui/tiles/conversation_tile.dart b/lib/ui/tiles/conversation_tile.dart index 397f961..c2b69fd 100644 --- a/lib/ui/tiles/conversation_tile.dart +++ b/lib/ui/tiles/conversation_tile.dart @@ -1,6 +1,7 @@ import 'package:comunic/helpers/conversations_helper.dart'; import 'package:comunic/lists/users_list.dart'; import 'package:comunic/models/conversation.dart'; +import 'package:comunic/ui/routes/main_route/main_route.dart'; import 'package:comunic/ui/widgets/conversation_image_widget.dart'; import 'package:comunic/ui/widgets/custom_list_tile.dart'; import 'package:comunic/utils/date_utils.dart'; @@ -52,65 +53,83 @@ class ConversationTile extends StatelessWidget { } @override - Widget build(BuildContext context) { - return CustomListTile( - onTap: () => onOpen(conversation), - // Conversation name - title: Text( - ConversationsHelper.getConversationName( - conversation, - usersList, - ), - style: TextStyle( - fontWeight: conversation.sawLastMessage ? null : FontWeight.bold, - ), - ), + Widget build(BuildContext context) => Column( + children: [_buildMainTile(context), _buildCallTile(context)], + ); - // Tile color - tileColor: conversation.sawLastMessage - ? null - : (conversation.color ?? Colors.blue).withOpacity(0.2), - - // Leading icon - leading: - ConversationImageWidget(conversation: conversation, users: usersList), - - // Conversation information - isThreeLine: true, - subtitle: Column( - crossAxisAlignment: CrossAxisAlignment.stretch, - children: [ - _buildSubInformation(Icons.access_time, - diffTimeFromNowToStr(conversation.lastActivity)), - _buildSubInformation( - Icons.group, - conversation.members.length == 1 - ? tr("1 member") - : tr( - "%num% members", - args: { - "num": conversation.members.length.toString(), - }, - ), + Widget _buildMainTile(BuildContext context) => CustomListTile( + onTap: () => onOpen(conversation), + // Conversation name + title: Text( + ConversationsHelper.getConversationName( + conversation, + usersList, ), - ], - ), + style: TextStyle( + fontWeight: conversation.sawLastMessage ? null : FontWeight.bold, + ), + ), - onLongPressOpenMenu: (position) { - showMenu<_PopupMenuChoices>( - context: context, - position: position, - items: [ - PopupMenuItem( - child: Text(tr("Update")), - value: _PopupMenuChoices.UPDATE, - ), - PopupMenuItem( - child: Text(tr("Delete")), - value: _PopupMenuChoices.DELETE, - ) - ]).then(_conversationMenuCallback); - }, + // Tile color + tileColor: conversation.sawLastMessage + ? null + : (conversation.color ?? Colors.blue).withOpacity(0.2), + + // Leading icon + leading: ConversationImageWidget( + conversation: conversation, users: usersList), + + // Conversation information + isThreeLine: true, + subtitle: Column( + crossAxisAlignment: CrossAxisAlignment.stretch, + children: [ + _buildSubInformation(Icons.access_time, + diffTimeFromNowToStr(conversation.lastActivity)), + _buildSubInformation( + Icons.group, + conversation.members.length == 1 + ? tr("1 member") + : tr( + "%num% members", + args: { + "num": conversation.members.length.toString(), + }, + ), + ), + ], + ), + + onLongPressOpenMenu: (position) { + showMenu<_PopupMenuChoices>( + context: context, + position: position, + items: [ + PopupMenuItem( + child: Text(tr("Update")), + value: _PopupMenuChoices.UPDATE, + ), + PopupMenuItem( + child: Text(tr("Delete")), + value: _PopupMenuChoices.DELETE, + ) + ]).then(_conversationMenuCallback); + }, + ); + + /// Build call tile, in case of ongoing call + Widget _buildCallTile(BuildContext context) { + if (!conversation.isHavingCall) return Container(); + + return Padding( + padding: EdgeInsets.only(bottom: 20), + child: ListTile( + onTap: () => MainController.of(context).startCall(conversation.id), + dense: true, + title: Text(tr("Ongoing call")), + leading: Icon(Icons.call), + tileColor: Colors.yellow.withOpacity(0.2), + ), ); }