Soru/moor
This commit is contained in:
parent
79a306351e
commit
f594c7005d
55 changed files with 1034 additions and 1133 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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 &&
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue