/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.modules.messaging.history; import java.util.ArrayList; import java.util.List; import im.actor.core.api.ApiDialog; import im.actor.core.api.ApiMessageState; import im.actor.core.api.rpc.RequestLoadDialogs; import im.actor.core.entity.content.AbsContent; import im.actor.core.modules.api.ApiSupportConfiguration; import im.actor.core.modules.ModuleContext; import im.actor.core.modules.messaging.history.entity.DialogHistory; import im.actor.core.modules.ModuleActor; import im.actor.runtime.actors.messages.Void; import static im.actor.core.entity.EntityConverter.convert; public class DialogsHistoryActor extends ModuleActor { // j2objc workaround private static final Void DUMB = null; private static final int LIMIT = 20; private static final String KEY_VERSION = "_1"; private static final String KEY_LOADED_DATE = "dialogs_history_date" + KEY_VERSION; private static final String KEY_LOADED = "dialogs_history_loaded" + KEY_VERSION; private static final String KEY_LOADED_INIT = "dialogs_history_inited" + KEY_VERSION; private long historyMaxDate; private boolean historyLoaded; private boolean isLoading = false; public DialogsHistoryActor(ModuleContext context) { super(context); } @Override public void preStart() { historyMaxDate = preferences().getLong(KEY_LOADED_DATE, Long.MAX_VALUE); historyLoaded = preferences().getBool(KEY_LOADED, false); if (!preferences().getBool(KEY_LOADED_INIT, false)) { self().send(new LoadMore()); } else { context().getConductor().getConductor().onDialogsLoaded(); } } private void onLoadMore() { if (historyLoaded || isLoading) { return; } isLoading = true; api(new RequestLoadDialogs(historyMaxDate, LIMIT, ApiSupportConfiguration.OPTIMIZATIONS)) .chain(r -> updates().loadRequiredPeers(r.getUserPeers(), r.getGroupPeers())) .chain(r -> updates().applyRelatedData(r.getUsers(), r.getGroups())) .then(r -> onLoadedMore(r.getDialogs())); } private void onLoadedMore(List<ApiDialog> rawDialogs) { final ArrayList<DialogHistory> dialogs = new ArrayList<>(); long maxLoadedDate = Long.MAX_VALUE; for (ApiDialog dialog : rawDialogs) { dialogs.add(new DialogHistory( convert(dialog.getPeer()), dialog.getUnreadCount(), dialog.getSortDate(), dialog.getRid(), dialog.getDate(), dialog.getSenderUid(), AbsContent.fromMessage(dialog.getMessage()), dialog.getState() == ApiMessageState.READ, dialog.getState() == ApiMessageState.RECEIVED)); maxLoadedDate = Math.min(dialog.getSortDate(), maxLoadedDate); } if (dialogs.size() > 0) { final long finalMaxLoadedDate = maxLoadedDate; context().getMessagesModule().getRouter().onDialogsHistoryLoaded(dialogs).then((v) -> { if (dialogs.size() < LIMIT) { markAsLoaded(); } else { markAsSliceLoaded(finalMaxLoadedDate); } }); } else { markAsLoaded(); } } private void markAsLoaded() { isLoading = false; historyLoaded = true; preferences().putBool(KEY_LOADED, true); preferences().putBool(KEY_LOADED_INIT, true); context().getConductor().getConductor().onDialogsLoaded(); } private void markAsSliceLoaded(long date) { isLoading = false; historyLoaded = false; historyMaxDate = date; preferences().putBool(KEY_LOADED, false); preferences().putBool(KEY_LOADED_INIT, true); preferences().putLong(KEY_LOADED_DATE, date); context().getConductor().getConductor().onDialogsLoaded(); } // // Messages // @Override public void onReceive(Object message) { if (message instanceof LoadMore) { onLoadMore(); } else { super.onReceive(message); } } public static class LoadMore { } }