package com.alorma.github.ui.fragment.issues.user;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.alorma.github.R;
import com.alorma.github.account.AccountNameProvider;
import com.alorma.github.injector.component.ApiComponent;
import com.alorma.github.injector.component.ApplicationComponent;
import com.alorma.github.injector.component.DaggerApiComponent;
import com.alorma.github.injector.module.ApiModule;
import com.alorma.github.injector.module.issues.UserIssuesModule;
import com.alorma.github.presenter.issue.UserIssuesBaseRxPresenter;
import com.alorma.github.sdk.bean.info.IssueInfo;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.ui.activity.IssueDetailActivity;
import com.alorma.github.ui.activity.PullRequestDetailActivity;
import com.alorma.github.ui.adapter.base.RecyclerArrayAdapter;
import com.alorma.github.ui.fragment.base.BaseFragment;
import com.alorma.github.ui.listeners.TitleProvider;
import com.alorma.github.utils.AttributesUtils;
import com.mikepenz.iconics.typeface.IIcon;
import core.search.IssuesSearchRequest;
import core.issues.Issue;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.inject.Inject;
public abstract class UserIssuesListFragment extends BaseFragment
implements TitleProvider, com.alorma.github.presenter.View<List<Issue>>, RecyclerArrayAdapter.RecyclerAdapterContentListener,
RecyclerArrayAdapter.ItemCallback<Issue> {
@Inject UserIssuesBaseRxPresenter presenter;
@Inject AccountNameProvider accountNameProvider;
private SwipeRefreshLayout refreshLayout;
private RecyclerView recyclerView;
private IssuesAdapter adapter;
@Override
protected void injectComponents(ApplicationComponent applicationComponent) {
super.injectComponents(applicationComponent);
ApiComponent apiComponent = DaggerApiComponent.builder().applicationComponent(applicationComponent).apiModule(new ApiModule()).build();
apiComponent.plus(new UserIssuesModule()).inject(this);
presenter.attachView(this);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
return getLayoutInflater(savedInstanceState).inflate(R.layout.recyclerview, null, false);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
refreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe);
refreshLayout.setOnRefreshListener(this::loadItems);
refreshLayout.setColorSchemeColors(AttributesUtils.getAccentColor(getContext()));
recyclerView = (RecyclerView) view.findViewById(R.id.recycler);
adapter = new IssuesAdapter(LayoutInflater.from(getContext()));
adapter.setRecyclerAdapterContentListener(this);
adapter.setCallback(this);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}
@Override
public void onStart() {
super.onStart();
showLoading();
loadItems();
}
@Override
public void onPause() {
super.onPause();
presenter.detachView();
}
private void loadItems() {
presenter.execute(buildIssueSearchRequest());
}
private IssuesSearchRequest buildIssueSearchRequest() {
return new IssuesSearchRequest().setActionAndAuthor(getAction(), accountNameProvider.getName()).setIsOpen(true);
}
@Override
public void loadMoreItems() {
presenter.executePaginated(null);
}
@Override
protected int getLightTheme() {
return R.style.AppTheme_Repository;
}
@Override
protected int getDarkTheme() {
return R.style.AppTheme_Dark_Repository;
}
@Override
public void showLoading() {
refreshLayout.post(() -> refreshLayout.setRefreshing(true));
}
@Override
public void onDataReceived(List<Issue> issues, boolean isFromPaginated) {
if (!isFromPaginated) {
adapter.clear();
}
adapter.addAll(issues);
}
@Override
public void hideLoading() {
refreshLayout.post(() -> refreshLayout.setRefreshing(false));
}
@Override
public void showError(Throwable throwable) {
if (isResumed()) {
if (recyclerView != null) {
Snackbar.make(recyclerView, R.string.no_issues_found, Snackbar.LENGTH_SHORT).show();
}
}
}
@Override
public void onItemSelected(Issue item) {
IssueInfo info = new IssueInfo();
info.num = item.getNumber();
info.repoInfo = new RepoInfo();
if (item.getRepository() != null) {
info.repoInfo = new RepoInfo();
info.repoInfo.owner = item.getRepository().getOwner().getLogin();
info.repoInfo.name = item.getRepository().getName();
} else if (item.getRepositoryUrl() != null) {
info.repoInfo = new RepoInfo();
Uri parse = Uri.parse(item.getRepositoryUrl());
List<String> pathSegments = parse.getPathSegments();
if (pathSegments != null && pathSegments.size() > 1) {
pathSegments = new ArrayList<>(pathSegments);
Collections.reverse(pathSegments);
info.repoInfo.name = pathSegments.get(0);
info.repoInfo.owner = pathSegments.get(1);
}
}
if (info.repoInfo != null) {
if (item.getPullRequest() != null) {
Intent intent = PullRequestDetailActivity.createLauncherIntent(getActivity(), info);
startActivity(intent);
} else {
Intent intent = IssueDetailActivity.createLauncherIntent(getActivity(), info);
startActivity(intent);
}
}
}
@Override
protected boolean showTitle() {
return false;
}
protected abstract String getAction();
@Override
public IIcon getTitleIcon() {
return null;
}
}