/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.fragments; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.database.MatrixCursor; import android.os.Bundle; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.Loader; import android.util.Log; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.GridView; import android.widget.ScrollView; import android.widget.TextView; import com.galaxy.meetup.client.android.EsCursorAdapter; import com.galaxy.meetup.client.android.EsCursorLoader; import com.galaxy.meetup.client.android.Intents; import com.galaxy.meetup.client.android.R; import com.galaxy.meetup.client.android.content.AudienceData; import com.galaxy.meetup.client.android.content.CircleData; import com.galaxy.meetup.client.android.content.EsAccount; import com.galaxy.meetup.client.android.content.EsAudienceData; import com.galaxy.meetup.client.android.content.EsPeopleData; import com.galaxy.meetup.client.android.content.EsProvider; import com.galaxy.meetup.client.android.content.PersonData; import com.galaxy.meetup.client.android.realtimechat.Client; import com.galaxy.meetup.client.android.realtimechat.Data; import com.galaxy.meetup.client.android.realtimechat.ParticipantUtils; import com.galaxy.meetup.client.android.realtimechat.RealTimeChatService; import com.galaxy.meetup.client.android.realtimechat.RealTimeChatServiceListener; import com.galaxy.meetup.client.android.realtimechat.RealTimeChatServiceResult; import com.galaxy.meetup.client.android.ui.fragments.PeopleSearchAdapter.SearchListAdapterListener; import com.galaxy.meetup.client.android.ui.view.AudienceView; import com.galaxy.meetup.client.android.ui.view.SuggestedPeopleListItemView; import com.galaxy.meetup.client.android.ui.view.TypeableAudienceView; import com.galaxy.meetup.client.util.EsLog; /** * * @author sihai * */ public class AudienceFragment extends EsFragment implements LoaderCallbacks, OnClickListener, OnItemClickListener, SearchListAdapterListener { private List displayedSuggestedParticipants; private EsAccount mAccount; private Runnable mAudienceChangedCallback; protected AudienceData mAudienceResult; protected AudienceView mAudienceView; private boolean mCacheSuggestionsResponse; private int mCircleUsageType; private boolean mFilterNullGaiaIds; private GridView mGridView; private boolean mIncludePhoneOnlyContacts; private boolean mIncludePlusPages; private TextView mListHeader; private View mListParent; private boolean mPublicProfileSearchEnabled; private RTCListener mRealTimeChatListener; private Integer mRequestId; protected PeopleSearchListAdapter mSearchListAdapter; private boolean mShowSuggestedPeople; private List mSuggestedPeople; private SuggestedPeopleAdpater mSuggestedPeopleAdapter; private ScrollView mSuggestedPeopleScrollView; private int mSuggestedPeopleSize; public AudienceFragment() { mIncludePhoneOnlyContacts = true; mRealTimeChatListener = new RTCListener(); mRequestId = null; mSuggestedPeopleSize = 0; } private void cacheSuggestedResponse(Client.SuggestionsResponse suggestionsresponse) { if(mCacheSuggestionsResponse) { EsAudienceData.processSuggestionsResponse(getActivity(), mAccount, suggestionsresponse); mCacheSuggestionsResponse = false; } } private boolean isInAudience(String s) { String s1; PersonData apersondata[] = mAudienceView.getAudience().getUsers(); int length = apersondata.length; for(int j = 0; j < length; j++) { s1 = ParticipantUtils.getParticipantIdFromPerson(apersondata[j]); if(null != s1 && s1.equals(s)) { return true; } } return false; } private void loadSuggestedPeople(Client.SuggestionsResponse suggestionsresponse) { for(Iterator iterator = suggestionsresponse.getSuggestionList().iterator(); iterator.hasNext();) { Iterator iterator1 = ((Client.Suggestion)iterator.next()).getSuggestedUserList().iterator(); while(iterator1.hasNext()) { Data.Participant participant = (Data.Participant)iterator1.next(); mSuggestedPeople.add(participant); } } updateSuggestedPeopleDisplay(); } private void updateSuggestedPeopleDisplay() { Iterator iterator = mSuggestedPeople.iterator(); do { if(!iterator.hasNext()) break; Data.Participant participant1 = (Data.Participant)iterator.next(); Iterator iterator2 = displayedSuggestedParticipants.iterator(); boolean flag1; do { boolean flag = iterator2.hasNext(); flag1 = false; if(!flag) break; if(!((Data.Participant)iterator2.next()).getParticipantId().equals(participant1.getParticipantId())) continue; flag1 = true; break; } while(true); if(!flag1) { displayedSuggestedParticipants.add(participant1); if(mListHeader != null && mListHeader.getVisibility() != 0) mListHeader.setVisibility(0); } } while(true); int i = 0; MatrixCursor matrixcursor = new MatrixCursor(SuggestedPeopleQuery.columnNames); Iterator iterator1 = displayedSuggestedParticipants.iterator(); while(iterator1.hasNext()) { Data.Participant participant = (Data.Participant)iterator1.next(); Object aobj[] = new Object[4]; int j = i + 1; aobj[0] = Integer.valueOf(i); aobj[1] = participant.getParticipantId(); aobj[2] = participant.getFullName(); int k; if(isInAudience(participant.getParticipantId())) k = 1; else k = 0; aobj[3] = Integer.valueOf(k); matrixcursor.addRow(aobj); i = j; } mSuggestedPeopleAdapter.swapCursor(matrixcursor); if(mSuggestedPeopleSize != mSuggestedPeopleAdapter.getCount() && mSuggestedPeopleAdapter.getCount() == mGridView.getChildCount()) { mSuggestedPeopleScrollView.scrollTo(0, 0); mSuggestedPeopleSize = mSuggestedPeopleAdapter.getCount(); } } public final AudienceData getAudience() { return mAudienceView.getAudience(); } protected final void getSuggestedPeople() { AudienceData audiencedata = mAudienceView.getAudience(); boolean flag = isAudienceEmpty(); mCacheSuggestionsResponse = flag; mRequestId = Integer.valueOf(RealTimeChatService.requestSuggestedParticipants(getActivity(), mAccount, audiencedata, Client.SuggestionsRequest.SuggestionsType.HANGOUT)); if(flag) getLoaderManager().initLoader(1, null, this); } public final boolean isAudienceEmpty() { boolean flag = true; AudienceData audiencedata = mAudienceView.getAudience(); if(null == audiencedata) { return true; } CircleData acircledata[]; if(audiencedata.getUserCount() > 0) { return false; } acircledata = audiencedata.getCircles(); int length = acircledata.length; for(int j = 0; j < length; j++) { CircleData circledata = acircledata[j]; if(circledata.getSize() > 0 || circledata.getType() == 9 || circledata.getType() == 7) { return false; } } return true; } public final boolean isEmpty() { return false; } public final void onActivityCreated(Bundle bundle) { super.onActivityCreated(bundle); if(bundle == null) { AudienceData audiencedata = (AudienceData)getActivity().getIntent().getParcelableExtra("audience"); if(audiencedata != null) mAudienceView.replaceAudience(audiencedata); } } public final void onActivityResult(int i, int j, Intent intent) { if(i == 1 && j == -1 && intent != null) mAudienceResult = (AudienceData)intent.getParcelableExtra("audience"); } public final void onAddPersonToCirclesAction(String s, String s1, boolean flag) { } public final void onAttach(Activity activity) { super.onAttach(activity); mAccount = (EsAccount)getActivity().getIntent().getParcelableExtra("account"); } protected final void onAudienceChanged() { if(mAudienceChangedCallback != null) mAudienceChangedCallback.run(); } public final void onChangeCirclesAction(String s, String s1) { } public final void onCircleSelected(String s, CircleData circledata) { mAudienceView.addCircle(circledata); if(mAudienceView instanceof TypeableAudienceView) ((TypeableAudienceView)mAudienceView).clearText(); } public void onClick(View view) { int i = view.getId(); if(i == R.id.edit_audience || i == R.id.audience_view) { AudienceData audiencedata = mAudienceView.getAudience(); startActivityForResult(Intents.getEditAudienceActivityIntent(getActivity(), mAccount, getString(R.string.realtimechat_edit_audience_activity_title), audiencedata, mCircleUsageType, mIncludePhoneOnlyContacts, mIncludePlusPages, mPublicProfileSearchEnabled, mFilterNullGaiaIds), 1); } } public void onCreate(Bundle bundle) { super.onCreate(bundle); mSuggestedPeople = new LinkedList(); displayedSuggestedParticipants = new LinkedList(); if(bundle != null) { if(bundle.containsKey("request_id")) { mRequestId = Integer.valueOf(bundle.getInt("request_id")); mCacheSuggestionsResponse = bundle.getBoolean("cache_suggestions_response"); } else { mRequestId = null; mCacheSuggestionsResponse = false; } mShowSuggestedPeople = bundle.getBoolean("show_suggested_people"); mPublicProfileSearchEnabled = bundle.getBoolean("public_profile_search"); mIncludePhoneOnlyContacts = bundle.getBoolean("phone_only_contacts"); mIncludePlusPages = bundle.getBoolean("plus_pages"); } } public Loader onCreateLoader(int i, Bundle bundle) { if(EsLog.isLoggable("Audience", 3)) Log.d("Audience", (new StringBuilder("onCreateLoader ")).append(i).toString()); EsCursorLoader escursorloader; if(i == 1) { android.net.Uri uri = EsProvider.appendAccountParameter(EsProvider.HANGOUT_SUGGESTIONS_URI, mAccount); escursorloader = new EsCursorLoader(getActivity(), uri, HangoutSuggestionsQuery.PROJECTION, null, null, "sequence ASC", null); } else { escursorloader = null; } return escursorloader; } public View onCreateView(LayoutInflater layoutinflater, ViewGroup viewgroup, Bundle bundle) { View view = layoutinflater.inflate(R.layout.audience_fragment, viewgroup, false); mGridView = (GridView)view.findViewById(0x102000a); mSuggestedPeopleScrollView = (ScrollView)view.findViewById(R.id.suggested_people_scroll_view); mListParent = view.findViewById(R.id.list_layout_parent); mListHeader = (TextView)view.findViewById(R.id.list_header); mGridView.setOnItemClickListener(this); mSuggestedPeopleAdapter = new SuggestedPeopleAdpater(getActivity(), null); mGridView.setAdapter(mSuggestedPeopleAdapter); return view; } public final void onDismissSuggestionAction(String s, String s1) { } public void onItemClick(AdapterView adapterview, View view, int i, long l) { mSuggestedPeopleAdapter.onItemClick(i); } public void onLoadFinished(Loader loader, Cursor cursor) { if(EsLog.isLoggable("Audience", 3)) Log.d("Audience", (new StringBuilder("onLoadFinished ")).append(loader.getId()).toString()); if(loader.getId() == 1 && cursor != null && cursor.moveToFirst()) { do { Data.Participant participant = Data.Participant.newBuilder().setParticipantId(cursor.getString(1)).setFullName(cursor.getString(2)).setFirstName(cursor.getString(3)).build(); mSuggestedPeople.add(participant); } while(cursor.moveToNext()); updateSuggestedPeopleDisplay(); } } public void onLoadFinished(Loader loader, Object obj) { onLoadFinished(loader, (Cursor)obj); } public void onLoaderReset(Loader loader) { } public void onPause() { super.onPause(); if(mShowSuggestedPeople) RealTimeChatService.unregisterListener(mRealTimeChatListener); } public final void onPersonSelected(String s, String s1, PersonData persondata) { mAudienceView.addPerson(persondata); if(mAudienceView instanceof TypeableAudienceView) ((TypeableAudienceView)mAudienceView).clearText(); } public void onResume() { super.onResume(); if(mAudienceResult != null) { AudienceData audiencedata = mAudienceResult; mAudienceView.replaceAudience(audiencedata); mAudienceResult = null; } if(mShowSuggestedPeople) RealTimeChatService.registerListener(mRealTimeChatListener); if(mRequestId != null && !RealTimeChatService.isRequestPending(mRequestId.intValue())) { RealTimeChatServiceResult realtimechatserviceresult = RealTimeChatService.removeResult(mRequestId.intValue()); if(realtimechatserviceresult != null && realtimechatserviceresult.getErrorCode() == 1 && realtimechatserviceresult.getCommand() != null && realtimechatserviceresult.getCommand().hasSuggestionsResponse()) { loadSuggestedPeople(realtimechatserviceresult.getCommand().getSuggestionsResponse()); cacheSuggestedResponse(realtimechatserviceresult.getCommand().getSuggestionsResponse()); } } } public void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); if(mSearchListAdapter != null) mSearchListAdapter.onSaveInstanceState(bundle); if(mRequestId != null) { bundle.putInt("request_id", mRequestId.intValue()); bundle.putBoolean("cache_suggestions_response", mCacheSuggestionsResponse); } bundle.putBoolean("show_suggested_people", mShowSuggestedPeople); bundle.putBoolean("public_profile_search", mPublicProfileSearchEnabled); bundle.putBoolean("phone_only_contacts", mIncludePhoneOnlyContacts); bundle.putBoolean("plus_pages", mIncludePlusPages); } public final void onSearchListAdapterStateChange(PeopleSearchAdapter peoplesearchadapter) { if(mListParent != null) if(peoplesearchadapter.isEmpty()) mListParent.setVisibility(0); else mListParent.setVisibility(8); } public final void onStart() { super.onStart(); if(mSearchListAdapter != null) mSearchListAdapter.onStart(); } public final void onStop() { super.onStart(); if(mSearchListAdapter != null) mSearchListAdapter.onStop(); } public final void onUnblockPersonAction(String s, boolean flag) { } public void onViewCreated(View view, Bundle bundle) { super.onViewCreated(view, bundle); mAudienceView = (AudienceView)view.findViewById(R.id.audience_view); mSearchListAdapter = new PeopleSearchListAdapter(new ContextThemeWrapper(getActivity(), R.style.CircleBrowserTheme), getFragmentManager(), getLoaderManager(), mAccount); mSearchListAdapter.setIncludePhoneNumberContacts(mIncludePhoneOnlyContacts); mSearchListAdapter.setIncludePlusPages(mIncludePlusPages); mSearchListAdapter.setPublicProfileSearchEnabled(mPublicProfileSearchEnabled); mSearchListAdapter.setCircleUsageType(mCircleUsageType); mSearchListAdapter.setFilterNullGaiaIds(mFilterNullGaiaIds); mSearchListAdapter.setListener(this); mSearchListAdapter.onCreate(bundle); if(mAudienceView instanceof TypeableAudienceView) { TypeableAudienceView typeableaudienceview = (TypeableAudienceView)mAudienceView; typeableaudienceview.setEmptyAudienceHint(R.string.realtimechat_new_conversation_hint_text); typeableaudienceview.setAutoCompleteAdapter(mSearchListAdapter); } mAudienceView.setAccount(mAccount); mAudienceView.initLoaders(getLoaderManager()); setupAudienceClickListener(); mAudienceView.setAudienceChangedCallback(new Runnable() { public final void run() { if(mShowSuggestedPeople) { getSuggestedPeople(); if(mSuggestedPeopleAdapter.isEmpty() && mListHeader != null) mListHeader.setVisibility(8); updateSuggestedPeopleDisplay(); } onAudienceChanged(); } }); if(mShowSuggestedPeople) { if(mSuggestedPeopleAdapter.isEmpty() && mListHeader != null) mListHeader.setVisibility(8); getSuggestedPeople(); } } public final void setAudienceChangedCallback(Runnable runnable) { mAudienceChangedCallback = runnable; } public final void setCirclesUsageType(int i) { mCircleUsageType = i; } public final void setFilterNullGaiaIds(boolean flag) { mFilterNullGaiaIds = true; } public final void setIncludePhoneOnlyContacts(boolean flag) { mIncludePhoneOnlyContacts = flag; } public final void setIncludePlusPages(boolean flag) { mIncludePlusPages = flag; } public final void setPublicProfileSearchEnabled(boolean flag) { mPublicProfileSearchEnabled = true; } public final void setShowSuggestedPeople(boolean flag) { mShowSuggestedPeople = true; } protected void setupAudienceClickListener() { getView().findViewById(R.id.edit_audience).setOnClickListener(this); } //================================================================================================================== // Inner class //================================================================================================================== private static interface HangoutSuggestionsQuery { public static final String PROJECTION[] = { "_id", "participant_id", "full_name", "first_name" }; } private final class RTCListener extends RealTimeChatServiceListener { public final void onResponseReceived$1587694a(int i, RealTimeChatServiceResult realtimechatserviceresult) { if(mRequestId != null && i == mRequestId.intValue() && realtimechatserviceresult.getErrorCode() == 1 && realtimechatserviceresult.getCommand().hasSuggestionsResponse()) { Client.SuggestionsResponse suggestionsresponse = realtimechatserviceresult.getCommand().getSuggestionsResponse(); loadSuggestedPeople(suggestionsresponse); cacheSuggestedResponse(suggestionsresponse); } } public final void onResponseTimeout(int i) { mRequestId.intValue(); } } private final class SuggestedPeopleAdpater extends EsCursorAdapter { final LayoutInflater mLayoutInflater; public SuggestedPeopleAdpater(Context context, Cursor cursor) { super(context, null); mLayoutInflater = (LayoutInflater)context.getSystemService("layout_inflater"); } public final void bindView(View view, Context context, Cursor cursor) { boolean flag = true; SuggestedPeopleListItemView suggestedpeoplelistitemview = (SuggestedPeopleListItemView)view; suggestedpeoplelistitemview.setPersonId(cursor.getString(1)); suggestedpeoplelistitemview.setParticipantName(cursor.getString(2).replaceAll(" .*", "")); if(cursor.getInt(3) <= 0) flag = false; suggestedpeoplelistitemview.setChecked(flag); } public final View newView(Context context, Cursor cursor, ViewGroup viewgroup) { return mLayoutInflater.inflate(R.layout.suggested_people_list_item_view, null); } public final void onItemClick(int i) { String s = null; Cursor cursor = getCursor(); cursor.moveToPosition(i); String s1 = cursor.getString(2); String s2 = cursor.getString(1); String s3; PersonData persondata; if(s2.startsWith("g:")) s3 = EsPeopleData.extractGaiaId(s2); else if(s2.startsWith("e:")) { s = s2.substring(2); s3 = null; } else if(s2.startsWith("p:")) { s = s2; s3 = null; } else { s = null; s3 = null; } persondata = new PersonData(s3, s1, s); if(isInAudience(ParticipantUtils.getParticipantIdFromPerson(persondata))) mAudienceView.removePerson(persondata); else mAudienceView.addPerson(persondata); } } private static interface SuggestedPeopleQuery { public static final String columnNames[] = { "_id", "participant_id", "full_name", "in_audience" }; } }