diff --git a/lib/data/datasource/federation_configurations_datasource.dart b/lib/data/datasource/federation_configurations_datasource.dart new file mode 100644 index 0000000000..9f381a3716 --- /dev/null +++ b/lib/data/datasource/federation_configurations_datasource.dart @@ -0,0 +1,12 @@ +import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; + +abstract class FederationConfigurationsDatasource { + Future getFederationConfigurations(String userId); + + Future saveFederationConfigurations( + String userId, + FederationConfigurations federationConfiguration, + ); + + Future deleteFederationConfigurations(String userId); +} diff --git a/lib/data/datasource_impl/federation_configurations_datasource_impl.dart b/lib/data/datasource_impl/federation_configurations_datasource_impl.dart new file mode 100644 index 0000000000..c8daee8b83 --- /dev/null +++ b/lib/data/datasource_impl/federation_configurations_datasource_impl.dart @@ -0,0 +1,68 @@ +import 'package:fluffychat/data/datasource/federation_configurations_datasource.dart'; +import 'package:fluffychat/data/hive/dto/federation_configurations_hive_obj.dart'; +import 'package:fluffychat/data/hive/hive_collection_tom_database.dart'; +import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; +import 'package:fluffychat/di/global/get_it_initializer.dart'; +import 'package:fluffychat/domain/exception/federation_configuration_not_found.dart'; +import 'package:matrix/matrix.dart'; + +class HiveFederationConfigurationsDatasourceImpl + implements FederationConfigurationsDatasource { + @override + Future getFederationConfigurations( + String userId, + ) async { + final hiveCollectionFederationDatabase = + await getIt.getAsync(); + final cachedFederationConfigurations = + await hiveCollectionFederationDatabase.federationConfigurationsBox + .get(userId); + if (cachedFederationConfigurations != null) { + final federationConfigurationsHiveObj = + FederationConfigurationsHiveObj.fromJson( + copyMap( + cachedFederationConfigurations, + ), + ); + + return FederationConfigurations( + fedServerInformation: federationConfigurationsHiveObj + .federationServerInformation + .toFederationServerInformation(), + identityServerInformation: + federationConfigurationsHiveObj.identityServerUrl != null + ? IdentityServerInformation( + baseUrl: Uri.parse( + federationConfigurationsHiveObj.identityServerUrl!, + ), + ) + : null, + ); + } + throw FederationConfigurationNotFound(); + } + + @override + Future saveFederationConfigurations( + String userId, + FederationConfigurations federationConfiguration, + ) async { + final hiveCollectionFederationDatabase = + await getIt.getAsync(); + return hiveCollectionFederationDatabase.federationConfigurationsBox.put( + userId, + FederationConfigurationsHiveObj.fromFederationConfigurations( + federationConfiguration, + ).toJson(), + ); + } + + @override + Future deleteFederationConfigurations(String userId) async { + final hiveCollectionFederationDatabase = + getIt.get(); + return hiveCollectionFederationDatabase.federationConfigurationsBox.delete( + userId, + ); + } +} diff --git a/lib/data/hive/dto/federation_configurations_hive_obj.dart b/lib/data/hive/dto/federation_configurations_hive_obj.dart new file mode 100644 index 0000000000..6655773662 --- /dev/null +++ b/lib/data/hive/dto/federation_configurations_hive_obj.dart @@ -0,0 +1,44 @@ +import 'package:equatable/equatable.dart'; +import 'package:fluffychat/data/hive/dto/federation_server_information_hive_obj.dart'; +import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'federation_configurations_hive_obj.g.dart'; + +@JsonSerializable(explicitToJson: true) +class FederationConfigurationsHiveObj with EquatableMixin { + final FederationServerInformationHiveObj federationServerInformation; + + final String? identityServerUrl; + + FederationConfigurationsHiveObj({ + required this.federationServerInformation, + required this.identityServerUrl, + }); + + factory FederationConfigurationsHiveObj.fromFederationConfigurations( + FederationConfigurations federationConfigurations, + ) { + return FederationConfigurationsHiveObj( + federationServerInformation: + FederationServerInformationHiveObj.fromFederationServerInformation( + federationConfigurations.fedServerInformation, + ), + identityServerUrl: federationConfigurations + .identityServerInformation?.baseUrl + .toString(), + ); + } + + factory FederationConfigurationsHiveObj.fromJson(Map json) => + _$FederationConfigurationsHiveObjFromJson(json); + + Map toJson() => + _$FederationConfigurationsHiveObjToJson(this); + + @override + List get props => [ + federationServerInformation, + identityServerUrl, + ]; +} diff --git a/lib/data/hive/dto/federation_server_information_hive_obj.dart b/lib/data/hive/dto/federation_server_information_hive_obj.dart new file mode 100644 index 0000000000..cec0eecebb --- /dev/null +++ b/lib/data/hive/dto/federation_server_information_hive_obj.dart @@ -0,0 +1,40 @@ +import 'package:equatable/equatable.dart'; +import 'package:fluffychat/data/model/federation_server/federation_server_information.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'federation_server_information_hive_obj.g.dart'; + +@JsonSerializable(explicitToJson: true) +class FederationServerInformationHiveObj with EquatableMixin { + final List? baseUrls; + + FederationServerInformationHiveObj({ + required this.baseUrls, + }); + + factory FederationServerInformationHiveObj.fromJson( + Map json, + ) => + _$FederationServerInformationHiveObjFromJson(json); + + Map toJson() => + _$FederationServerInformationHiveObjToJson(this); + + FederationServerInformation toFederationServerInformation() { + return FederationServerInformation( + baseUrls: baseUrls?.map((e) => Uri.parse(e)).toList(), + ); + } + + factory FederationServerInformationHiveObj.fromFederationServerInformation( + FederationServerInformation fedServerInformation, + ) { + return FederationServerInformationHiveObj( + baseUrls: + fedServerInformation.baseUrls?.map((e) => e.toString()).toList(), + ); + } + + @override + List get props => [baseUrls]; +} diff --git a/lib/data/hive/hive_collection_tom_database.dart b/lib/data/hive/hive_collection_tom_database.dart index c60c79c703..42c7001aa8 100644 --- a/lib/data/hive/hive_collection_tom_database.dart +++ b/lib/data/hive/hive_collection_tom_database.dart @@ -18,8 +18,13 @@ class HiveCollectionToMDatabase { late BoxCollection _collection; String get _tomConfigurationsBoxName => 'tom_configurations_box'; + + String get _federationConfigurationsBoxName => + 'federation_configurations_box'; late CollectionBox tomConfigurationsBox; + late CollectionBox federationConfigurationsBox; + HiveCollectionToMDatabase(this.name, this.path, {this.key}); static Future databaseBuilder() async { @@ -114,7 +119,10 @@ class HiveCollectionToMDatabase { Future open() async { _collection = await BoxCollection.open( name, - {_tomConfigurationsBoxName}, + { + _tomConfigurationsBoxName, + _federationConfigurationsBoxName, + }, path: path, key: key, ); @@ -122,6 +130,10 @@ class HiveCollectionToMDatabase { _tomConfigurationsBoxName, preload: true, ); + federationConfigurationsBox = await _collection.openBox( + _federationConfigurationsBoxName, + preload: true, + ); } Future clear() async { diff --git a/lib/data/model/federation_server/federation_configuration.dart b/lib/data/model/federation_server/federation_configuration.dart new file mode 100644 index 0000000000..dfa8604c78 --- /dev/null +++ b/lib/data/model/federation_server/federation_configuration.dart @@ -0,0 +1,19 @@ +import 'package:equatable/equatable.dart'; +import 'package:fluffychat/data/model/federation_server/federation_server_information.dart'; +import 'package:matrix/matrix.dart'; + +class FederationConfigurations with EquatableMixin { + final FederationServerInformation fedServerInformation; + final IdentityServerInformation? identityServerInformation; + + FederationConfigurations({ + required this.fedServerInformation, + this.identityServerInformation, + }); + + @override + List get props => [ + fedServerInformation, + identityServerInformation, + ]; +} diff --git a/lib/data/model/federation_server/federation_server_information.dart b/lib/data/model/federation_server/federation_server_information.dart new file mode 100644 index 0000000000..ef5282b83d --- /dev/null +++ b/lib/data/model/federation_server/federation_server_information.dart @@ -0,0 +1,24 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'federation_server_information.g.dart'; + +@JsonSerializable() +class FederationServerInformation with EquatableMixin { + static const String fedServerKey = 'm.federated_identity_services'; + + @JsonKey(name: 'base_urls') + final List? baseUrls; + + FederationServerInformation({ + this.baseUrls, + }); + + factory FederationServerInformation.fromJson(Map json) => + _$FederationServerInformationFromJson(json); + + Map toJson() => _$FederationServerInformationToJson(this); + + @override + List get props => [baseUrls]; +} diff --git a/lib/data/model/user/fed_token_information.dart b/lib/data/model/user/fed_token_information.dart new file mode 100644 index 0000000000..5cd120b3d1 --- /dev/null +++ b/lib/data/model/user/fed_token_information.dart @@ -0,0 +1,36 @@ +import 'package:equatable/equatable.dart'; +import 'package:json_annotation/json_annotation.dart'; + +part 'fed_token_information.g.dart'; + +@JsonSerializable() +class FedTokenInformation with EquatableMixin { + @JsonKey(name: 'access_token') + final String? fedAccessToken; + @JsonKey(name: 'token_type') + final String? fedTokenType; + @JsonKey(name: 'matrix_server_name') + final String? matrixServerName; + @JsonKey(name: 'expires_in') + final int? fedTokenExpiresIn; + + FedTokenInformation({ + this.fedAccessToken, + this.fedTokenType, + this.matrixServerName, + this.fedTokenExpiresIn, + }); + + factory FedTokenInformation.fromJson(Map json) => + _$FedTokenInformationFromJson(json); + + Map toJson() => _$FedTokenInformationToJson(this); + + @override + List get props => [ + fedAccessToken, + fedTokenType, + matrixServerName, + fedTokenExpiresIn, + ]; +} diff --git a/lib/data/repository/federation_configurations_repository_impl.dart b/lib/data/repository/federation_configurations_repository_impl.dart new file mode 100644 index 0000000000..c34825f446 --- /dev/null +++ b/lib/data/repository/federation_configurations_repository_impl.dart @@ -0,0 +1,34 @@ +import 'package:fluffychat/data/datasource/federation_configurations_datasource.dart'; +import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; +import 'package:fluffychat/di/global/get_it_initializer.dart'; +import 'package:fluffychat/domain/repository/federation_configurations_repository.dart'; + +class FederationConfigurationsRepositoryImpl + implements FederationConfigurationsRepository { + final FederationConfigurationsDatasource federationConfigurationsDatasource = + getIt.get(); + + @override + Future getFederationConfigurations(String userId) { + return federationConfigurationsDatasource + .getFederationConfigurations(userId); + } + + @override + Future saveFederationConfigurations( + String userId, + FederationConfigurations federationConfigurations, + ) { + return federationConfigurationsDatasource.saveFederationConfigurations( + userId, + federationConfigurations, + ); + } + + @override + Future deleteFederationConfigurations(String userId) { + return federationConfigurationsDatasource.deleteFederationConfigurations( + userId, + ); + } +} diff --git a/lib/di/global/get_it_initializer.dart b/lib/di/global/get_it_initializer.dart index 763604cd6b..9f5862f257 100644 --- a/lib/di/global/get_it_initializer.dart +++ b/lib/di/global/get_it_initializer.dart @@ -1,6 +1,7 @@ import 'dart:collection'; import 'package:fluffychat/config/app_grid_config/app_config_loader.dart'; +import 'package:fluffychat/data/datasource/federation_configurations_datasource.dart'; import 'package:fluffychat/data/datasource/localizations/localizations_datasource.dart'; import 'package:fluffychat/data/datasource/lookup_datasource.dart'; import 'package:fluffychat/data/datasource/media/media_data_source.dart'; @@ -14,6 +15,7 @@ import 'package:fluffychat/data/datasource/tom_contacts_datasource.dart'; import 'package:fluffychat/data/datasource_impl/contact/lookup_datasource_impl.dart'; import 'package:fluffychat/data/datasource_impl/contact/phonebook_contact_datasource_impl.dart'; import 'package:fluffychat/data/datasource_impl/contact/tom_contacts_datasource_impl.dart'; +import 'package:fluffychat/data/datasource_impl/federation_configurations_datasource_impl.dart'; import 'package:fluffychat/data/datasource_impl/localizations/localizations_datasource_impl.dart'; import 'package:fluffychat/data/datasource_impl/media/media_data_source_impl.dart'; import 'package:fluffychat/data/datasource_impl/multiple_account/multiple_account_datasource_impl.dart'; @@ -33,6 +35,7 @@ import 'package:fluffychat/data/network/server_config_api.dart'; import 'package:fluffychat/data/repository/contact/lookup_repository_impl.dart'; import 'package:fluffychat/data/repository/contact/phonebook_contact_repository_impl.dart'; import 'package:fluffychat/data/repository/contact/tom_contact_repository_impl.dart'; +import 'package:fluffychat/data/repository/federation_configurations_repository_impl.dart'; import 'package:fluffychat/data/repository/localizations/localizations_repository_impl.dart'; import 'package:fluffychat/data/repository/media/media_repository_impl.dart'; import 'package:fluffychat/data/repository/multiple_account/multiple_account_repository_impl.dart'; @@ -45,6 +48,7 @@ import 'package:fluffychat/di/global/network_connectivity_di.dart'; import 'package:fluffychat/di/global/network_di.dart'; import 'package:fluffychat/domain/contact_manager/contacts_manager.dart'; import 'package:fluffychat/domain/repository/contact_repository.dart'; +import 'package:fluffychat/domain/repository/federation_configurations_repository.dart'; import 'package:fluffychat/domain/repository/localizations/localizations_repository.dart'; import 'package:fluffychat/domain/repository/lookup_repository.dart'; import 'package:fluffychat/domain/repository/multiple_account/multiple_account_repository.dart'; @@ -174,6 +178,9 @@ class GetItInitializer { getIt.registerFactory( () => HiveToMConfigurationDatasource(), ); + getIt.registerFactory( + () => HiveFederationConfigurationsDatasourceImpl(), + ); getIt.registerFactory( () => MediaDataSourceImpl(getIt.get()), ); @@ -226,6 +233,9 @@ class GetItInitializer { getIt.registerFactory( () => ToMConfigurationsRepositoryImpl(), ); + getIt.registerFactory( + () => FederationConfigurationsRepositoryImpl(), + ); getIt.registerLazySingleton( () => RecoveryWordsRepositoryImpl(), ); diff --git a/lib/domain/exception/federation_configuration_not_found.dart b/lib/domain/exception/federation_configuration_not_found.dart new file mode 100644 index 0000000000..fad6f1c30f --- /dev/null +++ b/lib/domain/exception/federation_configuration_not_found.dart @@ -0,0 +1,3 @@ +class FederationConfigurationNotFound implements Exception { + FederationConfigurationNotFound() : super(); +} diff --git a/lib/domain/model/extensions/homeserver_summary_extensions.dart b/lib/domain/model/extensions/homeserver_summary_extensions.dart index 14285b7594..ee47e763c8 100644 --- a/lib/domain/model/extensions/homeserver_summary_extensions.dart +++ b/lib/domain/model/extensions/homeserver_summary_extensions.dart @@ -1,3 +1,4 @@ +import 'package:fluffychat/data/model/federation_server/federation_server_information.dart'; import 'package:fluffychat/domain/model/tom_server_information.dart'; import 'package:matrix/matrix.dart'; @@ -18,4 +19,24 @@ extension HomeserverSummaryExtensions on HomeserverSummary { return null; } } + + FederationServerInformation? get federationServer { + if (discoveryInformation?.additionalProperties == null) { + return null; + } + final fedServerJson = discoveryInformation + ?.additionalProperties[FederationServerInformation.fedServerKey]; + if (fedServerJson == null) { + return null; + } + try { + return FederationServerInformation.fromJson(fedServerJson); + } catch (e) { + Logs().e( + 'Failed to parse m.federated_identity_services from homeserver summary', + e, + ); + return null; + } + } } diff --git a/lib/domain/repository/federation_configurations_repository.dart b/lib/domain/repository/federation_configurations_repository.dart new file mode 100644 index 0000000000..b82ab7102e --- /dev/null +++ b/lib/domain/repository/federation_configurations_repository.dart @@ -0,0 +1,12 @@ +import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; + +abstract class FederationConfigurationsRepository { + Future getFederationConfigurations(String userId); + + Future saveFederationConfigurations( + String userId, + FederationConfigurations federationConfigurations, + ); + + Future deleteFederationConfigurations(String userId); +} diff --git a/lib/migrate_steps/migrate_v6_to_v7/migrate_v6_to_v7.dart b/lib/migrate_steps/migrate_v6_to_v7/migrate_v6_to_v7.dart index 527cf4eb64..51223c5726 100644 --- a/lib/migrate_steps/migrate_v6_to_v7/migrate_v6_to_v7.dart +++ b/lib/migrate_steps/migrate_v6_to_v7/migrate_v6_to_v7.dart @@ -10,16 +10,27 @@ class MigrateV6ToV7 extends MigrateSteps { Logs().d( 'MigrateV6ToV7::onMigrate() Starting migration from v6 to v7', ); - final hiveCollectionToMDatabase = - await getIt.getAsync(); - await hiveCollectionToMDatabase.clear(); - Logs().d( - 'MigrateV6ToV7::onMigrate(): Delete ToM database success', - ); + await migrateHiveCollectionToMDatabase(); final multipleAccountRepository = getIt.get(); await multipleAccountRepository.deletePersistActiveAccount(); Logs().d( 'MigrateV6ToV7::onMigrate(): Delete persist active account success', ); } + + Future migrateHiveCollectionToMDatabase() async { + try { + final hiveCollectionToMDatabase = + await getIt.getAsync(); + await hiveCollectionToMDatabase.clear(); + Logs().d( + 'MigrateV6ToV7::onMigrate(): Delete ToM database success', + ); + } catch (e) { + Logs().e( + 'MigrateV6ToV7::onMigrate(): Delete ToM database failed', + e, + ); + } + } } diff --git a/lib/pages/settings_dashboard/settings/settings.dart b/lib/pages/settings_dashboard/settings/settings.dart index b4f40067c2..2ec24db205 100644 --- a/lib/pages/settings_dashboard/settings/settings.dart +++ b/lib/pages/settings_dashboard/settings/settings.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/di/global/get_it_initializer.dart'; +import 'package:fluffychat/domain/repository/federation_configurations_repository.dart'; import 'package:fluffychat/domain/repository/tom_configurations_repository.dart'; import 'package:fluffychat/event/twake_inapp_event_types.dart'; import 'package:fluffychat/pages/bootstrap/bootstrap_dialog.dart'; @@ -44,6 +45,8 @@ class SettingsController extends State with ConnectPageMixin { final ValueNotifier displayNameNotifier = ValueNotifier(''); final tomConfigurationRepository = getIt.get(); + final federationConfigurationsRepository = + getIt.get(); final _responsiveUtils = getIt.get(); static const String generateEmailSubject = @@ -119,6 +122,7 @@ class SettingsController extends State with ConnectPageMixin { await Future.wait([ matrix.client.logout(), _deleteTomConfigurations(matrix.client), + _deleteFederationConfigurations(matrix.client), ]); } catch (e) { Logs().e('SettingsController()::_logoutActionsOnMobile - error: $e'); @@ -137,6 +141,7 @@ class SettingsController extends State with ConnectPageMixin { await Future.wait([ matrix.client.logout(), _deleteTomConfigurations(matrix.client), + _deleteFederationConfigurations(matrix.client), ]); } catch (e) { Logs().e('SettingsController()::_logoutActions - error: $e'); @@ -331,6 +336,25 @@ class SettingsController extends State with ConnectPageMixin { } } + Future _deleteFederationConfigurations(Client currentClient) async { + try { + Logs().d( + 'SettingsController::_deleteFederationConfigurations - Client ID: ${currentClient.userID}', + ); + if (matrix.twakeSupported) { + await federationConfigurationsRepository + .deleteFederationConfigurations(currentClient.userID!); + } + Logs().d( + 'SettingsController::_deleteFederationConfigurations - Success', + ); + } catch (e) { + Logs().e( + 'SettingsController::_deleteFederationConfigurations - error: $e', + ); + } + } + @override void initState() { _getCurrentProfile(client); diff --git a/lib/widgets/matrix.dart b/lib/widgets/matrix.dart index ce4234d564..505103ff6c 100644 --- a/lib/widgets/matrix.dart +++ b/lib/widgets/matrix.dart @@ -1,6 +1,8 @@ import 'dart:async'; import 'dart:io'; +import 'package:fluffychat/data/model/federation_server/federation_configuration.dart'; import 'package:fluffychat/domain/contact_manager/contacts_manager.dart'; +import 'package:fluffychat/domain/repository/federation_configurations_repository.dart'; import 'package:fluffychat/presentation/mixins/init_config_mixin.dart'; import 'package:fluffychat/presentation/model/client_login_state_event.dart'; import 'package:fluffychat/widgets/layouts/agruments/logout_body_args.dart'; @@ -75,8 +77,6 @@ class Matrix extends StatefulWidget { class MatrixState extends State with WidgetsBindingObserver, ReceiveSharingIntentMixin, InitConfigMixin { - final tomConfigurationRepository = getIt.get(); - final _contactsManager = getIt.get(); int _activeClient = -1; @@ -431,6 +431,7 @@ class MatrixState extends State waitForFirstSync = false; markFirstLogin(); await setUpToMServicesInLogin(newActiveClient); + await setUpFederationServicesInLogin(newActiveClient); await _storePersistActiveAccount(newActiveClient); matrixState.reSyncContacts(); onClientLoginStateChanged.add( @@ -461,6 +462,7 @@ class MatrixState extends State if (activeClient == null) return; waitForFirstSync = false; await setUpToMServicesInLogin(activeClient); + await setUpFederationServicesInLogin(activeClient); final result = await setActiveClient(activeClient); matrixState.reSyncContacts(); if (result.isSuccess) { @@ -581,6 +583,21 @@ class MatrixState extends State return null; } + Future getFederationConfigurations( + String userId, + ) async { + try { + final federationConfigurationRepository = + getIt.get(); + final federationConfigurations = await federationConfigurationRepository + .getFederationConfigurations(userId); + return federationConfigurations; + } catch (e) { + Logs().e('MatrixState::_getFederationConfigurations: $e'); + } + return null; + } + void _retrieveLocalToMConfiguration() async { if (client.userID == null) return; try { @@ -648,6 +665,23 @@ class MatrixState extends State setUpAuthorization(client); } + Future setUpFederationServicesInLogin(Client client) async { + final federationSever = loginHomeserverSummary?.federationServer; + final identityServer = + loginHomeserverSummary?.discoveryInformation?.mIdentityServer; + Logs().d('MatrixState::setUpFederationServicesInLogin: $federationSever'); + + if (federationSever != null) { + await _storeFederationConfiguration( + client, + FederationConfigurations( + fedServerInformation: federationSever, + identityServerInformation: identityServer, + ), + ); + } + } + void setUpAuthorization(Client client) { final authorizationInterceptor = getIt.get(); Logs().d( @@ -713,6 +747,33 @@ class MatrixState extends State } } + Future _storeFederationConfiguration( + Client client, + FederationConfigurations config, + ) async { + try { + Logs().e( + 'Matrix::_storeFederationConfiguration: clientName - ${client.clientName}', + ); + Logs().e( + 'Matrix::_storeFederationConfiguration: userId - ${client.userID}', + ); + if (client.userID == null) return; + final FederationConfigurationsRepository + federationConfigurationRepository = + getIt.get(); + await federationConfigurationRepository.saveFederationConfigurations( + client.userID!, + config, + ); + Logs().e( + 'Matrix::_storeFederationConfiguration: configurationRepository - $federationConfigurationRepository', + ); + } catch (e) { + Logs().e('Matrix::_storeFederationConfiguration: error - $e'); + } + } + Future _setUpToMServicesWhenChangingActiveClient(Client? client) async { Logs().d( 'Matrix::_checkHomeserverExists: Old twakeSupported - $twakeSupported', diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index ae0532078f..c7cf866cfb 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -35,6 +35,7 @@ import media_kit_libs_macos_video import media_kit_video import package_info_plus import path_provider_foundation +import patrol import photo_manager import record_macos import screen_brightness_macos @@ -80,6 +81,7 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) PathProviderPlugin.register(with: registry.registrar(forPlugin: "PathProviderPlugin")) + PatrolPlugin.register(with: registry.registrar(forPlugin: "PatrolPlugin")) PhotoManagerPlugin.register(with: registry.registrar(forPlugin: "PhotoManagerPlugin")) RecordMacosPlugin.register(with: registry.registrar(forPlugin: "RecordMacosPlugin")) ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin"))