/**
* Copyright 2010 Mark Wyszomierski
*/
package com.joelapenna.foursquared;
import com.joelapenna.foursquare.Foursquare;
import com.joelapenna.foursquare.types.Checkin;
import com.joelapenna.foursquare.types.Group;
import com.joelapenna.foursquare.types.Venue;
import com.joelapenna.foursquared.app.LoadableListActivity;
import com.joelapenna.foursquared.util.NotificationsUtil;
import com.joelapenna.foursquared.widget.HistoryListAdapter;
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.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
/**
* This only works for the currently authenticated user.
*
* @date March 9, 2010
* @author Mark Wyszomierski (markww@gmail.com)
*/
public class UserHistoryActivity extends LoadableListActivity {
static final String TAG = "UserHistoryActivity";
public static final String EXTRA_USER_NAME = Foursquared.PACKAGE_NAME
+ ".UserHistoryActivity.EXTRA_USER_NAME";
private StateHolder mStateHolder;
private HistoryListAdapter mListAdapter;
private BroadcastReceiver mLoggedOutReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent 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_NAME)) {
mStateHolder = new StateHolder(getIntent().getStringExtra(EXTRA_USER_NAME));
mStateHolder.startTaskHistory(this);
} else {
Log.e(TAG, TAG + " requires username as intent extra.");
finish();
return;
}
}
ensureUi();
}
@Override
public void onPause() {
super.onPause();
if (isFinishing()) {
mStateHolder.cancelTasks();
unregisterReceiver(mLoggedOutReceiver);
}
}
@Override
public Object onRetainNonConfigurationInstance() {
mStateHolder.setActivityForTaskFriends(null);
return mStateHolder;
}
private void ensureUi() {
mListAdapter = new HistoryListAdapter(
this, ((Foursquared) getApplication()).getRemoteResourceManager());
mListAdapter.setGroup(mStateHolder.getHistory());
ListView listView = getListView();
listView.setAdapter(mListAdapter);
listView.setSmoothScrollbarEnabled(true);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {
Object obj = (Object)mListAdapter.getItem(position);
if (obj != null) {
startVenueActivity((Checkin)obj);
}
}
});
if (mStateHolder.getIsRunningHistoryTask()) {
setLoadingView();
} else if (mStateHolder.getFetchedOnce() && mStateHolder.getHistory().size() == 0) {
setEmptyView();
}
setTitle(getString(R.string.user_history_activity_title, mStateHolder.getUsername()));
}
@Override
public int getNoSearchResultsStringId() {
return R.string.user_history_activity_no_info;
}
private void onHistoryTaskComplete(Group<Checkin> group, Exception ex) {
mListAdapter = new HistoryListAdapter(
this, ((Foursquared) getApplication()).getRemoteResourceManager());
if (group != null) {
mStateHolder.setHistory(group);
mListAdapter.setGroup(mStateHolder.getHistory());
getListView().setAdapter(mListAdapter);
}
else {
mStateHolder.setHistory(new Group<Checkin>());
mListAdapter.setGroup(mStateHolder.getHistory());
getListView().setAdapter(mListAdapter);
NotificationsUtil.ToastReasonForFailure(this, ex);
}
mStateHolder.setIsRunningHistoryTask(false);
mStateHolder.setFetchedOnce(true);
// TODO: Can tighten this up by just calling ensureUI() probably.
if (mStateHolder.getHistory().size() == 0) {
setEmptyView();
}
}
private void startVenueActivity(Checkin checkin) {
if (checkin != null) {
if (checkin.getVenue() != null && !TextUtils.isEmpty(checkin.getVenue().getId())) {
Venue venue = checkin.getVenue();
Intent intent = new Intent(this, VenueActivity.class);
intent.setAction(Intent.ACTION_VIEW);
intent.putExtra(VenueActivity.INTENT_EXTRA_VENUE_PARTIAL, venue);
startActivity(intent);
} else {
Log.e(TAG, "Venue has no ID to start venue activity.");
}
}
}
/**
* Gets friends of the current user we're working for.
*/
private static class HistoryTask extends AsyncTask<String, Void, Group<Checkin>> {
private UserHistoryActivity mActivity;
private Exception mReason;
public HistoryTask(UserHistoryActivity activity) {
mActivity = activity;
}
@Override
protected void onPreExecute() {
mActivity.setLoadingView();
}
@Override
protected Group<Checkin> doInBackground(String... params) {
try {
Foursquared foursquared = (Foursquared) mActivity.getApplication();
Foursquare foursquare = foursquared.getFoursquare();
// Prune out shouts for now.
Group<Checkin> history = foursquare.history("50", null);
Group<Checkin> venuesOnly = new Group<Checkin>();
for (Checkin it : history) {
if (it.getVenue() != null) {
venuesOnly.add(it);
}
}
return venuesOnly;
} catch (Exception e) {
mReason = e;
}
return null;
}
@Override
protected void onPostExecute(Group<Checkin> checkins) {
if (mActivity != null) {
mActivity.onHistoryTaskComplete(checkins, mReason);
}
}
@Override
protected void onCancelled() {
if (mActivity != null) {
mActivity.onHistoryTaskComplete(null, mReason);
}
}
public void setActivity(UserHistoryActivity activity) {
mActivity = activity;
}
}
private static class StateHolder {
private String mUsername;
private Group<Checkin> mHistory;
private HistoryTask mTaskHistory;
private boolean mIsRunningHistoryTask;
private boolean mFetchedOnce;
public StateHolder(String username) {
mUsername = username;
mIsRunningHistoryTask = false;
mFetchedOnce = false;
mHistory = new Group<Checkin>();
}
public String getUsername() {
return mUsername;
}
public Group<Checkin> getHistory() {
return mHistory;
}
public void setHistory(Group<Checkin> history) {
mHistory = history;
}
public void startTaskHistory(UserHistoryActivity activity) {
mIsRunningHistoryTask = true;
mTaskHistory = new HistoryTask(activity);
mTaskHistory.execute();
}
public void setActivityForTaskFriends(UserHistoryActivity activity) {
if (mTaskHistory != null) {
mTaskHistory.setActivity(activity);
}
}
public void setIsRunningHistoryTask(boolean isRunning) {
mIsRunningHistoryTask = isRunning;
}
public boolean getIsRunningHistoryTask() {
return mIsRunningHistoryTask;
}
public void setFetchedOnce(boolean fetchedOnce) {
mFetchedOnce = fetchedOnce;
}
public boolean getFetchedOnce() {
return mFetchedOnce;
}
public void cancelTasks() {
if (mTaskHistory != null) {
mTaskHistory.setActivity(null);
mTaskHistory.cancel(true);
}
}
}
}