Revert "Merge branch 'matrix-chat' into 'gsoc-2021'"

This reverts merge request !11
This commit is contained in:
Thuvarakan Tharmarajasingam
2021-08-23 14:03:46 +00:00
parent d5637fd6a6
commit d41a572888
7 changed files with 109 additions and 298 deletions

View File

@ -1,26 +1,27 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'pages/Profile.dart';
import 'p2p/MatrixServerModel.dart';
import 'package:flutter/material.dart';
import 'pages/Profile.dart';
void main() { void main() {
runApp(MyApp()); runApp(MyApp());
} }
Route<dynamic> generateRoute(RouteSettings settings) { Route<dynamic> generateRoute(RouteSettings settings) {
return MaterialPageRoute(builder: (_) => Profile()); return MaterialPageRoute(
builder: (_) => Profile());
} }
class MyApp extends StatelessWidget { class MyApp extends StatelessWidget {
void initState() {} void initState(){
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return MultiProvider( return MaterialApp(
providers: [ChangeNotifierProvider(create: (_) => MatrixServer())], onGenerateRoute: generateRoute,
child: const MaterialApp( initialRoute: '/',
onGenerateRoute: generateRoute,
initialRoute: '/',
),
); );
} }
} }

View File

@ -1,61 +0,0 @@
import 'package:flutter/foundation.dart';
// ignore: import_of_legacy_library_into_null_safe
import 'package:p2p_client_dart/p2p_client_dart.dart';
class Contact {
String displayName;
String? roomId;
String? userId;
Contact(this.displayName);
@override
String toString() {
return displayName;
}
Contact.fromJson(Map<String, String> json)
: displayName = json['displayName']!,
roomId = json['roomId'],
userId = json['userId'];
}
class MatrixServer extends ChangeNotifier {
Server _server = Server();
Server get server => _server;
@override
String toString() {
return 'Matrix Server - ${server.toString()}';
}
set server(Server newServer) {
this._server = newServer;
notifyListeners();
}
Future<void> setServerConfig(
String url, String name, String? username, String? password) async {
this._server = server = Server.init(url, name);
if (username != null && password != null) {
await this._server.login(username, password);
print(this._server.isAuthenticated);
}
}
Future<List<Contact>> getContactsList() async {
var roomData = await server.getJoinedRooms();
List<Contact> contacts = roomData.map((e) {
Map<String, String> contact = {};
e.retainWhere((e) => e.senderId != server.userId);
if (e.length == 0) return Contact("None");
contact["roomId"] = e[0].roomId;
contact["userId"] = e[0].senderId;
contact["displayName"] = e[0].content['displayname'];
return Contact.fromJson(contact);
}).toList();
contacts.retainWhere((element) => element.displayName != "None");
return contacts;
}
}

View File

