package com.dwdesign.tweetings.fragment;
import static com.dwdesign.tweetings.util.Utils.getActivatedAccountIds;
import static com.dwdesign.tweetings.util.Utils.openTweetSearch;
import java.util.Collections;
import java.util.Comparator;
import com.dwdesign.popupmenu.PopupMenu;
import com.dwdesign.popupmenu.PopupMenu.OnMenuItemClickListener;
import com.dwdesign.tweetings.R;
import com.dwdesign.tweetings.app.TweetingsApplication;
import com.dwdesign.tweetings.loader.SavedSearchesLoader;
import com.dwdesign.tweetings.model.Panes;
import twitter4j.ResponseList;
import twitter4j.SavedSearch;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class SavedSearchesListFragment extends PullToRefreshListFragment implements
LoaderCallbacks<ResponseList<SavedSearch>>, OnItemClickListener, Panes.Left, OnMenuItemClickListener {
private PopupMenu mPopupMenu;
private SavedSearchesAdapter mAdapter;
private long mAccountId;
private ListView mListView;
private long mSelectedId;
private final BroadcastReceiver mStateReceiver = new BroadcastReceiver() {
@Override
public void onReceive(final Context context, final Intent intent) {
final String action = intent.getAction();
if (BROADCAST_SEARCH_CHANGED.equals(action)) {
getLoaderManager().restartLoader(0, null, SavedSearchesListFragment.this);
}
}
};
private static final Comparator<SavedSearch> POSITION_COMPARATOR = new Comparator<SavedSearch>() {
@Override
public int compare(final SavedSearch object1, final SavedSearch object2) {
return object1.getPosition() - object2.getPosition();
}
};
@Override
public void onActivityCreated(final Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mAdapter = new SavedSearchesAdapter(getActivity());
setListAdapter(mAdapter);
mListView = getListView();
mListView.setOnItemClickListener(this);
final Bundle args = getArguments();
mAccountId = args != null ? args.getLong(INTENT_KEY_ACCOUNT_ID, -1) : -1;
getLoaderManager().initLoader(0, null, this);
setListShown(false);
}
@Override
public Loader<ResponseList<SavedSearch>> onCreateLoader(final int id, final Bundle args) {
return new SavedSearchesLoader(getActivity(), mAccountId);
}
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
final SavedSearch item = mAdapter.findItem(id);
if (item == null) return;
openTweetSearch(getActivity(), mAccountId, item.getQuery(), item.getId());
}
public boolean onItemLongClick(final AdapterView<?> adapter, final View view, final int position, final long id) {
mSelectedId = id;
mPopupMenu = PopupMenu.getInstance(getActivity(), view);
mPopupMenu.inflate(R.menu.action_savedsearch);
mPopupMenu.setOnMenuItemClickListener(this);
mPopupMenu.show();
return true;
}
public boolean onMenuItemClick(final MenuItem item) {
switch (item.getItemId()) {
case MENU_DELETE: {
final SavedSearch searchItem = mAdapter.findItem(mSelectedId);
final TweetingsApplication application = getApplication();
application.getServiceInterface().destroySavedSearch(mAccountId, searchItem.getId());
break;
}
}
return super.onContextItemSelected(item);
}
@Override
public void onStop() {
if (mPopupMenu != null) {
mPopupMenu.dismiss();
}
unregisterReceiver(mStateReceiver);
super.onStop();
}
@Override
public void onStart() {
super.onStart();
final IntentFilter filter = new IntentFilter(BROADCAST_SEARCH_CHANGED);
filter.addAction(BROADCAST_RETWEET_CHANGED);
registerReceiver(mStateReceiver, filter);
}
@Override
public void onLoaderReset(final Loader<ResponseList<SavedSearch>> loader) {
mAdapter.setData(null);
}
@Override
public void onLoadFinished(final Loader<ResponseList<SavedSearch>> loader, final ResponseList<SavedSearch> data) {
if (data != null) {
Collections.sort(data, POSITION_COMPARATOR);
}
mAdapter.setData(data);
setListShown(true);
onRefreshComplete();
}
@Override
public void onPullDownToRefresh() {
getLoaderManager().restartLoader(0, null, this);
}
@Override
public void onPullUpToRefresh() {
}
static class SavedSearchesAdapter extends BaseAdapter {
private ResponseList<SavedSearch> mData;
private final LayoutInflater mInflater;
public SavedSearchesAdapter(final Context context) {
mInflater = LayoutInflater.from(context);
}
public SavedSearch findItem(final long id) {
final int count = getCount();
for (int i = 0; i < count; i++) {
if (id != -1 && id == getItemId(i)) return getItem(i);
}
return null;
}
@Override
public int getCount() {
return mData != null ? mData.size() : 0;
}
@Override
public SavedSearch getItem(final int position) {
return mData != null ? mData.get(position) : null;
}
@Override
public long getItemId(final int position) {
return mData != null ? mData.get(position).getId() : -1;
}
@Override
public View getView(final int position, final View convertView, final ViewGroup parent) {
final View view = convertView != null ? convertView : mInflater.inflate(
android.R.layout.simple_list_item_1, null);
final TextView text = (TextView) view.findViewById(android.R.id.text1);
text.setText(getItem(position).getName());
return view;
}
public void setData(final ResponseList<SavedSearch> data) {
mData = data;
notifyDataSetChanged();
}
}
}