package com.alorma.github.ui.fragment.repos; import android.content.SharedPreferences; import android.support.design.widget.Snackbar; import android.view.LayoutInflater; import com.alorma.github.GitskariosSettings; import com.alorma.github.R; import com.alorma.github.sdk.services.client.GithubListClient; import com.alorma.github.ui.adapter.repos.ReposAdapter; import com.alorma.github.ui.fragment.base.LoadingListFragment; import com.alorma.gitskarios.core.Pair; import com.mikepenz.octicons_typeface_library.Octicons; import core.repositories.Repo; import java.util.Collection; import java.util.List; import rx.Observer; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public abstract class BaseReposListFragment extends LoadingListFragment<ReposAdapter> implements SharedPreferences.OnSharedPreferenceChangeListener, Observer<Pair<List<Repo>, Integer>> { private GitskariosSettings settings; @Override public void onCompleted() { stopRefresh(); } @Override public void onError(Throwable e) { e.printStackTrace(); Snackbar.make(recyclerView, R.string.error_loading_repos, Snackbar.LENGTH_SHORT).show(); stopRefresh(); } @Override public void onNext(Pair<List<Repo>, Integer> listIntegerPair) { setPage(listIntegerPair.second); List<Repo> repos = listIntegerPair.first; if (repos.size() > 0) { hideEmpty(); if (refreshing || getAdapter() == null) { setUpList(repos); } else { getAdapter().addAll(repos); } } else if (getAdapter() == null || getAdapter().getItemCount() == 0) { setEmpty(); } else { getAdapter().clear(); setEmpty(); } } protected void setUpList(Collection<Repo> repos) { settings = new GitskariosSettings(getActivity()); settings.registerListener(this); ReposAdapter reposAdapter = new ReposAdapter(LayoutInflater.from(getActivity())); reposAdapter.showOwnerName(showAdapterOwnerName()); reposAdapter.addAll(repos); setAdapter(reposAdapter); } protected boolean showAdapterOwnerName() { return false; } @Override public void setEmpty(boolean withError, int statusCode) { super.setEmpty(withError, statusCode); if (getAdapter() != null) { getAdapter().clear(); } } protected void setAction(GithubListClient<List<Repo>> reposClient) { startRefresh(); reposClient.observable().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(this); } @Override protected Octicons.Icon getNoDataIcon() { return Octicons.Icon.oct_repo; } @Override protected int getNoDataText() { return 0; } @Override public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { if (GitskariosSettings.KEY_REPO_SORT.equals(key)) { executeRequest(); } } @Override public void onDestroy() { if (settings != null) { settings.unregisterListener(this); } super.onDestroy(); } }