package com.joelapenna.foursquared.appwidget.stats;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.RemoteViews;
import com.joelapenna.foursquare.Foursquare;
import com.joelapenna.foursquare.error.FoursquareException;
import com.joelapenna.foursquare.types.User;
import com.joelapenna.foursquared.Foursquared;
import com.joelapenna.foursquared.FoursquaredSettings;
import com.joelapenna.foursquared.R;
import com.joelapenna.foursquared.app.FoursquaredService;
import com.joelapenna.foursquared.location.LocationUtils;
import com.joelapenna.foursquared.util.DumpcatcherHelper;
import java.io.IOException;
public abstract class StatsWidgetUpdater {
private static final String LEADER_BOARD_URL = "http://foursquare.com/iphone/me?uid=";
private static final String LEADER_BOARD_SCOPE = "&view=all&scope=friends";
protected static final String TAG = "StatsWidgetUpdater";
final private Foursquared mFoursquared;
protected int mLayoutResource;
protected int mLayoutId;
final private String mRefreshToastExtra;
protected StatsWidgetUpdater(Foursquared foursquared) {
setLayoutResources();
mFoursquared = foursquared;
mRefreshToastExtra = foursquared.getString(R.string.stats_widget_show_toast_extra);
}
protected abstract void setLayoutResources();
protected abstract void updateUserStats(RemoteViews views,UserStats userStats);
protected abstract void updateUserRank(RemoteViews views,UserRank userRank);
protected abstract void addOnClickIntents(RemoteViews updateViews, Context context, User user);
final public void update(Context context, AppWidgetManager am, int widgetId){
RemoteViews updateViews = buildUpdate(context);
if (updateViews != null) {
try {
am.updateAppWidget(widgetId, updateViews);
} catch (Exception e) {
if (FoursquaredSettings.DEBUG) Log.d(TAG, "StatsWidgetUpdater.update crashed: ", e);
DumpcatcherHelper.sendException(e);
}
}
}
final private RemoteViews buildUpdate(Context context) {
RemoteViews updateViews = new RemoteViews(context.getPackageName(), mLayoutResource);
UserStats userStats = null;
User user = null;
if ( mFoursquared.isReady() ) {
try {
FoursquareHelper.prepareUserAgent(context);
Foursquare.Location loc = LocationUtils.createFoursquareLocation(mFoursquared.getLastKnownLocation());
user = mFoursquared.getFoursquare().user(null, true, true, loc);
String lastInitial = null;
if ( user.getLastname() != null && !"".equals(user.getLastname()) ) {
lastInitial = user.getLastname().charAt(0) + ".";
}
String username = user.getFirstname() + (lastInitial == null ? "" : " "+lastInitial);
userStats = new UserStats(String.valueOf(user.getMayorCount()),
String.valueOf(user.getBadges().size()),
user.getCheckin().getVenue().getName(),
user.getId(),
username);
//Update userStats performed in subclass, based on relevant view id.
updateUserStats(updateViews,userStats);
} catch (FoursquareException e) {
Log.e(TAG, "Foursquare problem encountered", e);
} catch (IOException e) {
Log.e(TAG, "Couldn't contact API", e);
}
}
if (user != null && userStats != null) {
try {
HTMLParser parser = new HTMLParser(context,userStats.getUserName());
String url = LEADER_BOARD_URL+user.getId()+LEADER_BOARD_SCOPE;
parser.parse(url);
UserRank userRank = parser.getUserRank();
updateUserRank(updateViews,userRank);
} catch (FoursquareHelper.ParseException e) {
Log.e(TAG, "Could not parse HTML response", e);
}
}
if ( user != null ) {
addOnClickIntents(updateViews,context, user);
}
return updateViews;
}
}