package com.aswifter.material.book;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.ActivityOptionsCompat;
import android.support.v4.app.Fragment;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.OvershootInterpolator;
import android.widget.ProgressBar;
import com.afollestad.materialdialogs.MaterialDialog;
import com.aswifter.material.R;
import com.aswifter.material.common.ThreadPool;
import com.aswifter.material.widget.RecyclerItemClickListener;
import com.google.android.agera.BaseObservable;
import com.google.android.agera.Repositories;
import com.google.android.agera.Repository;
import com.google.android.agera.Result;
import com.google.android.agera.Updatable;
import java.util.List;
import java.util.concurrent.ExecutorService;
/**
* Created by Chenyc on 15/7/1.
*/
public class BooksFragment extends Fragment implements Updatable {
private RecyclerView mRecyclerView;
private MyAdapter mAdapter;
private ProgressBar mProgressBar;
private FloatingActionButton mFabButton;
private static final int ANIM_DURATION_FAB = 400;
private ExecutorService networkExecutor;
private Repository<Result<List<Book>>> booksRepository;
private SearchObservable searchObservable;
private BooksSupplier booksSupplier;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_books, null);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
mRecyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), onItemClickListener));
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
mProgressBar = (ProgressBar) view.findViewById(R.id.progressBar);
mAdapter = new MyAdapter(this, getActivity());
mRecyclerView.setAdapter(mAdapter);
setUpFAB(view);
setUpRepository();
return view;
}
public class SearchObservable extends BaseObservable {
public void doSearch(String key) {
booksSupplier.setKey(key);
dispatchUpdate();
}
}
private void setUpRepository() {
searchObservable = new SearchObservable();
booksSupplier = new BooksSupplier(getString(R.string.default_search_keyword));
// Set up books repository
booksRepository = Repositories
.repositoryWithInitialValue(Result.<List<Book>>absent())
.observe(searchObservable)
.onUpdatesPerLoop()
.goTo(ThreadPool.executor)
.thenGetFrom(booksSupplier)
.compile();
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mFabButton.setTranslationY(2 * getResources().getDimensionPixelOffset(R.dimen.btn_fab_size));
//doSearch(getString(R.string.default_search_keyword));
}
@Override
public void update() {
mProgressBar.setVisibility(View.GONE);
startFABAnimation();
if (booksRepository.get().isPresent()) {
mAdapter.updateItems(booksRepository.get().get(), true);
}
}
@Override
public void onResume() {
super.onResume();
booksRepository.addUpdatable(this);
}
@Override
public void onPause() {
super.onPause();
booksRepository.removeUpdatable(this);
}
private void doSearch(String keyword) {
mProgressBar.setVisibility(View.VISIBLE);
mAdapter.clearItems();
searchObservable.doSearch(keyword);
}
private void setUpFAB(View view) {
mFabButton = (FloatingActionButton) view.findViewById(R.id.fab_normal);
mFabButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new MaterialDialog.Builder(getActivity())
.title(R.string.search)
//.inputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD)
.input(R.string.input_hint, R.string.input_prefill, new MaterialDialog.InputCallback() {
@Override
public void onInput(MaterialDialog dialog, CharSequence input) {
// Do something
if (!TextUtils.isEmpty(input)) {
doSearch(input.toString());
}
}
}).show();
}
});
}
private void startFABAnimation() {
mFabButton.animate()
.translationY(0)
.setInterpolator(new OvershootInterpolator(1.f))
.setStartDelay(500)
.setDuration(ANIM_DURATION_FAB)
.start();
}
private RecyclerItemClickListener.OnItemClickListener onItemClickListener = new RecyclerItemClickListener.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
Book book = mAdapter.getBook(position);
Intent intent = new Intent(getActivity(), BookDetailActivity.class);
intent.putExtra("book", book);
ActivityOptionsCompat options =
ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
view.findViewById(R.id.ivBook), getString(R.string.transition_book_img));
ActivityCompat.startActivity(getActivity(), intent, options.toBundle());
}
};
}