Soru/moor

This commit is contained in:
Sorunome 2020-05-13 13:58:59 +00:00 committed by Christian Pauly
commit f594c7005d
55 changed files with 1034 additions and 1133 deletions

View file

@ -32,7 +32,7 @@ class _AudioPlayerState extends State<AudioPlayer> {
StreamSubscription soundSubscription;
Uint8List audioFile;
String statusText = "00:00";
String statusText = '00:00';
double currentPosition = 0;
double maxPosition = 0;
@ -45,7 +45,7 @@ class _AudioPlayerState extends State<AudioPlayer> {
super.dispose();
}
_downloadAction() async {
Future<void> _downloadAction() async {
if (status != AudioPlayerStatus.NOT_DOWNLOADED) return;
setState(() => status = AudioPlayerStatus.DOWNLOADING);
final matrixFile = await SimpleDialogs(context)
@ -57,7 +57,7 @@ class _AudioPlayerState extends State<AudioPlayer> {
_playAction();
}
_playAction() async {
void _playAction() async {
if (AudioPlayer.currentId != widget.event.eventId) {
if (AudioPlayer.currentId != null) {
if (flutterSound.audioState != t_AUDIO_STATE.IS_STOPPED) {
@ -84,16 +84,16 @@ class _AudioPlayerState extends State<AudioPlayer> {
soundSubscription ??= flutterSound.onPlayerStateChanged.listen((e) {
if (AudioPlayer.currentId != widget.event.eventId) {
soundSubscription?.cancel()?.then((f) => soundSubscription = null);
this.setState(() {
setState(() {
currentPosition = 0;
statusText = "00:00";
statusText = '00:00';
});
AudioPlayer.currentId = null;
} else if (e != null) {
DateTime date =
var date =
DateTime.fromMillisecondsSinceEpoch(e.currentPosition.toInt());
String txt = DateFormat('mm:ss', 'en_US').format(date);
this.setState(() {
var txt = DateFormat('mm:ss', 'en_US').format(date);
setState(() {
maxPosition = e.duration;
currentPosition = e.currentPosition;
statusText = txt;

View file

@ -23,13 +23,14 @@ class Avatar extends StatelessWidget {
@override
Widget build(BuildContext context) {
final String src = mxContent?.getThumbnail(
var thumbnail = mxContent?.getThumbnail(
Matrix.of(context).client,
width: size * MediaQuery.of(context).devicePixelRatio,
height: size * MediaQuery.of(context).devicePixelRatio,
method: ThumbnailMethod.scale,
);
String fallbackLetters = "@";
final src = thumbnail;
var fallbackLetters = '@';
if ((name?.length ?? 0) >= 2) {
fallbackLetters = name.substring(0, 2);
} else if ((name?.length ?? 0) == 1) {

View file

@ -48,26 +48,26 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
.client
.onUserEvent
.stream
.where((u) => u.type == 'account_data' && u.eventType == "m.push_rules")
.where((u) => u.type == 'account_data' && u.eventType == 'm.push_rules')
.listen(
(u) => setState(() => null),
);
List<PopupMenuEntry<String>> items = <PopupMenuEntry<String>>[
var items = <PopupMenuEntry<String>>[
widget.room.pushRuleState == PushRuleState.notify
? PopupMenuItem<String>(
value: "mute",
value: 'mute',
child: Text(L10n.of(context).muteChat),
)
: PopupMenuItem<String>(
value: "unmute",
value: 'unmute',
child: Text(L10n.of(context).unmuteChat),
),
PopupMenuItem<String>(
value: "call",
value: 'call',
child: Text(L10n.of(context).videoCall),
),
PopupMenuItem<String>(
value: "leave",
value: 'leave',
child: Text(L10n.of(context).leave),
),
];
@ -75,7 +75,7 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
items.insert(
0,
PopupMenuItem<String>(
value: "details",
value: 'details',
child: Text(L10n.of(context).chatDetails),
),
);
@ -83,8 +83,8 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
return PopupMenuButton(
onSelected: (String choice) async {
switch (choice) {
case "leave":
bool confirmed = await SimpleDialogs(context).askConfirmation();
case 'leave':
var confirmed = await SimpleDialogs(context).askConfirmation();
if (confirmed) {
final success = await SimpleDialogs(context)
.tryRequestWithLoadingDialog(widget.room.leave());
@ -95,18 +95,18 @@ class _ChatSettingsPopupMenuState extends State<ChatSettingsPopupMenu> {
}
}
break;
case "mute":
case 'mute':
await SimpleDialogs(context).tryRequestWithLoadingDialog(
widget.room.setPushRuleState(PushRuleState.mentions_only));
break;
case "unmute":
case 'unmute':
await SimpleDialogs(context).tryRequestWithLoadingDialog(
widget.room.setPushRuleState(PushRuleState.notify));
break;
case "call":
case 'call':
startCallAction(context);
break;
case "details":
case 'details':
await Navigator.of(context).push(
AppRoute.defaultRoute(
context,

View file

@ -23,9 +23,9 @@ class ContentBanner extends StatelessWidget {
@override
Widget build(BuildContext context) {
final mediaQuery = MediaQuery.of(context);
final int bannerSize =
final bannerSize =
(mediaQuery.size.width * mediaQuery.devicePixelRatio).toInt();
final String src = mxContent?.getThumbnail(
final src = mxContent?.getThumbnail(
Matrix.of(context).client,
width: bannerSize,
height: bannerSize,
@ -60,7 +60,7 @@ class ContentBanner extends StatelessWidget {
: Icon(defaultIcon, size: 300),
),
),
if (this.onEdit != null)
if (onEdit != null)
Container(
margin: EdgeInsets.all(8),
alignment: Alignment.bottomRight,

View file

@ -16,7 +16,7 @@ class RecordingDialog extends StatefulWidget {
class _RecordingDialogState extends State<RecordingDialog> {
FlutterSound flutterSound = FlutterSound();
String time = "00:00:00";
String time = '00:00:00';
StreamSubscription _recorderSubscription;
@ -28,7 +28,7 @@ class _RecordingDialogState extends State<RecordingDialog> {
codec: t_CODEC.CODEC_AAC,
);
_recorderSubscription = flutterSound.onRecorderStateChanged.listen((e) {
DateTime date =
var date =
DateTime.fromMillisecondsSinceEpoch(e.currentPosition.toInt());
setState(() => time = DateFormat('mm:ss:SS', 'en_US').format(date));
});
@ -67,7 +67,7 @@ class _RecordingDialogState extends State<RecordingDialog> {
SizedBox(width: 8),
Expanded(
child: Text(
"${L10n.of(context).recording}: $time",
'${L10n.of(context).recording}: $time',
style: TextStyle(
fontSize: 18,
),
@ -95,7 +95,7 @@ class _RecordingDialogState extends State<RecordingDialog> {
),
onPressed: () async {
await _recorderSubscription?.cancel();
final String result = await flutterSound.stopRecorder();
final result = await flutterSound.stopRecorder();
if (widget.onFinished != null) {
widget.onFinished(result);
}

View file

@ -19,7 +19,8 @@ class SimpleDialogs {
bool password = false,
bool multiLine = false,
}) async {
final TextEditingController controller = TextEditingController();
var textEditingController = TextEditingController();
final controller = textEditingController;
String input;
await showDialog(
context: context,
@ -77,7 +78,7 @@ class SimpleDialogs {
String confirmText,
String cancelText,
}) async {
bool confirmed = false;
var confirmed = false;
await showDialog(
context: context,
builder: (c) => AlertDialog(
@ -157,8 +158,8 @@ class SimpleDialogs {
}
}
showLoadingDialog(BuildContext context) {
showDialog(
void showLoadingDialog(BuildContext context) async {
await showDialog(
context: context,
barrierDismissible: false,
builder: (BuildContext context) => AlertDialog(

View file

@ -67,7 +67,8 @@ class _EncryptionButtonState extends State<EncryptionButton> {
builder: (BuildContext context, snapshot) {
Color color;
if (widget.room.encrypted && snapshot.hasData) {
final List<DeviceKeys> deviceKeysList = snapshot.data;
var data = snapshot.data;
final deviceKeysList = data;
color = Colors.orange;
if (deviceKeysList.indexWhere((DeviceKeys deviceKeys) =>
deviceKeys.verified == false &&

View file

@ -15,7 +15,7 @@ class ImageBubble extends StatefulWidget {
}
class _ImageBubbleState extends State<ImageBubble> {
static Map<String, MatrixFile> _matrixFileMap = {};
static final Map<String, MatrixFile> _matrixFileMap = {};
MatrixFile get _file => _matrixFileMap[widget.event.eventId];
set _file(MatrixFile file) {
_matrixFileMap[widget.event.eventId] = file;
@ -65,7 +65,7 @@ class _ImageBubbleState extends State<ImageBubble> {
}
_getFile().then((MatrixFile file) {
setState(() => _file = file);
}, onError: (error) {
}, onError: (error, stacktrace) {
setState(() => _error = error);
});
return Center(

View file

@ -71,11 +71,11 @@ class ChatListItem extends StatelessWidget {
if (room.membership == Membership.join) {
if (Matrix.of(context).shareContent != null) {
if (Matrix.of(context).shareContent["msgtype"] ==
"chat.fluffy.shared_file") {
if (Matrix.of(context).shareContent['msgtype'] ==
'chat.fluffy.shared_file') {
await SimpleDialogs(context).tryRequestWithErrorToast(
room.sendFileEvent(
Matrix.of(context).shareContent["file"],
Matrix.of(context).shareContent['file'],
),
);
} else {
@ -98,11 +98,11 @@ class ChatListItem extends StatelessWidget {
final success = await SimpleDialogs(context)
.tryRequestWithLoadingDialog(room.forget());
if (success != false) {
if (this.onForget != null) this.onForget();
if (onForget != null) onForget();
}
return success;
}
final bool confirmed = await SimpleDialogs(context).askConfirmation();
final confirmed = await SimpleDialogs(context).askConfirmation();
if (!confirmed) {
return false;
}
@ -217,7 +217,7 @@ class ChatListItem extends StatelessWidget {
),
),
)
: Text(" "),
: Text(' '),
],
),
onTap: () => clickAction(context),

View file

@ -37,23 +37,23 @@ class Message extends StatelessWidget {
return StateMessage(event);
}
Client client = Matrix.of(context).client;
final bool ownMessage = event.senderId == client.userID;
Alignment alignment = ownMessage ? Alignment.topRight : Alignment.topLeft;
Color color = Theme.of(context).secondaryHeaderColor;
final bool sameSender = nextEvent != null &&
var client = Matrix.of(context).client;
final ownMessage = event.senderId == client.userID;
var alignment = ownMessage ? Alignment.topRight : Alignment.topLeft;
var color = Theme.of(context).secondaryHeaderColor;
final sameSender = nextEvent != null &&
[EventTypes.Message, EventTypes.Sticker].contains(nextEvent.type)
? nextEvent.sender.id == event.sender.id
: false;
BubbleNip nip = sameSender
var nip = sameSender
? BubbleNip.no
: ownMessage ? BubbleNip.rightBottom : BubbleNip.leftBottom;
Color textColor = ownMessage
var textColor = ownMessage
? Colors.white
: Theme.of(context).brightness == Brightness.dark
? Colors.white
: Colors.black;
MainAxisAlignment rowMainAxisAlignment =
var rowMainAxisAlignment =
ownMessage ? MainAxisAlignment.end : MainAxisAlignment.start;
if (event.showThumbnail) {
@ -65,7 +65,7 @@ class Message extends StatelessWidget {
: Theme.of(context).primaryColor;
}
List<Widget> rowChildren = [
var rowChildren = <Widget>[
Expanded(
child: Bubble(
elevation: 0,
@ -84,14 +84,14 @@ class Message extends StatelessWidget {
FutureBuilder<Event>(
future: event.getReplyEvent(timeline),
builder: (BuildContext context, snapshot) {
final Event replyEvent = snapshot.hasData
final replyEvent = snapshot.hasData
? snapshot.data
: Event(
eventId: event.content['m.relates_to']
['m.in_reply_to']['event_id'],
content: {"msgtype": "m.text", "body": "..."},
content: {'msgtype': 'm.text', 'body': '...'},
senderId: event.senderId,
typeKey: "m.room.message",
typeKey: 'm.room.message',
room: event.room,
roomId: event.roomId,
status: 1,
@ -110,7 +110,7 @@ class Message extends StatelessWidget {
),
if (event.type == EventTypes.Encrypted &&
event.messageType == MessageTypes.BadEncrypted &&
event.content["body"] == DecryptError.UNKNOWN_SESSION)
event.content['body'] == DecryptError.UNKNOWN_SESSION)
RaisedButton(
color: color.withAlpha(100),
child: Text(
@ -146,7 +146,7 @@ class Message extends StatelessWidget {
),
),
];
final Widget avatarOrSizedBox = sameSender
final avatarOrSizedBox = sameSender
? SizedBox(width: Avatar.defaultSize)
: Avatar(
event.sender.avatarUrl,
@ -193,8 +193,8 @@ class _MetaRow extends StatelessWidget {
@override
Widget build(BuildContext context) {
final String displayname = event.sender.calcDisplayname();
final bool showDisplayname =
final displayname = event.sender.calcDisplayname();
final showDisplayname =
!ownMessage && event.senderId != event.room.directChatMatrixID;
return Row(
mainAxisSize: MainAxisSize.min,

View file

@ -13,44 +13,44 @@ class ParticipantListItem extends StatelessWidget {
const ParticipantListItem(this.user);
participantAction(BuildContext context, String action) async {
void participantAction(BuildContext context, String action) async {
switch (action) {
case "ban":
case 'ban':
if (await SimpleDialogs(context).askConfirmation()) {
await SimpleDialogs(context).tryRequestWithLoadingDialog(user.ban());
}
break;
case "unban":
case 'unban':
if (await SimpleDialogs(context).askConfirmation()) {
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.unban());
}
break;
case "kick":
case 'kick':
if (await SimpleDialogs(context).askConfirmation()) {
await SimpleDialogs(context).tryRequestWithLoadingDialog(user.kick());
}
break;
case "admin":
case 'admin':
if (await SimpleDialogs(context).askConfirmation()) {
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.setPower(100));
}
break;
case "moderator":
case 'moderator':
if (await SimpleDialogs(context).askConfirmation()) {
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.setPower(50));
}
break;
case "user":
case 'user':
if (await SimpleDialogs(context).askConfirmation()) {
await SimpleDialogs(context)
.tryRequestWithLoadingDialog(user.setPower(0));
}
break;
case "message":
final String roomId = await user.startDirectChat();
case 'message':
final roomId = await user.startDirectChat();
await Navigator.of(context).pushAndRemoveUntil(
AppRoute.defaultRoute(
context,
@ -63,21 +63,21 @@ class ParticipantListItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
Map<Membership, String> membershipBatch = {
Membership.join: "",
var membershipBatch = <Membership, String>{
Membership.join: '',
Membership.ban: L10n.of(context).banned,
Membership.invite: L10n.of(context).invited,
Membership.leave: L10n.of(context).leftTheChat,
};
final String permissionBatch = user.powerLevel == 100
final permissionBatch = user.powerLevel == 100
? L10n.of(context).admin
: user.powerLevel >= 50 ? L10n.of(context).moderator : "";
List<PopupMenuEntry<String>> items = <PopupMenuEntry<String>>[];
: user.powerLevel >= 50 ? L10n.of(context).moderator : '';
var items = <PopupMenuEntry<String>>[];
if (user.id != Matrix.of(context).client.userID) {
items.add(
PopupMenuItem(
child: Text(L10n.of(context).sendAMessage), value: "message"),
child: Text(L10n.of(context).sendAMessage), value: 'message'),
);
}
if (user.canChangePowerLevel &&
@ -85,7 +85,7 @@ class ParticipantListItem extends StatelessWidget {
user.powerLevel != 100) {
items.add(
PopupMenuItem(
child: Text(L10n.of(context).makeAnAdmin), value: "admin"),
child: Text(L10n.of(context).makeAnAdmin), value: 'admin'),
);
}
if (user.canChangePowerLevel &&
@ -93,29 +93,29 @@ class ParticipantListItem extends StatelessWidget {
user.powerLevel != 50) {
items.add(
PopupMenuItem(
child: Text(L10n.of(context).makeAModerator), value: "moderator"),
child: Text(L10n.of(context).makeAModerator), value: 'moderator'),
);
}
if (user.canChangePowerLevel && user.powerLevel != 0) {
items.add(
PopupMenuItem(
child: Text(L10n.of(context).revokeAllPermissions), value: "user"),
child: Text(L10n.of(context).revokeAllPermissions), value: 'user'),
);
}
if (user.canKick) {
items.add(
PopupMenuItem(
child: Text(L10n.of(context).kickFromChat), value: "kick"),
child: Text(L10n.of(context).kickFromChat), value: 'kick'),
);
}
if (user.canBan && user.membership != Membership.ban) {
items.add(
PopupMenuItem(child: Text(L10n.of(context).banFromChat), value: "ban"),
PopupMenuItem(child: Text(L10n.of(context).banFromChat), value: 'ban'),
);
} else if (user.canBan && user.membership == Membership.ban) {
items.add(
PopupMenuItem(
child: Text(L10n.of(context).removeExile), value: "unban"),
child: Text(L10n.of(context).removeExile), value: 'unban'),
);
}
return PopupMenuButton(

View file

@ -13,7 +13,7 @@ class PresenceListItem extends StatelessWidget {
const PresenceListItem(this.presence);
static Map<String, Profile> _presences = {};
static final Map<String, Profile> _presences = {};
Future<Profile> _requestProfile(BuildContext context) async {
_presences[presence.sender] ??=
@ -28,7 +28,7 @@ class PresenceListItem extends StatelessWidget {
builder: (context, snapshot) {
if (!snapshot.hasData) return Container();
Uri avatarUrl;
String displayname = presence.sender.localpart;
var displayname = presence.sender.localpart;
if (snapshot.hasData) {
avatarUrl = snapshot.data.avatarUrl;
displayname = snapshot.data.displayname;
@ -64,7 +64,7 @@ class PresenceListItem extends StatelessWidget {
FlatButton(
child: Text(L10n.of(context).sendAMessage),
onPressed: () async {
final String roomId = await User(
final roomId = await User(
presence.sender,
room: Room(id: '', client: Matrix.of(context).client),
).startDirectChat();

View file

@ -27,7 +27,7 @@ class PublicRoomListItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final bool hasTopic =
final hasTopic =
publicRoomEntry.topic != null && publicRoomEntry.topic.isNotEmpty;
return ListTile(
leading: Avatar(
@ -36,13 +36,13 @@ class PublicRoomListItem extends StatelessWidget {
: Uri.parse(publicRoomEntry.avatarUrl),
publicRoomEntry.name),
title: Text(hasTopic
? "${publicRoomEntry.name} (${publicRoomEntry.numJoinedMembers})"
? '${publicRoomEntry.name} (${publicRoomEntry.numJoinedMembers})'
: publicRoomEntry.name),
subtitle: Text(
hasTopic
? publicRoomEntry.topic
: L10n.of(context).countParticipants(
publicRoomEntry.numJoinedMembers?.toString() ?? "0"),
publicRoomEntry.numJoinedMembers?.toString() ?? '0'),
maxLines: 1,
),
onTap: () => joinAction(context),

View file

@ -24,14 +24,17 @@ class Matrix extends StatefulWidget {
final Client client;
Matrix({this.child, this.clientName, this.client, Key key}) : super(key: key);
final Store store;
Matrix({this.child, this.clientName, this.client, this.store, Key key})
: super(key: key);
@override
MatrixState createState() => MatrixState();
/// Returns the (nearest) Client instance of your application.
static MatrixState of(BuildContext context) {
MatrixState newState =
var newState =
(context.dependOnInheritedWidgetOfExactType<_InheritedMatrix>()).data;
newState.context = FirebaseController.context = context;
return newState;
@ -40,6 +43,8 @@ class Matrix extends StatefulWidget {
class MatrixState extends State<Matrix> {
Client client;
Store store;
@override
BuildContext context;
Map<String, dynamic> get shareContent => _shareContent;
@ -62,16 +67,15 @@ class MatrixState extends State<Matrix> {
void clean() async {
if (!kIsWeb) return;
final LocalStorage storage = LocalStorage('LocalStorage');
final storage = LocalStorage('LocalStorage');
await storage.ready;
await storage.deleteItem(widget.clientName);
}
void _initWithStore() async {
Future<LoginState> initLoginState = client.onLoginStateChanged.stream.first;
client.storeAPI = kIsWeb ? Store(client) : ExtendedStore(client);
debugPrint(
"[Store] Store is extended: ${client.storeAPI.extended.toString()}");
var initLoginState = client.onLoginStateChanged.stream.first;
client.database = await getDatabase(client, store);
client.connect();
if (await initLoginState == LoginState.logged && !kIsWeb) {
await FirebaseController.setupFirebase(
client,
@ -81,14 +85,14 @@ class MatrixState extends State<Matrix> {
}
Map<String, dynamic> getAuthByPassword(String password, String session) => {
"type": "m.login.password",
"identifier": {
"type": "m.id.user",
"user": client.userID,
'type': 'm.login.password',
'identifier': {
'type': 'm.id.user',
'user': client.userID,
},
"user": client.userID,
"password": password,
"session": session,
'user': client.userID,
'password': password,
'session': session,
};
StreamSubscription onRoomKeyRequestSub;
@ -151,8 +155,9 @@ class MatrixState extends State<Matrix> {
@override
void initState() {
store = widget.store ?? Store();
if (widget.client == null) {
debugPrint("[Matrix] Init matrix client");
debugPrint('[Matrix] Init matrix client');
client = Client(widget.clientName, debug: false);
onJitsiCallSub ??= client.onEvent.stream
.where((e) =>
@ -163,12 +168,12 @@ class MatrixState extends State<Matrix> {
.listen(onJitsiCall);
onRoomKeyRequestSub ??=
client.onRoomKeyRequest.stream.listen((RoomKeyRequest request) async {
final Room room = request.room;
final User sender = room.getUserByMXIDSync(request.sender);
final room = request.room;
final sender = room.getUserByMXIDSync(request.sender);
if (await SimpleDialogs(context).askConfirmation(
titleText: L10n.of(context).requestToReadOlderMessages,
contentText:
"${sender.id}\n\n${L10n.of(context).device}:\n${request.requestingDevice.deviceId}\n\n${L10n.of(context).identity}:\n${request.requestingDevice.curve25519Key.beautified}",
'${sender.id}\n\n${L10n.of(context).device}:\n${request.requestingDevice.deviceId}\n\n${L10n.of(context).identity}:\n${request.requestingDevice.curve25519Key.beautified}',
confirmText: L10n.of(context).verify,
cancelText: L10n.of(context).deny,
)) {
@ -178,20 +183,21 @@ class MatrixState extends State<Matrix> {
_initWithStore();
} else {
client = widget.client;
client.connect();
}
if (client.storeAPI != null) {
client.storeAPI
.getItem("chat.fluffy.jitsi_instance")
if (store != null) {
store
.getItem('chat.fluffy.jitsi_instance')
.then((final instance) => jitsiInstance = instance ?? jitsiInstance);
client.storeAPI.getItem("chat.fluffy.wallpaper").then((final path) async {
store.getItem('chat.fluffy.wallpaper').then((final path) async {
if (path == null) return;
final file = File(path);
if (await file.exists()) {
wallpaper = file;
}
});
client.storeAPI.getItem("chat.fluffy.renderHtml").then((final render) async {
renderHtml = render == "1";
store.getItem('chat.fluffy.renderHtml').then((final render) async {
renderHtml = render == '1';
});
}
super.initState();
@ -221,12 +227,11 @@ class _InheritedMatrix extends InheritedWidget {
@override
bool updateShouldNotify(_InheritedMatrix old) {
bool update = old.data.client.accessToken != this.data.client.accessToken ||
old.data.client.userID != this.data.client.userID ||
old.data.client.matrixVersions != this.data.client.matrixVersions ||
old.data.client.deviceID != this.data.client.deviceID ||
old.data.client.deviceName != this.data.client.deviceName ||
old.data.client.homeserver != this.data.client.homeserver;
var update = old.data.client.accessToken != data.client.accessToken ||
old.data.client.userID != data.client.userID ||
old.data.client.deviceID != data.client.deviceID ||
old.data.client.deviceName != data.client.deviceName ||
old.data.client.homeserver != data.client.homeserver;
return update;
}
}

View file

@ -40,14 +40,13 @@ class MessageContent extends StatelessWidget {
case MessageTypes.Text:
case MessageTypes.Notice:
case MessageTypes.Emote:
if (
Matrix.of(context).renderHtml && !event.redacted &&
event.content['format'] == 'org.matrix.custom.html' &&
event.content['formatted_body'] is String
) {
if (Matrix.of(context).renderHtml &&
!event.redacted &&
event.content['format'] == 'org.matrix.custom.html' &&
event.content['formatted_body'] is String) {
String html = event.content['formatted_body'];
if (event.messageType == MessageTypes.Emote) {
html = "* $html";
html = '* $html';
}
return HtmlMessage(
html: html,

View file

@ -36,9 +36,9 @@ class MessageDownloadContent extends StatelessWidget {
matrixFile.open();
}),
Text(
"- " +
(event.content.containsKey("filename")
? event.content["filename"]
'- ' +
(event.content.containsKey('filename')
? event.content['filename']
: event.body),
style: TextStyle(
color: textColor,
@ -47,7 +47,7 @@ class MessageDownloadContent extends StatelessWidget {
),
if (event.sizeString != null)
Text(
"- " + event.sizeString,
'- ' + event.sizeString,
style: TextStyle(
color: textColor,
fontWeight: FontWeight.bold,

View file

@ -15,15 +15,17 @@ class ReplyContent extends StatelessWidget {
@override
Widget build(BuildContext context) {
Widget replyBody;
if (
replyEvent != null && Matrix.of(context).renderHtml &&
[EventTypes.Message, EventTypes.Encrypted].contains(replyEvent.type) &&
[MessageTypes.Text, MessageTypes.Notice, MessageTypes.Emote].contains(replyEvent.messageType) &&
!replyEvent.redacted && replyEvent.content['format'] == 'org.matrix.custom.html' && replyEvent.content['formatted_body'] is String
) {
if (replyEvent != null &&
Matrix.of(context).renderHtml &&
[EventTypes.Message, EventTypes.Encrypted].contains(replyEvent.type) &&
[MessageTypes.Text, MessageTypes.Notice, MessageTypes.Emote]
.contains(replyEvent.messageType) &&
!replyEvent.redacted &&
replyEvent.content['format'] == 'org.matrix.custom.html' &&
replyEvent.content['formatted_body'] is String) {
String html = replyEvent.content['formatted_body'];
if (replyEvent.messageType == MessageTypes.Emote) {
html = "* $html";
html = '* $html';
}
replyBody = HtmlMessage(
html: html,
@ -39,7 +41,7 @@ class ReplyContent extends StatelessWidget {
withSenderNamePrefix: false,
hideReply: true,
) ??
"",
'',
overflow: TextOverflow.ellipsis,
maxLines: 1,
style: TextStyle(
@ -62,7 +64,7 @@ class ReplyContent extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(
(replyEvent?.sender?.calcDisplayname() ?? "") + ":",
(replyEvent?.sender?.calcDisplayname() ?? '') + ':',
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: TextStyle(

View file

@ -15,9 +15,8 @@ class ThemesSettingsState extends State<ThemesSettings> {
@override
Widget build(BuildContext context) {
final MatrixState matrix = Matrix.of(context);
final ThemeSwitcherWidgetState themeEngine =
ThemeSwitcherWidget.of(context);
final matrix = Matrix.of(context);
final themeEngine = ThemeSwitcherWidget.of(context);
_selectedTheme = themeEngine.selectedTheme;
_amoledEnabled = themeEngine.amoledEnabled;

View file

@ -147,7 +147,7 @@ class ThemeSwitcher extends InheritedWidget {
class ThemeSwitcherWidget extends StatefulWidget {
final Widget child;
ThemeSwitcherWidget({Key key, this.child})
ThemeSwitcherWidget({Key key, @required this.child})
: assert(child != null),
super(key: key);
@ -156,7 +156,7 @@ class ThemeSwitcherWidget extends StatefulWidget {
/// Returns the (nearest) Client instance of your application.
static ThemeSwitcherWidgetState of(BuildContext context) {
ThemeSwitcherWidgetState newState =
var newState =
(context.dependOnInheritedWidgetOfExactType<ThemeSwitcher>()).data;
newState.context = context;
return newState;
@ -167,17 +167,17 @@ class ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
ThemeData themeData;
Themes selectedTheme;
bool amoledEnabled;
@override
BuildContext context;
Future loadSelection(MatrixState matrix) async {
String item = await matrix.client.storeAPI.getItem("theme") ?? "light";
String item = await matrix.store.getItem('theme') ?? 'light';
selectedTheme =
Themes.values.firstWhere((e) => e.toString() == 'Themes.' + item);
amoledEnabled =
(await matrix.client.storeAPI.getItem("amoled_enabled") ?? "false")
.toLowerCase() ==
'true';
amoledEnabled = (await matrix.store.getItem('amoled_enabled') ?? 'false')
.toLowerCase() ==
'true';
switchTheme(matrix, selectedTheme, amoledEnabled);
return;
@ -199,7 +199,7 @@ class ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
break;
case Themes.system:
// This needs to be a low level call as we don't have a MaterialApp yet
Brightness brightness =
var brightness =
MediaQueryData.fromWindow(WidgetsBinding.instance.window)
.platformBrightness;
if (brightness == Brightness.dark) {
@ -224,16 +224,15 @@ class ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
}
Future saveThemeValue(MatrixState matrix, Themes value) async {
await matrix.client.storeAPI
.setItem("theme", value.toString().split('.').last);
await matrix.store.setItem('theme', value.toString().split('.').last);
}
Future saveAmoledEnabledValue(MatrixState matrix, bool value) async {
await matrix.client.storeAPI.setItem("amoled_enabled", value.toString());
await matrix.store.setItem('amoled_enabled', value.toString());
}
void setup() async {
final MatrixState matrix = Matrix.of(context);
final matrix = Matrix.of(context);
await loadSelection(matrix);
if (selectedTheme == null) {
@ -271,9 +270,8 @@ class ThemeSwitcherWidgetState extends State<ThemeSwitcherWidget> {
Widget build(BuildContext context) {
if (themeData == null) {
// This needs to be a low level call as we don't have a MaterialApp yet
Brightness brightness =
MediaQueryData.fromWindow(WidgetsBinding.instance.window)
.platformBrightness;
var brightness = MediaQueryData.fromWindow(WidgetsBinding.instance.window)
.platformBrightness;
if (brightness == Brightness.dark) {
themeData = darkTheme;
} else {