package com.dwdesign.tweetings.fragment; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import twitter4j.ResponseList; import twitter4j.SavedSearch; import com.dwdesign.popupmenu.PopupMenu; import com.dwdesign.popupmenu.PopupMenu.OnMenuItemClickListener; import com.dwdesign.tweetings.R; import com.dwdesign.tweetings.adapter.ListActionAdapter; import com.dwdesign.tweetings.adapter.SeparatedListAdapter; import com.dwdesign.tweetings.adapter.UserListsAdapter; import com.dwdesign.tweetings.app.TweetingsApplication; import com.dwdesign.tweetings.fragment.SavedSearchesListFragment.SavedSearchesAdapter; import com.dwdesign.tweetings.fragment.UserProfileFragment.UserRecentPhotosAction; import com.dwdesign.tweetings.loader.SavedSearchesLoader; import com.dwdesign.tweetings.loader.UserListsLoader; import com.dwdesign.tweetings.model.ListAction; import com.dwdesign.tweetings.model.Panes; import com.dwdesign.tweetings.model.ParcelableUserList; import static com.dwdesign.tweetings.util.Utils.getAccountUsername; import static com.dwdesign.tweetings.util.Utils.getActivatedAccountIds; import static com.dwdesign.tweetings.util.Utils.openSavedSearches; import static com.dwdesign.tweetings.util.Utils.openTrends; import static com.dwdesign.tweetings.util.Utils.openTweetSearch; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.Adapter; import android.widget.ListAdapter; import android.widget.ListView; public class SearchFragment extends BaseListFragment implements OnItemClickListener, OnItemLongClickListener, Panes.Left, OnMenuItemClickListener, LoaderCallbacks<ResponseList<SavedSearch>> { private SeparatedListAdapter<Adapter> mAdapter; private ListActionAdapter mSearchAdapter; private SavedSearchesAdapter mSavedSearchesAdapter; private long[] account_ids; private int mSelectedId; private SharedPreferences mPreferences; private ListView mListView; private TweetingsApplication mApplication; private PopupMenu mPopupMenu; private final BroadcastReceiver mStatusReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { final String action = intent.getAction(); if (BROADCAST_ACCOUNT_LIST_DATABASE_UPDATED.equals(action)) { if (!getLoaderManager().hasRunningLoaders()) { SearchFragment.this.loadSavedSearches(); } } else if (BROADCAST_SEARCH_CHANGED.equals(action)) { SearchFragment.this.loadSavedSearches(); } } }; @Override public void onActivityCreated(final Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); mApplication = getApplication(); mPreferences = getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_PRIVATE); mAdapter = new SeparatedListAdapter<Adapter>(getActivity()); mSearchAdapter = new ListActionAdapter(getActivity()); mSearchAdapter.add(new SearchAction()); mSearchAdapter.add(new TrendsAction()); loadSavedSearches(); setListShown(false); mListView = getListView(); setListAdapter(mAdapter); mListView.setOnItemClickListener(this); mListView.setOnItemLongClickListener(this); } private void loadSavedSearches() { try { mAdapter.clear(); mAdapter.addSection(getString(R.string.search_menu), mSearchAdapter); final long[] activated_ids = getActivatedAccountIds(getActivity()); int i = 1; account_ids = null; account_ids = new long[activated_ids.length]; for (final long account_id : activated_ids) { try { getLoaderManager().destroyLoader(i); } catch (Exception e) { } account_ids[i-1] = account_id; String user_name = getAccountUsername(getActivity(), account_id); mSavedSearchesAdapter = new SavedSearchesAdapter(getActivity()); mAdapter.addSection("@" + user_name + ": " + getString(R.string.saved_searches), mSavedSearchesAdapter); final Bundle args = new Bundle(); args.putLong(INTENT_KEY_ACCOUNT_ID, account_id); args.putInt(INTENT_KEY_POSITION, i); getLoaderManager().initLoader(i, args, this); i++; } } catch (Exception e) { e.printStackTrace(); } } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } @Override public final void onItemClick(final AdapterView<?> adapter, final View view, final int position, final long id) { final Object obj = mAdapter.getItem(position); final int section = mAdapter.getSection(position); if (obj.getClass().getSimpleName().startsWith("SavedSearch")) { final SavedSearch search = (SavedSearch) obj; long account_id = account_ids[section-1]; openTweetSearch(getActivity(), account_id, search.getQuery(), search.getId()); } else { final ListAction row = (ListAction) obj; row.onClick(); } } public boolean onItemLongClick(final AdapterView<?> adapter, final View view, final int position, final long id) { final Object obj = mAdapter.getItem(position); if (obj.getClass().getSimpleName().startsWith("SavedSearch")) { mSelectedId = position; mPopupMenu = PopupMenu.getInstance(getActivity(), view); mPopupMenu.inflate(R.menu.action_savedsearch); mPopupMenu.setOnMenuItemClickListener(this); mPopupMenu.show(); return true; } return false; } public boolean onMenuItemClick(final MenuItem item) { switch (item.getItemId()) { case MENU_DELETE: { final SavedSearch obj = (SavedSearch) mAdapter.getItem(mSelectedId); final int section = mAdapter.getSection(mSelectedId); long account_id = account_ids[section-1]; final TweetingsApplication application = getApplication(); application.getServiceInterface().destroySavedSearch(account_id, obj.getId()); break; } } return super.onContextItemSelected(item); } class SearchAction extends ListAction { @Override public long getId() { return 1; } @Override public String getName() { return getString(R.string.search); } @Override public void onClick() { getActivity().onSearchRequested(); } } class SearchToolsAction extends ListAction { @Override public long getId() { return 1; } @Override public String getName() { return getString(R.string.saved_searches); } @Override public void onClick() { final long default_account_id = mPreferences.getLong(PREFERENCE_KEY_DEFAULT_ACCOUNT_ID, -1); openSavedSearches(getActivity(), default_account_id); } } class TrendsAction extends ListAction { @Override public long getId() { return 2; } @Override public String getName() { return getString(R.string.trends); } @Override public void onClick() { final long account_id = mPreferences.getLong(PREFERENCE_KEY_DEFAULT_ACCOUNT_ID, -1); openTrends(getActivity(), account_id); } } 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 Loader<ResponseList<SavedSearch>> onCreateLoader(final int id, final Bundle args) { setProgressBarIndeterminateVisibility(true); long account_id = args.getLong(INTENT_KEY_ACCOUNT_ID, -1); int position = args.getInt(INTENT_KEY_POSITION, 1); return new SavedSearchesLoader(getActivity(), account_id, position); } @Override public void onLoaderReset(final Loader<ResponseList<SavedSearch>> loader) { setProgressBarIndeterminateVisibility(false); } @Override public void onLoadFinished(final Loader<ResponseList<SavedSearch>> loader, final ResponseList<SavedSearch> data) { setProgressBarIndeterminateVisibility(false); if (data != null) { Collections.sort(data, POSITION_COMPARATOR); } int position = ((SavedSearchesLoader)loader).getPosition(); if (position >= 1) { ArrayList<Adapter> adapters = mAdapter.getAdapters(); try { SavedSearchesAdapter searchAdapter = (SavedSearchesAdapter) adapters.get(position); searchAdapter.setData(data); searchAdapter.notifyDataSetChanged(); mAdapter.notifyDataSetChanged(); } catch (Exception e) { } } setListShown(true); } @Override public void onStart() { super.onStart(); final IntentFilter filter = new IntentFilter(BROADCAST_SEARCH_CHANGED); //filter.addAction(BROADCAST_ACCOUNT_LIST_DATABASE_UPDATED); registerReceiver(mStatusReceiver, filter); } @Override public void onStop() { if (mPopupMenu != null) { mPopupMenu.dismiss(); } unregisterReceiver(mStatusReceiver); super.onStop(); } }