package treehou.se.habit.ui.servers.sitemaps;
import android.os.Bundle;
import android.support.v4.util.Pair;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.Switch;
import com.jakewharton.rxbinding.widget.RxCompoundButton;
import com.trello.rxlifecycle.components.support.RxFragment;
import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;
import io.realm.Realm;
import io.realm.RealmResults;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Func1;
import rx.functions.Func2;
import treehou.se.habit.R;
import treehou.se.habit.core.db.model.SitemapDB;
public class SitemapSettingsFragment extends RxFragment {
private static final String TAG = "SitemapSelectFragment";
private static final String ARG_SITEMAP = "ARG_SITEMAP";
@BindView(R.id.show_in_sitemap) Switch cbxShowSitemaps;
private Realm realm;
private Unbinder unbinder;
private long sitemapId = -1;
/**
* Load sitemaps setting.
*
* @param sitemapId the sitemap to load
* @return Fragment
*/
public static SitemapSettingsFragment newInstance(long sitemapId) {
SitemapSettingsFragment fragment = new SitemapSettingsFragment();
Bundle args = new Bundle();
args.putLong(ARG_SITEMAP, sitemapId);
fragment.setArguments(args);
return fragment;
}
/**
* Mandatory empty constructor for the fragment manager to instantiate the
* fragment (e.g. upon screen orientation changes).
*/
public SitemapSettingsFragment() {}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
realm = Realm.getDefaultInstance();
sitemapId = getArguments().getLong(ARG_SITEMAP);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sitemap_settings, container, false);
unbinder = ButterKnife.bind(this, view);
setupActionBar();
Observable<SitemapDB> sitemapObservable = realm.where(SitemapDB.class).equalTo("id", sitemapId).findAll().asObservable()
.flatMap(new Func1<RealmResults<SitemapDB>, Observable<SitemapDB>>() {
@Override
public Observable<SitemapDB> call(RealmResults<SitemapDB> sitemapDBs) {
return Observable.from(sitemapDBs);
}
})
.filter(sitemapDB -> sitemapDB != null && sitemapDB.getSettingsDB() != null)
.distinctUntilChanged();
sitemapObservable.map(sitemapDB -> sitemapDB.getSettingsDB().isDisplay())
.compose(bindToLifecycle())
.subscribe(RxCompoundButton.checked(cbxShowSitemaps));
Observable.combineLatest(sitemapObservable,
RxCompoundButton.checkedChanges(cbxShowSitemaps), Pair::new)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(sitemapDBBooleanPair -> {
SitemapDB sitemapDB = sitemapDBBooleanPair.first;
boolean showSitemap = sitemapDBBooleanPair.second;
realm.beginTransaction();
sitemapDB.getSettingsDB().setDisplay(showSitemap);
realm.commitTransaction();
});
return view;
}
/**
* Setup actionbar.
*/
private void setupActionBar(){
ActionBar actionBar = ((AppCompatActivity) getActivity()).getSupportActionBar();
if(actionBar != null) actionBar.setTitle(R.string.sitemaps);
}
@Override
public void onResume() {
super.onResume();
}
@Override
public void onDestroyView() {
super.onDestroyView();
unbinder.unbind();
}
@Override
public void onDestroy() {
super.onDestroy();
realm.close();
}
}