package com.khmelenko.lab.varis.fragment;
import android.app.Activity;
import android.app.Fragment;
import android.app.ProgressDialog;
import android.os.Bundle;
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 android.widget.TextView;
import android.widget.Toast;
import com.khmelenko.lab.varis.R;
import com.khmelenko.lab.varis.adapter.OnListItemListener;
import com.khmelenko.lab.varis.adapter.RepoListAdapter;
import com.khmelenko.lab.varis.network.response.Repo;
import java.util.ArrayList;
import java.util.List;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
* Fragment for main app screen
*
* @author Dmytro Khmelenko
*/
public class ReposFragment extends Fragment {
private ReposFragmentListener mListener;
@Bind(R.id.empty_text)
TextView mEmptyView;
@Bind(R.id.main_repos_swipe_view)
SwipeRefreshLayout mSwipeRefreshLayout;
@Bind(R.id.main_repos_recycler_view)
RecyclerView mReposRecyclerView;
private RepoListAdapter mRepoListAdapter;
private List<Repo> mRepos = new ArrayList<>();
private ProgressDialog mProgressDialog;
/**
* Creates new instance of the fragment
*
* @return Fragment instance
*/
public static ReposFragment newInstance() {
return new ReposFragment();
}
public ReposFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_repos, container, false);
ButterKnife.bind(this, view);
mReposRecyclerView.setHasFixedSize(true);
LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
mReposRecyclerView.setLayoutManager(layoutManager);
mRepoListAdapter = new RepoListAdapter(mRepos, new OnListItemListener() {
@Override
public void onItemSelected(int position) {
if (mListener != null) {
mListener.onRepositorySelected(mRepos.get(position));
}
}
});
mReposRecyclerView.setAdapter(mRepoListAdapter);
mSwipeRefreshLayout.setColorSchemeResources(R.color.swipe_refresh_progress);
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
if (mListener != null) {
mListener.onRefreshData();
}
}
});
return view;
}
/**
* Checks whether data existing or not
*/
private void checkIfEmpty() {
mEmptyView.setText(R.string.repo_empty_text);
if (mRepos.isEmpty()) {
mEmptyView.setVisibility(View.VISIBLE);
} else {
mEmptyView.setVisibility(View.GONE);
}
}
/**
* Clears the fragment data
*/
public void clearData() {
mRepos.clear();
mRepoListAdapter.notifyDataSetChanged();
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (ReposFragmentListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement MainFragmentListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
/**
* Sets the list of repositories
*
* @param repos Repositories
*/
public void setRepos(List<Repo> repos) {
mRepos.clear();
mRepos.addAll(repos);
mRepoListAdapter.notifyDataSetChanged();
checkIfEmpty();
}
/**
* Sets the progress of the loading
*
* @param isLoading True, if loading is in progress. False otherwise
*/
public void setLoadingProgress(boolean isLoading) {
if (isLoading) {
if(mProgressDialog == null) {
mProgressDialog = ProgressDialog.show(getActivity(), "", getString(R.string.loading_msg));
}
} else {
mSwipeRefreshLayout.setRefreshing(false);
if(mProgressDialog != null) {
mProgressDialog.dismiss();
mProgressDialog = null;
}
}
}
/**
* Handles the case when loading data failed
*/
public void handleLoadingFailed(String message) {
checkIfEmpty();
String msg = getString(R.string.error_failed_loading_repos, message);
Toast.makeText(getActivity(), msg, Toast.LENGTH_SHORT).show();
}
/**
* Fragment listener
*/
public interface ReposFragmentListener {
/**
* Handles repository selection
*
* @param repo Selected repository
*/
void onRepositorySelected(Repo repo);
/**
* Handles request for refreshing data
*/
void onRefreshData();
}
}