From fdb53454122026266c7cac9b6a5ccb5f90f70d8c Mon Sep 17 00:00:00 2001 From: Christian Pauly Date: Sat, 18 Sep 2021 11:24:21 +0200 Subject: [PATCH] feat: Allow loading of multiple clients in main.dart --- lib/main.dart | 29 +++++---------------- lib/utils/client_manager.dart | 48 +++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 23 deletions(-) create mode 100644 lib/utils/client_manager.dart diff --git a/lib/main.dart b/lib/main.dart index 0177df27..90af2838 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -2,7 +2,7 @@ import 'dart:async'; import 'package:adaptive_theme/adaptive_theme.dart'; -import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:fluffychat/utils/client_manager.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/routes.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -18,7 +18,6 @@ import 'package:future_loading_dialog/future_loading_dialog.dart'; import 'package:universal_html/html.dart' as html; import 'package:vrouter/vrouter.dart'; -import 'utils/matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart'; import 'widgets/layouts/wait_for_login.dart'; import 'widgets/lock_screen.dart'; import 'widgets/matrix.dart'; @@ -35,27 +34,10 @@ void main() async { FlutterError.onError = (FlutterErrorDetails details) => Zone.current.handleUncaughtError(details.exception, details.stack); - final client = Client( - PlatformInfos.clientName, - enableE2eeRecovery: true, - verificationMethods: { - KeyVerificationMethod.numbers, - if (PlatformInfos.isMobile || PlatformInfos.isLinux) - KeyVerificationMethod.emoji, - }, - importantStateEvents: { - 'im.ponies.room_emotes', // we want emotes to work properly - }, - databaseBuilder: FlutterMatrixHiveStore.hiveDatabaseBuilder, - supportedLoginTypes: { - AuthenticationTypes.password, - if (PlatformInfos.isMobile || PlatformInfos.isWeb) AuthenticationTypes.sso - }, - compute: compute, - ); + final clients = await ClientManager.getClients(); if (PlatformInfos.isMobile) { - BackgroundPush.clientOnly(client); + BackgroundPush.clientOnly(clients.first); } final queryParameters = {}; @@ -68,13 +50,14 @@ void main() async { () => runApp(PlatformInfos.isMobile ? AppLock( builder: (args) => FluffyChatApp( - client: client, + client: clients.first, queryParameters: queryParameters, ), lockScreen: LockScreen(), enabled: false, ) - : FluffyChatApp(client: client, queryParameters: queryParameters)), + : FluffyChatApp( + client: clients.first, queryParameters: queryParameters)), SentryController.captureException, ); } diff --git a/lib/utils/client_manager.dart b/lib/utils/client_manager.dart new file mode 100644 index 00000000..9d0c5acf --- /dev/null +++ b/lib/utils/client_manager.dart @@ -0,0 +1,48 @@ +import 'dart:convert'; + +import 'package:fluffychat/utils/platform_infos.dart'; +import 'package:flutter/foundation.dart'; +import 'package:matrix/encryption/utils/key_verification.dart'; +import 'package:matrix/matrix.dart'; + +import 'famedlysdk_store.dart'; +import 'matrix_sdk_extensions.dart/flutter_matrix_hive_database.dart'; + +abstract class ClientManager { + static const String clientNamespace = 'im.fluffychat.store.clients'; + static Future> getClients() async { + final store = Store(); + final clientNames = {PlatformInfos.clientName}; + try { + final rawClientNames = await store.getItem(clientNamespace); + if (rawClientNames != null) { + final clientNamesList = + (jsonDecode(rawClientNames) as List).cast(); + clientNames.addAll(clientNamesList); + } + } catch (e, s) { + Logs().w('Client names in store are corrupted', e, s); + } + return clientNames + .map((clientName) => Client( + clientName, + enableE2eeRecovery: true, + verificationMethods: { + KeyVerificationMethod.numbers, + if (PlatformInfos.isMobile || PlatformInfos.isLinux) + KeyVerificationMethod.emoji, + }, + importantStateEvents: { + 'im.ponies.room_emotes', // we want emotes to work properly + }, + databaseBuilder: FlutterMatrixHiveStore.hiveDatabaseBuilder, + supportedLoginTypes: { + AuthenticationTypes.password, + if (PlatformInfos.isMobile || PlatformInfos.isWeb) + AuthenticationTypes.sso + }, + compute: compute, + )) + .toList(); + } +}