From 1348a30ecab1ea19eb6e62d8ea67c5a82822c148 Mon Sep 17 00:00:00 2001 From: dikshantbhangala Date: Mon, 30 Dec 2024 15:28:07 +0530 Subject: [PATCH 1/2] done with change --- lib/services/communication_service.dart | 0 macos/Flutter/GeneratedPluginRegistrant.swift | 2 +- .../MainActivity.kt | 0 pubspec.yaml | 1 + 4 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 lib/services/communication_service.dart rename {android/app/src/main/kotlin/com/nankai/openpeerchat_flutter => openpeerchat_flutter}/MainActivity.kt (100%) diff --git a/lib/services/communication_service.dart b/lib/services/communication_service.dart new file mode 100644 index 0000000..e69de29 diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 14cd431..9d4b458 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -9,7 +9,7 @@ import flutter_secure_storage_macos import local_auth_darwin import path_provider_foundation import shared_preferences_foundation -import sqflite +import sqflite_darwin func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { FlutterSecureStoragePlugin.register(with: registry.registrar(forPlugin: "FlutterSecureStoragePlugin")) diff --git a/android/app/src/main/kotlin/com/nankai/openpeerchat_flutter/MainActivity.kt b/openpeerchat_flutter/MainActivity.kt similarity index 100% rename from android/app/src/main/kotlin/com/nankai/openpeerchat_flutter/MainActivity.kt rename to openpeerchat_flutter/MainActivity.kt diff --git a/pubspec.yaml b/pubspec.yaml index b3040f7..70a4a2f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: open_filex: ^4.5.0 permission_handler: ^11.3.1 path_provider: ^2.1.4 + web_socket_channel: ^3.0.1 dev_dependencies: flutter_lints: From 1ed7a2a3ab247769f78a0cd7c1577c043454e36c Mon Sep 17 00:00:00 2001 From: dikshantbhangala Date: Mon, 30 Dec 2024 15:44:53 +0530 Subject: [PATCH 2/2] done --- lib/classes/global.dart | 2 + lib/pages/chat_page.dart | 147 +++++++++++++----------- lib/pages/profile.dart | 4 +- lib/services/communication_service.dart | 32 ++++++ openpeerchat_flutter/MainActivity.kt | 7 -- 5 files changed, 115 insertions(+), 77 deletions(-) delete mode 100644 openpeerchat_flutter/MainActivity.kt diff --git a/lib/classes/global.dart b/lib/classes/global.dart index 6af0a7b..fb4d39f 100644 --- a/lib/classes/global.dart +++ b/lib/classes/global.dart @@ -28,6 +28,8 @@ class Global extends ChangeNotifier { static Map cache = {}; static final GlobalKey scaffoldKey = GlobalKey(); + static var profileNameStream; + void sentToConversations(Msg msg, String converser, {bool addToTable = true}) { diff --git a/lib/pages/chat_page.dart b/lib/pages/chat_page.dart index 33a2518..d2883ad 100644 --- a/lib/pages/chat_page.dart +++ b/lib/pages/chat_page.dart @@ -13,26 +13,31 @@ import '../components/view_file.dart'; import '../encyption/rsa.dart'; class ChatPage extends StatefulWidget { - const ChatPage({Key? key, required this.converser}) : super(key: key); + String converser; + ChatPage({Key? key, required this.converser}) : super(key: key); + - final String converser; @override - ChatPageState createState() => ChatPageState(); + _ChatPageState createState() => _ChatPageState(); } -class ChatPageState extends State { +class _ChatPageState extends State { List messageList = []; TextEditingController myController = TextEditingController(); @override void initState() { super.initState(); - } - - @override - void didChangeDependencies() { - super.didChangeDependencies(); + // Adding listener to listen for profile name updates + Global.profileNameStream.listen((updatedName) { + setState(() { + if (widget.converser == Global.myName) { + // Update the converser name if it matches the updated profile name + widget.converser = updatedName; + } + }); + }); } final ScrollController _scrollController = ScrollController(); @@ -74,72 +79,78 @@ class ChatPageState extends State { Expanded( child: messageList.isEmpty ? const Center( - child: Text('No messages yet'), - ) + child: Text('No messages yet'), + ) : ListView.builder( - controller: _scrollController, - padding: const EdgeInsets.all(8), - itemCount: groupedMessages.keys.length, - itemBuilder: (BuildContext context, int index) { - String date = groupedMessages.keys.elementAt(index); - return Column( - children: [ - Center( - child: Padding( - padding: const EdgeInsets.only(top: 10), - child: Text( - date, - style: const TextStyle(fontWeight: FontWeight.bold), - ), - ), - ), - ...groupedMessages[date]!.map((msg) { - String displayMessage = msg.message; - if (Global.myPrivateKey != null) { - RSAPrivateKey privateKey = Global.myPrivateKey!; - dynamic data = jsonDecode(msg.message); - if (data['type'] == 'text') { - Uint8List encryptedBytes = base64Decode(data['data']); - Uint8List decryptedBytes = rsaDecrypt(privateKey, encryptedBytes); - displayMessage = utf8.decode(decryptedBytes); - } - } + controller: _scrollController, + padding: const EdgeInsets.all(8), + itemCount: groupedMessages.keys.length, + itemBuilder: (BuildContext context, int index) { + String date = groupedMessages.keys.elementAt(index); return Column( - crossAxisAlignment: msg.msgtype == 'sent' ? CrossAxisAlignment.end : CrossAxisAlignment.start, children: [ - Align( - alignment: msg.msgtype == 'sent' ? Alignment.centerRight : Alignment.centerLeft, - child: Bubble( - padding: const BubbleEdges.all(12), - margin: const BubbleEdges.only(top: 10), - //add shadow - style: BubbleStyle( - elevation: 3, - shadowColor: Colors.black.withOpacity(0.5), - ), - // nip: msg.msgtype == 'sent' ? BubbleNip.rightTop : BubbleNip.leftTop, - radius: const Radius.circular(10), - color: msg.msgtype == 'sent' ? const Color(0xffd1c4e9) : const Color(0xff80DEEA), - child: msg.message.contains('file') ? _buildFileBubble(msg) : Text( - displayMessage, - style: const TextStyle(color: Colors.black87), + Center( + child: Padding( + padding: const EdgeInsets.only(top: 10), + child: Text( + date, + style: const TextStyle(fontWeight: FontWeight.bold), ), ), ), - Padding( - padding: const EdgeInsets.only(top: 2, bottom: 10), - child: Text( - dateFormatter(timeStamp: msg.timestamp), - style: const TextStyle(color: Colors.black54, fontSize: 10), - ), - ), + ...groupedMessages[date]!.map((msg) { + String displayMessage = msg.message; + if (Global.myPrivateKey != null) { + RSAPrivateKey privateKey = Global.myPrivateKey!; + dynamic data = jsonDecode(msg.message); + if (data['type'] == 'text') { + Uint8List encryptedBytes = base64Decode(data['data']); + Uint8List decryptedBytes = rsaDecrypt(privateKey, encryptedBytes); + displayMessage = utf8.decode(decryptedBytes); + } + } + return Column( + crossAxisAlignment: msg.msgtype == 'sent' + ? CrossAxisAlignment.end + : CrossAxisAlignment.start, + children: [ + Align( + alignment: msg.msgtype == 'sent' + ? Alignment.centerRight + : Alignment.centerLeft, + child: Bubble( + padding: const BubbleEdges.all(12), + margin: const BubbleEdges.only(top: 10), + style: BubbleStyle( + elevation: 3, + shadowColor: Colors.black.withOpacity(0.5), + ), + radius: const Radius.circular(10), + color: msg.msgtype == 'sent' + ? const Color(0xffd1c4e9) + : const Color(0xff80DEEA), + child: msg.message.contains('file') + ? _buildFileBubble(msg) + : Text( + displayMessage, + style: const TextStyle(color: Colors.black87), + ), + ), + ), + Padding( + padding: const EdgeInsets.only(top: 2, bottom: 10), + child: Text( + dateFormatter(timeStamp: msg.timestamp), + style: const TextStyle(color: Colors.black54, fontSize: 10), + ), + ), + ], + ); + }), ], ); - }), - ], - ); - }, - ), + }, + ), ), MessagePanel(converser: widget.converser), ], @@ -161,7 +172,6 @@ class ChatPageState extends State { color: Colors.black87, ), overflow: TextOverflow.visible, - ), ), IconButton( @@ -180,3 +190,4 @@ String dateFormatter({required String timeStamp}) { String formattedTime = DateFormat('hh:mm aa').format(dateTime); return formattedTime; } + diff --git a/lib/pages/profile.dart b/lib/pages/profile.dart index 6e344e7..1dac65c 100644 --- a/lib/pages/profile.dart +++ b/lib/pages/profile.dart @@ -4,7 +4,7 @@ import 'home_screen.dart'; import 'package:nanoid/nanoid.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../classes/global.dart'; - +import '../services/communication_service.dart'; class Profile extends StatefulWidget { final bool onLogin; @@ -113,7 +113,7 @@ class _ProfileState extends State { // saving the name and id to shared preferences prefs.setString('p_name', myName.text); prefs.setString('p_id', customLengthId); - + CommunicationService.broadcastProfileUpdate(customLengthId, myName.text); // On pressing, move to the home screen navigateToHomeScreen(); }, diff --git a/lib/services/communication_service.dart b/lib/services/communication_service.dart index e69de29..3681a17 100644 --- a/lib/services/communication_service.dart +++ b/lib/services/communication_service.dart @@ -0,0 +1,32 @@ +import 'dart:convert'; +// ignore: depend_on_referenced_packages +import 'package:web_socket_channel/web_socket_channel.dart'; + +class CommunicationService { + static final WebSocketChannel _channel = + WebSocketChannel.connect(Uri.parse('ws://your-websocket-server-url')); + + /// Broadcasts a profile update to all connected peers + static void broadcastProfileUpdate(String userId, String newName) { + final message = { + 'type': 'profile_update', + 'userId': userId, + 'newName': newName, + }; + + _channel.sink.add(jsonEncode(message)); + } + + /// Listens for incoming messages + static void listen(void Function(Map) onMessage) { + _channel.stream.listen((data) { + final decodedData = jsonDecode(data); + onMessage(decodedData); + }); + } + + /// Closes the WebSocket connection + static void closeConnection() { + _channel.sink.close(); + } +} diff --git a/openpeerchat_flutter/MainActivity.kt b/openpeerchat_flutter/MainActivity.kt deleted file mode 100644 index d9d9e99..0000000 --- a/openpeerchat_flutter/MainActivity.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.nankai.openpeerchat_flutter - -import io.flutter.embedding.android.FlutterFragmentActivity - -class MainActivity: FlutterFragmentActivity() { - // ... -} \ No newline at end of file