package net.naonedbus.fragment.impl; import java.io.IOException; import java.util.List; import net.naonedbus.R; import net.naonedbus.bean.Bicloo; import net.naonedbus.bean.async.AsyncResult; import net.naonedbus.manager.impl.BiclooManager; import net.naonedbus.manager.impl.FavoriBiclooManager; import net.naonedbus.provider.impl.FavoriBiclooProvider; import net.naonedbus.widget.adapter.impl.BiclooArrayAdapter; import org.json.JSONException; import android.annotation.SuppressLint; import android.content.ContentResolver; import android.content.Context; import android.database.ContentObserver; import android.os.Bundle; import android.os.Handler; import android.util.SparseBooleanArray; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.ListAdapter; import android.widget.ListView; import com.actionbarsherlock.view.ActionMode; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; public class BicloosFavorisFragment extends BicloosFragment implements OnItemLongClickListener, ActionMode.Callback { private ListView mListView; private ActionMode mActionMode; private final ContentObserver mContentObserver = new ContentObserver(new Handler()) { @Override public void onChange(final boolean selfChange) { refreshContent(); }; }; @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setEmptyMessageValues(R.string.error_title_empty_favori, R.string.error_summary_empty_favori_bicloo, R.drawable.ic_star_empty); }; @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mListView = getListView(); mListView.setOnItemLongClickListener(this); mListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); final ContentResolver contentResolver = getActivity().getContentResolver(); contentResolver.registerContentObserver(FavoriBiclooProvider.CONTENT_URI, true, mContentObserver); } @Override public void onDestroy() { final ContentResolver contentResolver = getActivity().getContentResolver(); contentResolver.unregisterContentObserver(mContentObserver); super.onDestroy(); } @Override public boolean onContextItemSelected(final android.view.MenuItem item) { return false; // Must keep this, otherwise this fragment will handle // onContextItemSelected of other activty's fragments. } @Override protected AsyncResult<ListAdapter> loadContent(final Context context, final Bundle bundle) { final AsyncResult<ListAdapter> result = new AsyncResult<ListAdapter>(); final FavoriBiclooManager favoriBiclooManager = FavoriBiclooManager.getInstance(); final BiclooManager biclooManager = BiclooManager.getInstance(); if (bundle != null && bundle.getBoolean(BUNDKE_KEY_FORCE_UDPATE)) { biclooManager.clearCache(); } final List<Bicloo> favoris = favoriBiclooManager.getAll(context.getContentResolver()); try { final List<Bicloo> bicloos = biclooManager.getAll(context); for (final Bicloo bicloo : bicloos) { for (final Bicloo favori : favoris) { if (bicloo.getId() == favori.getId()) { favori.set(bicloo); break; } } } } catch (final IOException e) { result.setException(e); } catch (final JSONException e) { result.setException(e); } setDistances(favoris); final BiclooArrayAdapter adapter = new BiclooArrayAdapter(context, favoris); adapter.setIndexer(mIndexers.get(mCurrentSortPreference)); adapter.sort(mComparators.get(mCurrentSortPreference)); result.setResult(adapter); return result; } @Override public boolean onCreateActionMode(final ActionMode mode, final Menu menu) { final MenuInflater menuInflater = getSherlockActivity().getSupportMenuInflater(); menuInflater.inflate(R.menu.fragment_favoris_bicloos_contextual, menu); return true; } @Override public boolean onPrepareActionMode(final ActionMode mode, final Menu menu) { final int checkedItems = getCheckedItemsCount(); mActionMode = mode; mActionMode.setTitle(getResources().getQuantityString(R.plurals.selected_items, checkedItems, checkedItems)); return false; } @Override public boolean onActionItemClicked(final ActionMode mode, final MenuItem item) { switch (item.getItemId()) { case R.id.menu_delete: menuDelete(); mode.finish(); break; default: return false; } return true; } @SuppressLint("NewApi") private void menuDelete() { Bicloo item; final FavoriBiclooManager manager = FavoriBiclooManager.getInstance(); final ContentResolver contentResolver = getActivity().getContentResolver(); final BiclooArrayAdapter adapter = (BiclooArrayAdapter) getListAdapter(); for (int i = mListView.getCount() - 1; i > -1; i--) { if (mListView.isItemChecked(i)) { item = adapter.getItem(i); adapter.remove(item); manager.remove(contentResolver, item.getId()); } } adapter.notifyDataSetChanged(); getSherlockActivity().invalidateOptionsMenu(); } @Override public void onDestroyActionMode(final ActionMode mode) { mActionMode = null; mListView.clearChoices(); final BiclooArrayAdapter adapter = (BiclooArrayAdapter) getListAdapter(); adapter.clearCheckedItemPositions(); adapter.notifyDataSetChanged(); } @Override public void onListItemClick(final ListView l, final View v, final int position, final long id) { if (mActionMode == null) { mListView.setItemChecked(position, false); super.onListItemClick(l, v, position, id); } else { onItemSelected(); } } @Override public boolean onItemLongClick(final AdapterView<?> parent, final View view, final int position, final long id) { mListView.setItemChecked(position, !mListView.isItemChecked(position)); onItemSelected(); return true; } public void onItemSelected() { final SparseBooleanArray checkedPositions = mListView.getCheckedItemPositions(); final BiclooArrayAdapter adapter = (BiclooArrayAdapter) getListAdapter(); adapter.setCheckedItemPositions(checkedPositions); if (mActionMode == null) { getSherlockActivity().startActionMode(this); } else if (hasItemChecked() == false) { mActionMode.finish(); } else { mActionMode.invalidate(); } } private boolean hasItemChecked() { final SparseBooleanArray checked = mListView.getCheckedItemPositions(); for (int i = 0; i < checked.size(); i++) { if (checked.valueAt(i)) return true; } return false; } private int getCheckedItemsCount() { final SparseBooleanArray checkedPositions = mListView.getCheckedItemPositions(); int count = 0; for (int i = 0; i < checkedPositions.size(); i++) { if (checkedPositions.valueAt(i)) { count++; } } return count; } }