/** * 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.LoadableListActivity; import com.joelapenna.foursquared.location.LocationUtils; import com.joelapenna.foursquared.util.NotificationsUtil; import com.joelapenna.foursquared.widget.FriendListAdapter; 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.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ListView; /** * Shows a list of friends for the user id passed as an intent extra. * * @date March 9, 2010 * @author Mark Wyszomierski (markww@gmail.com) */ public class UserDetailsFriendsActivity extends LoadableListActivity { static final String TAG = "UserDetailsFriendsActivity"; static final boolean DEBUG = FoursquaredSettings.DEBUG; public static final String EXTRA_USER_ID = Foursquared.PACKAGE_NAME + ".UserDetailsFriendsActivity.EXTRA_USER_ID"; public static final String EXTRA_USER_NAME = Foursquared.PACKAGE_NAME + ".UserDetailsFriendsActivity.EXTRA_USER_NAME"; public static final String EXTRA_SHOW_ADD_FRIEND_OPTIONS = Foursquared.PACKAGE_NAME + ".UserDetailsFriendsActivity.EXTRA_SHOW_ADD_FRIEND_OPTIONS"; private StateHolder mStateHolder; private FriendListAdapter mListAdapter; 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.setActivityForTaskFriends(this); } else { if (getIntent().hasExtra(EXTRA_USER_ID) && getIntent().hasExtra(EXTRA_USER_NAME)) { mStateHolder = new StateHolder( getIntent().getStringExtra(EXTRA_USER_ID), getIntent().getStringExtra(EXTRA_USER_NAME)); } else { Log.e(TAG, TAG + " requires a userid and username in its intent extras."); finish(); return; } mStateHolder.startTaskFriends(this); } ensureUi(); } @Override public void onPause() { super.onPause(); if (isFinishing()) { mStateHolder.cancelTasks(); mListAdapter.removeObserver(); } } @Override public void onDestroy() { super.onDestroy(); unregisterReceiver(mLoggedOutReceiver); } @Override public Object onRetainNonConfigurationInstance() { mStateHolder.setActivityForTaskFriends(null); return mStateHolder; } private void ensureUi() { mListAdapter = new FriendListAdapter(this, ((Foursquared) getApplication()).getRemoteResourceManager()); mListAdapter.setGroup(mStateHolder.getFriends()); ListView listView = getListView(); listView.setAdapter(mListAdapter); listView.setSmoothScrollbarEnabled(true); 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(UserDetailsFriendsActivity.this, UserDetailsActivity.class); intent.putExtra(UserDetailsActivity.EXTRA_USER_PARCEL, user); intent.putExtra(UserDetailsActivity.EXTRA_SHOW_ADD_FRIEND_OPTIONS, true); startActivity(intent); } }); if (mStateHolder.getIsRunningFriendsTask()) { setLoadingView(); } else if (mStateHolder.getFetchedFriendsOnce() && mStateHolder.getFriends().size() == 0) { setEmptyView(); } setTitle(getString(R.string.user_details_friends_activity_title, mStateHolder.getUsername())); } private void onFriendsTaskComplete(Group<User> group, Exception ex) { mListAdapter.removeObserver(); mListAdapter = new FriendListAdapter(this, ((Foursquared) getApplication()).getRemoteResourceManager()); if (group != null) { mStateHolder.setFriends(group); mListAdapter.setGroup(mStateHolder.getFriends()); getListView().setAdapter(mListAdapter); } else { mStateHolder.setFriends(new Group<User>()); mListAdapter.setGroup(mStateHolder.getFriends()); getListView().setAdapter(mListAdapter); NotificationsUtil.ToastReasonForFailure(this, ex); } mStateHolder.setIsRunningFriendsTask(false); mStateHolder.setFetchedFriendsOnce(true); // TODO: We can probably tighten this up by just calling ensureUI() again. if (mStateHolder.getFriends().size() == 0) { setEmptyView(); } } /** * Gets friends of the current user we're working for. */ private static class FriendsTask extends AsyncTask<String, Void, Group<User>> { private UserDetailsFriendsActivity mActivity; private Exception mReason; public FriendsTask(UserDetailsFriendsActivity activity) { mActivity = activity; } @Override protected void onPreExecute() { mActivity.setLoadingView(); } @Override protected Group<User> doInBackground(String... params) { try { Foursquared foursquared = (Foursquared) mActivity.getApplication(); Foursquare foursquare = foursquared.getFoursquare(); return foursquare.friends( params[0], LocationUtils.createFoursquareLocation(foursquared.getLastKnownLocation())); } catch (Exception e) { mReason = e; } return null; } @Override protected void onPostExecute(Group<User> users) { if (mActivity != null) { mActivity.onFriendsTaskComplete(users, mReason); } } @Override protected void onCancelled() { if (mActivity != null) { mActivity.onFriendsTaskComplete(null, mReason); } } public void setActivity(UserDetailsFriendsActivity activity) { mActivity = activity; } } private static class StateHolder { private String mUserId; private String mUsername; private Group<User> mFriends; private FriendsTask mTaskFriends; private boolean mIsRunningFriendsTask; private boolean mFetchedFriendsOnce; public StateHolder(String userId, String username) { mUserId = userId; mUsername = username; mIsRunningFriendsTask = false; mFetchedFriendsOnce = false; mFriends = new Group<User>(); } public String getUsername() { return mUsername; } public Group<User> getFriends() { return mFriends; } public void setFriends(Group<User> friends) { mFriends = friends; } public void startTaskFriends(UserDetailsFriendsActivity activity) { mIsRunningFriendsTask = true; mTaskFriends = new FriendsTask(activity); mTaskFriends.execute(mUserId); } public void setActivityForTaskFriends(UserDetailsFriendsActivity activity) { if (mTaskFriends != null) { mTaskFriends.setActivity(activity); } } public void setIsRunningFriendsTask(boolean isRunning) { mIsRunningFriendsTask = isRunning; } public boolean getIsRunningFriendsTask() { return mIsRunningFriendsTask; } public void setFetchedFriendsOnce(boolean fetchedOnce) { mFetchedFriendsOnce = fetchedOnce; } public boolean getFetchedFriendsOnce() { return mFetchedFriendsOnce; } public void cancelTasks() { if (mTaskFriends != null) { mTaskFriends.setActivity(null); mTaskFriends.cancel(true); } } } }