/**
* 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.foursquare.types.Venue;
import com.joelapenna.foursquared.app.LoadableListActivity;
import com.joelapenna.foursquared.location.LocationUtils;
import com.joelapenna.foursquared.util.NotificationsUtil;
import com.joelapenna.foursquared.widget.SeparatedListAdapter;
import com.joelapenna.foursquared.widget.VenueListAdapter;
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;
import java.util.ArrayList;
/**
* Shows a list of venues that the specified user is mayor of.
* We can fetch these ourselves given a userId, or work from
* a venue array parcel.
*
* @date March 15, 2010
* @author Mark Wyszomierski (markww@gmail.com)
*/
public class UserMayorshipsActivity extends LoadableListActivity {
static final String TAG = "UserMayorshipsActivity";
static final boolean DEBUG = FoursquaredSettings.DEBUG;
public static final String EXTRA_USER_ID = Foursquared.PACKAGE_NAME
+ ".UserMayorshipsActivity.EXTRA_USER_ID";
public static final String EXTRA_USER_NAME = Foursquared.PACKAGE_NAME
+ ".UserMayorshipsActivity.EXTRA_USER_NAME";
public static final String EXTRA_VENUE_LIST_PARCEL = Foursquared.PACKAGE_NAME
+ ".UserMayorshipsActivity.EXTRA_VENUE_LIST_PARCEL";
private StateHolder mStateHolder;
private SeparatedListAdapter 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.setActivityForTaskVenues(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, "UserMayorships requires a userid in its intent extras.");
finish();
return;
}
if (getIntent().getExtras().containsKey(EXTRA_VENUE_LIST_PARCEL)) {
// Can't jump from ArrayList to Group, argh.
ArrayList<Venue> venues = getIntent().getExtras().getParcelableArrayList(
EXTRA_VENUE_LIST_PARCEL);
Group<Venue> group = new Group<Venue>();
for (Venue it : venues) {
group.add(it);
}
mStateHolder.setVenues(group);
} else {
mStateHolder.startTaskVenues(this);
}
}
ensureUi();
}
@Override
public void onPause() {
super.onPause();
if (isFinishing()) {
mStateHolder.cancelTasks();
mListAdapter.removeObserver();
unregisterReceiver(mLoggedOutReceiver);
}
}
@Override
public Object onRetainNonConfigurationInstance() {
mStateHolder.setActivityForTaskVenues(null);
return mStateHolder;
}
private void ensureUi() {
mListAdapter = new SeparatedListAdapter(this);
VenueListAdapter adapter = new VenueListAdapter(this,
((Foursquared) getApplication()).getRemoteResourceManager());
if (mStateHolder.getVenues().size() > 0) {
adapter.setGroup(mStateHolder.getVenues());
mListAdapter.addSection(
getResources().getString(R.string.user_mayorships_activity_adapter_title),
adapter);
}
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) {
Venue venue = (Venue)mListAdapter.getItem(position);
Intent intent = new Intent(UserMayorshipsActivity.this, VenueActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(VenueActivity.INTENT_EXTRA_VENUE_PARTIAL, venue);
startActivity(intent);
}
});
if (mStateHolder.getIsRunningVenuesTask()) {
setLoadingView();
} else if (mStateHolder.getFetchedVenuesOnce() && mStateHolder.getVenues().size() == 0) {
setEmptyView();
}
setTitle(getString(R.string.user_mayorships_activity_title, mStateHolder.getUsername()));
}
private void onVenuesTaskComplete(User user, Exception ex) {
mListAdapter.removeObserver();
mListAdapter = new SeparatedListAdapter(this);
if (user != null) {
mStateHolder.setVenues(user.getMayorships());
}
else {
mStateHolder.setVenues(new Group<Venue>());
NotificationsUtil.ToastReasonForFailure(this, ex);
}
if (mStateHolder.getVenues().size() > 0) {
VenueListAdapter adapter = new VenueListAdapter(this,
((Foursquared) getApplication()).getRemoteResourceManager());
adapter.setGroup(mStateHolder.getVenues());
mListAdapter.addSection(
getResources().getString(R.string.user_mayorships_activity_adapter_title),
adapter);
}
getListView().setAdapter(mListAdapter);
mStateHolder.setIsRunningVenuesTask(false);
mStateHolder.setFetchedVenuesOnce(true);
// TODO: We can probably tighten this up by just calling ensureUI() again.
if (mStateHolder.getVenues().size() == 0) {
setEmptyView();
}
}
@Override
public int getNoSearchResultsStringId() {
return R.string.user_mayorships_activity_no_info;
}
/**
* Gets venues that the current user is mayor of.
*/
private static class VenuesTask extends AsyncTask<String, Void, User> {
private UserMayorshipsActivity mActivity;
private Exception mReason;
public VenuesTask(UserMayorshipsActivity activity) {
mActivity = activity;
}
@Override
protected void onPreExecute() {
mActivity.setLoadingView();
}
@Override
protected User doInBackground(String... params) {
try {
Foursquared foursquared = (Foursquared) mActivity.getApplication();
Foursquare foursquare = foursquared.getFoursquare();
return foursquare.user(params[0], true, false, false,
LocationUtils.createFoursquareLocation(foursquared.getLastKnownLocation()));
} catch (Exception e) {
mReason = e;
}
return null;
}
@Override
protected void onPostExecute(User user) {
if (mActivity != null) {
mActivity.onVenuesTaskComplete(user, mReason);
}
}
@Override
protected void onCancelled() {
if (mActivity != null) {
mActivity.onVenuesTaskComplete(null, mReason);
}
}
public void setActivity(UserMayorshipsActivity activity) {
mActivity = activity;
}
}
private static class StateHolder {
private String mUserId;
private String mUsername;
private Group<Venue> mVenues;
private VenuesTask mTaskVenues;
private boolean mIsRunningVenuesTask;
private boolean mFetchedVenuesOnce;
public StateHolder(String userId, String username) {
mUserId = userId;
mUsername = username;
mIsRunningVenuesTask = false;
mFetchedVenuesOnce = false;
mVenues = new Group<Venue>();
}
public String getUsername() {
return mUsername;
}
public Group<Venue> getVenues() {
return mVenues;
}
public void setVenues(Group<Venue> venues) {
mVenues = venues;
}
public void startTaskVenues(UserMayorshipsActivity activity) {
mIsRunningVenuesTask = true;
mTaskVenues = new VenuesTask(activity);
mTaskVenues.execute(mUserId);
}
public void setActivityForTaskVenues(UserMayorshipsActivity activity) {
if (mTaskVenues != null) {
mTaskVenues.setActivity(activity);
}
}
public void setIsRunningVenuesTask(boolean isRunning) {
mIsRunningVenuesTask = isRunning;
}
public boolean getIsRunningVenuesTask() {
return mIsRunningVenuesTask;
}
public void setFetchedVenuesOnce(boolean fetchedOnce) {
mFetchedVenuesOnce = fetchedOnce;
}
public boolean getFetchedVenuesOnce() {
return mFetchedVenuesOnce;
}
public void cancelTasks() {
if (mTaskVenues != null) {
mTaskVenues.setActivity(null);
mTaskVenues.cancel(true);
}
}
}
}