package com.ov3rk1ll.kinocast.ui;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.ov3rk1ll.kinocast.R;
import com.ov3rk1ll.kinocast.api.Parser;
import com.ov3rk1ll.kinocast.data.ViewModel;
import com.ov3rk1ll.kinocast.ui.helper.layout.GridLayoutManager;
import com.ov3rk1ll.kinocast.ui.helper.layout.ResultRecyclerAdapter;
import com.ov3rk1ll.kinocast.utils.BookmarkManager;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
public class ListFragment extends Fragment {
private static final String ARG_URL = "param_url";
private static final String ARG_SPECIAL = "param_special";
public static final int SPECIAL_BOOKMARKS = 0;
ResultRecyclerAdapter adapter;
private String mUrl;
private int mSpecialId = -1;
public static ListFragment newInstance(String url) {
ListFragment fragment = new ListFragment();
Bundle args = new Bundle();
args.putString(ARG_URL, url);
fragment.setArguments(args);
return fragment;
}
public static ListFragment newInstance(int specialId) {
ListFragment fragment = new ListFragment();
Bundle args = new Bundle();
args.putInt(ARG_SPECIAL, specialId);
fragment.setArguments(args);
return fragment;
}
public ListFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
if(getArguments().containsKey(ARG_URL))
mUrl = getArguments().getString(ARG_URL);
if(getArguments().containsKey(ARG_SPECIAL))
mSpecialId = getArguments().getInt(ARG_SPECIAL);
}
adapter = new ResultRecyclerAdapter(getActivity(), R.layout.frament_list_item);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_list, container, false);
RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.list);
recyclerView.setHasFixedSize(true);
recyclerView.setAdapter(adapter);
GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity());
DisplayMetrics displayMetrics = getActivity().getResources().getDisplayMetrics();
int columns = displayMetrics.widthPixels / getActivity().getResources().getDimensionPixelSize(R.dimen.list_item_width);
if(columns < 2){
columns = 2;
}
gridLayoutManager.setColumns(columns);
recyclerView.setLayoutManager(gridLayoutManager);
recyclerView.setItemAnimator(new DefaultItemAnimator());
adapter.setOnItemClickListener(new ResultRecyclerAdapter.OnRecyclerViewItemClickListener<ViewModel>() {
@Override public void onItemClick(View view, ViewModel viewModel) {
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra(DetailActivity.ARG_ITEM, viewModel);
intent.putExtra(DetailActivity.ARG_ITEM, viewModel);
//ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), view.findViewById(R.id.image), "photo_hero");
getActivity().startActivity(intent);
}
});
view.findViewById(R.id.button_retry).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
loadData();
}
});
return view;
}
@Override
public void onResume() {
super.onResume();
if(mSpecialId != -1){
List<ViewModel> itemToRemove = new ArrayList<>();
AtomicReference<BookmarkManager> bookmarks = new AtomicReference<>(new BookmarkManager(getActivity()));
for(ViewModel item: adapter.getItems()){
if(bookmarks.get().findItem(item) == null){
itemToRemove.add(item);
}
}
for(ViewModel item: itemToRemove){
adapter.remove(item);
}
}
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
loadData();
}
public void loadData(){
if(mUrl != null)
(new QueryPageTask()).execute(mUrl);
else if(mSpecialId != -1)
(new QueryBookmarkTask()).execute(getActivity());
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
GridLayoutManager gridLayoutManager = (GridLayoutManager) ((RecyclerView) getActivity().findViewById(R.id.list)).getLayoutManager();
DisplayMetrics displayMetrics = getActivity().getResources().getDisplayMetrics();
int columns = displayMetrics.widthPixels / getActivity().getResources().getDimensionPixelSize(R.dimen.list_item_width);
if(columns < 2){
columns = 2;
}
gridLayoutManager.setColumns(columns);
}
@SuppressWarnings("deprecation")
private class QueryPageTask extends AsyncTask<String, Void, ViewModel[]>{
Exception exception;
@Override
protected void onPreExecute() {
((AppCompatActivity)getActivity()).setSupportProgressBarIndeterminateVisibility(true);
getActivity().findViewById(R.id.list).setVisibility(View.VISIBLE);
getActivity().findViewById(R.id.layout_error).setVisibility(View.GONE);
super.onPreExecute();
}
@Override
protected ViewModel[] doInBackground(String... params) {
List<ViewModel> list = null;
try {
list = Parser.getInstance().parseList(params[0]);
} catch (IOException e) {
e.printStackTrace();
exception = e;
}
if(list == null) return null;
return list.toArray(new ViewModel[list.size()]);
}
@Override
protected void onPostExecute(ViewModel[] viewModels) {
if(viewModels != null){
for(ViewModel m: viewModels){
adapter.add(m, adapter.getItemCount());
}
}else{
getActivity().findViewById(R.id.list).setVisibility(View.GONE);
((TextView)getActivity().findViewById(R.id.text_error)).setText(
getString(R.string.connection_error_title) + "\n" +
getString(R.string.connection_error_message, Parser.getInstance().getUrl()) +
"\n" + exception.getMessage()
);
getActivity().findViewById(R.id.layout_error).setVisibility(View.VISIBLE);
}
if(getActivity() != null)
((AppCompatActivity)getActivity()).setSupportProgressBarIndeterminateVisibility(false);
super.onPostExecute(viewModels);
}
}
@SuppressWarnings("deprecation")
private class QueryBookmarkTask extends AsyncTask<Context, Void, ViewModel[]>{
@Override
protected void onPreExecute() {
((AppCompatActivity)getActivity()).setSupportProgressBarIndeterminateVisibility(true);
super.onPreExecute();
}
@Override
protected ViewModel[] doInBackground(Context... params) {
AtomicReference<BookmarkManager> bookmarks = new AtomicReference<>(new BookmarkManager(params[0]));
List<ViewModel> list = new ArrayList<>();
for(int i = 0; i < bookmarks.get().size(); i++){
BookmarkManager.Bookmark b = bookmarks.get().get(i);
if(!b.isInternal()) {
Parser p = Parser.selectByParserId(getActivity(), b.getParserId());
list.add(p.loadDetail(b.getUrl()));
}
}
return list.toArray(new ViewModel[list.size()]);
}
@Override
protected void onPostExecute(ViewModel[] viewModels) {
if(viewModels != null){
for(ViewModel m: viewModels){
adapter.add(m, adapter.getItemCount());
}
}else{
new AlertDialog.Builder(getActivity())
.setTitle(getString(R.string.connection_error_title))
.setMessage(getString(R.string.connection_error_message))
.setPositiveButton(getString(R.string.connection_error_button), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
(new QueryPageTask()).execute(mUrl);
}
})
.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
getActivity().finish();
}
})
.show();
}
if(getActivity() != null)
((AppCompatActivity)getActivity()).setSupportProgressBarIndeterminateVisibility(false);
super.onPostExecute(viewModels);
}
}
}