/**
* Copyright 2010 Mark Wyszomierski
*/
package com.joelapenna.foursquared;
import com.joelapenna.foursquare.Foursquare;
import com.joelapenna.foursquare.error.FoursquareException;
import com.joelapenna.foursquare.types.Settings;
import com.joelapenna.foursquare.types.User;
import android.app.Activity;
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.view.Window;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
/**
* Lets the user set pings on/off for a given friend.
*
* @date September 25, 2010
* @author Mark Wyszomierski (markww@gmail.com)
*
*/
public class UserDetailsPingsActivity extends Activity {
private static final String TAG = "UserDetailsPingsActivity";
private static final boolean DEBUG = FoursquaredSettings.DEBUG;
public static final String EXTRA_USER_PARCEL = Foursquared.PACKAGE_NAME
+ ".UserDetailsPingsActivity.EXTRA_USER_PARCEL";
public static final String EXTRA_USER_RETURNED = Foursquared.PACKAGE_NAME
+ ".UserDetailsPingsActivity.EXTRA_USER_RETURNED";
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);
requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
setContentView(R.layout.user_details_pings_activity);
registerReceiver(mLoggedOutReceiver, new IntentFilter(Foursquared.INTENT_ACTION_LOGGED_OUT));
Object retained = getLastNonConfigurationInstance();
if (retained != null && retained instanceof StateHolder) {
mStateHolder = (StateHolder) retained;
mStateHolder.setActivity(this);
setPreparedResultIntent();
} else {
mStateHolder = new StateHolder();
if (getIntent().getExtras() != null) {
if (getIntent().hasExtra(EXTRA_USER_PARCEL)) {
User user = getIntent().getExtras().getParcelable(EXTRA_USER_PARCEL);
mStateHolder.setUser(user);
} else {
Log.e(TAG, TAG + " requires a user pareclable in its intent extras.");
finish();
return;
}
} else {
Log.e(TAG, "TipActivity requires a tip pareclable in its intent extras.");
finish();
return;
}
}
ensureUi();
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(mLoggedOutReceiver);
}
@Override
public Object onRetainNonConfigurationInstance() {
mStateHolder.setActivity(null);
return mStateHolder;
}
private void ensureUi() {
User user = mStateHolder.getUser();
TextView tv = (TextView)findViewById(R.id.userDetailsPingsActivityDescription);
Button btn = (Button)findViewById(R.id.userDetailsPingsActivityButton);
if (user.getSettings().getGetPings()) {
tv.setText(getString(R.string.user_details_pings_activity_description_on,
user.getFirstname()));
btn.setText(getString(R.string.user_details_pings_activity_pings_off,
user.getFirstname()));
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setEnabled(false);
setProgressBarIndeterminateVisibility(true);
mStateHolder.startPingsTask(UserDetailsPingsActivity.this, false);
}
});
} else {
tv.setText(getString(R.string.user_details_pings_activity_description_off,
user.getFirstname()));
btn.setText(getString(R.string.user_details_pings_activity_pings_on,
user.getFirstname()));
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
v.setEnabled(false);
setProgressBarIndeterminateVisibility(true);
mStateHolder.startPingsTask(UserDetailsPingsActivity.this, true);
}
});
}
if (mStateHolder.getIsRunningTaskPings()) {
btn.setEnabled(false);
setProgressBarIndeterminateVisibility(true);
} else {
btn.setEnabled(true);
setProgressBarIndeterminateVisibility(false);
}
}
private void setPreparedResultIntent() {
if (mStateHolder.getPreparedResult() != null) {
setResult(Activity.RESULT_OK, mStateHolder.getPreparedResult());
}
}
private void prepareResultIntent() {
Intent intent = new Intent();
intent.putExtra(EXTRA_USER_RETURNED, mStateHolder.getUser());
mStateHolder.setPreparedResult(intent);
setPreparedResultIntent();
}
private void onTaskPingsComplete(Settings settings, String userId, boolean on, Exception ex) {
mStateHolder.setIsRunningTaskPings(false);
// The api is returning pings = false for all cases, so manually overwrite,
// assume a non-null settings object is success.
if (settings != null) {
settings.setGetPings(on);
mStateHolder.setSettingsResult(settings);
prepareResultIntent();
} else {
Toast.makeText(this, ex.toString(), Toast.LENGTH_LONG).show();
}
ensureUi();
}
private static class TaskPings extends AsyncTask<Void, Void, Settings> {
private UserDetailsPingsActivity mActivity;
private String mUserId;
private boolean mOn;
private Exception mReason;
public TaskPings(UserDetailsPingsActivity activity, String userId, boolean on) {
mActivity = activity;
mUserId = userId;
mOn = on;
}
public void setActivity(UserDetailsPingsActivity activity) {
mActivity = activity;
}
@Override
protected void onPreExecute() {
mActivity.ensureUi();
}
@Override
protected Settings doInBackground(Void... params) {
try {
Foursquared foursquared = (Foursquared) mActivity.getApplication();
Foursquare foursquare = foursquared.getFoursquare();
return foursquare.setpings(mUserId, mOn);
} catch (Exception e) {
if (DEBUG) Log.d(TAG, "TipTask: Exception performing tip task.", e);
mReason = e;
}
return null;
}
@Override
protected void onPostExecute(Settings settings) {
if (mActivity != null) {
mActivity.onTaskPingsComplete(settings, mUserId, mOn, mReason);
}
}
@Override
protected void onCancelled() {
if (mActivity != null) {
mActivity.onTaskPingsComplete(null, mUserId, mOn, new FoursquareException("Tip task cancelled."));
}
}
}
private static class StateHolder {
private User mUser;
private boolean mIsRunningTask;
private Intent mPreparedResult;
private TaskPings mTaskPings;
public StateHolder() {
mPreparedResult = null;
mIsRunningTask = false;
}
public User getUser() {
return mUser;
}
public void setUser(User user) {
mUser = user;
}
public void setSettingsResult(Settings settings) {
mUser.getSettings().setGetPings(settings.getGetPings());
}
public void startPingsTask(UserDetailsPingsActivity activity, boolean on) {
if (!mIsRunningTask) {
mIsRunningTask = true;
mTaskPings = new TaskPings(activity, mUser.getId(), on);
mTaskPings.execute();
}
}
public void setActivity(UserDetailsPingsActivity activity) {
if (mTaskPings != null) {
mTaskPings.setActivity(activity);
}
}
public void setIsRunningTaskPings(boolean isRunning) {
mIsRunningTask = isRunning;
}
public boolean getIsRunningTaskPings() {
return mIsRunningTask;
}
public Intent getPreparedResult() {
return mPreparedResult;
}
public void setPreparedResult(Intent intent) {
mPreparedResult = intent;
}
}
}