Search in sources :

Example 1 with FatSeqUpdate

use of im.actor.core.api.base.FatSeqUpdate in project actor-platform by actorapp.

the class BookImportActor method performImportIfRequired.

private void performImportIfRequired() {
    if (ENABLE_LOG) {
        Log.d(TAG, "performImportIfRequired called");
    }
    if (isUploadingContacts) {
        if (ENABLE_LOG) {
            Log.d(TAG, "performImportIfRequired:exiting:already importing");
        }
        return;
    }
    if (importQueue.size() == 0) {
        if (ENABLE_LOG) {
            Log.d(TAG, "performImportIfRequired:exiting:nothing to import");
        }
        // Marking as everything is imported
        context().getConductor().getConductor().onPhoneBookImported();
        return;
    }
    //
    // Performing import
    //
    isUploadingContacts = true;
    final ArrayList<ApiPhoneToImport> phoneToImports = new ArrayList<>();
    final ArrayList<ApiEmailToImport> emailToImports = new ArrayList<>();
    for (int i = 0; i < MAX_IMPORT_SIZE && importQueue.size() > 0; i++) {
        ImportQueueItem importQueueItem = importQueue.remove(0);
        if (importQueueItem instanceof ImportEmailQueueItem) {
            emailToImports.add(new ApiEmailToImport(((ImportEmailQueueItem) importQueueItem).getEmail(), ((ImportEmailQueueItem) importQueueItem).getName()));
        } else if (importQueueItem instanceof ImportPhoneQueueItem) {
            phoneToImports.add(new ApiPhoneToImport(((ImportPhoneQueueItem) importQueueItem).getPhoneNumber(), ((ImportPhoneQueueItem) importQueueItem).getName()));
        } else {
            throw new RuntimeException();
        }
    }
    request(new RequestImportContacts(phoneToImports, emailToImports, ApiSupportConfiguration.OPTIMIZATIONS), new RpcCallback<ResponseImportContacts>() {

        @Override
        public void onResult(ResponseImportContacts response) {
            for (ApiPhoneToImport phoneToImport : phoneToImports) {
                storage.markAsImported(phoneToImport.getPhoneNumber());
                importingPhones.remove(phoneToImport.getPhoneNumber());
            }
            for (ApiEmailToImport emailToImport : emailToImports) {
                storage.markAsImported(emailToImport.getEmail());
                importingEmails.remove(emailToImport.getEmail());
            }
            context().getContactsModule().getBookImportState().put(0, storage.toByteArray());
            //
            if (response.getUsers().size() != 0 || response.getUserPeers().size() != 0) {
                if (ENABLE_LOG) {
                    Log.d(TAG, "Import success with " + (response.getUsers().size() + response.getUserPeers().size()) + " new contacts");
                }
                if (response.getUserPeers().size() != 0) {
                    // Optimized version
                    ArrayList<Integer> uids = new ArrayList<>();
                    for (ApiUserOutPeer u : response.getUserPeers()) {
                        uids.add(u.getUid());
                    }
                    updates().loadRequiredPeers(response.getUserPeers(), new ArrayList<>()).flatMap(v -> updates().applyUpdate(response.getSeq(), response.getState(), new UpdateContactsAdded(uids)));
                } else {
                    // Old version
                    ArrayList<Integer> uids = new ArrayList<>();
                    for (ApiUser u : response.getUsers()) {
                        uids.add(u.getId());
                    }
                    updates().onUpdateReceived(new FatSeqUpdate(response.getSeq(), response.getState(), UpdateContactsAdded.HEADER, new UpdateContactsAdded(uids).toByteArray(), response.getUsers(), new ArrayList<>()));
                }
            } else {
                if (ENABLE_LOG) {
                    Log.d(TAG, "Import success, but no new contacts found");
                }
            }
            //
            // Launching next iteration
            //
            isUploadingContacts = false;
            performImportIfRequired();
        }

        @Override
        public void onError(RpcException e) {
            // TODO: Better error handling
            if (ENABLE_LOG) {
                Log.d(TAG, "Import failure");
            }
            e.printStackTrace();
            //
            // Launching next iteration
            //
            isUploadingContacts = false;
            performImportIfRequired();
        }
    });
}
Also used : ApiSupportConfiguration(im.actor.core.modules.api.ApiSupportConfiguration) ApiEmailToImport(im.actor.core.api.ApiEmailToImport) ModuleContext(im.actor.core.modules.ModuleContext) UpdateContactsAdded(im.actor.core.api.updates.UpdateContactsAdded) Void(im.actor.runtime.actors.messages.Void) Bser(im.actor.runtime.bser.Bser) ApiPhoneToImport(im.actor.core.api.ApiPhoneToImport) PhoneBookContact(im.actor.core.entity.PhoneBookContact) PhoneBookIds(im.actor.core.entity.PhoneBookIds) ApiUser(im.actor.core.api.ApiUser) FatSeqUpdate(im.actor.core.api.base.FatSeqUpdate) ResponseImportContacts(im.actor.core.api.rpc.ResponseImportContacts) RpcException(im.actor.core.network.RpcException) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) RequestImportContacts(im.actor.core.api.rpc.RequestImportContacts) List(java.util.List) ModuleActor(im.actor.core.modules.ModuleActor) PhoneBookEmail(im.actor.core.entity.PhoneBookEmail) BookImportStorage(im.actor.core.modules.contacts.entity.BookImportStorage) RpcCallback(im.actor.core.network.RpcCallback) ApiUserOutPeer(im.actor.core.api.ApiUserOutPeer) Log(im.actor.runtime.Log) PhoneBookPhone(im.actor.core.entity.PhoneBookPhone) UpdateContactsAdded(im.actor.core.api.updates.UpdateContactsAdded) FatSeqUpdate(im.actor.core.api.base.FatSeqUpdate) ApiPhoneToImport(im.actor.core.api.ApiPhoneToImport) ApiUserOutPeer(im.actor.core.api.ApiUserOutPeer) ApiUser(im.actor.core.api.ApiUser) ArrayList(java.util.ArrayList) ResponseImportContacts(im.actor.core.api.rpc.ResponseImportContacts) ApiEmailToImport(im.actor.core.api.ApiEmailToImport) RpcException(im.actor.core.network.RpcException) RequestImportContacts(im.actor.core.api.rpc.RequestImportContacts)

