/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.modules.messaging.history; import im.actor.core.api.rpc.RequestLoadArchived; import im.actor.core.api.rpc.ResponseLoadArchived; import im.actor.core.modules.api.ApiSupportConfiguration; import im.actor.core.modules.ModuleContext; import im.actor.core.network.RpcCallback; import im.actor.core.network.RpcException; import im.actor.core.modules.ModuleActor; import im.actor.runtime.Log; import im.actor.runtime.actors.messages.Void; import im.actor.runtime.function.Consumer; public class ArchivedDialogsActor extends ModuleActor { private static final String TAG = "ArchivedDialogsActor"; private static final int LIMIT = 20; private byte[] nextOffset; private boolean isLoading = false; RpcCallback<ResponseLoadArchived> lastCallback; private long lastRequest = -1; public ArchivedDialogsActor(ModuleContext context) { super(context); } private void onLoadMore(boolean init, RpcCallback<ResponseLoadArchived> callback) { if (init || isLoading) { // // notify old callback replaced // if (lastCallback != null) { lastCallback.onError(new RpcException(TAG, 0, "callback replaced", false, null)); } } lastCallback = callback; if (isLoading && !init) { return; } if (init) { if (lastRequest != -1) { cancelRequest(lastRequest); } nextOffset = null; } isLoading = true; Log.d(TAG, "Loading archived dialogs"); api(new RequestLoadArchived(nextOffset, LIMIT, ApiSupportConfiguration.OPTIMIZATIONS)) .chain(r -> updates().applyRelatedData(r.getUsers(), r.getGroups())) .chain(r -> updates().loadRequiredPeers(r.getUserPeers(), r.getGroupPeers())) .then(r -> onLoadedMore(r)) .failure(e -> lastCallback.onError((RpcException) e)); } private void onLoadedMore(ResponseLoadArchived responseLoadArchiveds) { isLoading = false; this.nextOffset = responseLoadArchiveds.getNextOffset(); lastCallback.onResult(responseLoadArchiveds); Log.d(TAG, "Archived dialogs loaded"); } // Messages @Override public void onReceive(Object message) { if (message instanceof LoadMore) { onLoadMore(((LoadMore) message).isInit(), ((LoadMore) message).getCallback()); } else { super.onReceive(message); } } public static class LoadMore { RpcCallback<ResponseLoadArchived> callback; boolean init; public LoadMore(boolean init, RpcCallback<ResponseLoadArchived> callback) { this.callback = callback; this.init = init; } public boolean isInit() { return init; } public RpcCallback<ResponseLoadArchived> getCallback() { return callback; } } }