package com.stanfy.enroscar.async.rx.test; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.view.View; import android.widget.TextView; import com.stanfy.enroscar.async.Load; import com.stanfy.enroscar.async.OperatorBuilder; import com.stanfy.enroscar.async.Send; import com.stanfy.enroscar.async.internal.AsyncProvider; import com.stanfy.enroscar.async.internal.LoaderDescription; import com.stanfy.enroscar.async.internal.ObservableAsyncProvider; import com.stanfy.enroscar.async.internal.ObservableTools; import com.stanfy.enroscar.async.internal.OperatorBase; import java.util.concurrent.Callable; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executors; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; import rx.schedulers.Schedulers; /** * Example of Async Rx usage. */ public class UserActivity extends FragmentActivity { static final int LOADER_LOAD = 1, LOADER_SEND = 2; final CountDownLatch loadSync = new CountDownLatch(1); final CountDownLatch sendSync = new CountDownLatch(1); TextView view; boolean completeCalled; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); final TextView view = new TextView(this); this.view = view; setContentView(view); final UserActivityOperator operator = UserActivityOperator.build() .operations(this) .withinActivity(this) .get(); operator.when().loadThingIsFinished() .doOnCompleted(new Action0() { @Override public void call() { completeCalled = true; } }) .subscribe(new Action1<Thing>() { @Override public void call(final Thing thing) { view.setText(thing.toString()); loadSync.countDown(); } }); operator.when().sendThingIsFinished() .subscribe(new Action1<Thing>() { @Override public void call(final Thing thing) { view.setText(view.getText() + thing.toString()); sendSync.countDown(); } }); operator.loadThing(1); view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { operator.sendThing(2); } }); } @Load Observable<Thing> loadThing(final int v) { return Observable.just(new Thing(v)); } @Send Observable<Thing> sendThing(final int v) { return Observable.from(Executors.newCachedThreadPool().submit(new Callable<Thing>() { @Override public Thing call() throws Exception { return new Thing(v); } })).subscribeOn(Schedulers.newThread()); } /** Data type. */ public static class Thing { private final int v; public Thing(final int v) { this.v = v; } @Override public String toString() { return "thing " + v; } } // -------------- GENERATED CODE ---------------- static final class UserActivityOperator extends OperatorBase<UserActivity, UserActivity$$LoaderDescription> { // construction UserActivityOperator(final OperatorContext<UserActivity> operatorContext) { super(new UserActivity$$LoaderDescription(operatorContext), operatorContext); } public static OperatorBuilder<UserActivityOperator, UserActivity> build() { return new OperatorBuilderBase<UserActivityOperator, UserActivity>() { @Override protected UserActivityOperator create(final OperatorContext<UserActivity> context) { return new UserActivityOperator(context); } }; } // invocation public void loadThing(final int param) { AsyncProvider<Thing> provider = new ObservableAsyncProvider<Thing>() { @Override protected Observable<Thing> provideObservable() { return getOperations().loadThing(param); } }; initLoader(1, provider, false); } public void forceLoadThing(final int param) { AsyncProvider<Thing> provider = new ObservableAsyncProvider<Thing>() { @Override protected Observable<Thing> provideObservable() { return getOperations().loadThing(param); } }; restartLoader(1, provider, false); } public void sendThing(final int param) { AsyncProvider<Thing> provider = new ObservableAsyncProvider<Thing>() { @Override protected Observable<Thing> provideObservable() { return getOperations().sendThing(param); } }; restartLoader(2, provider, true); } // cancellation public void cancelLoadThing() { destroyLoader(LOADER_LOAD); } public void cancelSendThing() { destroyLoader(LOADER_SEND); } } /* same visibility */ static final class UserActivity$$LoaderDescription extends LoaderDescription { UserActivity$$LoaderDescription(final OperatorBase.OperatorContext<UserActivity> context) { super(context); } /* same visibility */ Observable<Thing> loadThingIsFinished() { return ObservableTools.loaderObservable(LOADER_LOAD, this, false); } /* same visibility */ Observable<Thing> sendThingIsFinished() { return ObservableTools.loaderObservable(LOADER_SEND, this, true); } } }