Example 2 with FatSeqUpdate

use of im.actor.core.api.base.FatSeqUpdate in project actor-platform by actorapp.

the class SequenceActor method onReceive.

//
// Messages
//
@Override
public void onReceive(Object message) {
    if (message instanceof Invalidate || message instanceof SeqUpdateTooLong || message instanceof ForceInvalidate) {
        if (!isValidated) {
            return;
        }
        invalidate();
    } else if (message instanceof SeqUpdate || message instanceof FatSeqUpdate) {
        if (!isValidated) {
            stash();
            return;
        }
        int seq;
        byte[] state;
        int type;
        byte[] body;
        List<ApiUser> users = null;
        List<ApiGroup> groups = null;
        if (message instanceof SeqUpdate) {
            seq = ((SeqUpdate) message).getSeq();
            state = ((SeqUpdate) message).getState();
            type = ((SeqUpdate) message).getUpdateHeader();
            body = ((SeqUpdate) message).getUpdate();
        } else {
            seq = ((FatSeqUpdate) message).getSeq();
            state = ((FatSeqUpdate) message).getState();
            type = ((FatSeqUpdate) message).getUpdateHeader();
            body = ((FatSeqUpdate) message).getUpdate();
            users = ((FatSeqUpdate) message).getUsers();
            groups = ((FatSeqUpdate) message).getGroups();
        }
        onUpdateReceived(seq, state, type, body, users, groups);
    } else if (message instanceof ExecuteAfter) {
        if (!isValidated) {
            stash();
            return;
        }
        onExecuteAfter((ExecuteAfter) message);
    } else if (message instanceof PushSeq) {
        if (!isValidated) {
            stash();
            return;
        }
        onPushSeqReceived(((PushSeq) message).seq, ((PushSeq) message).authId);
    } else if (message instanceof WeakUpdate) {
        WeakUpdate weakUpdate = (WeakUpdate) message;
        onWeakUpdateReceived(weakUpdate.getUpdateHeader(), weakUpdate.getUpdate(), weakUpdate.getDate());
    } else {
        super.onReceive(message);
    }
}
Also used : FatSeqUpdate(im.actor.core.api.base.FatSeqUpdate) FatSeqUpdate(im.actor.core.api.base.FatSeqUpdate) SeqUpdate(im.actor.core.api.base.SeqUpdate) WeakUpdate(im.actor.core.api.base.WeakUpdate) ExecuteAfter(im.actor.core.modules.sequence.internal.ExecuteAfter) ArrayList(java.util.ArrayList) List(java.util.List) SeqUpdateTooLong(im.actor.core.api.base.SeqUpdateTooLong)

Aggregations

FatSeqUpdate (im.actor.core.api.base.FatSeqUpdate)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 ApiEmailToImport (im.actor.core.api.ApiEmailToImport)1 ApiPhoneToImport (im.actor.core.api.ApiPhoneToImport)1 ApiUser (im.actor.core.api.ApiUser)1 ApiUserOutPeer (im.actor.core.api.ApiUserOutPeer)1 SeqUpdate (im.actor.core.api.base.SeqUpdate)1 SeqUpdateTooLong (im.actor.core.api.base.SeqUpdateTooLong)1 WeakUpdate (im.actor.core.api.base.WeakUpdate)1 RequestImportContacts (im.actor.core.api.rpc.RequestImportContacts)1 ResponseImportContacts (im.actor.core.api.rpc.ResponseImportContacts)1 UpdateContactsAdded (im.actor.core.api.updates.UpdateContactsAdded)1 PhoneBookContact (im.actor.core.entity.PhoneBookContact)1 PhoneBookEmail (im.actor.core.entity.PhoneBookEmail)1 PhoneBookIds (im.actor.core.entity.PhoneBookIds)1 PhoneBookPhone (im.actor.core.entity.PhoneBookPhone)1 ModuleActor (im.actor.core.modules.ModuleActor)1 ModuleContext (im.actor.core.modules.ModuleContext)1 ApiSupportConfiguration (im.actor.core.modules.api.ApiSupportConfiguration)1