package com.alorma.github.ui.fragment.releases; import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; import com.alorma.github.R; 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.repository.tags.RepositoryTagsModule; import com.alorma.github.presenter.View; import com.alorma.github.presenter.repos.releases.tags.RepositoryTagsPresenter; import com.alorma.github.sdk.bean.info.RepoInfo; import com.alorma.github.ui.adapter.TagsAdapter; import com.alorma.github.ui.fragment.base.LoadingListFragment; import com.mikepenz.octicons_typeface_library.Octicons; import core.repositories.releases.Release; import core.repositories.releases.tags.Tag; import java.util.List; import javax.inject.Inject; public class RepositoryTagsFragment extends LoadingListFragment<TagsAdapter> implements View<List<Tag>>, TagsAdapter.TagsCallback { private static final String REPO_INFO = "REPO_INFO"; @Inject RepositoryTagsPresenter tagsPresenter; private ReleasesCallback releasesCallback; private RepoInfo repoInfo; public static RepositoryTagsFragment newInstance(RepoInfo info) { RepositoryTagsFragment repositoryTagsFragment = new RepositoryTagsFragment(); Bundle args = new Bundle(); args.putParcelable(REPO_INFO, info); repositoryTagsFragment.setArguments(args); return repositoryTagsFragment; } @Override protected void injectComponents(ApplicationComponent applicationComponent) { ApiComponent apiComponent = DaggerApiComponent.builder().applicationComponent(applicationComponent).apiModule(new ApiModule()).build(); apiComponent.plus(new RepositoryTagsModule()).inject(this); tagsPresenter.attachView(this); } @Override public void onAttach(Context context) { super.onAttach(context); if (context instanceof ReleasesCallback) { releasesCallback = (ReleasesCallback) context; } } @Override public void onDetach() { releasesCallback = new ReleasesCallback() { @Override public void showTagDialog(Tag tag) { } @Override public void showReleaseDialog(Release release) { } }; super.onDetach(); } @Override public void onDestroy() { super.onDestroy(); tagsPresenter.detachView(); } @Override protected void loadArguments() { repoInfo = getArguments().getParcelable(REPO_INFO); } @Override protected void executeRequest() { super.executeRequest(); if (getAdapter() != null) { getAdapter().clear(); } tagsPresenter.execute(repoInfo.toCoreRepoInfo()); } @Override protected void executePaginatedRequest(int page) { super.executePaginatedRequest(page); tagsPresenter.executePaginated(repoInfo.toCoreRepoInfo()); } @Override public void showLoading() { //do nothing } @Override public void onDataReceived(List<Tag> tags, boolean isFromPaginated) { if (getActivity() == null) return; if (tags.size() > 0) { hideEmpty(); if (refreshing || getAdapter() == null) { TagsAdapter adapter = new TagsAdapter(LayoutInflater.from(getActivity()), repoInfo); adapter.setTagsCallback(this); adapter.addAll(tags); setAdapter(adapter); } else { getAdapter().addAll(tags); } setPage(tagsPresenter.getPage()); } else if (getAdapter() == null || getAdapter().getItemCount() == 0) { setEmpty(); } else { getAdapter().clear(); setEmpty(); } } @Override public void hideLoading() { stopRefresh(); } @Override public void showError(Throwable throwable) { stopRefresh(); if (getAdapter() == null || getAdapter().getItemCount() == 0) { setEmpty(); } } @Override protected int getLightTheme() { return R.style.AppTheme_Repository; } @Override protected int getDarkTheme() { return R.style.AppTheme_Dark_Repository; } @Override protected Octicons.Icon getNoDataIcon() { return null; } @Override protected int getNoDataText() { return R.string.no_tags; } @Override public void onTagSelected(Tag tag) { releasesCallback.showTagDialog(tag); } @Override public void onReleaseSelected(Release release) { releasesCallback.showReleaseDialog(release); } public interface ReleasesCallback { void showTagDialog(Tag tag); void showReleaseDialog(Release release); } }