/** * Copyright 2010 Mark Wyszomierski */ package com.joelapenna.foursquared; import com.joelapenna.foursquare.Foursquare; import com.joelapenna.foursquare.types.Group; import com.joelapenna.foursquare.types.User; import com.joelapenna.foursquared.app.LoadableListActivityWithViewAndHeader; import com.joelapenna.foursquared.location.LocationUtils; import com.joelapenna.foursquared.util.NotificationsUtil; import com.joelapenna.foursquared.widget.FriendListAdapter; import com.joelapenna.foursquared.widget.SegmentedButton; import com.joelapenna.foursquared.widget.SegmentedButton.OnClickListenerSegmentedButton; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.ScrollView; /** * To be used when a user has some friends in common. We show two lists, by default * the first list is 'friends in common'. The second list is all friends. This is * expected to be used with a fully-fetched user object, so the friends in common * group should already be fetched. The full 'all friends' list is fetched separately * within this activity. * * If the user has no friends in common, then just use UserDetailsFriendsActivity * directly. * * @date September 23, 2010 * @author Mark Wyszomierski (markww@gmail.com) */ public class UserDetailsFriendsInCommonActivity extends LoadableListActivityWithViewAndHeader { static final String TAG = "UserDetailsFriendsInCommonActivity"; static final boolean DEBUG = FoursquaredSettings.DEBUG; public static final String EXTRA_USER_PARCEL = Foursquared.PACKAGE_NAME + ".UserDetailsFriendsInCommonActivity.EXTRA_USER_PARCEL"; private StateHolder mStateHolder; private FriendListAdapter mListAdapter; private ScrollView mLayoutEmpty; private static final int MENU_REFRESH = 0; private BroadcastReceiver mLoggedOutReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (DEBUG) Log.d(TAG, "onReceive: " + intent); finish(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); registerReceiver(mLoggedOutReceiver, new IntentFilter(Foursquared.INTENT_ACTION_LOGGED_OUT)); Object retained = getLastNonConfigurationInstance(); if (retained != null && retained instanceof StateHolder) { mStateHolder = (StateHolder) retained; mStateHolder.setActivity(this); } else { mStateHolder = new StateHolder(); if (getIntent().hasExtra(EXTRA_USER_PARCEL)) { mStateHolder.setUser((User)getIntent().getParcelableExtra(EXTRA_USER_PARCEL)); if (mStateHolder.getUser().getFriendsInCommon() == null || mStateHolder.getUser().getFriendsInCommon().size() == 0) { Log.e(TAG, TAG + " requires user parcel have friends in common size > 0."); finish(); return; } } else { Log.e(TAG, TAG + " requires user parcel in intent extras."); finish(); return; } } ensureUi(); } @Override public void onPause() { super.onPause(); if (isFinishing()) { mStateHolder.cancelTasks(); mListAdapter.removeObserver(); } } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(mLoggedOutReceiver); } @Override public Object onRetainNonConfigurationInstance() { mStateHolder.setActivity(null); return mStateHolder; } private void ensureUi() { LayoutInflater inflater = LayoutInflater.from(this); mLayoutEmpty = (ScrollView)inflater.inflate(R.layout.user_details_friends_activity_empty, null); mLayoutEmpty.setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT)); mListAdapter = new FriendListAdapter(this, ((Foursquared) getApplication()).getRemoteResourceManager()); if (mStateHolder.getFriendsInCommonOnly()) { mListAdapter.setGroup(mStateHolder.getUser().getFriendsInCommon()); } else { mListAdapter.setGroup(mStateHolder.getAllFriends()); if (mStateHolder.getAllFriends().size() == 0) { if (mStateHolder.getRanOnce()) { setEmptyView(mLayoutEmpty); } else { setLoadingView(); } } } SegmentedButton buttons = getHeaderButton(); buttons.clearButtons(); buttons.addButtons( getString(R.string.user_details_friends_in_common_common_friends), getString(R.string.user_details_friends_in_common_all_friends)); if (mStateHolder.getFriendsInCommonOnly()) { buttons.setPushedButtonIndex(0); } else { buttons.setPushedButtonIndex(1); } buttons.setOnClickListener(new OnClickListenerSegmentedButton() { @Override public void onClick(int index) { if (index == 0) { mStateHolder.setFriendsInCommonOnly(true); mListAdapter.setGroup(mStateHolder.getUser().getFriendsInCommon()); } else { mStateHolder.setFriendsInCommonOnly(false); mListAdapter.setGroup(mStateHolder.getAllFriends()); if (mStateHolder.getAllFriends().size() < 1) { if (mStateHolder.getRanOnce()) { setEmptyView(mLayoutEmpty); } else { setLoadingView(); mStateHolder.startTaskAllFriends(UserDetailsFriendsInCommonActivity.this); } } } mListAdapter.notifyDataSetChanged(); getListView().setSelection(0); } }); ListView listView = getListView(); listView.setAdapter(mListAdapter); listView.setSmoothScrollbarEnabled(false); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { User user = (User) parent.getAdapter().getItem(position); Intent intent = new Intent(UserDetailsFriendsInCommonActivity.this, UserDetailsActivity.class); intent.putExtra(UserDetailsActivity.EXTRA_USER_PARCEL, user); intent.putExtra(UserDetailsActivity.EXTRA_SHOW_ADD_FRIEND_OPTIONS, true); startActivity(intent); } }); if (mStateHolder.getIsRunningTaskAllFriends()) { setProgressBarIndeterminateVisibility(true); } else { setProgressBarIndeterminateVisibility(false); } setTitle(getString(R.string.user_details_friends_in_common_title, mStateHolder.getUser().getFirstname())); } @Override public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); menu.add(Menu.NONE, MENU_REFRESH, Menu.NONE, R.string.refresh) .setIcon(R.drawable.ic_menu_refresh); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_REFRESH: if (!mStateHolder.getFriendsInCommonOnly()) { mStateHolder.startTaskAllFriends(this); } return true; } return super.onOptionsItemSelected(item); } private void onStartTaskAllFriends() { mStateHolder.setIsRunningTaskAllFriends(true); setProgressBarIndeterminateVisibility(true); setLoadingView(); } private void onTaskAllFriendsComplete(Group<User> allFriends, Exception ex) { setProgressBarIndeterminateVisibility(false); mStateHolder.setRanOnce(true); mStateHolder.setIsRunningTaskAllFriends(false); if (allFriends != null) { mStateHolder.setAllFriends(allFriends); } else { NotificationsUtil.ToastReasonForFailure(this, ex); } SegmentedButton buttons = getHeaderButton(); if (buttons.getSelectedButtonIndex() == 1) { mListAdapter.setGroup(mStateHolder.getAllFriends()); if (mStateHolder.getAllFriends().size() == 0) { if (mStateHolder.getRanOnce()) { setEmptyView(mLayoutEmpty); } else { setLoadingView(); } } } } /** * Gets friends of the current user we're working for. */ private static class TaskAllFriends extends AsyncTask<Void, Void, Group<User>> { private UserDetailsFriendsInCommonActivity mActivity; private String mUserId; private Exception mReason; public TaskAllFriends(UserDetailsFriendsInCommonActivity activity, String userId) { mActivity = activity; mUserId = userId; } @Override protected void onPreExecute() { mActivity.onStartTaskAllFriends(); } @Override protected Group<User> doInBackground(Void... params) { try { Foursquared foursquared = (Foursquared) mActivity.getApplication(); Foursquare foursquare = foursquared.getFoursquare(); return foursquare.friends( mUserId, LocationUtils.createFoursquareLocation(foursquared.getLastKnownLocation())); } catch (Exception e) { mReason = e; } return null; } @Override protected void onPostExecute(Group<User> allFriends) { if (mActivity != null) { mActivity.onTaskAllFriendsComplete(allFriends, mReason); } } @Override protected void onCancelled() { if (mActivity != null) { mActivity.onTaskAllFriendsComplete(null, mReason); } } public void setActivity(UserDetailsFriendsInCommonActivity activity) { mActivity = activity; } } private static class StateHolder { private User mUser; private Group<User> mAllFriends; private TaskAllFriends mTaskAllFriends; private boolean mIsRunningTaskAllFriends; private boolean mRanOnceTaskAllFriends; private boolean mFriendsInCommonOnly; public StateHolder() { mAllFriends = new Group<User>(); mIsRunningTaskAllFriends = false; mRanOnceTaskAllFriends = false; mFriendsInCommonOnly = true; } public User getUser() { return mUser; } public void setUser(User user) { mUser = user; } public Group<User> getAllFriends() { return mAllFriends; } public void setAllFriends(Group<User> allFriends) { mAllFriends = allFriends; } public void startTaskAllFriends(UserDetailsFriendsInCommonActivity activity) { if (!mIsRunningTaskAllFriends) { mIsRunningTaskAllFriends = true; mTaskAllFriends = new TaskAllFriends(activity, mUser.getId()); mTaskAllFriends.execute(); } } public void setActivity(UserDetailsFriendsInCommonActivity activity) { if (mTaskAllFriends != null) { mTaskAllFriends.setActivity(activity); } } public boolean getIsRunningTaskAllFriends() { return mIsRunningTaskAllFriends; } public void setIsRunningTaskAllFriends(boolean isRunning) { mIsRunningTaskAllFriends = isRunning; } public void cancelTasks() { if (mTaskAllFriends != null) { mTaskAllFriends.setActivity(null); mTaskAllFriends.cancel(true); } } public boolean getRanOnce() { return mRanOnceTaskAllFriends; } public void setRanOnce(boolean ranOnce) { mRanOnceTaskAllFriends = ranOnce; } public boolean getFriendsInCommonOnly() { return mFriendsInCommonOnly; } public void setFriendsInCommonOnly(boolean friendsInCommonOnly) { mFriendsInCommonOnly = friendsInCommonOnly; } } }