package treehou.se.habit.ui.servers.sitemaps;
import android.os.Bundle;
import android.support.v4.app.FragmentManager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.trello.rxlifecycle.RxLifecycle;
import com.trello.rxlifecycle.components.support.RxFragment;
import java.util.List;
import javax.inject.Inject;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import io.realm.Realm;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.subjects.BehaviorSubject;
import se.treehou.ng.ohcommunicator.connector.models.OHServer;
import se.treehou.ng.ohcommunicator.connector.models.OHSitemap;
import treehou.se.habit.HabitApplication;
import treehou.se.habit.R;
import treehou.se.habit.core.db.model.ServerDB;
import treehou.se.habit.core.db.model.SitemapDB;
import treehou.se.habit.module.ServerLoaderFactory;
import treehou.se.habit.ui.adapter.SitemapListAdapter;
import treehou.se.habit.util.Settings;
public class SitemapSelectFragment extends RxFragment {
private static final String TAG = "SitemapSelectFragment";
private static final String ARG_SHOW_SERVER = "ARG_SHOW_SERVER";
@Inject Settings settings;
@Inject ServerLoaderFactory serverLoader;
@BindView(R.id.list) RecyclerView listView;
@BindView(R.id.empty) TextView emptyView;
private SitemapListAdapter sitemapAdapter;
private Realm realm;
private Unbinder unbinder;
private BehaviorSubject<OHServer> serverBehaviorSubject = BehaviorSubject.create();
private long serverId = -1;
/**
* Load sitemaps for servers.
* Open provided sitemap if loaded.
*
* @param serverId the server to load
* @return Fragment
*/
public static SitemapSelectFragment newInstance(long serverId) {
SitemapSelectFragment fragment = new SitemapSelectFragment();
Bundle args = new Bundle();
args.putLong(ARG_SHOW_SERVER, serverId);
fragment.setArguments(args);
return fragment;
}
public SitemapSelectFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((HabitApplication) getActivity().getApplication()).component().inject(this);
realm = Realm.getDefaultInstance();
serverId = getArguments().getLong(ARG_SHOW_SERVER);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sitemaplist, container, false);
unbinder = ButterKnife.bind(this, view);
setupActionBar();
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(), 1);
listView.setLayoutManager(gridLayoutManager);
listView.setItemAnimator(new DefaultItemAnimator());
sitemapAdapter = new SitemapListAdapter(getContext());
sitemapAdapter.setSitemapSelectedListener(new SitemapListAdapter.SitemapSelectedListener() {
@Override
public void onSelected(OHServer server, OHSitemap sitemap) {
SitemapDB sitemapDB = realm.where(SitemapDB.class)
.equalTo("server.id", serverId)
.equalTo("name", sitemap.getName())
.findFirst();
if(sitemapDB != null){
openSitemap(sitemapDB);
}
}
@Override
public void onErrorSelected(OHServer server) {
serverBehaviorSubject.onNext(server);
}
});
listView.setAdapter(sitemapAdapter);
return view;
}
/**
* Open fragment showing sitemap.
*
* @param sitemap the name of sitemap to show.
*/
private void openSitemap(SitemapDB sitemap){
FragmentManager fragmentManager = getActivity().getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.page_container, SitemapSettingsFragment.newInstance(sitemap.getId()))
.addToBackStack(null)
.commit();
}
/**
* Setup actionbar.
*/
private void setupActionBar(){
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if(actionBar != null) actionBar.setTitle(R.string.sitemaps);
}
/**
* Clears list of sitemaps.
*/
private void clearList() {
emptyView.setVisibility(View.VISIBLE);
sitemapAdapter.clear();
}
@Override
public void onResume() {
super.onResume();
clearList();
loadSitemapsFromServers();
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@Override
public void onDestroy() {
super.onDestroy();
realm.close();
}
/**
* Load servers from database and request their sitemaps.
*/
private void loadSitemapsFromServers(){
realm.where(ServerDB.class).equalTo("id", serverId).findAll().asObservable()
.flatMap(Observable::from)
.map(ServerDB::toGeneric)
.distinct()
.compose(serverLoader.serverToSitemap(getActivity()))
.observeOn(AndroidSchedulers.mainThread())
.compose(RxLifecycle.bindFragment(this.lifecycle()))
.subscribe(serverSitemaps -> {
emptyView.setVisibility(View.GONE);
OHServer server = serverSitemaps.first;
List<OHSitemap> sitemaps = serverSitemaps.second;
for (OHSitemap sitemap : sitemaps) {
sitemapAdapter.add(server, sitemap);
}
}, throwable -> {
Log.e(TAG, "Request sitemap failed", throwable);
});
}
}