package com.camnter.newlife.ui.activity.agera; import android.annotation.SuppressLint; import android.os.Bundle; import android.os.Looper; import android.support.annotation.NonNull; import android.widget.TextView; import butterknife.BindView; import butterknife.ButterKnife; import com.camnter.newlife.R; import com.camnter.newlife.core.activity.BaseAppCompatActivity; import com.google.android.agera.Function; import com.google.android.agera.Functions; import com.google.android.agera.Observable; import com.google.android.agera.Repositories; import com.google.android.agera.Repository; import com.google.android.agera.Reservoir; import com.google.android.agera.Reservoirs; import com.google.android.agera.Result; import com.google.android.agera.Supplier; import com.google.android.agera.Updatable; import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.concurrent.Executor; import java.util.concurrent.Executors; /** * Description:AgeraSimpleActivity * Created by:CaMnter * Time:2016-05-30 16:21 */ public class AgeraSimpleActivity extends BaseAppCompatActivity { /*********************** * Test - 8 - Function * ***********************/ private static final String filterString = "???"; @BindView(R.id.agera_observable_text_one) TextView observableOneText; @BindView(R.id.agera_observable_text_two) TextView observableTwoText; @BindView(R.id.agera_observable_text_three) TextView observableThreeText; @BindView(R.id.agera_observable_text_four) TextView observableFourText; @BindView(R.id.agera_observable_text_five) TextView observableFiveText; @BindView(R.id.agera_observable_text_six) TextView observableSixText; @BindView(R.id.agera_observable_text_seven) TextView observableSevenText; @BindView(R.id.agera_observable_text_eight) TextView observableEightText; /************************* * Test - 1 - Observable * *************************/ private Observable observableTestOne = new Observable() { @Override public void addUpdatable(@NonNull Updatable updatable) { updatable.update(); } @Override public void removeUpdatable(@NonNull Updatable updatable) { } }; private Updatable updatableOne = new Updatable() { @SuppressLint("SetTextI18n") @Override public void update() { observableOneText.setText("Jud: " + UUID.randomUUID().toString()); } }; /************************* * Test - 2 - Repository * *************************/ private Supplier<String> supplierTestTwo = () -> { return "Jud: " + UUID.randomUUID().toString(); }; private Repository<String> repositoryTestTwo = Repositories .repositoryWithInitialValue("Tes") .observe() .onUpdatesPerLoop() .thenGetFrom(this.supplierTestTwo) .compile(); private Updatable updatableTwo = new Updatable() { @SuppressLint("SetTextI18n") @Override public void update() { observableTwoText.setText("Jud: " + UUID.randomUUID().toString()); } }; /************************ * Test - 3 - Transform * ************************/ private Repository<String> repositoryTestThree = Repositories .repositoryWithInitialValue("Tes") .observe() .onUpdatesPerLoop() .getFrom(() -> 6) .transform(input -> "Save you from anything " + input) .thenMergeIn(() -> 7, (s, integer) -> s + " and " + integer) .compile(); private Updatable updatableThree = new Updatable() { @Override public void update() { observableThreeText.setText(repositoryTestThree.get()); } }; /*********************** * Test - 4 - Executor * ***********************/ private Executor executor = Executors.newFixedThreadPool( Runtime.getRuntime().availableProcessors()); private Repository<String> repositoryTestFour = Repositories .repositoryWithInitialValue("Tes") .observe() .onUpdatesPerLoop() .goTo(executor) .thenGetFrom(() -> { if (Looper.myLooper() != null || Looper.myLooper() == Looper.getMainLooper()) { return "Main UI Thread: Save you from anything"; } else { return "Child Thread(" + Thread.currentThread().getId() + "): Save you from anything"; } }) .compile(); private Updatable updatableFour = new Updatable() { @Override public void update() { observableFourText.setText(repositoryTestFour.get()); } }; /***************************** * Test - 5 - Error Handling * *****************************/ private Repository<String> repositoryTestFive = Repositories .repositoryWithInitialValue("Tes") .observe() .onUpdatesPerLoop() .attemptGetFrom(new Supplier<Result<String>>() { @NonNull @Override public Result<String> get() { try { throw new RuntimeException("Save you from anything 06"); } catch (Exception e) { return Result.failure(e); } } }) .orEnd(input -> "Throwable message: " + input.getMessage()) .thenTransform(input -> input) .compile(); private Updatable updatableFive = new Updatable() { @Override public void update() { observableFiveText.setText(repositoryTestFive.get()); } }; /*********************** * Test - 6 - Receiver * ***********************/ private Repository<Result<String>> repositoryTestSix = Repositories .repositoryWithInitialValue(Result.<String>absent()) .observe() .onUpdatesPerLoop() .attemptGetFrom(new Supplier<Result<String>>() { @NonNull @Override public Result<String> get() { try { throw new RuntimeException("Save you from anything 06"); } catch (Exception e) { return Result.failure(e); } } }) .orEnd(input -> Result.failure(input)) .thenTransform(input -> Result.absentIfNull(input)) .compile(); private Updatable updatableSix = new Updatable() { @SuppressLint("SetTextI18n") @Override public void update() { repositoryTestSix .get() .ifFailedSendTo(value -> observableSixText.setText("ifFailedSendTo -> " + value)) .ifSucceededSendTo( value -> observableSixText.setText("ifSucceededSendTo -> " + value)); } }; /************************ * Test - 7 - Reservoir * ************************/ private Reservoir<String> reservoir = Reservoirs.reservoir(); private Repository<String> repositoryTestSeven = Repositories .repositoryWithInitialValue("Tes") .observe() .onUpdatesPerLoop() .attemptGetFrom(reservoir) .orSkip() .thenTransform(input -> "Reservoir test: Save you from anything " + input) .compile(); private Updatable updatableSeven = new Updatable() { @Override public void update() { observableSevenText.setText(repositoryTestSeven.get()); } }; private Function<String, Integer> function = Functions .functionFrom(String.class) .unpack( input -> { List<String> list = new ArrayList<>(); list.add("Function test:"); list.add(" "); list.add(input); list.add(" "); list.add("you"); list.add(" "); list.add("from"); list.add(" "); list.add("anything"); list.add(" "); list.add(filterString); return list; }) .filter(value -> value.equals(filterString)) .map(input -> input.getBytes()) .thenApply(input -> { int totalLength = 0; for (byte[] byteArray : input) { totalLength += byteArray.length; } return totalLength; }); private Repository<String> repositoryTestEight = Repositories .repositoryWithInitialValue("Tes") .observe() .onUpdatesPerLoop() .getFrom( () -> "Save") .transform(function) .thenTransform(input -> "Function test: list size = " + input) .compile(); private Updatable updatableEight = new Updatable() { @Override public void update() { observableEightText.setText(repositoryTestEight.get()); } }; /** * Fill in layout id * * @return layout id */ @Override protected int getLayoutId() { return R.layout.activity_agera_simple; } /** * Initialize the view in the layout * * @param savedInstanceState savedInstanceState */ @Override protected void initViews(Bundle savedInstanceState) { this.setTitle("AgeraSimpleActivity"); ButterKnife.bind(this); this.playAgera(); } private void playAgera() { this.observableTestOne.addUpdatable(this.updatableOne); this.repositoryTestTwo.addUpdatable(this.updatableTwo); this.repositoryTestThree.addUpdatable(this.updatableThree); this.repositoryTestFour.addUpdatable(this.updatableFour); this.repositoryTestFive.addUpdatable(this.updatableFive); this.repositoryTestSix.addUpdatable(this.updatableSix); // Reservoir this.repositoryTestSeven.addUpdatable(this.updatableSeven); this.reservoir.accept("CaMnter"); //this.repositoryTestEight.addUpdatable(this.updatableEight); } /** * Initialize the View of the listener */ @Override protected void initListeners() { } /** * Initialize the Activity data */ @Override protected void initData() { } }