package im.actor.core.modules.stickers;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import im.actor.core.api.ApiStickerCollection;
import im.actor.core.api.rpc.RequestLoadOwnStickers;
import im.actor.core.api.rpc.ResponseLoadOwnStickers;
import im.actor.core.entity.StickerPack;
import im.actor.core.modules.ModuleContext;
import im.actor.core.modules.stickers.entity.StickersStorage;
import im.actor.core.modules.ModuleActor;
import im.actor.runtime.function.Consumer;
public class StickersActor extends ModuleActor {
private boolean isLoaded = false;
private StickersStorage stickersStorage;
public StickersActor(ModuleContext context) {
super(context);
}
@Override
public void preStart() {
stickersStorage = new StickersStorage();
byte[] data = context().getPreferences().getBytes("stickers.data");
if (data != null) {
try {
stickersStorage = new StickersStorage(data);
} catch (IOException e) {
e.printStackTrace();
}
}
if (!context().getPreferences().getBool("stickers_loaded", false)) {
api(new RequestLoadOwnStickers()).then(responseLoadOwnStickers -> {
onOwnStickerCollectionChanged(responseLoadOwnStickers.getOwnStickers());
context().getPreferences().putBool("stickers_loaded", true);
isLoaded = true;
unstashAll();
});
} else {
isLoaded = true;
notifyVM();
}
}
private void onOwnStickerCollectionChanged(List<ApiStickerCollection> ownStickers) {
stickersStorage.getStickerPacks().clear();
for (ApiStickerCollection collection : ownStickers) {
stickersStorage.getStickerPacks().add(new StickerPack(collection));
}
notifyVM();
saveStorage();
}
private void onStickerCollectionsChanged(List<ApiStickerCollection> updated) {
for (int i = 0; i < stickersStorage.getStickerPacks().size(); i++) {
StickerPack collection = stickersStorage.getStickerPacks().get(i);
for (ApiStickerCollection c : updated) {
if (c.getId() == collection.getId()) {
stickersStorage.getStickerPacks().set(i, new StickerPack(c));
break;
}
}
}
notifyVM();
saveStorage();
}
private void saveStorage() {
context().getPreferences().putBytes("stickers.data", stickersStorage.toByteArray());
}
private void notifyVM() {
context().getStickersModule()
.getStickersVM()
.getOwnStickerPacks()
.change(new ArrayList<>(stickersStorage.getStickerPacks()));
}
@Override
public void onReceive(Object message) {
if (message instanceof StickerCollectionsChanged) {
if (!isLoaded) {
stash();
}
onStickerCollectionsChanged(((StickerCollectionsChanged) message).getUpdated());
} else if (message instanceof OwnStickerCollectionsChanged) {
if (!isLoaded) {
stash();
}
onOwnStickerCollectionChanged(((OwnStickerCollectionsChanged) message).getOwnStickers());
} else {
super.onReceive(message);
}
}
public static class OwnStickerCollectionsChanged {
private List<ApiStickerCollection> ownStickers;
public OwnStickerCollectionsChanged(List<ApiStickerCollection> ownStickers) {
this.ownStickers = ownStickers;
}
public List<ApiStickerCollection> getOwnStickers() {
return ownStickers;
}
}
public static class StickerCollectionsChanged {
private List<ApiStickerCollection> updated;
public StickerCollectionsChanged(List<ApiStickerCollection> updated) {
this.updated = updated;
}
public List<ApiStickerCollection> getUpdated() {
return updated;
}
}
}