/*
* Copyright (C) 2015 Actor LLC. <https://actor.im>
*/
package im.actor.core.modules;
import im.actor.core.Configuration;
import im.actor.core.Messenger;
import im.actor.core.i18n.I18nEngine;
import im.actor.core.modules.api.ApiModule;
import im.actor.core.modules.auth.Authentication;
import im.actor.core.modules.eventbus.EventBusModule;
import im.actor.core.modules.sequence.Updates;
import im.actor.core.modules.calls.CallsModule;
import im.actor.core.modules.contacts.ContactsModule;
import im.actor.core.modules.conductor.DisplayLists;
import im.actor.core.modules.encryption.EncryptionModule;
import im.actor.core.modules.external.ExternalModule;
import im.actor.core.modules.file.FilesModule;
import im.actor.core.modules.groups.GroupsModule;
import im.actor.core.modules.mentions.MentionsModule;
import im.actor.core.modules.messaging.MessagesModule;
import im.actor.core.modules.notifications.NotificationsModule;
import im.actor.core.modules.presence.PresenceModule;
import im.actor.core.modules.profile.ProfileModule;
import im.actor.core.modules.push.PushesModule;
import im.actor.core.modules.search.SearchModule;
import im.actor.core.modules.security.SecurityModule;
import im.actor.core.modules.settings.SettingsModule;
import im.actor.core.modules.stickers.StickersModule;
import im.actor.core.modules.storage.StorageModule;
import im.actor.core.modules.typing.TypingModule;
import im.actor.core.modules.users.UsersModule;
import im.actor.core.modules.conductor.ConductorModule;
import im.actor.core.network.ActorApi;
import im.actor.core.util.Timing;
import im.actor.runtime.Runtime;
import im.actor.runtime.Storage;
import im.actor.runtime.eventbus.EventBus;
import im.actor.runtime.storage.PreferencesStorage;
public class Modules implements ModuleContext {
// Messenger object
private final Messenger messenger;
// Very basic modules
private final Configuration configuration;
private final I18nEngine i18nEngine;
private final PreferencesStorage preferences;
private final EventBus events;
private final StorageModule storageModule;
// API support
private final ApiModule api;
// Modules required before authentication
private final ExternalModule external;
private final Authentication authentication;
// Modules for authenticated users
private volatile Updates updates;
private volatile UsersModule users;
private volatile GroupsModule groups;
private volatile StickersModule stickers;
private volatile CallsModule calls;
private volatile MessagesModule messages;
private volatile PushesModule pushes;
private volatile PresenceModule presence;
private volatile TypingModule typing;
private volatile FilesModule filesModule;
private volatile ContactsModule contacts;
private volatile NotificationsModule notifications;
private volatile SettingsModule settings;
private volatile ProfileModule profile;
private volatile SearchModule search;
private volatile SecurityModule security;
private volatile DisplayLists displayLists;
private volatile MentionsModule mentions;
private volatile EncryptionModule encryptionModule;
private volatile ConductorModule conductor;
private volatile EventBusModule eventBusModule;
public Modules(Messenger messenger, Configuration configuration) {
this.messenger = messenger;
this.configuration = configuration;
// Timing timing = new Timing("MODULES_INIT");
// timing.section("I18N");
this.i18nEngine = I18nEngine.create(this);
// timing.section("Preferences");
this.preferences = Storage.createPreferencesStorage();
// timing.section("Storage");
this.storageModule = new StorageModule(this);
// timing.section("Events");
this.events = new EventBus();
// timing.section("Conductor");
this.conductor = new ConductorModule(this);
// timing.section("API");
this.api = new ApiModule(this);
// timing.section("External");
this.external = new ExternalModule(this);
// timing.section("Pushes");
this.pushes = new PushesModule(this);
// timing.section("Auth");
this.authentication = new Authentication(this);
// timing.end();
}
public void run() {
// Timing timing = new Timing("RUN");
// timing.section("Auth");
this.authentication.run();
// timing.end();
}
public void onLoggedIn(boolean first) {
Timing timing = new Timing("ACCOUNT_CREATE");
timing.section("Users");
users = new UsersModule(this);
timing.section("Storage");
storageModule.run(first);
timing.section("Groups");
groups = new GroupsModule(this);
timing.section("Conductor");
conductor.run();
timing.section("Stickers");
stickers = new StickersModule(this);
timing.section("Calls");
calls = new CallsModule(this);
timing.section("Search");
search = new SearchModule(this);
timing.section("Security");
security = new SecurityModule(this);
timing.section("Messages");
messages = new MessagesModule(this);
timing.section("Updates");
updates = new Updates(this);
timing.section("Presence");
presence = new PresenceModule(this);
timing.section("Typing");
typing = new TypingModule(this);
timing.section("Files");
filesModule = new FilesModule(this);
timing.section("Notifications");
notifications = new NotificationsModule(this);
timing.section("Contacts");
contacts = new ContactsModule(this);
timing.section("Settings");
settings = new SettingsModule(this);
timing.section("Profile");
profile = new ProfileModule(this);
timing.section("Mentions");
mentions = new MentionsModule(this);
// timing.section("Encryption");
// encryptionModule = new EncryptionModule(this);
timing.section("DisplayLists");
displayLists = new DisplayLists(this);
timing.section("EventBus");
eventBusModule = new EventBusModule(this);
timing = new Timing("ACCOUNT_RUN");
timing.section("Users");
users.run();
timing.section("Groups");
groups.run();
timing.section("Settings");
settings.run();
timing.section("Files");
filesModule.run();
timing.section("Search");
search.run();
timing.section("Notifications");
notifications.run();
// timing.section("Encryption");
// encryptionModule.run();
timing.section("Contacts");
contacts.run();
timing.section("Messages");
messages.run();
timing.section("EventBus");
eventBusModule.run();
timing.section("Updates");
updates.run();
timing.section("Calls");
calls.run();
timing.section("Stickers");
stickers.run();
timing.section("Conductor:end");
conductor.runAfter();
timing.end();
if (Runtime.isMainThread()) {
messenger.onLoggedIn();
} else {
Runtime.postToMainThread(() -> messenger.onLoggedIn());
}
}
@Override
public void afterStorageReset() {
// Recreation of Users Module to pick fresh database
users = new UsersModule(this);
}
public void onLoggedOut() {
im.actor.runtime.Runtime.postToMainThread(new Runnable() {
@Override
public void run() {
// Reset Storage
Storage.resetStorage();
// Kill app
im.actor.runtime.Runtime.killApp();
}
});
}
@Override
public PreferencesStorage getPreferences() {
return preferences;
}
@Override
public Configuration getConfiguration() {
return configuration;
}
@Override
public Authentication getAuthModule() {
return authentication;
}
@Override
public UsersModule getUsersModule() {
return users;
}
@Override
public GroupsModule getGroupsModule() {
return groups;
}
@Override
public StickersModule getStickersModule() {
return stickers;
}
@Override
public CallsModule getCallsModule() {
return calls;
}
@Override
public MessagesModule getMessagesModule() {
return messages;
}
@Override
public Updates getUpdatesModule() {
return updates;
}
@Override
public TypingModule getTypingModule() {
return typing;
}
@Override
public PresenceModule getPresenceModule() {
return presence;
}
@Override
public ActorApi getActorApi() {
return api.getActorApi();
}
@Override
public ApiModule getApiModule() {
return api;
}
@Override
public StorageModule getStorageModule() {
return storageModule;
}
@Override
public I18nEngine getI18nModule() {
return i18nEngine;
}
@Override
public ContactsModule getContactsModule() {
return contacts;
}
@Override
public FilesModule getFilesModule() {
return filesModule;
}
@Override
public NotificationsModule getNotificationsModule() {
return notifications;
}
@Override
public SettingsModule getSettingsModule() {
return settings;
}
@Override
public ProfileModule getProfileModule() {
return profile;
}
@Override
public PushesModule getPushesModule() {
return pushes;
}
@Override
public SecurityModule getSecurityModule() {
return security;
}
@Override
public SearchModule getSearchModule() {
return search;
}
@Override
public Messenger getMessenger() {
return messenger;
}
@Override
public ExternalModule getExternalModule() {
return external;
}
@Override
public DisplayLists getDisplayListsModule() {
return displayLists;
}
@Override
public MentionsModule getMentions() {
return mentions;
}
@Override
public EncryptionModule getEncryption() {
return encryptionModule;
}
@Override
public EventBusModule getEventBus() {
return eventBusModule;
}
@Override
public ConductorModule getConductor() {
return conductor;
}
@Override
public EventBus getEvents() {
return events;
}
}