package io.nextop.demo.flip; import android.renderscript.Sampler; import io.nextop.Id; import io.nextop.Message; import io.nextop.Nextop; import io.nextop.WireValue; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Action0; import rx.functions.Action1; import rx.functions.Func2; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; public class FlipInfoViewModelManager extends ThinViewModelManager<FlipInfoViewModel> { FlipInfoViewModelManager(Nextop nextop) { super(nextop); } // CONTROLLER void setIntro(final Id flipId, final String intro) { Map<WireValue, WireValue> content = Collections.singletonMap( WireValue.of("intro"), WireValue.of(intro)); Message update = Message.newBuilder() .setRoute("POST http://" + Flip.REMOTE + "/flip/$flip-id/info") .set("flip-id", flipId) .setContent(content) .build(); nextop.send(update); update(flipId, new Func2<FlipInfoViewModel, RxState, FlipInfoViewModel>() { @Override public FlipInfoViewModel call(FlipInfoViewModel flipInfoVm, RxState rxState) { flipInfoVm.set(intro, -1L); return flipInfoVm; } }); } private void add(final Id flipId, Message message) { final List<WireValue> values = message.getContent().asList(); if (!values.isEmpty()) { update(flipId, new Func2<FlipInfoViewModel, RxState, FlipInfoViewModel>() { @Override public FlipInfoViewModel call(FlipInfoViewModel flipInfoVm, RxState rxState) { for (WireValue value : values) { Map<WireValue, WireValue> m = value.asMap(); String intro = m.get(WireValue.of("intro")).asString(); long updateIndex = m.get(WireValue.of("most_recent_update_index")).asLong(); flipInfoVm.set(intro, updateIndex); } return flipInfoVm; } }); } } // VMM @Override protected void startUpdates(final FlipInfoViewModel flipInfoVm, final RxState state) { // sync info // then subscribe to updates Message sync = Message.newBuilder() .setRoute("GET http://" + Flip.REMOTE + "/flip/$flip-id/info") .set("flip-id", flipInfoVm.id) .build(); state.bind(nextop.send(sync)) .doOnNext(new Action1<Message>() { @Override public void call(Message message) { add(flipInfoVm.id, message); state.sync(); } }).doOnCompleted(new Action0() { @Override public void call() { // start the poller Action0 poller = new Action0() { @Override public void call() { Message poll = Message.newBuilder() .setRoute("GET http://" + Flip.REMOTE + "/flip/$flip-id/info") .set("flip-id", flipInfoVm.id) .set("after", flipInfoVm.getUpdateIndex()) .build(); state.bind(nextop.send(poll)) .doOnNext(new Action1<Message>() { @Override public void call(final Message message) { add(flipInfoVm.id, message); } }).subscribe(); } }; state.bind(AndroidSchedulers.mainThread().createWorker().schedulePeriodically(poller, pollTimeoutMs, pollTimeoutMs, TimeUnit.MILLISECONDS)); } }).subscribe(); } @Override protected FlipInfoViewModel create(Id id) { return new FlipInfoViewModel(id); } }