package com.ambergleam.android.photogallery.controller;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.TextView;
import com.ambergleam.android.photogallery.BaseFragment;
import com.ambergleam.android.photogallery.R;
import com.ambergleam.android.photogallery.callbacks.ClearFavoritesCallback;
import com.ambergleam.android.photogallery.callbacks.LoadFavoritesCallback;
import com.ambergleam.android.photogallery.manager.DataManager;
import com.ambergleam.android.photogallery.model.Favorite;
import com.ambergleam.android.photogallery.model.Photo;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import javax.inject.Inject;
import butterknife.ButterKnife;
import butterknife.Bind;
public class FavoritesFragment extends BaseFragment implements LoadFavoritesCallback, ClearFavoritesCallback {
@Inject DataManager mDataManager;
@Bind(R.id.fragment_favorites_refresh) SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.fragment_favorites_grid) GridView mGridView;
@Bind(R.id.fragment_favorites_empty) TextView mEmptyView;
private ArrayList<Photo> mPhotos;
public static FavoritesFragment newInstance() {
return new FavoritesFragment();
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPhotos = new ArrayList<>();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_favorites, container, false);
ButterKnife.bind(this, view);
setupAdapter();
setupListeners();
return view;
}
@Override
public void onResume() {
super.onResume();
mDataManager.loadFavorites(this);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
inflater.inflate(R.menu.menu_favorites, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_item_favorites_clear:
mDataManager.clearFavorites(this);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
super.onPrepareOptionsMenu(menu);
MenuItem menuItemClear = menu.findItem(R.id.menu_item_favorites_clear);
menuItemClear.setVisible(!mPhotos.isEmpty());
}
private void setupAdapter() {
if (getActivity() == null || mGridView == null) {
return;
}
mGridView.setAdapter(new PhotoGridViewAdapter(mPhotos));
}
private void setupListeners() {
mGridView.setOnItemClickListener((gridView, gridItem, position, id) -> {
Intent intent = new Intent(getActivity(), PhotoActivity.class);
intent.putExtra(PhotoFragment.ARGS_PHOTO, mPhotos.get(position));
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(
getActivity(),
gridItem,
getString(R.string.transition_photo)
);
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
});
mSwipeRefreshLayout.setOnRefreshListener(() -> mDataManager.loadFavorites(this));
mSwipeRefreshLayout.setColorSchemeResources(R.color.primary, R.color.accent);
}
private void updateUI() {
if (mPhotos.isEmpty()) {
mSwipeRefreshLayout.setVisibility(View.GONE);
mEmptyView.setVisibility(View.VISIBLE);
} else {
mSwipeRefreshLayout.setVisibility(View.VISIBLE);
mEmptyView.setVisibility(View.GONE);
}
getActivity().invalidateOptionsMenu();
}
@Override
public void onFavoritesCleared() {
mPhotos = new ArrayList<>();
setupAdapter();
updateUI();
}
@Override
public void onFavoritesLoaded(List<Favorite> favoriteList) {
mPhotos = new ArrayList<>();
for (Favorite favorite : favoriteList) {
mPhotos.add(favorite.getPhoto());
}
setupAdapter();
updateUI();
mSwipeRefreshLayout.setRefreshing(false);
}
private class PhotoGridViewAdapter extends ArrayAdapter<Photo> {
public PhotoGridViewAdapter(ArrayList<Photo> items) {
super(getActivity(), 0, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater().inflate(R.layout.grid_item_favorites, parent, false);
}
Photo item = getItem(position);
ImageView imageView = (ImageView) convertView.findViewById(R.id.grid_item_favorites_image);
Picasso.with(getActivity())
.load(item.getSmallUrl())
.into(imageView);
int size = item.getSmallestSide();
Picasso.with(getActivity())
.load(item.getLargeUrl())
.resize(size, size)
.centerCrop()
.fetch();
return convertView;
}
}
}