/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.fragments; import java.util.concurrent.CountDownLatch; import android.content.Context; import android.content.DialogInterface; import android.database.Cursor; import android.database.DataSetObserver; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.LoaderManager; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.telephony.PhoneNumberUtils; import android.text.TextUtils; import android.text.util.Rfc822Token; import android.text.util.Rfc822Tokenizer; import android.util.Patterns; import android.widget.Filter; import android.widget.Filterable; import com.galaxy.meetup.client.android.EsMatrixCursor; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.common.EsCompositeCursorAdapter; import com.galaxy.meetup.client.android.content.CircleData; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsAccountsData; import com.galaxy.meetup.client.android.content.PersonData; import com.galaxy.meetup.client.android.ui.fragments.AlertFragmentDialog.AlertDialogListener; import com.galaxy.meetup.client.util.AccountsUtil; import com.galaxy.meetup.client.util.MentionTokenizer; /** * * @author sihai * */ public abstract class PeopleSearchAdapter extends EsCompositeCursorAdapter implements LoaderCallbacks, Filterable, AlertDialogListener { private static final String CIRCLES_PROJECTION[] = { "_id", "circle_id", "type", "circle_name", "contact_count" }; private static final String CONTACT_PROJECTION[] = { "person_id", "lookup_key", "name", "email" }; private static final String CONTACT_PROJECTION_WITH_PHONE[] = { "person_id", "lookup_key", "name", "email", "phone", "phone_type" }; private static final String GAIA_ID_CIRCLE_PROJECTION[] = { "gaia_id", "packed_circle_ids" }; private static final String LOCAL_PROFILE_PROJECTION[] = { "_id", "person_id", "gaia_id", "name", "avatar", "packed_circle_ids", "email", "profile_type" }; public static final String PEOPLE_PROJECTION[] = { "_id", "person_id", "gaia_id", "name", "avatar", "packed_circle_ids", "blocked", "profile_type" }; private static final String PUBLIC_PROFILE_PROJECTION[] = { "_id", "gaia_id", "person_id", "name", "avatar", "profile_type", "snippet" }; protected final EsAccount mAccount; private int mActiveLoaderCount; private String mActivityId; protected boolean mAddToCirclesActionEnabled; private final DataSetObserver mCircleContentObserver; protected final CircleNameResolver mCircleNameResolver; private int mCircleUsageType; private boolean mCirclesError; private boolean mCirclesLoaded; private final int mCirclesLoaderId; private Cursor mContactsCursor; private boolean mContactsError; private boolean mContactsLoaded; private final int mContactsLoaderId; private Filter mFilter; private volatile CountDownLatch mFilterLatch; private boolean mFilterNullGaiaIds; private final FragmentManager mFragmentManager; private Cursor mGaiaIdCircleCursor; private final int mGaiaIdLoaderId; private final Handler mHandler; private boolean mIncludePeopleInCircles; protected boolean mIncludePhoneNumberContacts; private boolean mIncludePlusPages; private boolean mIsMentionsAdapter; protected SearchListAdapterListener mListener; private final LoaderManager mLoaderManager; private boolean mLocalProfileError; private Cursor mLocalProfilesCursor; private boolean mLocalProfilesLoaded; private final int mPeopleLoaderId; private final int mProfilesLoaderId; private boolean mPublicProfileSearchEnabled; private Cursor mPublicProfilesCursor; private boolean mPublicProfilesError; private boolean mPublicProfilesLoading; private boolean mPublicProfilesNotFound; protected String mQuery; private PeopleSearchResults mResults; private boolean mResultsPreserved; private boolean mShowPersonNameDialog; private boolean mShowProgressWhenEmpty; public PeopleSearchAdapter(Context context, FragmentManager fragmentmanager, LoaderManager loadermanager, EsAccount esaccount) { this(context, fragmentmanager, loadermanager, esaccount, 0); } public PeopleSearchAdapter(Context context, FragmentManager fragmentmanager, LoaderManager loadermanager, EsAccount esaccount, int i) { super(context); SearchResultsFragment searchresultsfragment; mCircleUsageType = -1; mShowProgressWhenEmpty = true; mShowPersonNameDialog = true; mIncludePeopleInCircles = true; mResults = new PeopleSearchResults(); mHandler = new Handler() { public final void handleMessage(Message message) { if(0 == message.what) { showEmptyPeopleSearchResults(); } else if(1 == message.what) { // TODO } } }; mCircleContentObserver = new DataSetObserver() { public final void onChanged() { notifyDataSetChanged(); } }; for(int j = 0; j < 6; j++) addPartition(false, false); int k = 1024 + i * 10; int l = k + 1; mCirclesLoaderId = k; int i1 = l + 1; mGaiaIdLoaderId = l; int j1 = i1 + 1; mPeopleLoaderId = i1; int k1 = j1 + 1; mContactsLoaderId = j1; mProfilesLoaderId = k1; searchresultsfragment = (SearchResultsFragment)fragmentmanager.findFragmentByTag("people_search_results"); if(searchresultsfragment != null) { PeopleSearchResults peoplesearchresults = searchresultsfragment.getPeopleSearchResults(); if(peoplesearchresults != null) { mResults = peoplesearchresults; mQuery = mResults.getQuery(); mResultsPreserved = true; } } else { searchresultsfragment = new SearchResultsFragment(); fragmentmanager.beginTransaction().add(searchresultsfragment, "people_search_results").commitAllowingStateLoss(); } searchresultsfragment.setPeopleSearchResults(mResults); mFragmentManager = fragmentmanager; mLoaderManager = loadermanager; mAccount = esaccount; mResults.setMyProfile(mAccount.getPersonId()); mResults.setIncludePeopleInCircles(mIncludePeopleInCircles); mCircleNameResolver = new CircleNameResolver(context, loadermanager, mAccount, i); mCircleNameResolver.registerObserver(mCircleContentObserver); return; } private void changeCursorForPeoplePartition() { mHandler.removeMessages(0); Cursor cursor = mResults.getCursor(); if(cursor.getCount() == 0) mHandler.sendEmptyMessageDelayed(0, 500L); else changeCursor(4, cursor); } private String getWellFormedEmailAddress() { if(TextUtils.isEmpty(mQuery)) { return null; } Rfc822Token arfc822token[] = Rfc822Tokenizer.tokenize(mQuery); if(arfc822token != null && arfc822token.length > 0) { String s = arfc822token[0].getAddress(); if(!TextUtils.isEmpty(s) && Patterns.EMAIL_ADDRESS.matcher(s).matches()) return s; } return null; } private String getWellFormedSmsAddress() { boolean flag; flag = TextUtils.isEmpty(mQuery); if(flag) { return null; } String s; boolean flag1 = PhoneNumberUtils.isWellFormedSmsAddress(mQuery); s = null; if(!flag1) return null; int i = mQuery.length(); boolean flag2 = true; for(int j = 0; j < i;) { char c = mQuery.charAt(j); boolean flag3 = PhoneNumberUtils.isDialable(c); s = null; if(!flag3) continue; /* Loop/switch isn't completed */ if(c == '+') { s = null; if(!flag2) continue; /* Loop/switch isn't completed */ } j++; flag2 = false; } s = mQuery; return s; } private void releaseLatch() { CountDownLatch countdownlatch = mFilterLatch; if(countdownlatch != null) countdownlatch.countDown(); } private void updatePublicProfileSearchStatus() { if(!mPublicProfileSearchEnabled) { return; } EsMatrixCursor esmatrixcursor; esmatrixcursor = new EsMatrixCursor(new String[] { "_id" }); if(!TextUtils.isEmpty(mQuery) && mQuery.trim().length() >= 2 && mLocalProfilesLoaded && mContactsLoaded) { if(mPublicProfilesError) { Object aobj2[] = new Object[1]; aobj2[0] = Integer.valueOf(3); esmatrixcursor.addRow(aobj2); } else { if(mPublicProfilesNotFound && !mIsMentionsAdapter) { Object aobj1[] = new Object[1]; aobj1[0] = Integer.valueOf(2); esmatrixcursor.addRow(aobj1); } else if(mPublicProfilesLoading && !mIsMentionsAdapter && (mShowProgressWhenEmpty || mResults.getCount() > 0)) { Object aobj[] = new Object[1]; aobj[0] = Integer.valueOf(1); esmatrixcursor.addRow(aobj); } } } if(esmatrixcursor.getCount() != 0) showEmptyPeopleSearchResults(); changeCursor(5, esmatrixcursor); } protected final void continueLoadingPublicProfiles() { if(mResults.hasMoreResults()) mHandler.post(new Runnable() { @Override public void run() { // TODO Auto-generated method stub } } ); } public Filter getFilter() { if(mFilter == null) mFilter = new Filter() { public final CharSequence convertResultToString(Object obj) { Cursor cursor = (Cursor)obj; String s; if(cursor == null || cursor.isClosed()) { s = ""; } else { int i = cursor.getColumnIndex("circle_name"); if(i != -1) { s = cursor.getString(i); } else { int j = cursor.getColumnIndex("name"); if(j != -1) { s = cursor.getString(j); } else { int k = cursor.getColumnIndex("address"); if(k != -1) s = cursor.getString(k); else s = ""; } } } return s; } protected final android.widget.Filter.FilterResults performFiltering(CharSequence charsequence) { final CharSequence queryString = charsequence; releaseLatch(); CountDownLatch countdownlatch = new CountDownLatch(1); mFilterLatch = countdownlatch; mHandler.post(new Runnable() { public final void run() { String s; if(queryString == null) s = null; else if(mIsMentionsAdapter) { int i = queryString.length(); if(i > 0 && MentionTokenizer.isMentionTrigger(queryString.charAt(0))) s = queryString.subSequence(1, i).toString(); else s = null; } else { s = queryString.toString(); } setQueryString(s); } }); try { countdownlatch.await(); } catch(InterruptedException interruptedexception) { } mFilterLatch = null; return new android.widget.Filter.FilterResults(); } protected final void publishResults(CharSequence charsequence, android.widget.Filter.FilterResults filterresults) { filterresults.count = getCount(); } }; return mFilter; } protected final int getItemViewType(int i, int j) { return i; } public final int getItemViewTypeCount() { return 6; } public boolean isEmpty() { boolean flag; if(TextUtils.isEmpty(mQuery) || !mCircleNameResolver.isLoaded()) flag = true; else flag = false; return flag; } public final boolean isError() { boolean flag; if(mCirclesError || mLocalProfileError || mContactsError) flag = true; else flag = false; return flag; } public final boolean isLoaded() { boolean flag; if(mLocalProfilesLoaded && mContactsLoaded && (mCircleUsageType == -1 || mCirclesLoaded) && mCircleNameResolver.isLoaded()) flag = true; else flag = false; return flag; } public final boolean isSearchingForFirstResult() { boolean flag; if(!TextUtils.isEmpty(mQuery) && mResults.getCount() == 0 && (!isLoaded() || mPublicProfilesLoading)) flag = true; else flag = false; return flag; } public final void onCreate(Bundle bundle) { if(bundle != null) { bundle.setClassLoader(getClass().getClassLoader()); mQuery = bundle.getString("search_list_adapter.query"); if(bundle.containsKey("search_list_adapter.results") && !mResultsPreserved) mResults = (PeopleSearchResults)bundle.getParcelable("search_list_adapter.results"); } } public final Loader onCreateLoader(int i, Bundle bundle) { Object obj; if(i == mCirclesLoaderId) obj = new CircleListLoader(getContext(), mAccount, mCircleUsageType, CIRCLES_PROJECTION, mQuery, 10); else if(i == mGaiaIdLoaderId) obj = new PeopleListLoader(getContext(), mAccount, GAIA_ID_CIRCLE_PROJECTION, null, mIncludePlusPages, mFilterNullGaiaIds); else if(i == mContactsLoaderId) { Context context = getContext(); EsAccount _tmp = mAccount; String as[]; if(mIncludePhoneNumberContacts) as = CONTACT_PROJECTION_WITH_PHONE; else as = CONTACT_PROJECTION; obj = new AndroidContactSearchLoader(context, as, mQuery, 2, mIncludePhoneNumberContacts); } else if(i == mPeopleLoaderId) obj = new PeopleSearchListLoader(getContext(), mAccount, LOCAL_PROFILE_PROJECTION, mQuery, mIncludePlusPages, mIncludePeopleInCircles, mFilterNullGaiaIds, mActivityId, 10); else if(i == mProfilesLoaderId) obj = new PublicProfileSearchLoader(getContext(), mAccount, PUBLIC_PROFILE_PROJECTION, mQuery, 2, mIncludePlusPages, mFilterNullGaiaIds, mResults.getToken()); else obj = null; return ((Loader) (obj)); } public final void onDialogCanceled(String s) { } public final void onDialogListClick(int i, Bundle bundle) { } public final void onDialogNegativeClick(String s) { } public final void onDialogPositiveClick(Bundle bundle, String s) { if(!"add_email_dialog".equals(s)) { if("add_sms_dialog".equals(s)) { String s1 = bundle.getString("message"); String s2 = getWellFormedSmsAddress(); if(!TextUtils.isEmpty(s1) && !TextUtils.isEmpty(s2)) { String s3 = (new StringBuilder("p:")).append(s2).toString(); if(mAddToCirclesActionEnabled) { mListener.onChangeCirclesAction(s3, s1); } else { PersonData persondata = new PersonData(null, s1, s3); mListener.onPersonSelected(s3, null, persondata); } } } } else { String s4 = bundle.getString("message"); String s5 = getWellFormedEmailAddress(); if(!TextUtils.isEmpty(s4) && !TextUtils.isEmpty(s5)) { String s6 = (new StringBuilder("e:")).append(s5).toString(); if(mAddToCirclesActionEnabled) { mListener.onChangeCirclesAction(s6, s4); } else { PersonData persondata1 = new PersonData(null, s4, s5); mListener.onPersonSelected(s6, null, persondata1); } } } } public final void onItemClick(int i) { Cursor cursor = (Cursor)getItem(i); if(null == cursor) { return; } switch(getPartitionForPosition(i)) { case 0: // '\0' String s11 = cursor.getString(1); PersonData persondata3 = new PersonData(cursor.getString(2), cursor.getString(3), null); mListener.onPersonSelected(s11, null, persondata3); break; case 1: // '\001' final Context context = getContext(); final String circleId = cursor.getString(1); String s10 = cursor.getString(3); int j = cursor.getInt(2); final CircleData circle = new CircleData(circleId, j, s10, cursor.getInt(4)); if(AccountsUtil.isRestrictedCircleForAccount(mAccount, j) && !EsAccountsData.hasSeenMinorPublicExtendedDialog(context, mAccount)) { android.app.AlertDialog.Builder builder = new android.app.AlertDialog.Builder(context); builder.setTitle(cursor.getString(3)); builder.setMessage(R.string.dialog_public_or_extended_circle_for_minor); int k = R.string.ok; android.content.DialogInterface.OnClickListener onclicklistener = new android.content.DialogInterface.OnClickListener() { public final void onClick(DialogInterface dialoginterface, int i1) { mListener.onCircleSelected(circleId, circle); EsAccountsData.saveMinorPublicExtendedDialogSeenPreference(context, mAccount, true); } }; builder.setPositiveButton(k, onclicklistener); int l = R.string.cancel; android.content.DialogInterface.OnClickListener onclicklistener1 = new android.content.DialogInterface.OnClickListener() { public final void onClick(DialogInterface dialoginterface, int i1) { } }; builder.setNegativeButton(l, onclicklistener1); builder.show(); } else { mListener.onCircleSelected(circleId, circle); } break; case 4: // '\004' String s4 = cursor.getString(1); String s5 = cursor.getString(2); SearchListAdapterListener searchlistadapterlistener = mListener; String s6 = cursor.getString(3); String s7 = cursor.getString(4); boolean flag = mIncludePhoneNumberContacts; String s8 = null; if(flag) { String s9 = cursor.getString(10); boolean flag1 = TextUtils.isEmpty(s9); s8 = null; if(!flag1) { StringBuilder stringbuilder = new StringBuilder("p:"); s8 = stringbuilder.append(s9.trim()).toString(); } } if(s8 == null) s8 = cursor.getString(8); if(TextUtils.isEmpty(s8)) { s8 = cursor.getString(9); if(TextUtils.isEmpty(s8)) s8 = null; } PersonData persondata2 = new PersonData(s6, s7, s8); searchlistadapterlistener.onPersonSelected(s4, s5, persondata2); break; case 2: // '\002' if(!mAddToCirclesActionEnabled) if(mShowPersonNameDialog) { showPersonNameDialog("add_email_dialog"); } else { String s2 = getWellFormedEmailAddress(); if(!TextUtils.isEmpty(s2)) { String s3 = (new StringBuilder("e:")).append(s2).toString(); PersonData persondata1 = new PersonData(null, null, s2); mListener.onPersonSelected(s3, null, persondata1); } } break; case 3: // '\003' if(!mAddToCirclesActionEnabled) if(mShowPersonNameDialog) { showPersonNameDialog("add_sms_dialog"); } else { String s = getWellFormedSmsAddress(); if(!TextUtils.isEmpty(s)) { String s1 = (new StringBuilder("p:")).append(s).toString(); PersonData persondata = new PersonData(null, null, s1); mListener.onPersonSelected(s1, null, persondata); } } break; } } public final void onLoadFinished(Loader loader, Object obj) { boolean flag; Cursor cursor; int i; flag = true; cursor = (Cursor)obj; i = loader.getId(); if(i != mCirclesLoaderId) { if(i == mGaiaIdLoaderId) { if(mGaiaIdCircleCursor != null && mGaiaIdCircleCursor != cursor) mGaiaIdCircleCursor.close(); mGaiaIdCircleCursor = cursor; mResults.onStartGaiaIdsAndCircles(); if(cursor != null && cursor.moveToFirst()) do mResults.addGaiaIdAndCircles(cursor.getString(0), cursor.getString(1)); while(cursor.moveToNext()); mResults.onFinishGaiaIdsAndCircles(); changeCursorForPeoplePartition(); } else if(i == mContactsLoaderId) { boolean flag4; if(cursor == null) flag4 = flag; else flag4 = false; mContactsError = flag4; mContactsLoaded = flag; if(mContactsCursor != null && mContactsCursor != cursor) mContactsCursor.close(); mContactsCursor = cursor; mResults.onStartContacts(); String as[]; EsMatrixCursor esmatrixcursor; String as1[]; EsMatrixCursor esmatrixcursor1; String s1; Object aobj[]; String s2; Object aobj1[]; String s3; String s4; if(cursor != null && cursor.moveToFirst()) do { if(mIncludePhoneNumberContacts) s3 = cursor.getString(4); else s3 = null; if(mIncludePhoneNumberContacts) s4 = cursor.getString(5); else s4 = null; mResults.addContact(cursor.getString(0), cursor.getString(1), cursor.getString(2), cursor.getString(3), s3, s4); } while(cursor.moveToNext()); //mResults; PeopleSearchResults.onFinishContacts(); changeCursorForPeoplePartition(); as = new String[2]; as[0] = "_id"; as[1] = "address"; esmatrixcursor = new EsMatrixCursor(as); if(cursor != null && cursor.getCount() == 0) { s2 = getWellFormedEmailAddress(); if(!TextUtils.isEmpty(s2)) { aobj1 = new Object[2]; aobj1[0] = Integer.valueOf(0); aobj1[1] = s2; esmatrixcursor.addRow(aobj1); } } changeCursor(2, esmatrixcursor); if(mIncludePhoneNumberContacts) { as1 = new String[2]; as1[0] = "_id"; as1[1] = "address"; esmatrixcursor1 = new EsMatrixCursor(as1); if(cursor != null && cursor.getCount() == 0) { s1 = getWellFormedSmsAddress(); if(!TextUtils.isEmpty(s1)) { aobj = new Object[2]; aobj[0] = Integer.valueOf(0); aobj[1] = s1; esmatrixcursor1.addRow(aobj); } } changeCursor(3, esmatrixcursor1); } } else if(i == mPeopleLoaderId) { boolean flag1 = false; if(cursor == null) flag1 = flag; mLocalProfileError = flag1; mLocalProfilesLoaded = flag; if(mLocalProfilesCursor != null && mLocalProfilesCursor != cursor) mLocalProfilesCursor.close(); mLocalProfilesCursor = cursor; mResults.onStartLocalProfiles(); if(cursor != null && cursor.moveToFirst()) do mResults.addLocalProfile(cursor.getString(1), cursor.getString(2), cursor.getString(3), cursor.getInt(7), cursor.getString(4), cursor.getString(5), cursor.getString(6), null, null); while(cursor.moveToNext()); mResults.onFinishLocalProfiles(); changeCursorForPeoplePartition(); } else if(i == mProfilesLoaderId && cursor != PublicProfileSearchLoader.ABORTED) { mHandler.removeMessages(1); if(mPublicProfilesCursor != null && mPublicProfilesCursor != cursor) mPublicProfilesCursor.close(); mPublicProfilesCursor = cursor; boolean flag2; if(cursor == null || !cursor.moveToFirst()) flag2 = flag; else flag2 = false; mPublicProfilesError = flag2; if(mPublicProfilesError) mPublicProfilesLoading = false; else if(TextUtils.equals(cursor.getString(0), mResults.getToken())) { mPublicProfilesLoading = false; String s = cursor.getString(1); mResults.setToken(s); PeopleSearchResults peoplesearchresults = mResults; boolean flag3; if(!TextUtils.isEmpty(s)) flag3 = flag; else flag3 = false; peoplesearchresults.setHasMoreResults(flag3); for(; cursor.moveToNext(); mResults.addPublicProfile(cursor.getString(2), cursor.getString(1), cursor.getString(3), cursor.getInt(5), cursor.getString(4), cursor.getString(6))); if(mResults.getPublicProfileCount() != 0) flag = false; mPublicProfilesNotFound = flag; changeCursorForPeoplePartition(); } } } else { boolean flag5; if(cursor == null) flag5 = flag; else flag5 = false; mCirclesError = flag5; mCirclesLoaded = flag; changeCursor(1, cursor); updatePublicProfileSearchStatus(); if(mListener != null) mListener.onSearchListAdapterStateChange(this); mActiveLoaderCount = -1 + mActiveLoaderCount; if(mActiveLoaderCount <= 0) releaseLatch(); return; } } public final void onLoaderReset(Loader loader) { } public final void onSaveInstanceState(Bundle bundle) { bundle.putString("search_list_adapter.query", mQuery); if(mResults.isParcelable()) bundle.putParcelable("search_list_adapter.results", mResults); } public final void onStart() { mCircleNameResolver.initLoader(); mLoaderManager.initLoader(mGaiaIdLoaderId, null, this); Bundle bundle = new Bundle(); bundle.putString("query", mQuery); if(mCircleUsageType != -1) mLoaderManager.initLoader(mCirclesLoaderId, bundle, this); mLoaderManager.initLoader(mPeopleLoaderId, bundle, this); if(!mFilterNullGaiaIds) mLoaderManager.initLoader(mContactsLoaderId, bundle, this); if(mPublicProfileSearchEnabled) mLoaderManager.initLoader(mProfilesLoaderId, bundle, this); updatePublicProfileSearchStatus(); AddEmailDialogListener addemaildialoglistener = (AddEmailDialogListener)mFragmentManager.findFragmentByTag("add_person_dialog_listener"); if(addemaildialoglistener != null) addemaildialoglistener.setAdapter(this); } public final void onStop() { mHandler.removeMessages(0); } public final void setAddToCirclesActionEnabled(boolean flag) { mAddToCirclesActionEnabled = flag; } public final void setCircleUsageType(int i) { mCircleUsageType = i; } public final void setFilterNullGaiaIds(boolean flag) { mFilterNullGaiaIds = flag; } public final void setIncludePeopleInCircles(boolean flag) { mIncludePeopleInCircles = flag; mResults.setIncludePeopleInCircles(mIncludePeopleInCircles); } public final void setIncludePhoneNumberContacts(boolean flag) { mIncludePhoneNumberContacts = flag; } public final void setIncludePlusPages(boolean flag) { mIncludePlusPages = flag; } public final void setListener(SearchListAdapterListener searchlistadapterlistener) { mListener = searchlistadapterlistener; } public final void setMention(String s) { mActivityId = s; mIsMentionsAdapter = true; } public final void setPublicProfileSearchEnabled(boolean flag) { mPublicProfileSearchEnabled = flag; } public final void setQueryString(String s) { if(TextUtils.equals(mQuery, s)) { releaseLatch(); return; } mResults.setQueryString(s); mHandler.removeMessages(0); mHandler.removeMessages(1); mQuery = s; mActiveLoaderCount = 0; if(TextUtils.isEmpty(s)) { mLoaderManager.destroyLoader(mCirclesLoaderId); mLoaderManager.destroyLoader(mPeopleLoaderId); mLoaderManager.destroyLoader(mContactsLoaderId); mLoaderManager.destroyLoader(mProfilesLoaderId); clearPartitions(); releaseLatch(); if(mListener != null) mListener.onSearchListAdapterStateChange(this); } else { Bundle bundle = new Bundle(); bundle.putString("query", mQuery); if(mCircleUsageType != -1) { mActiveLoaderCount = 1 + mActiveLoaderCount; mLoaderManager.restartLoader(mCirclesLoaderId, bundle, this); } mActiveLoaderCount = 1 + mActiveLoaderCount; mLoaderManager.restartLoader(mPeopleLoaderId, bundle, this); if(!mFilterNullGaiaIds) { mActiveLoaderCount = 1 + mActiveLoaderCount; mLoaderManager.restartLoader(mContactsLoaderId, bundle, this); } if(mPublicProfileSearchEnabled) { mPublicProfilesError = false; mPublicProfilesNotFound = false; mPublicProfilesLoading = false; mHandler.sendEmptyMessageDelayed(1, 300L); mLoaderManager.destroyLoader(mProfilesLoaderId); mLoaderManager.initLoader(mProfilesLoaderId, bundle, this); updatePublicProfileSearchStatus(); } } } public final void setShowPersonNameDialog(boolean flag) { mShowPersonNameDialog = false; } public final void setShowProgressWhenEmpty(boolean flag) { mShowProgressWhenEmpty = false; } protected final void showEmptyPeopleSearchResults() { mHandler.removeMessages(0); Cursor cursor = mResults.getCursor(); if(cursor.getCount() == 0) changeCursor(4, cursor); } protected final void showPersonNameDialog(String s) { AddEmailDialogListener addemaildialoglistener = (AddEmailDialogListener)mFragmentManager.findFragmentByTag("add_person_dialog_listener"); if(addemaildialoglistener == null) { addemaildialoglistener = new AddEmailDialogListener(); mFragmentManager.beginTransaction().add(addemaildialoglistener, "add_person_dialog_listener").commit(); } addemaildialoglistener.setAdapter(this); Context context = getContext(); EditFragmentDialog editfragmentdialog = EditFragmentDialog.newInstance(context.getString(R.string.add_email_dialog_title), null, context.getString(R.string.add_email_dialog_hint), context.getString(0x104000a), context.getString(0x1040000), false); editfragmentdialog.setTargetFragment(addemaildialoglistener, 0); editfragmentdialog.show(mFragmentManager, s); } public static interface SearchListAdapterListener { void onAddPersonToCirclesAction(String s, String s1, boolean flag); void onChangeCirclesAction(String s, String s1); void onCircleSelected(String s, CircleData circledata); void onDismissSuggestionAction(String s, String s1); void onPersonSelected(String s, String s1, PersonData persondata); void onSearchListAdapterStateChange(PeopleSearchAdapter peoplesearchadapter); void onUnblockPersonAction(String s, boolean flag); } public static class AddEmailDialogListener extends Fragment implements AlertFragmentDialog.AlertDialogListener { private PeopleSearchAdapter mAdapter; public AddEmailDialogListener() { } public final void onDialogCanceled(String s) { } public final void onDialogListClick(int i, Bundle bundle) { } public final void onDialogNegativeClick(String s) { } public final void onDialogPositiveClick(Bundle bundle, String s) { if (mAdapter != null) mAdapter.onDialogPositiveClick(bundle, s); } public final void setAdapter(PeopleSearchAdapter peoplesearchadapter) { mAdapter = peoplesearchadapter; } } public static class SearchResultsFragment extends Fragment { private PeopleSearchResults mResults; public SearchResultsFragment() { setRetainInstance(true); } public final PeopleSearchResults getPeopleSearchResults() { return mResults; } public final void setPeopleSearchResults( PeopleSearchResults peoplesearchresults) { mResults = peoplesearchresults; } } }