/* * Copyright (C) 2015 Actor LLC. <https://actor.im> */ package im.actor.core.modules.profile.avatar; import im.actor.core.api.ApiFileLocation; import im.actor.core.api.base.SeqUpdate; import im.actor.core.api.rpc.RequestEditAvatar; import im.actor.core.api.rpc.RequestRemoveAvatar; import im.actor.core.api.rpc.ResponseEditAvatar; import im.actor.core.api.rpc.ResponseSeq; import im.actor.core.api.updates.UpdateUserAvatarChanged; import im.actor.core.entity.FileReference; import im.actor.core.modules.Modules; import im.actor.core.modules.file.UploadManager; import im.actor.core.modules.sequence.internal.ExecuteAfter; import im.actor.core.modules.ModuleActor; import im.actor.core.util.RandomUtils; import im.actor.core.network.RpcCallback; import im.actor.core.network.RpcException; import im.actor.core.viewmodel.AvatarUploadState; public class OwnAvatarChangeActor extends ModuleActor { private long currentChangeTask = 0; public OwnAvatarChangeActor(Modules modules) { super(modules); } public void changeAvatar(String descriptor) { if (currentChangeTask != 0) { context().getFilesModule().cancelUpload(currentChangeTask); currentChangeTask = 0; } currentChangeTask = RandomUtils.nextRid(); context().getProfileModule().getOwnAvatarVM().getUploadState().change(new AvatarUploadState(descriptor, true)); context().getFilesModule().requestUpload(currentChangeTask, descriptor, "avatar.jpg", self()); } public void uploadCompleted(final long rid, FileReference fileReference) { if (rid != currentChangeTask) { return; } request(new RequestEditAvatar(new ApiFileLocation(fileReference.getFileId(), fileReference.getAccessHash())), new RpcCallback<ResponseEditAvatar>() { @Override public void onResult(ResponseEditAvatar response) { // Put update to sequence updates().onUpdateReceived(new SeqUpdate(response.getSeq(), response.getState(), UpdateUserAvatarChanged.HEADER, new UpdateUserAvatarChanged(myUid(), response.getAvatar()).toByteArray())); // After update applied turn of uploading state updates().onUpdateReceived(new ExecuteAfter(response.getSeq(), () -> self().send(new AvatarChanged(rid)))); } @Override public void onError(RpcException e) { if (rid != currentChangeTask) { return; } currentChangeTask = 0; context().getProfileModule().getOwnAvatarVM().getUploadState().change(new AvatarUploadState(null, false)); } }); } public void avatarChanged(long rid) { if (rid != currentChangeTask) { return; } currentChangeTask = 0; context().getProfileModule().getOwnAvatarVM().getUploadState().change(new AvatarUploadState(null, false)); } public void uploadError(long rid) { if (rid != currentChangeTask) { return; } currentChangeTask = 0; context().getProfileModule().getOwnAvatarVM().getUploadState().change(new AvatarUploadState(null, false)); } 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)); } }); } //region Messages @Override public void onReceive(Object message) { if (message instanceof ChangeAvatar) { ChangeAvatar changeAvatar = (ChangeAvatar) message; changeAvatar(changeAvatar.getDescriptor()); } else if (message instanceof UploadManager.UploadCompleted) { UploadManager.UploadCompleted uploadCompleted = (UploadManager.UploadCompleted) message; uploadCompleted(uploadCompleted.getRid(), uploadCompleted.getFileReference()); } else if (message instanceof UploadManager.UploadError) { UploadManager.UploadError uploadError = (UploadManager.UploadError) message; uploadError(uploadError.getRid()); } else if (message instanceof RemoveAvatar) { removeAvatar(); } else if (message instanceof AvatarChanged) { avatarChanged(((AvatarChanged) message).getRid()); } else { super.onReceive(message); } } public static class ChangeAvatar { private String descriptor; public ChangeAvatar(String descriptor) { this.descriptor = descriptor; } public String getDescriptor() { return descriptor; } } public static class RemoveAvatar { } public static class AvatarChanged { private long rid; public AvatarChanged(long rid) { this.rid = rid; } public long getRid() { return rid; } } //endregion }