Clean up everything

This commit is contained in:
Christian Pauly 2020-01-19 15:07:42 +01:00
commit f4ef4eeea9
15 changed files with 617 additions and 375 deletions

View file

@ -42,7 +42,9 @@ class Avatar extends StatelessWidget {
src,
)
: null,
backgroundColor: name?.color ?? Theme.of(context).secondaryHeaderColor,
backgroundColor: mxContent.mxc.isEmpty
? name?.color ?? Theme.of(context).secondaryHeaderColor
: Theme.of(context).secondaryHeaderColor,
child: mxContent.mxc.isEmpty
? Text(fallbackLetters, style: TextStyle(color: Colors.white))
: null,

View file

@ -12,11 +12,13 @@ class ContentBanner extends StatelessWidget {
final double height;
final IconData defaultIcon;
final bool loading;
final Function onEdit;
const ContentBanner(this.mxContent,
{this.height = 400,
this.defaultIcon = Icons.people_outline,
this.loading = false,
this.onEdit,
Key key})
: super(key: key);
@ -42,25 +44,46 @@ class ContentBanner extends StatelessWidget {
: null,
child: Container(
height: 200,
color: Theme.of(context).secondaryHeaderColor,
child: !loading
? mxContent.mxc?.isNotEmpty ?? false
? kIsWeb
? Image.network(
src,
height: 200,
fit: BoxFit.cover,
)
: CachedNetworkImage(
imageUrl: src,
height: 200,
fit: BoxFit.cover,
placeholder: (c, s) =>
Center(child: CircularProgressIndicator()),
errorWidget: (c, s, o) => Icon(Icons.error, size: 200),
)
: Icon(defaultIcon, size: 200)
: Icon(defaultIcon, size: 200),
alignment: Alignment.center,
decoration: BoxDecoration(
color: Theme.of(context).secondaryHeaderColor,
),
child: Stack(
children: <Widget>[
Positioned(
left: 0,
right: 0,
top: 0,
bottom: 0,
child: !loading
? mxContent.mxc?.isNotEmpty ?? false
? kIsWeb
? Image.network(
src,
height: 200,
fit: BoxFit.cover,
)
: CachedNetworkImage(
imageUrl: src,
height: 200,
fit: BoxFit.cover,
)
: Icon(defaultIcon, size: 200)
: Icon(defaultIcon, size: 200),
),
if (this.onEdit != null)
Container(
margin: EdgeInsets.all(8),
alignment: Alignment.bottomRight,
child: FloatingActionButton(
mini: true,
backgroundColor: Theme.of(context).primaryColor,
child: Icon(Icons.file_upload),
onPressed: onEdit,
),
),
],
),
),
);
}

View file

