import 'dart:async'; import 'dart:io'; import 'package:flutter/painting.dart'; import 'package:get_it/get_it.dart'; import 'package:logging/logging.dart'; import 'package:moxlib/awaitabledatasender.dart'; import 'package:moxplatform/moxplatform.dart'; import 'package:moxplatform/types.dart'; import 'package:moxxyv2/shared/commands.dart'; import 'package:moxxyv2/shared/eventhandler.dart'; import 'package:moxxyv2/shared/events.dart'; import 'package:moxxyv2/ui/bloc/blocklist_bloc.dart' as blocklist; import 'package:moxxyv2/ui/bloc/conversation_bloc.dart' as conversation; import 'package:moxxyv2/ui/bloc/conversations_bloc.dart' as conversations; import 'package:moxxyv2/ui/bloc/newconversation_bloc.dart' as new_conversation; import 'package:moxxyv2/ui/bloc/profile_bloc.dart' as profile; import 'package:moxxyv2/ui/bloc/sharedmedia_bloc.dart' as sharedmedia; import 'package:moxxyv2/ui/prestart.dart'; import 'package:moxxyv2/ui/service/progress.dart'; void setupEventHandler() { final handler = EventHandler() ..addMatchers(>[ EventTypeMatcher(onMessageAdded), EventTypeMatcher(onMessageUpdated), EventTypeMatcher(onConversationUpdated), EventTypeMatcher(onConversationAdded), EventTypeMatcher(onBlocklistPushed), EventTypeMatcher(onRosterPush), EventTypeMatcher(onProgress), EventTypeMatcher(onSelfAvatarChanged), EventTypeMatcher(preStartDone), EventTypeMatcher(onServiceReady) ]); GetIt.I.registerSingleton(handler); } Future handleIsolateEvent(Map? json) async { final log = GetIt.I.get(); if (json == null) { log.warning('Received null from the background service. Ignoring...'); return; } // NOTE: This feels dirty, but we gotta do it final event = getEventFromJson(json['data']! as Map)!; final data = DataWrapper( json['id']! as String, event, ); log.finest('S2F: $event'); // First attempt to deal with awaitables var found = false; found = await MoxplatformPlugin.handler.getDataSender().onData(data); if (found) return; // Then run the event handlers found = await GetIt.I.get().run(event); if (found == true) return; log.warning('Failed to match event'); } Future onConversationAdded(ConversationAddedEvent event, { dynamic extra }) async { GetIt.I.get().add( conversations.ConversationsAddedEvent(event.conversation), ); } Future onConversationUpdated(ConversationUpdatedEvent event, { dynamic extra }) async { GetIt.I.get().add( conversations.ConversationsUpdatedEvent(event.conversation), ); GetIt.I.get().add( conversation.ConversationUpdatedEvent(event.conversation), ); GetIt.I.get().add( profile.ConversationUpdatedEvent(event.conversation), ); GetIt.I.get().add( sharedmedia.UpdatedSharedMedia( event.conversation.jid, event.conversation.sharedMedia, ), ); } Future onMessageAdded(MessageAddedEvent event, { dynamic extra }) async { GetIt.I.get().add( conversation.MessageAddedEvent(event.message), ); } Future onMessageUpdated(MessageUpdatedEvent event, { dynamic extra }) async { GetIt.I.get().add( conversation.MessageUpdatedEvent(event.message), ); } Future onBlocklistPushed(BlocklistPushEvent event, { dynamic extra }) async { GetIt.I.get().add( blocklist.BlocklistPushedEvent( event.added, event.removed, ), ); } Future onRosterPush(RosterDiffEvent event, { dynamic extra }) async { GetIt.I.get().add( new_conversation.RosterPushedEvent( event.added, event.modified, event.removed, ), ); } Future onProgress(ProgressEvent event, { dynamic extra }) async { GetIt.I.get().onProgress(event.id, event.progress); } Future onSelfAvatarChanged(SelfAvatarChangedEvent event, { dynamic extra }) async { // Evict the profile picture from the cache await FileImage(File(event.path)).evict(); GetIt.I.get().add( conversations.AvatarChangedEvent(event.path), ); GetIt.I.get().add( profile.AvatarSetEvent(event.path, event.hash), ); } Future onServiceReady(ServiceReadyEvent event, { dynamic extra }) async { GetIt.I.get().fine('onServiceReady: Waiting for UI future to resolve...'); await GetIt.I.get>().future; GetIt.I.get().fine('onServiceReady: Done'); await MoxplatformPlugin.handler.getDataSender().sendData( PerformPreStartCommand(), awaitable: false, ); }