diff --git a/flutter/android/app/build.gradle b/flutter/android/app/build.gradle index 79bf6426a..a2a1a02a3 100644 --- a/flutter/android/app/build.gradle +++ b/flutter/android/app/build.gradle @@ -32,7 +32,7 @@ apply plugin: 'kotlin-android' apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle" android { - compileSdkVersion 31 + compileSdkVersion 32 sourceSets { main.java.srcDirs += 'src/main/kotlin' } diff --git a/flutter/lib/models/chat_model.dart b/flutter/lib/models/chat_model.dart index eaf8d2243..149b60a46 100644 --- a/flutter/lib/models/chat_model.dart +++ b/flutter/lib/models/chat_model.dart @@ -1,6 +1,6 @@ import 'dart:convert'; -import 'package:dash_chat/dash_chat.dart'; +import 'package:dash_chat_2/dash_chat_2.dart'; import 'package:flutter/material.dart'; import '../widgets/overlay.dart'; @@ -11,8 +11,8 @@ class MessageBody { List chatMessages; MessageBody(this.chatUser, this.chatMessages); - void add(ChatMessage cm) { - this.chatMessages.add(cm); + void insert(ChatMessage cm) { + this.chatMessages.insert(0, cm); } void clear() { @@ -24,19 +24,15 @@ class ChatModel with ChangeNotifier { static final clientModeID = -1; final ChatUser me = ChatUser( - uid: "", - name: "Me", + id: "", + firstName: "Me", ); late final Map _messages = Map() ..[clientModeID] = MessageBody(me, []); - final _scroller = ScrollController(); - var _currentID = clientModeID; - ScrollController get scroller => _scroller; - Map get messages => _messages; int get currentID => _currentID; @@ -62,8 +58,8 @@ class ChatModel with ChangeNotifier { "Failed to changeCurrentID,remote user doesn't exist"); } final chatUser = ChatUser( - uid: client.peerId, - name: client.name, + id: client.peerId, + firstName: client.name, ); _messages[id] = MessageBody(chatUser, []); _currentID = id; @@ -80,48 +76,39 @@ class ChatModel with ChangeNotifier { late final chatUser; if (id == clientModeID) { chatUser = ChatUser( - name: FFI.ffiModel.pi.username, - uid: FFI.getId(), + firstName: FFI.ffiModel.pi.username, + id: FFI.getId(), ); } else { final client = FFI.serverModel.clients[id]; if (client == null) { return debugPrint("Failed to receive msg,user doesn't exist"); } - chatUser = ChatUser(uid: client.peerId, name: client.name); + chatUser = ChatUser(id: client.peerId, firstName: client.name); } if (!_messages.containsKey(id)) { _messages[id] = MessageBody(chatUser, []); } - _messages[id]!.add(ChatMessage(text: text, user: chatUser)); + _messages[id]!.insert( + ChatMessage(text: text, user: chatUser, createdAt: DateTime.now())); _currentID = id; notifyListeners(); - scrollToBottom(); - } - - scrollToBottom() { - Future.delayed(Duration(milliseconds: 500), () { - _scroller.animateTo(_scroller.position.maxScrollExtent, - duration: Duration(milliseconds: 200), - curve: Curves.fastLinearToSlowEaseIn); - }); } send(ChatMessage message) { - if (message.text != null && message.text!.isNotEmpty) { - _messages[_currentID]?.add(message); + if (message.text.isNotEmpty) { + _messages[_currentID]?.insert(message); if (_currentID == clientModeID) { - FFI.setByName("chat_client_mode", message.text!); + FFI.setByName("chat_client_mode", message.text); } else { final msg = Map() ..["id"] = _currentID - ..["text"] = message.text!; + ..["text"] = message.text; FFI.setByName("chat_server_mode", jsonEncode(msg)); } } notifyListeners(); - scrollToBottom(); } close() { diff --git a/flutter/lib/pages/chat_page.dart b/flutter/lib/pages/chat_page.dart index 527f2a8c6..ce139d062 100644 --- a/flutter/lib/pages/chat_page.dart +++ b/flutter/lib/pages/chat_page.dart @@ -1,4 +1,4 @@ -import 'package:dash_chat/dash_chat.dart'; +import 'package:dash_chat_2/dash_chat_2.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hbb/common.dart'; import 'package:flutter_hbb/models/chat_model.dart'; @@ -23,7 +23,7 @@ class ChatPage extends StatelessWidget implements PageShape { final id = entry.key; final user = entry.value.chatUser; return PopupMenuItem( - child: Text("${user.name} ${user.uid}"), + child: Text("${user.firstName} ${user.id}"), value: id, ); }).toList(); @@ -44,19 +44,24 @@ class ChatPage extends StatelessWidget implements PageShape { return Stack( children: [ DashChat( - inputContainerStyle: BoxDecoration(color: Colors.white70), - sendOnEnter: false, - // if true,reload keyboard everytime,need fix onSend: (chatMsg) { chatModel.send(chatMsg); }, - user: chatModel.me, + currentUser: chatModel.me, messages: chatModel.messages[chatModel.currentID]?.chatMessages ?? [], - // default scrollToBottom has bug https://github.com/fayeed/dash_chat/issues/53 - scrollToBottom: false, - scrollController: chatModel.scroller, + messageOptions: MessageOptions( + showOtherUsersAvatar: false, + showTime: true, + messageDecorationBuilder: (_, __, ___) => + defaultMessageDecoration( + color: MyTheme.accent80, + borderTopLeft: 8, + borderTopRight: 8, + borderBottomRight: 8, + borderBottomLeft: 8, + )), ), chatModel.currentID == ChatModel.clientModeID ? SizedBox.shrink() @@ -68,7 +73,7 @@ class ChatPage extends StatelessWidget implements PageShape { color: MyTheme.accent80), SizedBox(width: 5), Text( - "${currentUser.name ?? ""} ${currentUser.uid ?? ""}", + "${currentUser.firstName} ${currentUser.id}", style: TextStyle(color: MyTheme.accent50), ), ], diff --git a/flutter/pubspec.lock b/flutter/pubspec.lock index a1db4ba6c..ec709b959 100644 --- a/flutter/pubspec.lock +++ b/flutter/pubspec.lock @@ -29,6 +29,27 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.0" + cached_network_image: + dependency: transitive + description: + name: cached_network_image + url: "https://pub.dartlang.org" + source: hosted + version: "3.2.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.1" characters: dependency: transitive description: @@ -71,6 +92,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.2" + csslib: + dependency: transitive + description: + name: csslib + url: "https://pub.dartlang.org" + source: hosted + version: "0.17.2" cupertino_icons: dependency: "direct main" description: @@ -78,13 +106,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.4" - dash_chat: + dash_chat_2: dependency: "direct main" description: - name: dash_chat + name: dash_chat_2 url: "https://pub.dartlang.org" source: hosted - version: "1.1.16" + version: "0.0.12" device_info: dependency: "direct main" description: @@ -195,6 +223,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_blurhash: + dependency: transitive + description: + name: flutter_blurhash + url: "https://pub.dartlang.org" + source: hosted + version: "0.7.0" flutter_breadcrumb: dependency: "direct main" description: @@ -202,6 +237,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.1" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + url: "https://pub.dartlang.org" + source: hosted + version: "3.3.0" flutter_launcher_icons: dependency: "direct dev" description: @@ -247,6 +289,13 @@ packages: description: flutter source: sdk version: "0.0.0" + html: + dependency: transitive + description: + name: html + url: "https://pub.dartlang.org" + source: hosted + version: "0.15.0" http: dependency: "direct main" description: @@ -345,6 +394,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.0.0" + octo_image: + dependency: transitive + description: + name: octo_image + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.2" package_info: dependency: "direct main" description: @@ -449,16 +505,14 @@ packages: name: provider url: "https://pub.dartlang.org" source: hosted - version: "5.0.0" + version: "6.0.3" qr_code_scanner: dependency: "direct main" description: - path: "." - ref: fix_break_changes_platform - resolved-ref: "0feca6f15042c279ff575c559a3430df917b623d" - url: "https://github.com/Heap-Hop/qr_code_scanner.git" - source: git - version: "0.7.0" + name: qr_code_scanner + url: "https://pub.dartlang.org" + source: hosted + version: "1.0.0" quiver: dependency: transitive description: @@ -466,6 +520,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.1.0" + rxdart: + dependency: transitive + description: + name: rxdart + url: "https://pub.dartlang.org" + source: hosted + version: "0.27.5" settings_ui: dependency: "direct main" description: @@ -541,6 +602,20 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.8.2" + sqflite: + dependency: transitive + description: + name: sqflite + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.3" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + url: "https://pub.dartlang.org" + source: hosted + version: "2.2.1+1" stack_trace: dependency: transitive description: @@ -562,6 +637,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.1.0" + synchronized: + dependency: transitive + description: + name: synchronized + url: "https://pub.dartlang.org" + source: hosted + version: "3.0.0+2" term_glyph: dependency: transitive description: @@ -583,13 +665,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "1.4.0" - transparent_image: - dependency: transitive - description: - name: transparent_image - url: "https://pub.dartlang.org" - source: hosted - version: "2.0.0" tuple: dependency: "direct main" description: @@ -674,6 +749,41 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.1.2" + video_player: + dependency: transitive + description: + name: video_player + url: "https://pub.dartlang.org" + source: hosted + version: "2.4.5" + video_player_android: + dependency: transitive + description: + name: video_player_android + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.8" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + url: "https://pub.dartlang.org" + source: hosted + version: "2.3.5" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + url: "https://pub.dartlang.org" + source: hosted + version: "5.1.3" + video_player_web: + dependency: transitive + description: + name: video_player_web + url: "https://pub.dartlang.org" + source: hosted + version: "2.0.12" wakelock: dependency: "direct main" description: @@ -745,5 +855,5 @@ packages: source: hosted version: "0.1.0" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=2.17.0 <3.0.0" flutter: ">=3.0.0" diff --git a/flutter/pubspec.yaml b/flutter/pubspec.yaml index fc01b3c83..2ee7ec1ac 100644 --- a/flutter/pubspec.yaml +++ b/flutter/pubspec.yaml @@ -32,7 +32,7 @@ dependencies: ffi: ^1.1.2 path_provider: ^2.0.2 external_path: ^1.0.1 - provider: ^5.0.0 + provider: ^6.0.3 tuple: ^2.0.0 wakelock: ^0.5.2 device_info: ^2.0.2 @@ -41,15 +41,12 @@ dependencies: url_launcher: ^6.0.9 shared_preferences: ^2.0.6 toggle_switch: ^1.4.0 - dash_chat: ^1.1.16 + dash_chat_2: ^0.0.12 draggable_float_widget: ^0.0.2 settings_ui: ^2.0.2 flutter_breadcrumb: ^1.0.1 http: ^0.13.4 - qr_code_scanner: - git: - url: https://github.com/Heap-Hop/qr_code_scanner.git - ref: fix_break_changes_platform + qr_code_scanner: ^1.0.0 zxing2: ^0.1.0 image_picker: ^0.8.5 image: ^3.1.3