package com.photo.photogallery.photos;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
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 com.photo.photogallery.PhotoGalleryApp;
import com.photo.photogallery.R;
import com.photo.photogallery.api.entities.Photo;
import com.photo.photogallery.api.entities.RecentPhotos;
import com.photo.photogallery.network.AppImageLoader;
import com.photo.photogallery.other.SpacesItemDecoration;
import com.photo.photogallery.photodetail.PhotoDetailActivity;
import com.photo.photogallery.search.SearchActivity;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import static android.support.v7.widget.LinearLayoutManager.VERTICAL;
import static android.view.View.GONE;
import static android.view.View.VISIBLE;
public class PhotosFragment extends Fragment implements
PhotosView, PhotosAdapter.Listener, SwipeRefreshLayout.OnRefreshListener {
@BindView(R.id.swipe_refresh_layout)
SwipeRefreshLayout swipeRefreshLayout;
@BindView(R.id.photos_loading_ui)
View loadingUiView;
@BindView(R.id.photos_loading_error_ui)
View errorUiView;
@BindView(R.id.photos_content_ui)
RecyclerView contentUiRecyclerView;
PhotosAdapter photosAdapter;
@Inject
AppImageLoader imageLoader;
@Inject
PhotosPresenter photosPresenter;
@NonNull
private Unbinder unbinder;
private boolean showAsGrid;
public PhotosFragment() {
}
public PhotosFragment newInstance() {
return new PhotosFragment();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
PhotoGalleryApp.get(getContext()).applicationComponent().plus(new PhotosModule(this)).inject(this);
setHasOptionsMenu(true);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_photos, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
unbinder = ButterKnife.bind(this, view);
contentUiRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));
SpacesItemDecoration decoration = new SpacesItemDecoration(4);
contentUiRecyclerView.addItemDecoration(decoration);
photosAdapter = new PhotosAdapter(this, getActivity().getLayoutInflater(), contentUiRecyclerView, imageLoader);
contentUiRecyclerView.setAdapter(photosAdapter);
setupSwipeRefreshLayout();
}
private void setupSwipeRefreshLayout() {
swipeRefreshLayout.setOnRefreshListener(this);
swipeRefreshLayout.setColorSchemeResources(
android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light
);
}
@Override
public void onRefresh() {
photosPresenter.getRecent();
}
@Override
public void setPresenter(PhotosPresenter photosPresenter) {
this.photosPresenter = photosPresenter;
}
@Override
public void onResume() {
super.onResume();
photosPresenter.subscribe();
}
@Override
public void onPause() {
super.onPause();
photosPresenter.unsubscribe();
}
@Override
public void showLoadingUi() {
errorUiView.setVisibility(GONE);
if (!swipeRefreshLayout.isRefreshing()) {
loadingUiView.setVisibility(VISIBLE);
contentUiRecyclerView.setVisibility(GONE);
}
}
@Override
public void showErrorUi(@NonNull Throwable error) {
loadingUiView.setVisibility(GONE);
errorUiView.setVisibility(VISIBLE);
contentUiRecyclerView.setVisibility(GONE);
}
@Override
public void showContentUi(@NonNull RecentPhotos recentPhotos) {
loadingUiView.setVisibility(GONE);
errorUiView.setVisibility(GONE);
contentUiRecyclerView.setVisibility(VISIBLE);
if (photosAdapter != null) {
photosAdapter.setData(recentPhotos.photosCollection().photos());
}
swipeRefreshLayout.setRefreshing(false);
}
@Override
public void OnPhotoSelected(@NonNull Photo photo) {
Intent photoDetailIntent = PhotoDetailActivity.getIntent(getContext());
photoDetailIntent.putExtra(PhotoDetailActivity.ARGUMENT_PHOTO, photo);
startActivity(photoDetailIntent);
}
@Override
public void onDestroyView() {
if (unbinder != null) {
unbinder.unbind();
}
super.onDestroyView();
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.menu_main, menu);
MenuItem menuItem = menu.findItem(R.id.menu_show_as);
switchLayout(true, menuItem);
super.onCreateOptionsMenu(menu, inflater);
}
private void switchLayout(boolean showAsGrid, MenuItem menuItem) {
if (showAsGrid) {
photosAdapter.setLayoutMode(PhotosAdapter.GRID_VIEW_MODE);
menuItem.setIcon(R.drawable.ic_list);
menuItem.setTitle(R.string.menu_show_as_list);
contentUiRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 3));
this.showAsGrid = false;
} else {
photosAdapter.setLayoutMode(PhotosAdapter.LIST_VIEW_MODE);
menuItem.setIcon(R.drawable.ic_grid);
menuItem.setTitle(R.string.menu_show_as_grid);
contentUiRecyclerView.setLayoutManager(new LinearLayoutManager(getContext(), VERTICAL, false));
this.showAsGrid = true;
}
menuItem.setShowAsActionFlags(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menu_show_as:
switchLayout(showAsGrid, item);
break;
case R.id.menu_search:
Intent searchIntent = SearchActivity.getIntent(getContext());
startActivity(searchIntent);
default:
return super.onOptionsItemSelected(item);
}
return true;
}
}