package com.alorma.github.ui.fragment.detail.repo; import android.os.Bundle; import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import com.alorma.github.R; import com.alorma.github.sdk.bean.dto.response.Contributor; import com.alorma.github.sdk.bean.info.RepoInfo; import com.alorma.github.sdk.services.client.GithubClient; import com.alorma.github.sdk.services.repo.GetRepoContributorsClient; import com.alorma.github.ui.adapter.users.UsersAdapter; import com.alorma.github.ui.fragment.base.LoadingListFragment; import com.mikepenz.octicons_typeface_library.Octicons; import core.User; import java.util.ArrayList; import java.util.List; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.schedulers.Schedulers; public class RepoContributorsFragment extends LoadingListFragment<UsersAdapter> { private static final String REPO_INFO = "REPO_INFO"; private RepoInfo repoInfo; private Subscription subscribe; public static RepoContributorsFragment newInstance(RepoInfo repoInfo) { Bundle bundle = new Bundle(); bundle.putParcelable(REPO_INFO, repoInfo); RepoContributorsFragment fragment = new RepoContributorsFragment(); fragment.setArguments(bundle); return fragment; } protected void executeRequest() { setAction(new GetRepoContributorsClient(repoInfo)); } protected void executePaginatedRequest(int page) { setAction(new GetRepoContributorsClient(repoInfo, page)); } private void setAction(GithubClient<List<Contributor>> client) { startRefresh(); subscribe = client.observable() .subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .map(contributors -> { List<User> users = new ArrayList<>(); for (Contributor contributor : contributors) { users.add(contributor.author); } return users; }) .subscribe(this::showUsers, throwable -> { if (getAdapter() == null || getAdapter().getItemCount() == 0) { setEmpty(); } }); } private void showUsers(List<User> users) { if (getActivity() != null) { if (users.size() > 0) { hideEmpty(); if (refreshing || getAdapter() == null) { UsersAdapter adapter = new UsersAdapter(LayoutInflater.from(getActivity())); adapter.addAll(users); setAdapter(adapter); } else { getAdapter().addAll(users); } } else if (getAdapter() == null || getAdapter().getItemCount() == 0) { setEmpty(); } else { getAdapter().clear(); setEmpty(); } } } @Override protected int getLightTheme() { return R.style.AppTheme_Repository; } @Override protected int getDarkTheme() { return R.style.AppTheme_Dark_Repository; } @Override protected RecyclerView.LayoutManager getLayoutManager() { return new GridLayoutManager(getActivity(), getResources().getInteger(R.integer.grid_layout_columns)); } protected void loadArguments() { if (getArguments() != null) { repoInfo = getArguments().getParcelable(REPO_INFO); } } @Override protected Octicons.Icon getNoDataIcon() { return Octicons.Icon.oct_person; } @Override protected int getNoDataText() { return R.string.no_contributors; } @Override public void onStop() { if (subscribe != null) { subscribe.unsubscribe(); } super.onStop(); } }