/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.fragments; import android.content.Context; import android.database.Cursor; import android.database.DatabaseUtils; import android.database.sqlite.SQLiteDatabase; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.support.v4.app.FragmentActivity; import android.support.v4.content.Loader; import android.text.TextUtils; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.StreamAdapter; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsDatabaseHelper; import com.galaxy.meetup.client.android.content.EsProvider; import com.galaxy.meetup.client.android.controller.ComposeBarController; import com.galaxy.meetup.client.android.service.EsService; import com.galaxy.meetup.client.android.service.EsServiceListener; import com.galaxy.meetup.client.android.service.ServiceResult; import com.galaxy.meetup.client.android.ui.view.ColumnGridView; import com.galaxy.meetup.client.android.ui.view.HostActionBar; import com.galaxy.meetup.client.android.ui.view.ItemClickListener; import com.galaxy.meetup.client.android.ui.view.SearchViewAdapter; import com.galaxy.meetup.client.android.ui.view.SearchViewAdapter.OnQueryChangeListener; import com.galaxy.meetup.client.android.ui.view.StreamCardView; import com.galaxy.meetup.client.util.SearchUtils; /** * * @author sihai * */ public class HostedPostSearchFragment extends HostedStreamFragment implements OnQueryChangeListener { private String mDelayedQuery; private final EsServiceListener mPostsSearchServiceListener = new EsServiceListener() { public final void onSearchActivitiesComplete(int i, ServiceResult serviceresult) { if(mNewerReqId != null && i == mNewerReqId.intValue() || mOlderReqId != null && i == mOlderReqId.intValue()) { mNewerReqId = null; mOlderReqId = null; HostedPostSearchFragment hostedpostsearchfragment = HostedPostSearchFragment.this; boolean flag; if(serviceresult != null && serviceresult.hasError()) flag = true; else flag = false; hostedpostsearchfragment.mError = flag; updateServerErrorView(); loadContent(); } } }; private String mQuery; private SearchViewAdapter mSearchViewAdapter; public HostedPostSearchFragment() { } private void createAndRunDbCleanup(final Context context, final EsAccount account, final Runnable mainThreadPostRunnable) { (new Thread(new Runnable() { public final void run() { SQLiteDatabase sqlitedatabase = EsDatabaseHelper.getDatabaseHelper(context, account).getWritableDatabase(); sqlitedatabase.delete("search", null, null); String s = DatabaseUtils.sqlEscapeString((new StringBuilder()).append(SearchUtils.getSearchKey("")).append('%').toString()); sqlitedatabase.delete("activity_streams", (new StringBuilder("stream_key LIKE ")).append(s).toString(), null); if(mainThreadPostRunnable != null) (new Handler(Looper.getMainLooper())).post(mainThreadPostRunnable); } })).start(); } private void doSearch() { mFirstLoad = true; prepareLoaderUri(); getLoaderManager().restartLoader(2, null, this); fetchContent(true); } protected final StreamAdapter createStreamAdapter(Context context, ColumnGridView columngridview, EsAccount esaccount, android.view.View.OnClickListener onclicklistener, ItemClickListener itemclicklistener, StreamAdapter.ViewUseListener viewuselistener, StreamCardView.StreamPlusBarClickListener streamplusbarclicklistener, StreamCardView.StreamMediaClickListener streammediaclicklistener, ComposeBarController composebarcontroller) { return super.createStreamAdapter(context, columngridview, esaccount, onclicklistener, itemclicklistener, viewuselistener, streamplusbarclicklistener, streammediaclicklistener, null); } protected final void fetchContent(final boolean newer) { if(!TextUtils.isEmpty(mQuery)) { if(newer) showEmptyViewProgress(getView()); Runnable runnable = new Runnable() { public final void run() { if(!isPaused()) { if(newer) { mNewerReqId = Integer.valueOf(EsService.searchActivities(getActivity(), mAccount, mQuery, false)); mOlderReqId = null; } else { mNewerReqId = null; mOlderReqId = Integer.valueOf(EsService.searchActivities(getActivity(), mAccount, mQuery, false)); } updateSpinner(); } } }; if(newer) createAndRunDbCleanup(getActivity().getApplicationContext(), mAccount, runnable); else runnable.run(); } } public final void loadContent() { getLoaderManager().restartLoader(2, null, this); } public final void onCreate(Bundle bundle) { super.onCreate(bundle); if(bundle != null) { mQuery = bundle.getString("query"); mDelayedQuery = bundle.getString("delayed_query"); prepareLoaderUri(); getLoaderManager().initLoader(2, null, this); } else { mDelayedQuery = getArguments().getString("query"); } } public final Loader onCreateLoader(int i, Bundle bundle) { if(1 == i) { return null; } return super.onCreateLoader(i, bundle); } public final void onDestroy() { super.onDestroy(); FragmentActivity fragmentactivity = getActivity(); if(fragmentactivity.isFinishing()) createAndRunDbCleanup(fragmentactivity.getApplicationContext(), mAccount, null); } public final void onLoadFinished(Loader loader, Cursor cursor) { int id = loader.getId(); if(2 == id) { super.onLoadFinished(loader, cursor); if(TextUtils.equals(mQuery, getArguments().getString("query"))) mSearchViewAdapter.hideSoftInput(); } else if(3 == id) { android.view.View view; saveScrollPosition(); mInnerAdapter.setMarkPostsAsRead(false); mInnerAdapter.changeStreamCursor(cursor); checkResetAnimationState(); mEndOfStream = false; mPreloadRequested = false; view = getView(); if(mError) { showEmptyView(getView(), getString(R.string.people_list_error)); } else { if(cursor != null && cursor.getCount() > 0) { showContent(view); mEndOfStream = TextUtils.isEmpty(mContinuationToken); } else if(mNewerReqId != null || mOlderReqId != null) showEmptyViewProgress(view); else if(!TextUtils.isEmpty(mQuery)) { if(mFirstLoad) fetchContent(true); else showEmptyView(view, getString(R.string.no_posts)); } else { showContent(view); } mFirstLoad = false; } restoreScrollPosition(); updateSpinner(); } } public final void onLoadFinished(Loader loader, Object obj) { onLoadFinished(loader, (Cursor)obj); } public final void onPause() { super.onPause(); EsService.unregisterListener(mPostsSearchServiceListener); } protected final void onPrepareActionBar(HostActionBar hostactionbar) { hostactionbar.showSearchView(); mSearchViewAdapter = hostactionbar.getSearchViewAdapter(); mSearchViewAdapter.setQueryHint(R.string.search_posts_hint_text); mSearchViewAdapter.addOnChangeListener(this); mSearchViewAdapter.requestFocus(true); } public final void onQueryClose() { } public final void onQueryTextChanged(CharSequence charsequence) { } public final void onQueryTextSubmitted(CharSequence charsequence) { String s = charsequence.toString().trim(); if(!TextUtils.equals(s, mQuery)) mResetAnimationState = true; mQuery = s; doSearch(); } public final void onResume() { super.onResume(); EsService.registerListener(mPostsSearchServiceListener); if(mNewerReqId == null) { if(mOlderReqId != null && !EsService.isRequestPending(mOlderReqId.intValue())) { ServiceResult serviceresult = EsService.removeResult(mOlderReqId.intValue()); mOlderReqId = null; if(!serviceresult.hasError()) loadContent(); } } else { if(!EsService.isRequestPending(mNewerReqId.intValue())) { ServiceResult serviceresult1 = EsService.removeResult(mNewerReqId.intValue()); mNewerReqId = null; if(!serviceresult1.hasError()) loadContent(); } } if(mDelayedQuery != null) { mQuery = mDelayedQuery; mDelayedQuery = null; mSearchViewAdapter.setQueryText(mQuery); doSearch(); } } public final void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); bundle.putString("query", mQuery); bundle.putString("delayed_query", mDelayedQuery); } protected final void prepareLoaderUri() { if(TextUtils.isEmpty(mQuery)) mPostsUri = EsProvider.buildStreamUri(mAccount, "com.google.android.apps.plus.INVALID_SEARCH_QUERY"); else mPostsUri = EsProvider.buildStreamUri(mAccount, SearchUtils.getSearchKey(mQuery)); } }