package edu.vanderbilt.vm.guide.ui; import android.widget.*; import edu.vanderbilt.vm.guide.container.Agenda; import edu.vanderbilt.vm.guide.ui.adapter.AgendaEditItemView; import edu.vanderbilt.vm.guide.ui.adapter.PlaceItemView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.view.MenuItem; import android.database.Cursor; import android.location.Location; import android.os.Bundle; import android.text.Html; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import edu.vanderbilt.vm.guide.R; import edu.vanderbilt.vm.guide.container.Place; import edu.vanderbilt.vm.guide.db.GuideDBConstants; import edu.vanderbilt.vm.guide.db.GuideDBOpenHelper; import edu.vanderbilt.vm.guide.ui.adapter.AgendaAdapter; import edu.vanderbilt.vm.guide.ui.listener.GeomancerListener; import edu.vanderbilt.vm.guide.util.DBUtils; import edu.vanderbilt.vm.guide.util.Geomancer; import edu.vanderbilt.vm.guide.util.GlobalState; import edu.vanderbilt.vm.guide.util.ImageDownloader; import java.util.Set; public class AgendaFragment extends SherlockFragment implements GeomancerListener { private static final Logger logger = LoggerFactory.getLogger("ui.AgendaFragment"); private final int DESCRIPTION_LENGTH = 100; private View mRoot; private Cursor mAllPlacesCursor; private Place mCurrentPlace; private ImageDownloader.BitmapDownloaderTask mDlTask = null; // Views private ListView mListView; private ImageButton mEditButton; private ImageButton mDeleteButton; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mRoot = inflater.inflate(R.layout.fragment_agenda, container, false); return mRoot; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); GuideDBOpenHelper helper = new GuideDBOpenHelper(getActivity()); String[] columns = { GuideDBConstants.PlaceTable.NAME_COL, GuideDBConstants.PlaceTable.CATEGORY_COL, GuideDBConstants.PlaceTable.LATITUDE_COL, GuideDBConstants.PlaceTable.LONGITUDE_COL, GuideDBConstants.PlaceTable.ID_COL, GuideDBConstants.PlaceTable.DESCRIPTION_COL, GuideDBConstants.PlaceTable.IMAGE_LOC_COL }; mAllPlacesCursor = DBUtils.getAllPlaces(columns, helper.getReadableDatabase()); //helper.close(); mListView = (ListView) mRoot.findViewById(R.id.agenda_list); mListView.setAdapter(new AgendaAdapter(getActivity(), GlobalState.getUserAgenda(), PlaceItemView.getFactory())); // Add an empty agenda indicator TextView emptyIndicator = (TextView) getActivity().getLayoutInflater() .inflate(R.layout.agenda_empty, null, false); ((ViewGroup) mListView.getParent()).addView(emptyIndicator); mListView.setEmptyView(emptyIndicator); // Setup button mEditButton = (ImageButton) mRoot.findViewById(R.id.agenda_edit); mEditButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (GlobalState.getUserAgenda().size() != 0) { v.setVisibility(View.GONE); mDeleteButton.setVisibility(View.VISIBLE); mListView.setAdapter(new AgendaAdapter(getActivity(), GlobalState.getUserAgenda(), AgendaEditItemView.getFactory())); mListView.invalidateViews(); } } }); mDeleteButton = (ImageButton) mRoot.findViewById(R.id.agenda_remove); mDeleteButton.setOnClickListener(new View.OnClickListener() { @SuppressWarnings("unchecked") @Override public void onClick(View v) { Agenda a = GlobalState.getUserAgenda(); Set<Integer> checkedSet = (Set<Integer>) mListView.getChildAt(0).getTag(); for (int i = a.size() - 1; i >= 0; i--) { if (checkedSet.contains(i)) { a.remove(a.get(i)); } } if (checkedSet.size() == 1) { Toast.makeText(getActivity(), "Removed 1 place from the Agenda", Toast.LENGTH_LONG).show(); } else if (checkedSet.size() > 1) { Toast.makeText(getActivity(), "Removed " + checkedSet.size() + " places from the Agenda", Toast.LENGTH_LONG).show(); } v.setVisibility(View.GONE); mEditButton.setVisibility(View.VISIBLE); mListView.setAdapter(new AgendaAdapter(getActivity(), a, PlaceItemView.getFactory())); mListView.invalidateViews(); } }); mRoot.findViewById(R.id.current_ll_ref).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { PlaceDetailer.open(getActivity(), mCurrentPlace.getUniqueId()); } }); updateLocation(Geomancer.getDeviceLocation()); setHasOptionsMenu(true); } @Override public void onResume() { super.onResume(); logger.trace("AgendaFragment: OnResume called"); Geomancer.registerGeomancerListener(this); } @Override public void onPause() { super.onPause(); Geomancer.removeGeomancerListener(this); } /* public void onReselect() { try { ((ListView) mRoot.findViewById(R.id.s_l_listview1)).invalidateViews(); } catch (IllegalStateException e) { logger.info("Caught IllegalStateException: ", e); } } */ @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.menu_sort_alphabetic: GlobalState.getUserAgenda().sortAlphabetically(); ((ListView) mRoot.findViewById(R.id.s_l_listview1)).invalidateViews(); Toast.makeText(getActivity(), "Agenda is sorted alphabetically", Toast.LENGTH_SHORT) .show(); return true; case R.id.menu_sort_distance: GlobalState.getUserAgenda().sortByDistance(); ((ListView) mRoot.findViewById(R.id.s_l_listview1)).invalidateViews(); Toast.makeText(getActivity(), "Agenda is sorted by distance", Toast.LENGTH_SHORT) .show(); return true; default: return false; } } @Override public void onDestroy() { super.onDestroy(); if (mDlTask != null) { logger.trace("Cancelling image download task"); mDlTask.cancel(true); } mAllPlacesCursor.close(); } @Override public void updateLocation(Location loc) { if (loc == null) { return; } int closestIx = Geomancer.findClosestPlace(loc, mAllPlacesCursor); if (closestIx == -1) { Toast.makeText(getActivity(), "Couldn't find closest place", Toast.LENGTH_LONG).show(); } else { mAllPlacesCursor.moveToPosition(closestIx); mCurrentPlace = DBUtils.getPlaceFromCursor(mAllPlacesCursor); fillViews(); mListView.invalidateViews(); } } private void fillViews() { String desc = mCurrentPlace.getDescription(); if (desc.length() > DESCRIPTION_LENGTH) { desc = desc.substring(0, DESCRIPTION_LENGTH).concat("..."); } ((TextView) mRoot.findViewById(R.id.location_prev_desc)).setText( Html.fromHtml("<b>" + mCurrentPlace.getName() + "</b> " + desc)); ImageView iv = (ImageView)mRoot.findViewById(R.id.current_img); mDlTask = new ImageDownloader.BitmapDownloaderTask(iv); logger.trace("Starting image download task"); mDlTask.execute(mCurrentPlace.getPictureLoc()); } }