package com.airbnb.epoxy.sample; import android.graphics.Color; import android.os.Bundle; import android.os.Parcelable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.RecyclerView.RecycledViewPool; import com.airbnb.epoxy.R; import com.airbnb.epoxy.sample.SampleController.AdapterCallbacks; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Random; /** * Example activity usage for {@link com.airbnb.epoxy.EpoxyController}. */ public class MainActivity extends AppCompatActivity implements AdapterCallbacks { private static final Random RANDOM = new Random(); private static final String CAROUSEL_DATA_KEY = "carousel_data_key"; private static final int SPAN_COUNT = 2; private final RecycledViewPool recycledViewPool = new RecycledViewPool(); private final SampleController controller = new SampleController(this, recycledViewPool); private List<CarouselData> carousels = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Many carousels and color models are shown on screen at once. The default recycled view // pool size is only 5, so we manually set the pool size to avoid constantly creating new views // We also use a shared view pool so that carousels can recycle items between themselves. recycledViewPool.setMaxRecycledViews(R.layout.model_color, Integer.MAX_VALUE); recycledViewPool.setMaxRecycledViews(R.layout.model_carousel_group, Integer.MAX_VALUE); RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); recyclerView.setRecycledViewPool(recycledViewPool); // We are using a multi span grid to allow two columns of buttons. To set this up we need // to set our span count on the controller and then get the span size lookup object from // the controller. This look up object will delegate span size lookups to each model. controller.setSpanCount(SPAN_COUNT); GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 2); gridLayoutManager.setSpanSizeLookup(controller.getSpanSizeLookup()); recyclerView.setLayoutManager(gridLayoutManager); recyclerView.setHasFixedSize(true); recyclerView.addItemDecoration(new VerticalGridCardSpacingDecoration()); recyclerView.setItemAnimator(new SampleItemAnimator()); recyclerView.setAdapter(controller.getAdapter()); if (savedInstanceState != null) { carousels = savedInstanceState.getParcelableArrayList(CAROUSEL_DATA_KEY); } updateController(); } @Override protected void onSaveInstanceState(Bundle state) { super.onSaveInstanceState(state); state.putParcelableArrayList(CAROUSEL_DATA_KEY, (ArrayList<? extends Parcelable>) carousels); controller.onSaveInstanceState(state); } @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); controller.onRestoreInstanceState(savedInstanceState); } private void updateController() { controller.setData(carousels); } @Override public void onAddCarouselClicked() { CarouselData carousel = new CarouselData(carousels.size(), new ArrayList<>()); addColorToCarousel(carousel); carousels.add(0, carousel); updateController(); } private void addColorToCarousel(CarouselData carousel) { List<ColorData> colors = carousel.getColors(); colors.add(0, new ColorData(randomColor(), colors.size())); } @Override public void onClearCarouselsClicked() { carousels.clear(); updateController(); } @Override public void onShuffleCarouselsClicked() { Collections.shuffle(carousels); updateController(); } @Override public void onChangeAllColorsClicked() { for (CarouselData carouselData : carousels) { for (ColorData colorData : carouselData.getColors()) { colorData.setColorInt(randomColor()); } } updateController(); } @Override public void onAddColorToCarouselClicked(CarouselData carousel) { addColorToCarousel(carousel); updateController(); } @Override public void onClearCarouselClicked(CarouselData carousel) { carousel.getColors().clear(); updateController(); } @Override public void onShuffleCarouselColorsClicked(CarouselData carousel) { Collections.shuffle(carousel.getColors()); updateController(); } @Override public void onChangeCarouselColorsClicked(CarouselData carousel) { for (ColorData colorData : carousel.getColors()) { colorData.setColorInt(randomColor()); } updateController(); } @Override public void onColorClicked(CarouselData carousel, int colorPosition) { int carouselPosition = carousels.indexOf(carousel); ColorData colorData = carousels.get(carouselPosition).getColors().get(colorPosition); colorData.setPlayAnimation(!colorData.shouldPlayAnimation()); updateController(); } private static int randomColor() { int r = RANDOM.nextInt(256); int g = RANDOM.nextInt(256); int b = RANDOM.nextInt(256); return Color.rgb(r, g, b); } }