@ -1,8 +1,8 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/components/message_content.dart';
import 'package:fluffychat/utils/event_extension.dart';
import 'package:fluffychat/utils/date_time_extension.dart';
import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/utils/room_name_calculator.dart';
import 'package:fluffychat/utils/room_extension.dart';
import 'package:fluffychat/views/chat.dart';
import 'package:flutter/material.dart';
import 'package:toast/toast.dart';
@ -91,7 +91,7 @@ class ChatListItem extends StatelessWidget {
children: <Widget>[
Expanded(
child: Text(
RoomNameCalculator(room).name,
room.getLocalizedDisplayname(context),
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
@ -117,9 +117,16 @@ class ChatListItem extends StatelessWidget {
color: Theme.of(context).primaryColor,
),
)
: MessageContent(
room.lastEvent,
textOnly: true,
: Text(
room.lastEvent.getLocalizedBody(context,
withSenderNamePrefix: true, hideQuotes: true),
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(
decoration: room.lastEvent.redacted
? TextDecoration.lineThrough
: null,
),
),
),
SizedBox(width: 8),

View file

@ -1,8 +1,8 @@
import 'package:bubble/bubble.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:flutter/material.dart';
import '../message_content.dart';
import 'package:fluffychat/utils/event_extension.dart';
import 'package:link_text/link_text.dart';
class StateMessage extends StatelessWidget {
final Event event;
@ -23,7 +23,13 @@ class StateMessage extends StatelessWidget {
color: Colors.black,
elevation: 0,
alignment: Alignment.center,
child: MessageContent(event, textColor: Colors.white),
child: LinkText(
text: event.getLocalizedBody(context),
textStyle: TextStyle(
color: Colors.white,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
),
),
),
);

View file

@ -4,7 +4,8 @@ import 'dart:io';
import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/utils/room_name_calculator.dart';
import 'package:fluffychat/utils/event_extension.dart';
import 'package:fluffychat/utils/room_extension.dart';
import 'package:fluffychat/utils/sqflite_store.dart';
import 'package:fluffychat/views/chat.dart';
import 'package:flutter/foundation.dart';
@ -264,28 +265,12 @@ class MatrixState extends State<Matrix> {
: "$unreadEvents unread messages";
// Calculate the body
String body;
switch (event.messageType) {
case MessageTypes.Image:
body = "${event.sender.calcDisplayname()} sent a picture";
break;
case MessageTypes.File:
body = "${event.sender.calcDisplayname()} sent a file";
break;
case MessageTypes.Audio:
body = "${event.sender.calcDisplayname()} sent an audio";
break;
case MessageTypes.Video:
body = "${event.sender.calcDisplayname()} sent a video";
break;
default:
body = "${event.sender.calcDisplayname()}: ${event.body}";
break;
}
final String body = event.getLocalizedBody(context,
withSenderNamePrefix: true, hideQuotes: true);
// The person object for the android message style notification
final person = Person(
name: RoomNameCalculator(room).name,
name: room.getLocalizedDisplayname(context),
icon: room.avatar.mxc.isEmpty
? null
: await downloadAndSaveContent(
@ -320,7 +305,10 @@ class MatrixState extends State<Matrix> {
var platformChannelSpecifics = NotificationDetails(
androidPlatformChannelSpecifics, iOSPlatformChannelSpecifics);
await _flutterLocalNotificationsPlugin.show(
0, RoomNameCalculator(room).name, body, platformChannelSpecifics,
0,
room.getLocalizedDisplayname(context),
body,
platformChannelSpecifics,
payload: roomId);
} catch (exception) {
print("[Push] Error while processing notification: " +
@ -356,7 +344,7 @@ class MatrixState extends State<Matrix> {
@override
void initState() {
if (widget.client == null) {
client = Client(widget.clientName, debug: false);
client = Client(widget.clientName, debug: true);
if (!kIsWeb) {
_initWithStore();
} else {

View file

@ -2,6 +2,7 @@ import 'package:bubble/bubble.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:famedlysdk/famedlysdk.dart';
import 'package:fluffychat/utils/app_route.dart';
import 'package:fluffychat/utils/event_extension.dart';
import 'package:fluffychat/views/content_web_view.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
@ -13,41 +14,17 @@ import 'matrix.dart';
class MessageContent extends StatelessWidget {
final Event event;
final Color textColor;
final bool textOnly;
const MessageContent(this.event, {this.textColor, this.textOnly = false});
const MessageContent(this.event, {this.textColor});
@override
Widget build(BuildContext context) {
final int maxLines = textOnly ? 1 : null;
final Widget unknown = Text(
"${event.sender.calcDisplayname()} sent a ${event.typeKey} event",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
);
switch (event.type) {
case EventTypes.Message:
case EventTypes.Sticker:
switch (event.messageType) {
case MessageTypes.Image:
case MessageTypes.Sticker:
if (textOnly) {
return Text(
"${event.sender.calcDisplayname()} sent a picture",
maxLines: maxLines,
style: TextStyle(
color: textColor,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
}
final int size = 400;
final String src = MxContent(event.content["url"]).getThumbnail(
Matrix.of(context).client,
@ -78,17 +55,6 @@ class MessageContent extends StatelessWidget {
),
);
case MessageTypes.Audio:
if (textOnly) {
return Text(
"${event.sender.calcDisplayname()} sent an audio message",
maxLines: maxLines,
style: TextStyle(
color: textColor,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
}
return Container(
width: 200,
child: RaisedButton(
@ -114,17 +80,6 @@ class MessageContent extends StatelessWidget {
),
);
case MessageTypes.Video:
if (textOnly) {
return Text(
"${event.sender.calcDisplayname()} sent a video message",
maxLines: maxLines,
style: TextStyle(
color: textColor,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
}
return Container(
width: 200,
child: RaisedButton(
@ -150,17 +105,6 @@ class MessageContent extends StatelessWidget {
),
);
case MessageTypes.File:
if (textOnly) {
return Text(
"${event.sender.calcDisplayname()} sent a file",
maxLines: maxLines,
style: TextStyle(
color: textColor,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
}
return Container(
width: 200,
child: RaisedButton(
@ -183,217 +127,29 @@ class MessageContent extends StatelessWidget {
case MessageTypes.Location:
case MessageTypes.None:
case MessageTypes.Notice:
final String senderPrefix =
textOnly && event.senderId != event.room.directChatMatrixID
? event.senderId == Matrix.of(context).client.userID
? "You: "
: "${event.sender.calcDisplayname()}: "
: "";
final String body = event.redacted
? "Redacted by ${event.redactedBecause.sender.calcDisplayname()}"
: senderPrefix + event.body;
if (textOnly) {
return Text(
body,
maxLines: maxLines,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: textColor,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
}
return LinkText(
text: body,
textStyle: TextStyle(
color: textColor,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
);
case MessageTypes.Emote:
if (textOnly) {
return Text(
"* " + event.body,
maxLines: maxLines,
overflow: TextOverflow.ellipsis,
style: TextStyle(
color: textColor,
fontStyle: FontStyle.italic,
decoration:
event.redacted ? TextDecoration.lineThrough : null,
),
);
}
return LinkText(
text: "* " + event.body,
text: event.getLocalizedBody(context),
textStyle: TextStyle(
color: textColor,
fontStyle: FontStyle.italic,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
);
}
return unknown;
case EventTypes.RoomCreate:
return Text(
"${event.sender.calcDisplayname()} has created the chat",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomAvatar:
return Text(
"${event.sender.calcDisplayname()} has changed the chat avatar",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomName:
return Text(
"${event.sender.calcDisplayname()} has changed the chat name to '${event.content['name']}'",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomMember: // Display what has changed
String text = "Failed to parse member event";
// Has the membership changed?
final String newMembership = event.content["membership"] ?? "";
final String oldMembership =
event.unsigned["prev_content"] is Map<String, dynamic>
? event.unsigned["prev_content"]["membership"] ?? ""
: "";
if (newMembership != oldMembership) {
if (oldMembership == "invite" && newMembership == "join") {
text =
"${event.stateKeyUser.calcDisplayname()} has accepted the invitation";
} else if (oldMembership == "leave" && newMembership == "join") {
text =
"${event.stateKeyUser.calcDisplayname()} has joined the chat";
} else if (oldMembership == "join" && newMembership == "ban") {
text =
"${event.sender.calcDisplayname()} has kicked and banned ${event.stateKeyUser.calcDisplayname()}";
} else if (oldMembership == "join" &&
newMembership == "leave" &&
event.stateKey != event.senderId) {
text =
"${event.sender.calcDisplayname()} has kicked ${event.stateKeyUser.calcDisplayname()}";
} else if (oldMembership == "join" &&
newMembership == "leave" &&
event.stateKey == event.senderId) {
text = "${event.stateKeyUser.calcDisplayname()} has left the room";
} else if (oldMembership == "invite" && newMembership == "ban") {
text =
"${event.sender.calcDisplayname()} has banned ${event.stateKeyUser.calcDisplayname()}";
} else if (oldMembership == "leave" && newMembership == "ban") {
text =
"${event.sender.calcDisplayname()} has banned ${event.stateKeyUser.calcDisplayname()}";
} else if (oldMembership == "ban" && newMembership == "leave") {
text =
"${event.sender.calcDisplayname()} has unbanned ${event.stateKeyUser.calcDisplayname()}";
} else if (newMembership == "invite") {
text =
"${event.sender.calcDisplayname()} has invited ${event.stateKeyUser.calcDisplayname()}";
} else if (newMembership == "join") {
text = "${event.stateKeyUser.calcDisplayname()} has joined";
}
} else if (newMembership == "join") {
final String newAvatar = event.content["avatar_url"] ?? "";
final String oldAvatar =
event.unsigned["prev_content"] is Map<String, dynamic>
? event.unsigned["prev_content"]["avatar_url"] ?? ""
: "";
final String newDisplayname = event.content["displayname"] ?? "";
final String oldDisplayname =
event.unsigned["prev_content"] is Map<String, dynamic>
? event.unsigned["prev_content"]["displayname"] ?? ""
: "";
// Has the user avatar changed?
if (newAvatar != oldAvatar) {
text =
"${event.stateKeyUser.calcDisplayname()} has changed the profile avatar";
}
// Has the user avatar changed?
else if (newDisplayname != oldDisplayname) {
text =
"${event.stateKeyUser.calcDisplayname()} has changed the displayname to '$newDisplayname'";
}
}
return Text(
text,
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomTopic:
return Text(
"${event.sender.calcDisplayname()} has changed the chat topic to '${event.content['topic']}'",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomPowerLevels:
return Text(
"${event.sender.calcDisplayname()} has changed the power levels of the chat",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.HistoryVisibility:
return Text(
"${event.sender.calcDisplayname()} has changed the history visibility of the chat to '${event.content['history_visibility']}'",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomJoinRules:
return Text(
"${event.sender.calcDisplayname()} has changed the join rules of the chat to '${event.content['join_rule']}'",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
style: TextStyle(
color: textColor,
),
);
case EventTypes.RoomCanonicalAlias:
if (event.content['canonical_alias']?.isEmpty ?? true) {
return Text(
"${event.sender.calcDisplayname()} has removed the canonical alias.",
maxLines: maxLines,
style: TextStyle(
color: textColor,
),
);
}
return Text(
"${event.sender.calcDisplayname()} has changed the canonical alias to: ${event.content['canonical_alias']}",
maxLines: maxLines,
overflow: textOnly ? TextOverflow.ellipsis : null,
event.getLocalizedBody(context),
style: TextStyle(
color: textColor,
),
);
default:
return unknown;
return Text(
"${event.sender.calcDisplayname()} sent a ${event.typeKey} event",
style: TextStyle(
color: textColor,
decoration: event.redacted ? TextDecoration.lineThrough : null,
),
);
}
}
}