package com.example.android.unsplash; import android.app.Activity; import android.app.ActivityOptions; import android.content.Intent; import android.graphics.Rect; import android.net.Uri; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ProgressBar; import com.example.android.unsplash.data.UnsplashService; import com.example.android.unsplash.data.model.Photo; import com.example.android.unsplash.ui.ForegroundImageView; import com.example.android.unsplash.ui.ItemClickSupport; import com.squareup.picasso.Picasso; import java.util.List; import butterknife.Bind; import butterknife.BindDimen; import butterknife.BindInt; import butterknife.ButterKnife; import retrofit.Callback; import retrofit.RestAdapter; import retrofit.RetrofitError; import retrofit.client.Response; public class MainActivity extends Activity { private static final int PHOTO_COUNT = 12; @Bind(R.id.image_grid) RecyclerView grid; @Bind(android.R.id.empty) ProgressBar empty; @BindInt(R.integer.photo_grid_columns) int columns; @BindDimen(R.dimen.grid_item_spacing) int gridSpacing; private PhotoAdapter adapter; private String photoUrlBase; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); GridLayoutManager gridLayoutManager = new GridLayoutManager(this, columns); gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { /* emulating https://material-design.storage.googleapis.com/publish/material_v_4/material_ext_publish/0B6Okdz75tqQsck9lUkgxNVZza1U/style_imagery_integration_scale1.png */ switch (position % 6) { case 0: case 1: case 2: case 4: return 1; case 3: return 2; default: return 3; } } }); grid.setLayoutManager(gridLayoutManager); grid.addItemDecoration(new GridMarginDecoration(gridSpacing)); grid.setHasFixedSize(true); photoUrlBase = "https://unsplash.it/" + getResources().getDisplayMetrics().widthPixels + "?image="; ItemClickSupport.addTo(grid).setOnItemClickListener( new ItemClickSupport.OnItemClickListener() { @Override public void onItemClicked(RecyclerView recyclerView, int position, View view) { Photo photo = adapter.getItem(position); Intent intent = new Intent(MainActivity.this, DetailActivity.class); intent.setAction(Intent.ACTION_VIEW); intent.setData(Uri.parse(photoUrlBase + photo.id)); intent.putExtra(DetailActivity.EXTRA_AUTHOR, photo.author); MainActivity.this.startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, view, view.getTransitionName()).toBundle()); } }); UnsplashService unsplashApi = new RestAdapter.Builder() .setEndpoint(UnsplashService.ENDPOINT) .build() .create(UnsplashService.class); unsplashApi.getFeed(new Callback<List<Photo>>() { @Override public void success(List<Photo> photos, Response response) { //grid.setAdapter(new PhotoAdapter(photos)); // the first items are really boring, get the last <n> adapter = new PhotoAdapter(photos.subList(photos.size() - PHOTO_COUNT, photos .size())); grid.setAdapter(adapter); empty.setVisibility(View.GONE); } @Override public void failure(RetrofitError error) { Log.e(getClass().getCanonicalName(), "Error retrieving Unsplash feed:", error); } }); } /* protected */ static class PhotoViewHolder extends RecyclerView.ViewHolder { @Bind(R.id.photo) ForegroundImageView imageView; public PhotoViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } } private static class GridMarginDecoration extends RecyclerView.ItemDecoration { private int space; public GridMarginDecoration(int space) { this.space = space; } @Override public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) { outRect.left = space; outRect.top = space; outRect.right = space; outRect.bottom = space; } } private class PhotoAdapter extends RecyclerView.Adapter<PhotoViewHolder> { private final List<Photo> photos; public PhotoAdapter(List<Photo> photos) { this.photos = photos; } @Override public PhotoViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new PhotoViewHolder( LayoutInflater.from(MainActivity.this) .inflate(R.layout.photo_item, parent, false)); } @Override public void onBindViewHolder(final PhotoViewHolder holder, final int position) { final Photo photo = photos.get(position); String url = photoUrlBase + photo.id; Picasso.with(MainActivity.this) .load(url) .placeholder(R.color.placeholder) .into(holder.imageView); } @Override public int getItemCount() { return photos.size(); } @Override public long getItemId(int position) { return photos.get(position).id; } public Photo getItem(int position) { return photos.get(position); } } }