/** * Copyright 2009 Joe LaPenna */ package com.joelapenna.foursquared; import com.joelapenna.foursquare.types.Checkin; import com.joelapenna.foursquare.types.Group; import com.joelapenna.foursquare.types.User; import com.joelapenna.foursquare.types.Venue; import com.joelapenna.foursquared.app.LoadableListActivity; import com.joelapenna.foursquared.util.UserUtils; import com.joelapenna.foursquared.widget.CheckinListAdapter; import com.joelapenna.foursquared.widget.SeparatedListAdapter; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; 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; /** * @author Joe LaPenna (joe@joelapenna.com) * @author Mark Wyszomierski (markww@gmail.com) * -refactored for display of straight checkins list (September 16, 2010). * */ public class VenueCheckinsActivity extends LoadableListActivity { public static final String TAG = "VenueCheckinsActivity"; public static final boolean DEBUG = FoursquaredSettings.DEBUG; public static final String INTENT_EXTRA_VENUE = Foursquared.PACKAGE_NAME + ".VenueCheckinsActivity.INTENT_EXTRA_VENUE"; private SeparatedListAdapter mListAdapter; private StateHolder mStateHolder; 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; } else { if (getIntent().hasExtra(INTENT_EXTRA_VENUE)) { mStateHolder = new StateHolder( (Venue)getIntent().getExtras().getParcelable(INTENT_EXTRA_VENUE), ((Foursquared) getApplication()).getUserId()); } else { Log.e(TAG, "VenueCheckinsActivity requires a venue parcel its intent extras."); finish(); return; } } ensureUi(); } @Override public void onPause() { super.onPause(); if (isFinishing()) { mListAdapter.removeObserver(); unregisterReceiver(mLoggedOutReceiver); } } @Override public Object onRetainNonConfigurationInstance() { return mStateHolder; } private void ensureUi() { mListAdapter = new SeparatedListAdapter(this); if (mStateHolder.getCheckinsYou().size() > 0) { String title = getResources().getString(R.string.venue_activity_people_count_you); CheckinListAdapter adapter = new CheckinListAdapter(this, ((Foursquared) getApplication()).getRemoteResourceManager()); adapter.setGroup(mStateHolder.getCheckinsYou()); mListAdapter.addSection(title, adapter); } if (mStateHolder.getCheckinsFriends().size() > 0) { String title = getResources().getString( mStateHolder.getCheckinsOthers().size() == 1 ? R.string.venue_activity_checkins_count_friends_single : R.string.venue_activity_checkins_count_friends_plural, mStateHolder.getCheckinsFriends().size()); CheckinListAdapter adapter = new CheckinListAdapter(this, ((Foursquared) getApplication()).getRemoteResourceManager()); adapter.setGroup(mStateHolder.getCheckinsFriends()); mListAdapter.addSection(title, adapter); } if (mStateHolder.getCheckinsOthers().size() > 0) { boolean others = mStateHolder.getCheckinsYou().size() + mStateHolder.getCheckinsFriends().size() > 0; String title = getResources().getString( mStateHolder.getCheckinsOthers().size() == 1 ? (others ? R.string.venue_activity_checkins_count_others_single : R.string.venue_activity_checkins_count_others_alone_single) : (others ? R.string.venue_activity_checkins_count_others_plural : R.string.venue_activity_checkins_count_others_alone_plural), mStateHolder.getCheckinsOthers().size()); CheckinListAdapter adapter = new CheckinListAdapter(this, ((Foursquared) getApplication()).getRemoteResourceManager()); adapter.setGroup(mStateHolder.getCheckinsOthers()); mListAdapter.addSection(title, adapter); } ListView listView = getListView(); listView.setAdapter(mListAdapter); listView.setSmoothScrollbarEnabled(true); listView.setDividerHeight(0); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Checkin checkin = (Checkin) parent.getAdapter().getItem(position); Intent intent = new Intent(VenueCheckinsActivity.this, UserDetailsActivity.class); intent.putExtra(UserDetailsActivity.EXTRA_USER_PARCEL, checkin.getUser()); intent.putExtra(UserDetailsActivity.EXTRA_SHOW_ADD_FRIEND_OPTIONS, true); startActivity(intent); } }); setTitle(getString(R.string.venue_checkins_activity_title, mStateHolder.getVenueName())); } private static class StateHolder { private String mVenueName; private Group<Checkin> mYou; private Group<Checkin> mFriends; private Group<Checkin> mOthers; public StateHolder(Venue venue, String loggedInUserId) { mVenueName = venue.getName(); mYou = new Group<Checkin>(); mFriends = new Group<Checkin>(); mOthers = new Group<Checkin>(); mYou.clear(); mFriends.clear(); mOthers.clear(); for (Checkin it : venue.getCheckins()) { User user = it.getUser(); if (UserUtils.isFriend(user)) { mFriends.add(it); } else if (loggedInUserId.equals(user.getId())) { mYou.add(it); } else { mOthers.add(it); } } } public String getVenueName() { return mVenueName; } public Group<Checkin> getCheckinsYou() { return mYou; } public Group<Checkin> getCheckinsFriends() { return mFriends; } public Group<Checkin> getCheckinsOthers() { return mOthers; } } }