use of im.actor.core.api.base.SeqUpdate in project actor-platform by actorapp.
the class SequenceActor method onUpdateReceived.
private void onUpdateReceived(final int seq, final byte[] state, int type, byte[] body, List<ApiUser> users, List<ApiGroup> groups) {
// Checking sequence
if (seq <= this.seq) {
Log.d(TAG, "Ignored SeqUpdate {seq:" + seq + ", currentSeq: " + this.seq + "}");
return;
}
Log.d(TAG, "SeqUpdate {seq:" + seq + "}");
if (!isValidated) {
Log.d(TAG, "Stashing update");
stash();
return;
}
if (seq != this.seq + 1) {
stash();
if (seq - this.seq > INVALIDATE_MAX_SEC_HOLE) {
Log.w(TAG, "Out of sequence: Too big hole. Force invalidate immediately");
forceInvalidate();
}
if (isTimerStarted) {
Log.w(TAG, "Out of sequence: timer already started");
} else {
Log.w(TAG, "Out of sequence: starting timer for invalidation");
startInvalidationTimer();
}
return;
}
Update update = null;
try {
update = updatesParser.read(type, body);
} catch (IOException e) {
e.printStackTrace();
}
if (update != null) {
if ((users == null || users.size() == 0) && (groups == null || groups.size() == 0)) {
if (validator.isCausesInvalidation(update)) {
Log.w(TAG, "Invalidating: No Users of Groups available for update");
forceInvalidate();
return;
}
}
Log.d(TAG, "Handling update #" + seq);
startWakeLock();
handler.onSeqUpdate(update, users, groups).then(aVoid -> {
Log.d(TAG, "Handling update ended #" + seq);
onUpdatesApplied(seq, state);
});
}
// Saving memory-only state
this.seq = seq;
this.state = state;
unstashAll();
stopInvalidationTimer();
}
use of im.actor.core.api.base.SeqUpdate in project actor-platform by actorapp.
the class OwnAvatarChangeActor method removeAvatar.
public void removeAvatar() {
if (currentChangeTask != 0) {
context().getFilesModule().cancelUpload(currentChangeTask);
currentChangeTask = 0;
}
currentChangeTask = RandomUtils.nextRid();
context().getProfileModule().getOwnAvatarVM().getUploadState().change(new AvatarUploadState(null, true));
final long currentRid = currentChangeTask;
request(new RequestRemoveAvatar(), new RpcCallback<ResponseSeq>() {
@Override
public void onResult(ResponseSeq response) {
updates().onUpdateReceived(new SeqUpdate(response.getSeq(), response.getState(), UpdateUserAvatarChanged.HEADER, new UpdateUserAvatarChanged(myUid(), null).toByteArray()));
// After update applied turn of uploading state
updates().onUpdateReceived(new ExecuteAfter(response.getSeq(), () -> self().send(new AvatarChanged(currentRid))));
}
@Override
public void onError(RpcException e) {
if (currentRid != currentChangeTask) {
return;
}
currentChangeTask = 0;
context().getProfileModule().getOwnAvatarVM().getUploadState().change(new AvatarUploadState(null, false));
}
});
}
use of im.actor.core.api.base.SeqUpdate in project actor-platform by actorapp.
the class ContactsModule method removeContact.
public Command<Boolean> removeContact(final int uid) {
return callback -> {
User user = users().getValue(uid);
if (user == null) {
runOnUiThread(() -> callback.onError(new RpcInternalException()));
return;
}
request(new RequestRemoveContact(uid, user.getAccessHash()), new RpcCallback<ResponseSeq>() {
@Override
public void onResult(ResponseSeq response) {
ArrayList<Integer> uids = new ArrayList<>();
uids.add(uid);
SeqUpdate update = new SeqUpdate(response.getSeq(), response.getState(), UpdateContactsRemoved.HEADER, new UpdateContactsRemoved(uids).toByteArray());
updates().onUpdateReceived(update);
runOnUiThread(() -> callback.onResult(true));
}
@Override
public void onError(RpcException e) {
runOnUiThread(() -> callback.onError(new RpcInternalException()));
}
});
};
}
use of im.actor.core.api.base.SeqUpdate in project actor-platform by actorapp.
the class ContactsModule method addContact.
public Command<Boolean> addContact(final int uid) {
return callback -> {
User user = users().getValue(uid);
if (user == null) {
runOnUiThread(() -> callback.onError(new RpcInternalException()));
return;
}
request(new RequestAddContact(uid, user.getAccessHash()), new RpcCallback<ResponseSeq>() {
@Override
public void onResult(ResponseSeq response) {
ArrayList<Integer> uids = new ArrayList<>();
uids.add(uid);
SeqUpdate update = new SeqUpdate(response.getSeq(), response.getState(), UpdateContactsAdded.HEADER, new UpdateContactsAdded(uids).toByteArray());
updates().onUpdateReceived(update);
runOnUiThread(() -> callback.onResult(true));
}
@Override
public void onError(RpcException e) {
runOnUiThread(() -> callback.onError(new RpcInternalException()));
}
});
};
}
use of im.actor.core.api.base.SeqUpdate in project actor-platform by actorapp.
the class MessageDeleteActor method performDelete.
public void performDelete(final Peer peer, final List<Long> rids) {
final ApiOutPeer outPeer = buidOutPeer(peer);
final ApiPeer apiPeer = buildApiPeer(peer);
request(new RequestDeleteMessage(outPeer, rids), new RpcCallback<ResponseSeq>() {
@Override
public void onResult(ResponseSeq response) {
if (deleteStorage.getPendingDeletions().containsKey(peer)) {
deleteStorage.getPendingDeletions().get(peer).getRids().removeAll(rids);
saveStorage();
}
updates().onUpdateReceived(new SeqUpdate(response.getSeq(), response.getState(), UpdateMessageDelete.HEADER, new UpdateMessageDelete(apiPeer, rids).toByteArray()));
}
@Override
public void onError(RpcException e) {
}
});
}
Aggregations