package net.tasksnow.view;
import android.app.ListFragment;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import net.tasksnow.R;
import net.tasksnow.TaskNowApplication;
import net.tasksnow.model.cards.CompleteItem;
import net.tasksnow.model.cards.DismissItem;
import net.tasksnow.view.reuse.GenericListAdapter;
import net.tasksnow.view.slidingmenu.SlidingMenuActivity;
import com.haarman.listviewanimations.itemmanipulation.OnDismissCallback;
import com.haarman.listviewanimations.itemmanipulation.ReplaceRunnable;
import com.haarman.listviewanimations.itemmanipulation.SwipeDismissAdapter;
import com.haarman.listviewanimations.swinginadapters.prepared.SwingBottomInAnimationAdapter;
import com.luma.android.andrologger.Logger;
import java.util.ArrayList;
/**
* @author LuMa
* @since 07:43:22 - 24.03.2013
* @project TasksNow
*/
public abstract class CardsListFragment extends ListFragment implements OnDismissCallback {
//Is a ListFragment. Every instance of a ListFragment belongs exactly to one category in the sidemenu!
private GenericListAdapter mCardsAdapter;
private TaskNowApplication application;
private EditText searchBox;
private View headerView;
private SwingBottomInAnimationAdapter swingBottomInAnimationAdapter;
private String direction;
private final ArrayList<GenericListAdapter.ListItem> remove = new ArrayList<GenericListAdapter.ListItem>();
ArrayList<GenericListAdapter.ListItem> temp = new ArrayList<GenericListAdapter.ListItem>();
private View dismissedView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.cardlist_fragment, container, false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
application = (TaskNowApplication) this.getActivity().getApplication();
if (this.mCardsAdapter == null) {
this.mCardsAdapter = new GenericListAdapter(this.getActivity(), this.getDiffItemCount());
}
Logger.onCreate(this.getActivity());
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
this.getListView().setHeaderDividersEnabled(true);
this.getListView().setVerticalScrollBarEnabled(false);
this.getListView().setVerticalFadingEdgeEnabled(false);
this.getListView().setClipToPadding(false);
this.getListView().setOverScrollMode(View.OVER_SCROLL_NEVER);
this.getListView().setOverscrollHeader(this.getResources().getDrawable(R.drawable.ic_action_new_labels));
this.getListView().setTextFilterEnabled(true);
initHeaderView();
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onDestroyView() {
super.onDestroyView();
setListAdapter(null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (headerView != null)
this.getListView().addHeaderView(headerView);
}
public void updateListAdapter() {
mCardsAdapter.clear();
this.fillListAdapter(mCardsAdapter);
if (this.getListAdapter() == null && mCardsAdapter != null) {
swingBottomInAnimationAdapter = new SwingBottomInAnimationAdapter(new SwipeDismissAdapter(mCardsAdapter, this));
swingBottomInAnimationAdapter.setListView(this.getListView());
this.setListAdapter(swingBottomInAnimationAdapter);
}
this.mCardsAdapter.notifyDataSetChanged();
}
@Override
public void onResume() {
super.onResume();
Logger.onResume(this.getActivity());
this.updateListAdapter();
}
@Override
public void onDestroy() {
super.onDestroy();
Logger.onDestroy(this.getActivity());
}
@Override
public void onDismiss(ListView listView, int[] reverseSortedPositions) {
temp = new ArrayList<GenericListAdapter.ListItem>();
for (int i = 0; i < mCardsAdapter.getCount(); i++) {
if (i == (reverseSortedPositions[0]) - 1) { //-1 because of header
//direction determines if dismiss or completed card is created
if (this.direction.equals("left")) {
DismissItem dismiss = new DismissItem(this.dismissedView.getHeight());
temp.add(dismiss); //TODO just test card
remove.add(dismiss);
}
else if (this.direction.equals("right")) {
CompleteItem completeItem = new CompleteItem(this.dismissedView.getHeight());
remove.add(completeItem);
temp.add(completeItem); //TODO just test card
}
}
else {
temp.add(mCardsAdapter.getItem(i));
}
}
mCardsAdapter.clear();
mCardsAdapter.addAll(temp);
mCardsAdapter.notifyDataSetChanged();
}
@Override
public void setData(String direction, View dismissedView) {
this.direction = direction;
this.dismissedView = dismissedView;
}
@Override
public void afterReplace() {
// mCardsAdapter.remove(mCardsAdapter.getItem(removePosition.get(0)));
mCardsAdapter.remove(remove.get(0));
remove.remove(0);
mCardsAdapter.notifyDataSetChanged();
}
@Override
public void startTimer() {
new ReplaceRunnable().execute(this);
}
@Override
public void onStop() {
if (searchBox != null) {
searchBox.setText(null);
}
this.getListView().clearTextFilter();
super.onStop();
}
public void initHeaderView() {
LayoutInflater inflater = this.getActivity().getLayoutInflater();
headerView = inflater.inflate(R.layout.cardlist_header_view, this.getListView(), false);
ImageButton headerIndicator = (ImageButton) headerView.findViewById(R.id.header_indicator);
headerIndicator.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
((SlidingMenuActivity) CardsListFragment.this.getActivity()).getSlidingMenu().toggle();
}
});
searchBox = (EditText) headerView.findViewById(R.id.search_box);
searchBox.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (TextUtils.isEmpty(s)) {
CardsListFragment.this.getListView().clearTextFilter();
}
else {
CardsListFragment.this.getListView().setFilterText(s.toString());
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
public TaskNowApplication getApplication() {
return application;
}
protected abstract int getDiffItemCount();
protected abstract void fillListAdapter(GenericListAdapter adapter);
}