package com.github.captain_miao.agera.tutorial; import android.databinding.DataBindingUtil; import android.graphics.Bitmap; import android.os.Bundle; import android.support.annotation.NonNull; import com.github.captain_miao.agera.tutorial.base.BaseActivity; import com.github.captain_miao.agera.tutorial.databinding.ActivityAgeraFunctionsBinding; import com.github.captain_miao.agera.tutorial.helper.MockRandomData; import com.github.captain_miao.agera.tutorial.observable.OnClickObservable; import com.github.captain_miao.agera.tutorial.supplier.ImageSupplier; import com.google.android.agera.Function; import com.google.android.agera.Functions; import com.google.android.agera.Repositories; import com.google.android.agera.Repository; import com.google.android.agera.Result; import com.google.android.agera.Supplier; import com.google.android.agera.Updatable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import static com.github.captain_miao.agera.tutorial.helper.MockRandomData.sImageSize; public class SimpleActivityI extends BaseActivity implements Updatable { private ActivityAgeraFunctionsBinding mBinding; @Override public void init(Bundle savedInstanceState) { mBinding = DataBindingUtil.setContentView(this, R.layout.activity_agera_functions); setUpRepository(); mBinding.setObservable(mObservable); } //for agera private ExecutorService mExecutor; private OnClickObservable mObservable; private Function<String, Result<Bitmap>> mFunction; private Repository<Result<Bitmap>> mRepository; private int mCount = 0; @Override protected void onResume() { super.onResume(); mRepository.addUpdatable(this); } @Override protected void onPause() { super.onPause(); mRepository.removeUpdatable(this); } @Override protected void onDestroy() { super.onDestroy(); mExecutor.shutdown(); } private void setUpRepository() { mExecutor = Executors.newSingleThreadExecutor(); mObservable = new OnClickObservable() { @Override public void onClick() { mCount++; dispatchUpdate(); } }; mFunction = Functions .functionFrom(String.class) .apply(new Function<String, String>() { @NonNull @Override public String apply(@NonNull String input) { return input.replace(sImageSize[0], sImageSize[mCount % 3]); } }) .apply(new Function<String, Result<Bitmap>>() { @NonNull @Override public Result<Bitmap> apply(@NonNull String input) { return new ImageSupplier(input).get(); } }) .thenApply(new Function<Result<Bitmap>, Result<Bitmap>>() { @NonNull @Override public Result<Bitmap> apply(@NonNull Result<Bitmap> input) { return input; } }); mRepository = Repositories.repositoryWithInitialValue(Result.<Bitmap>absent()) .observe(mObservable) .onUpdatesPerLoop() .goTo(mExecutor) .getFrom(new Supplier<String>() { @NonNull @Override public String get() { return MockRandomData.sImages[5]; } }) .thenTransform(mFunction)// works on work thread(mExecutor) .compile(); } @Override public void update() { if(mRepository.get().succeeded()) { mBinding.setBitmap(mRepository.get().get()); } } }