@ -1,8 +1,6 @@
import 'package:flutter_nearby_connections_example/database/DatabaseHelper.dart'; import 'package:flutter_nearby_connections_example/database/DatabaseHelper.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_nearby_connections_example/p2p/MatrixServerModel.dart';
import 'package:provider/provider.dart';
import '../classes/Global.dart'; import '../classes/Global.dart';
@ -15,15 +13,15 @@ class ChatListScreen extends StatefulWidget {
class _ChatListScreenState extends State<ChatListScreen> { class _ChatListScreenState extends State<ChatListScreen> {
bool isLoading = false; bool isLoading = false;
List<Contact> conversers = []; List<String> conversers = [];
@override @override
void initState() { void initState() {
super.initState(); super.initState();
refreshMessages(); refreshMessages();
// Global.conversations.forEach((key, value) { Global.conversations.forEach((key, value) {
// conversers.add(key); conversers.add(key);
// }); });
print(" 37 reloaded:" + Global.cache.toString()); print(" 37 reloaded:" + Global.cache.toString());
} }
@ -38,15 +36,6 @@ class _ChatListScreenState extends State<ChatListScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var server = context.watch<MatrixServer>();
Future<void> getContacts() async {
var contacts = await server.getContactsList();
setState(() {
conversers = contacts;
});
}
getContacts();
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
title: Text("Chats"), title: Text("Chats"),
@ -119,7 +108,7 @@ class _ChatListScreenState extends State<ChatListScreen> {
}, },
child: Column( child: Column(
children: [ children: [
Text(conversers[index].displayName), Text(conversers[index]),
], ],
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
), ),

View File

@ -1,13 +1,10 @@
import 'package:bubble/bubble.dart'; import 'package:bubble/bubble.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:flutter_nearby_connections/flutter_nearby_connections.dart'; import 'package:flutter_nearby_connections/flutter_nearby_connections.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter_nearby_connections_example/classes/Payload.dart'; import 'package:flutter_nearby_connections_example/classes/Payload.dart';
import 'package:nanoid/nanoid.dart'; import 'package:nanoid/nanoid.dart';
import 'package:intl/intl.dart'; import 'package:intl/intl.dart';
import 'package:flutter_nearby_connections_example/p2p/MatrixServerModel.dart';
import '../database/DatabaseHelper.dart'; import '../database/DatabaseHelper.dart';
import '../classes/Msg.dart'; import '../classes/Msg.dart';
@ -16,7 +13,7 @@ import '../classes/Global.dart';
class ChatPage extends StatefulWidget { class ChatPage extends StatefulWidget {
ChatPage(this.converser); ChatPage(this.converser);
final Contact converser; final String converser;
@override @override
_ChatPageState createState() => _ChatPageState(); _ChatPageState createState() => _ChatPageState();
@ -36,37 +33,11 @@ class _ChatPageState extends State<ChatPage> {
ScrollController _scrollController = new ScrollController(); ScrollController _scrollController = new ScrollController();
Widget build(BuildContext context) { Widget build(BuildContext context) {
var server = context.watch<MatrixServer>();
server.server.onEvent((data) {
print('data: ${data.content['type']}');
if (data.content['type'] == 'm.room.message') {
print('data: ${data.content['sender']}');
print(
'bool: ${(data.content['sender'] as String).contains(widget.converser.userId!)}');
// assuming only text will be send for now
if ((data.content['sender'] as String)
.contains(widget.converser.userId!)) {
// save to db
String msg = data.content['content']['body'];
String sender = widget.converser.userId!;
String timestamp = DateTime.now().toUtc().toString();
print('data: ${msg}');
var msgId = nanoid(21);
setState(() {
Global.conversations[widget.converser]!
.add({msgId: Msg(msg, "received", timestamp, msgId)});
insertIntoConversationsTable(Msg(msg, "received", timestamp, msgId),
widget.converser.userId!);
});
}
}
});
final myController = TextEditingController(); final myController = TextEditingController();
return Scaffold( return Scaffold(
resizeToAvoidBottomInset: false, resizeToAvoidBottomInset: false,
appBar: AppBar( appBar: AppBar(
title: Text('Chat with ' + widget.converser.displayName), title: Text('Chat with ' + widget.converser),
), ),
body: SingleChildScrollView( body: SingleChildScrollView(
reverse: true, reverse: true,
@ -77,43 +48,40 @@ class _ChatPageState extends State<ChatPage> {
children: [ children: [
Container( Container(
height: MediaQuery.of(context).size.height * .8, height: MediaQuery.of(context).size.height * .8,
child: Global.conversations[widget.converser] == null child:Global.conversations[widget.converser]==null? Text("no messages"): ListView.builder(
? Text("no messages") scrollDirection: Axis.vertical,
: ListView.builder( shrinkWrap: true,
scrollDirection: Axis.vertical, // reverse: true,
shrinkWrap: true, controller: _scrollController,
// reverse: true, padding: const EdgeInsets.all(8),
controller: _scrollController, itemCount: messageList == null ? 0 : messageList.length,
padding: const EdgeInsets.all(8), itemBuilder: (BuildContext context, int index) {
itemCount: return Container(
messageList == null ? 0 : messageList.length, height: 55,
itemBuilder: (BuildContext context, int index) { child: messageList[index].msgtype == 'sent'
return Container( ? Bubble(
height: 55, margin: BubbleEdges.only(top: 10),
child: messageList[index].msgtype == 'sent' nip: BubbleNip.rightTop,
? Bubble( color: Color(0xffd1c4e9),
margin: BubbleEdges.only(top: 10), child: Text(
nip: BubbleNip.rightTop, messageList[index].msgtype +
color: Color(0xffd1c4e9), ": " +
child: Text( messageList[index].message,
messageList[index].msgtype + textAlign: TextAlign.right),
": " + )
messageList[index].message, : Bubble(
textAlign: TextAlign.right), nip: BubbleNip.leftTop,
) color: Color(0xff80DEEA),
: Bubble( margin: BubbleEdges.only(top: 10),
nip: BubbleNip.leftTop, child: Text(
color: Color(0xff80DEEA), messageList[index].msgtype +
margin: BubbleEdges.only(top: 10), ": " +
child: Text( messageList[index].message,
messageList[index].msgtype + ),
": " + ),
messageList[index].message, );
), },
), ),
);
},
),
), ),
TextFormField( TextFormField(
controller: myController, controller: myController,
@ -124,15 +92,10 @@ class _ChatPageState extends State<ChatPage> {
), ),
), ),
ElevatedButton( ElevatedButton(
onPressed: () async { onPressed: () {
var message = await server.server.sendMessage(
widget.converser.userId!, myController.text,
roomId: widget.converser.roomId!);
print("message send to ${widget.converser.roomId!}");
print("message: $message");
var msgId = nanoid(21); var msgId = nanoid(21);
var data = { var data = {
"sender": "${Global.myName}", "sender": "$Global.myName",
"receiver": "$widget.device.deviceName", "receiver": "$widget.device.deviceName",
"message": "$myController.text", "message": "$myController.text",
"id": "$msgId", "id": "$msgId",
@ -140,40 +103,37 @@ class _ChatPageState extends State<ChatPage> {
"type": "Payload" "type": "Payload"
}; };
var Mesagedata = data.toString(); var Mesagedata = data.toString();
try { Global.cache[msgId] = Payload(
Global.cache[msgId] = Payload( msgId,
msgId, Global.myName,
Global.myName, widget.converser,
widget.converser.displayName, myController.text,
myController.text, DateTime.now().toUtc().toString());
DateTime.now().toUtc().toString()); insertIntoMessageTable(Payload(
insertIntoMessageTable(Payload( msgId,
msgId, Global.myName,
Global.myName, widget.converser,
widget.converser.displayName, myController.text,
myController.text, DateTime.now().toUtc().toString()));
DateTime.now().toUtc().toString())); // Global.devices.forEach((element) {
// Global.devices.forEach((element) { // Global.nearbyService!
// Global.nearbyService! // .sendMessage(element.deviceId, Mesagedata);
// .sendMessage(element.deviceId, Mesagedata); // });
// }); // Global.nearbyService!
// Global.nearbyService! // .sendMessage(widget.device.deviceId, myController.text);
// .sendMessage(widget.device.deviceId, myController.text); setState(() {
} finally { // Global
setState(() { // .conversations[widget.device.deviceName][msgId](new Msg(widget.device.deviceId,
// Global // myController.text, "sent"));
// .conversations[widget.device.deviceName][msgId](new Msg(widget.device.deviceId, Global.conversations[widget.converser]!.add({
// myController.text, "sent")); msgId: Msg(myController.text, "sent",
Msg msg = Msg(myController.text, "sent", data["Timestamp"]!, msgId)
data["Timestamp"]!, msgId);
Global.conversations[widget.converser]!
.add({msgId: msg});
messageList.add(msg);
insertIntoConversationsTable(
msg, widget.converser.displayName);
}); });
} insertIntoConversationsTable(
Msg(myController.text, "sent", data["Timestamp"]!,
msgId),
widget.converser);
});
}, },
child: Text("send")), child: Text("send")),
], ],

View File

@ -7,7 +7,6 @@ import 'package:flutter_nearby_connections_example/classes/Payload.dart';
import 'package:flutter_styled_toast/flutter_styled_toast.dart'; import 'package:flutter_styled_toast/flutter_styled_toast.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_nearby_connections/flutter_nearby_connections.dart'; import 'package:flutter_nearby_connections/flutter_nearby_connections.dart';
import 'package:flutter_nearby_connections_example/p2p/MatrixServerModel.dart';
import '../classes/Global.dart'; import '../classes/Global.dart';
import '../classes/Msg.dart'; import '../classes/Msg.dart';
@ -35,9 +34,8 @@ class _DevicesListScreenState extends State<DevicesListScreen> {
super.initState(); super.initState();
init(); init();
refreshMessages(); refreshMessages();
print(" 37 reloaded:" + Global.cache.toString()); print(" 37 reloaded:"+ Global.cache.toString());
} }
Future refreshMessages() async { Future refreshMessages() async {
setState(() => isLoading = true); setState(() => isLoading = true);
@ -54,27 +52,24 @@ class _DevicesListScreenState extends State<DevicesListScreen> {
Global.nearbyService!.stopAdvertisingPeer(); Global.nearbyService!.stopAdvertisingPeer();
super.dispose(); super.dispose();
} }
var _selectedIndex = 0; var _selectedIndex = 0;
Widget getBody(BuildContext context) { Widget getBody(BuildContext context) {
switch (_selectedIndex) { switch (_selectedIndex) {
case 0: case 0:
// return showTrips(context); // return showTrips(context);
case 1: case 1:
// return search(widget.account); // return search(widget.account);
case 2: case 2:
return Text('Not yet implemented!'); return Text('Not yet implemented!');
default: default:
throw UnimplementedError(); throw UnimplementedError();
} }
} }
void _onItemTapped(int index) { void _onItemTapped(int index) {
setState(() { setState(() {
_selectedIndex = index; _selectedIndex = index;
}); });
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
@ -96,6 +91,7 @@ class _DevicesListScreenState extends State<DevicesListScreen> {
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Icon(Icons.group_work), icon: Icon(Icons.group_work),
title: Text("Available"), title: Text("Available"),
), ),
BottomNavigationBarItem( BottomNavigationBarItem(
icon: Icon(Icons.account_box), icon: Icon(Icons.account_box),
@ -145,7 +141,7 @@ class _DevicesListScreenState extends State<DevicesListScreen> {
Navigator.of(context).push( Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (context) { builder: (context) {
return ChatPage(Contact(device.deviceName)); return ChatPage(device.deviceName);
}, },
), ),
); );
@ -298,17 +294,11 @@ class _DevicesListScreenState extends State<DevicesListScreen> {
Global.myName.toString()); Global.myName.toString());
if (temp2['type'] == "Payload" && temp2['receiver'] == Global.myName) { if (temp2['type'] == "Payload" && temp2['receiver'] == Global.myName) {
// Global.cache[temp2["id"]]!.broadcast = false; // Global.cache[temp2["id"]]!.broadcast = false;
if (Global.conversations[temp2['sender']] == null) { if (Global.conversations[ temp2['sender']]== null) {
Global.conversations[temp2['sender']] = []; Global.conversations[ temp2['sender']]= [];
} }
Global.conversations[temp2['sender']]!.add({ Global.conversations[ temp2['sender']]!.add({temp2["id"]:Msg(temp2['message'],"received",temp2['Timestamp'],temp2["id"])});
temp2["id"]: Msg( insertIntoConversationsTable(Msg(temp2['message'],"received",temp2['Timestamp'],temp2["id"]), temp2['sender']);
temp2['message'], "received", temp2['Timestamp'], temp2["id"])
});
insertIntoConversationsTable(
Msg(temp2['message'], "received", temp2['Timestamp'],
temp2["id"]),
temp2['sender']);
if (Global.cache[temp2["id"]] == null) { if (Global.cache[temp2["id"]] == null) {
Global.cache[temp2["id"]] = Ack(temp2["id"]); Global.cache[temp2["id"]] = Ack(temp2["id"]);
print("280 test"); print("280 test");

View File

@ -1,20 +1,13 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_nearby_connections_example/pages/ChatListScreen.dart'; import 'package:flutter_nearby_connections_example/pages/DeviceListScreen.dart';
import 'package:provider/provider.dart';
import 'package:flutter_nearby_connections_example/p2p/MatrixServerModel.dart';
import 'package:nanoid/nanoid.dart'; import 'package:nanoid/nanoid.dart';
import '../classes/Global.dart'; import '../classes/Global.dart';
import 'DeviceListScreen.dart';
class Profile extends StatelessWidget { class Profile extends StatelessWidget {
TextEditingController myName = TextEditingController(); TextEditingController myName = TextEditingController();
TextEditingController serverUrl = TextEditingController();
TextEditingController userName = TextEditingController();
TextEditingController password = TextEditingController();
var custom_length_id = nanoid(6); var custom_length_id = nanoid(6);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
var server = context.watch<MatrixServer>();
print('server ${server.toString()}');
return Scaffold( return Scaffold(
body: Center( body: Center(
child: Column( child: Column(
@ -40,76 +33,17 @@ class Profile extends StatelessWidget {
: null; : null;
}, },
), ),
TextFormField(
controller: serverUrl,
decoration: const InputDecoration(
icon: Icon(Icons.circle_rounded),
hintText: 'Server you wish to connect to',
labelText: 'Server Url *',
),
onSaved: (String? value) {
// This optional block of code can be used to run
// code when the user saves the form.
},
// validator: (String? value) {
// return (value != null && value.contains('@'))
// ? 'Do not use the @ char.'
// : null;
// },
),
TextFormField(
controller: userName,
decoration: const InputDecoration(
icon: Icon(Icons.person_add),
hintText: 'Enter you matrix username?',
labelText: 'Username *',
),
onSaved: (String? value) {
// This optional block of code can be used to run
// code when the user saves the form.
},
// validator: (String? value) {
// return (value != null && value.contains('@'))
// ? 'Do not use the @ char.'
// : null;
// },
),
TextFormField(
controller: password,
obscureText: true,
decoration: const InputDecoration(
icon: Icon(Icons.password),
hintText: 'Enter you matrix password?',
labelText: 'Password *',
),
onSaved: (String? value) {
// This optional block of code can be used to run
// code when the user saves the form.
},
// validator: (String? value) {
// return (value != null && value.contains('@'))
// ? 'Do not use the @ char.'
// : null;
// },
),
SizedBox( SizedBox(
height: 20, height: 20,
), ),
ElevatedButton( ElevatedButton(onPressed: () {
onPressed: () async { // Global.myName = myName.text+custom_length_id;
// Global.myName = myName.text+custom_length_id; Global.myName = myName.text;
await server.setServerConfig( Navigator.of(context).push(
serverUrl.text, myName.text, userName.text, password.text);
Global.myName = myName.text;
Navigator.of(context).push(
MaterialPageRoute( MaterialPageRoute(
builder: (_) => ChatListScreen(), builder: (_) => DevicesListScreen(deviceType: DeviceType.browser)));
// DevicesListScreen(deviceType: DeviceType.browser),
), }, child: Text("Save"))
);
},
child: Text("Save"),
)
], ],
), ),
), ),

View File

@ -3,10 +3,10 @@ description: Demonstrates how to use the flutter_nearby_connections plugin.
# The following line prevents the package from being accidentally published to # The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages. # pub.dev using `pub publish`. This is preferred for private packages.
publish_to: "none" # Remove this line if you wish to publish to pub.dev publish_to: 'none' # Remove this line if you wish to publish to pub.dev
environment: environment:
sdk: ">=2.12.0 <3.0.0" sdk: '>=2.12.0 <3.0.0'
dependencies: dependencies:
flutter: flutter:
@ -19,13 +19,11 @@ dependencies:
nanoid: ^1.0.0 nanoid: ^1.0.0
sqflite: ^2.0.0+3 sqflite: ^2.0.0+3
intl: ^0.17.0 intl: ^0.17.0
p2p_client_dart:
path: ../p2p-client/p2p-client-dart
provider: ^5.0.0
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter
flutter: flutter:
uses-material-design: true uses-material-design: true