package com.mirhoseini.marvel.character.cache;
import android.content.Context;
import android.os.Bundle;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;
import com.mirhoseini.marvel.MarvelApplication;
import com.mirhoseini.marvel.R;
import com.mirhoseini.marvel.base.BaseFragment;
import com.mirhoseini.marvel.character.cache.adapter.CharactersRecyclerViewAdapter;
import com.mirhoseini.marvel.database.model.CharacterModel;
import com.mirhoseini.marvel.util.AppConstants;
import com.mirhoseini.marvel.util.GridSpacingItemDecoration;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import rx.Observable;
import rx.subjects.PublishSubject;
import rx.subscriptions.CompositeSubscription;
import timber.log.Timber;
/**
* Created by Mohsen on 20/10/2016.
*/
public class CacheFragment extends BaseFragment implements CacheView {
public static final int COLUMN_COUNT = 2;
// injecting dependencies via Dagger
@Inject
Context context;
@Inject
CachePresenter presenter;
@Inject
CharactersRecyclerViewAdapter adapter;
// injecting views via ButterKnife
@BindView(R.id.list)
RecyclerView list;
@BindView(R.id.empty)
ViewGroup empty;
CompositeSubscription subscriptions = new CompositeSubscription();
GridLayoutManager gridLayoutManager;
GridSpacingItemDecoration gridSpacingItemDecoration;
PublishSubject<CharacterModel> notifyCharacter = PublishSubject.create();
PublishSubject<String> notifyMessage = PublishSubject.create();
PublishSubject<Boolean> notifyOffline = PublishSubject.create();
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public CacheFragment() {
}
public static CacheFragment newInstance() {
CacheFragment fragment = new CacheFragment();
return fragment;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
presenter.bind(this);
subscriptions.add(
adapter.asObservable()
.subscribe(notifyCharacter::onNext));
}
@Override
protected void injectDependencies(MarvelApplication application) {
application
.getCacheSubComponent()
.inject(this);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_cache, container, false);
ButterKnife.bind(this, view);
initRecyclerView();
return view;
}
@Override
public void onResume() {
super.onResume();
presenter.loadLast5CharactersCachedData();
}
@Override
public void onDetach() {
super.onDetach();
presenter.unbind();
subscriptions.unsubscribe();
}
@Override
public void showMessage(String message) {
notifyMessage.onNext(message);
}
@Override
public void showOfflineMessage(boolean isCritical) {
notifyOffline.onNext(isCritical);
}
private void initRecyclerView() {
initLayoutManager();
initGridSpacingItemDecoration();
list.setLayoutManager(gridLayoutManager);
list.addItemDecoration(gridSpacingItemDecoration);
}
public void initLayoutManager() {
gridLayoutManager = new GridLayoutManager(context, COLUMN_COUNT);
// Create a custom SpanSizeLookup where the first item spans both columns
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return position == 0 ? COLUMN_COUNT : 1;
}
});
}
public void initGridSpacingItemDecoration() {
gridSpacingItemDecoration = new GridSpacingItemDecoration(COLUMN_COUNT, AppConstants.RECYCLER_VIEW_ITEM_SPACE, true, 1);
}
@Override
public void setLast5CharactersCachedData(List<CharacterModel> characterModels) {
if (characterModels.size() > 0) {
list.setVisibility(View.VISIBLE);
empty.setVisibility(View.GONE);
adapter.setCharacters(characterModels);
list.setAdapter(adapter);
} else {
list.setVisibility(View.GONE);
empty.setVisibility(View.VISIBLE);
}
}
@Override
public void showError(Throwable throwable) {
Timber.e(throwable, "Error!");
Toast.makeText(context, throwable.getMessage(), Toast.LENGTH_LONG).show();
}
public Observable<CharacterModel> characterObservable() {
return notifyCharacter.asObservable();
}
public Observable<String> messageObservable() {
return notifyMessage.asObservable();
}
public Observable<Boolean> offlineObservable() {
return notifyOffline.asObservable();
}
}