diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index fb5535b..28599f2 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -41,4 +41,5 @@ + diff --git a/lib/apps/assistant/message.dart b/lib/apps/assistant/message.dart index d00b11d..fe2d943 100644 --- a/lib/apps/assistant/message.dart +++ b/lib/apps/assistant/message.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'package:image_save/image_save.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:open_file/open_file.dart'; @@ -69,8 +69,12 @@ class AssistantMessage extends StatelessWidget { ].request(); if (statuses[Permission.storage] == PermissionStatus.granted) { - final result = await ImageGallerySaver.saveFile(imagePath); - print(result); + + // Save to album. + final data = await File(imagePath).readAsBytes(); + final bool? success = await ImageSave.saveImage(data, content, albumName: "ESSE"); + print(success); + Navigator.pop(context); } }, diff --git a/lib/apps/assistant/page.dart b/lib/apps/assistant/page.dart index 14f267f..92f1a31 100644 --- a/lib/apps/assistant/page.dart +++ b/lib/apps/assistant/page.dart @@ -162,7 +162,7 @@ class _AssistantDetailState extends State { child: Column( children: [ Container( - padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 10.0), + padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 6.0), child: Row( children: [ if (!isDesktop) @@ -183,9 +183,9 @@ class _AssistantDetailState extends State { Text('Jarvis', style: TextStyle(fontWeight: FontWeight.bold), ), - SizedBox(height: 6.0), + SizedBox(height: 5.0), Text(lang.onlineActive, - style: TextStyle(color: color.onPrimary.withOpacity(0.5), fontSize: 14.0)) + style: TextStyle(color: color.onPrimary.withOpacity(0.5), fontSize: 12.0)) ], ), ), diff --git a/lib/apps/chat/detail.dart b/lib/apps/chat/detail.dart index c1d171a..3bc90ef 100644 --- a/lib/apps/chat/detail.dart +++ b/lib/apps/chat/detail.dart @@ -178,7 +178,7 @@ class _ChatDetailState extends State { child: Column( children: [ Container( - padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 10.0), + padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 6.0), child: Row( children: [ if (!isDesktop) @@ -201,13 +201,13 @@ class _ChatDetailState extends State { friend.name, style: TextStyle(fontWeight: FontWeight.bold), ), - SizedBox(height: 6.0), + SizedBox(height: 5.0), Text(friend.isClosed ? lang.closed : session.onlineLang(lang), style: TextStyle( color: color.onPrimary.withOpacity(0.5), - fontSize: 14.0)) + fontSize: 12.0)) ], ), ), diff --git a/lib/apps/file/list.dart b/lib/apps/file/list.dart index e2974a7..24231cb 100644 --- a/lib/apps/file/list.dart +++ b/lib/apps/file/list.dart @@ -16,7 +16,6 @@ class FilesList extends StatefulWidget { const List FILE_DIRECTORY = [ ["Starred", Icons.star], ["Documents", Icons.description], - ["Pictures", Icons.photo], ["Media", Icons.music_video], ["Trash", Icons.auto_delete], ]; diff --git a/lib/apps/group_chat/detail.dart b/lib/apps/group_chat/detail.dart index 5ddf9e1..4565355 100644 --- a/lib/apps/group_chat/detail.dart +++ b/lib/apps/group_chat/detail.dart @@ -183,7 +183,7 @@ class _GroupChatDetailState extends State { child: Column( children: [ Container( - padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 10.0), + padding: EdgeInsets.only(left: 20.0, right: 20.0, top: 10.0, bottom: 6.0), child: Row( children: [ if (!isDesktop) @@ -206,13 +206,13 @@ class _GroupChatDetailState extends State { this.group!.name, style: TextStyle(fontWeight: FontWeight.bold), ), - const SizedBox(height: 6.0), + const SizedBox(height: 5.0), Text(this.group!.isClosed ? lang.closed : session.onlineLang(lang), style: TextStyle( color: color.onPrimary.withOpacity(0.5), - fontSize: 14.0)) + fontSize: 12.0)) ], ), ), diff --git a/lib/provider.dart b/lib/provider.dart index 9240220..f2925e9 100644 --- a/lib/provider.dart +++ b/lib/provider.dart @@ -61,8 +61,6 @@ class AccountProvider extends ChangeNotifier { rpc.addListener('session-connect', _sessionConnect, false); rpc.addListener('session-suspend', _sessionSuspend, false); rpc.addListener('session-lost', _sessionLost, false); - - systemInfo(); } /// when security load accounts from rpc. @@ -99,11 +97,7 @@ class AccountProvider extends ChangeNotifier { this.activedAccountId = account.gid; this.accounts[account.gid] = account; - rpc.send('account-login', [account.gid, account.lock]); rpc.send('session-list', []); - - new Future.delayed(Duration(seconds: DEFAULT_ONLINE_DELAY), - () => rpc.send('account-online', [account.gid])); updateLogined(account); } @@ -122,7 +116,6 @@ class AccountProvider extends ChangeNotifier { if (!this.activedAccount.online) { this.activedAccount.online = true; - rpc.send('account-login', [gid, this.activedAccount.lock]); new Future.delayed(Duration(seconds: DEFAULT_ONLINE_DELAY), () => rpc.send('account-online', [gid])); } @@ -190,10 +183,6 @@ class AccountProvider extends ChangeNotifier { notifyListeners(); } - systemInfo() { - rpc.send('account-system-info', []); - } - clearActivedSession(SessionType type) { if (this.actived > 0 && this.activedSession.type == type) { rpc.send('session-suspend', [this.actived, this.activedSession.gid, diff --git a/lib/security.dart b/lib/security.dart index 31ae3f6..faac3be 100644 --- a/lib/security.dart +++ b/lib/security.dart @@ -149,6 +149,9 @@ class _SecurityPageState extends State { await rpc.init(Global.wsRpc); } + // init system info. + rpc.send('account-system-info', []); + // check if has logined. final loginedAccounts = await getLogined(); @@ -173,6 +176,7 @@ class _SecurityPageState extends State { } else { // TODO tostor error print(res.error); + await clearLogined(); } } diff --git a/lib/widgets/chat_message.dart b/lib/widgets/chat_message.dart index 4a4206c..6f4e112 100644 --- a/lib/widgets/chat_message.dart +++ b/lib/widgets/chat_message.dart @@ -1,7 +1,7 @@ import 'dart:io'; import 'package:flutter/material.dart'; -import 'package:image_gallery_saver/image_gallery_saver.dart'; +import 'package:image_save/image_save.dart'; import 'package:provider/provider.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:open_file/open_file.dart'; @@ -98,8 +98,12 @@ class ChatMessage extends StatelessWidget { ].request(); if (statuses[Permission.storage] == PermissionStatus.granted) { - final result = await ImageGallerySaver.saveFile(imagePath); - print(result); + + // Save to album. + final data = await File(imagePath).readAsBytes(); + final bool? success = await ImageSave.saveImage(data, message.content, albumName: "ESSE"); + print(success); + Navigator.pop(context); } }, diff --git a/pubspec.lock b/pubspec.lock index 3acbc3b..18e5088 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -303,13 +303,6 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "3.0.2" - image_gallery_saver: - dependency: "direct main" - description: - name: image_gallery_saver - url: "https://pub.dartlang.org" - source: hosted - version: "1.6.9" image_picker: dependency: "direct main" description: @@ -331,6 +324,13 @@ packages: url: "https://pub.dartlang.org" source: hosted version: "2.3.0" + image_save: + dependency: "direct main" + description: + name: image_save + url: "https://pub.dartlang.org" + source: hosted + version: "5.0.0" integration_test: dependency: "direct dev" description: flutter diff --git a/pubspec.yaml b/pubspec.yaml index 8e4b9bc..48c6ea4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,7 +23,7 @@ dependencies: url_launcher: any permission_handler: any image_picker: any # pick image - image_gallery_saver: any # Mobile save image to gallery + image_save: any # Mobile save image to gallery file_picker: any # pick file file_selector: any # pick file file_selector_linux: diff --git a/src/apps/group_chat/models.rs b/src/apps/group_chat/models.rs index e28a39b..a4786c9 100644 --- a/src/apps/group_chat/models.rs +++ b/src/apps/group_chat/models.rs @@ -342,7 +342,7 @@ impl GroupChat { if unique_check.len() > 0 { let id = unique_check.pop().unwrap().pop().unwrap().as_i64(); self.id = id; - let sql = format!("UPDATE groups SET height = {}, owner = '{}', gtype = {}, addr='{}', name = '{}', bio = '{}', is_ok = {}, is_need_agree = {}, is_closed = {}, key = '{}', datetime = {},is_remote = {}, is_deleted = false WHERE id = {}", + let sql = format!("UPDATE groups SET height = {}, owner = '{}', gtype = {}, addr='{}', name = '{}', bio = '{}', is_ok = {}, is_need_agree = {}, is_closed = {}, key = '{}', datetime = {}, is_remote = {}, is_deleted = false WHERE id = {}", self.height, self.owner.to_hex(), self.g_type.to_u32(), @@ -359,7 +359,7 @@ impl GroupChat { ); db.update(&sql)?; } else { - let sql = format!("INSERT INTO groups (height, owner, gcd, gtype, addr, name, bio, is_ok, is_need_agree, is_closed, key, datetime, is_deleted) VALUES ({}, '{}', '{}', {}, '{}', '{}', '{}', {}, {}, {}, '{}', {}, {}, false)", + let sql = format!("INSERT INTO groups (height, owner, gcd, gtype, addr, name, bio, is_ok, is_need_agree, is_closed, key, datetime, is_remote, is_deleted) VALUES ({}, '{}', '{}', {}, '{}', '{}', '{}', {}, {}, {}, '{}', {}, {}, false)", self.height, self.owner.to_hex(), self.g_id.to_hex(), diff --git a/src/apps/group_chat/rpc.rs b/src/apps/group_chat/rpc.rs index 9e224ce..936e3a4 100644 --- a/src/apps/group_chat/rpc.rs +++ b/src/apps/group_chat/rpc.rs @@ -1,7 +1,7 @@ use std::sync::Arc; use tdn::types::{ group::GroupId, - message::SendType, + message::{NetworkType, SendType}, primitive::{HandleResult, PeerAddr}, rpc::{json, rpc_response, RpcError, RpcHandler, RpcParam}, }; @@ -179,6 +179,7 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { GroupLocation::from_u32(params[0].as_i64().ok_or(RpcError::ParseError)? as u32); let gtype = GroupType::from_u32(params[1].as_i64().ok_or(RpcError::ParseError)? as u32); let my_name = params[2].as_str().ok_or(RpcError::ParseError)?.to_owned(); + // params[3] is remote addr next parse. let name = params[4].as_str().ok_or(RpcError::ParseError)?.to_owned(); let bio = params[5].as_str().ok_or(RpcError::ParseError)?.to_owned(); let need_agree = params[6].as_bool().ok_or(RpcError::ParseError)?; @@ -204,6 +205,8 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { glocation == GroupLocation::Remote, ); let gcd = gc.g_id; + let gdid = gc.id; + let gheight = gc.height; // save db let me = state.group.read().await.clone_user(&gid)?; @@ -231,6 +234,14 @@ pub(crate) fn new_rpc_handler(handler: &mut RpcHandler) { let mut session = gc.to_session(); session.insert(&s_db)?; results.rpcs.push(session_create(gid, &session)); + + // online local group. + state + .layer + .write() + .await + .add_running(&gcd, gid, gdid, gheight)?; + results.networks.push(NetworkType::AddGroup(gcd)); } Ok(results) diff --git a/src/rpc.rs b/src/rpc.rs index 064d564..3058f7a 100644 --- a/src/rpc.rs +++ b/src/rpc.rs @@ -266,6 +266,8 @@ fn new_rpc_handler( let mut results = HandleResult::rpc(json!(vec![gid.to_hex()])); results.networks.push(NetworkType::AddGroup(gid)); // add AddGroup to TDN. + debug!("Account Logined: {}.", gid.to_hex()); + Ok(results) }, ); @@ -292,6 +294,8 @@ fn new_rpc_handler( let mut results = HandleResult::rpc(json!(vec![gid.to_hex()])); results.networks.push(NetworkType::AddGroup(gid)); // add AddGroup to TDN. + debug!("Account Logined: {}.", gid.to_hex()); + if let Some(addr) = some_addr { let group_lock = state.group.read().await; let sender = group_lock.sender();