package com.mikepenz.unsplash.fragments; import android.app.Fragment; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Build; import android.os.Bundle; import android.support.v4.app.ActivityOptionsCompat; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.ProgressBar; import com.mikepenz.unsplash.OnItemClickListener; import com.mikepenz.unsplash.R; import com.mikepenz.unsplash.activities.DetailActivity; import com.mikepenz.unsplash.activities.MainActivity; import com.mikepenz.unsplash.models.Image; import com.mikepenz.unsplash.models.ImageList; import com.mikepenz.unsplash.network.UnsplashApi; import com.mikepenz.unsplash.views.adapters.ImageAdapter; import java.util.ArrayList; import java.util.Collections; import retrofit.RetrofitError; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; import tr.xip.errorview.ErrorView; import tr.xip.errorview.RetryListener; public class ImagesFragment extends Fragment { public static SparseArray<Bitmap> photoCache = new SparseArray<>(1); private UnsplashApi mApi = new UnsplashApi(); private ImageAdapter mImageAdapter; private ArrayList<Image> mImages; private ArrayList<Image> mCurrentImages; private RecyclerView mImageRecycler; private ProgressBar mImagesProgress; private ErrorView mImagesErrorView; @Override public void onCreate(Bundle savedInstanceState) { setHasOptionsMenu(true); if (ImagesFragment.this.getActivity() instanceof MainActivity) { ((MainActivity) ImagesFragment.this.getActivity()).setOnFilterChangedListener(new MainActivity.OnFilterChangedListener() { @Override public void onFilterChanged(long filter) { if (mImages != null) { if (filter == MainActivity.Category.ALL.id) { showAll(); } else if (filter == MainActivity.Category.FEATURED.id) { showFeatured(); } else if (filter == MainActivity.Category.LOVED.id) { //TODO } else { showCategory(filter); } } } }); } super.onCreate(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_images, container, false); mImageRecycler = (RecyclerView) rootView.findViewById(R.id.fragment_last_images_recycler); mImagesProgress = (ProgressBar) rootView.findViewById(R.id.fragment_images_progress); mImagesErrorView = (ErrorView) rootView.findViewById(R.id.fragment_images_error_view); GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 1); mImageRecycler.setLayoutManager(gridLayoutManager); mImageRecycler.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { return false; } }); mImageAdapter = new ImageAdapter(); mImageAdapter.setOnItemClickListener(recyclerRowClickListener); mImageRecycler.setAdapter(mImageAdapter); showAll(); return rootView; } @Override public void onResume() { super.onResume(); } private void showAll() { if (mImages != null) { updateAdapter(mImages); } else { mImagesProgress.setVisibility(View.VISIBLE); mImageRecycler.setVisibility(View.GONE); mImagesErrorView.setVisibility(View.GONE); // Load images from API mApi.fetchImages().cache().subscribeOn(Schedulers.newThread()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(observer); } } private void showFeatured() { updateAdapter(mApi.filterFeatured(mImages)); } private void showCategory(long category) { updateAdapter(mApi.filterCategory(mImages, category)); } private Observer<ImageList> observer = new Observer<ImageList>() { @Override public void onNext(final ImageList images) { mImages = images.getData(); updateAdapter(mImages); if (ImagesFragment.this.getActivity() instanceof MainActivity) { ((MainActivity) ImagesFragment.this.getActivity()).setCategoryCount(images); } } @Override public void onCompleted() { // Dismiss loading dialog mImagesProgress.setVisibility(View.GONE); mImageRecycler.setVisibility(View.VISIBLE); mImagesErrorView.setVisibility(View.GONE); } @Override public void onError(final Throwable error) { if (error instanceof RetrofitError) { RetrofitError e = (RetrofitError) error; if (e.getKind() == RetrofitError.Kind.NETWORK) { mImagesErrorView.setErrorTitle(R.string.error_network); mImagesErrorView.setErrorSubtitle(R.string.error_network_subtitle); } else if (e.getKind() == RetrofitError.Kind.HTTP) { mImagesErrorView.setErrorTitle(R.string.error_server); mImagesErrorView.setErrorSubtitle(R.string.error_server_subtitle); } else { mImagesErrorView.setErrorTitle(R.string.error_uncommon); mImagesErrorView.setErrorSubtitle(R.string.error_uncommon_subtitle); } } mImagesProgress.setVisibility(View.GONE); mImageRecycler.setVisibility(View.GONE); mImagesErrorView.setVisibility(View.VISIBLE); mImagesErrorView.setOnRetryListener(new RetryListener() { @Override public void onRetry() { showAll(); } }); } }; private OnItemClickListener recyclerRowClickListener = new OnItemClickListener() { @Override public void onClick(View v, int position) { Image selectedImage = mCurrentImages.get(position); Intent detailIntent = new Intent(getActivity(), DetailActivity.class); detailIntent.putExtra("position", position); detailIntent.putExtra("selected_image", selectedImage); if (selectedImage.getSwatch() != null) { detailIntent.putExtra("swatch_title_text_color", selectedImage.getSwatch().getTitleTextColor()); detailIntent.putExtra("swatch_rgb", selectedImage.getSwatch().getRgb()); } ImageView coverImage = (ImageView) v.findViewById(R.id.item_image_img); if (coverImage == null) { coverImage = (ImageView) ((View) v.getParent()).findViewById(R.id.item_image_img); } if (Build.VERSION.SDK_INT >= 21) { if (coverImage.getParent() != null) { ((ViewGroup) coverImage.getParent()).setTransitionGroup(false); } } if (coverImage != null && coverImage.getDrawable() != null) { Bitmap bitmap = ((BitmapDrawable) coverImage.getDrawable()).getBitmap(); //ew if (bitmap != null && !bitmap.isRecycled()) { photoCache.put(position, bitmap); // Setup the transition to the detail activity ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), coverImage, "cover"); startActivity(detailIntent, options.toBundle()); } } } }; @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_shuffle) { if (mImages != null) { //we don't want to shuffle the original list ArrayList<Image> shuffled = new ArrayList<Image>(mImages); Collections.shuffle(shuffled); mImageAdapter.updateData(shuffled); updateAdapter(shuffled); } } return super.onOptionsItemSelected(item); } /** * a small helper class to update the adapter * * @param images */ private void updateAdapter(ArrayList<Image> images) { mCurrentImages = images; mImageAdapter.updateData(mCurrentImages); mImageRecycler.scrollToPosition(0); /* mImageAdapter = new ImageAdapter(images); mImageAdapter.setOnItemClickListener(recyclerRowClickListener); mImageRecycler.setAdapter(mImageAdapter); */ } }