/**
* Copyright 2009 Joe LaPenna
*/
package com.joelapenna.foursquared.appwidget;
import com.joelapenna.foursquare.Foursquare;
import com.joelapenna.foursquare.types.Checkin;
import com.joelapenna.foursquare.types.Group;
import com.joelapenna.foursquare.types.User;
import com.joelapenna.foursquare.util.VenueUtils;
import com.joelapenna.foursquared.FoursquaredSettings;
import com.joelapenna.foursquared.MainActivity;
import com.joelapenna.foursquared.R;
import com.joelapenna.foursquared.UserDetailsActivity;
import com.joelapenna.foursquared.app.FoursquaredService;
import com.joelapenna.foursquared.util.DumpcatcherHelper;
import com.joelapenna.foursquared.util.RemoteResourceManager;
import com.joelapenna.foursquared.util.StringFormatters;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.text.format.DateUtils;
import android.util.Log;
import android.view.View;
import android.widget.RemoteViews;
import java.io.IOException;
import java.util.Date;
/**
* @author Joe LaPenna (joe@joelapenna.com)
*/
public class FriendsAppWidgetProvider extends AppWidgetProvider {
private static final String TAG = "FriendsAppWidgetProvider";
private static final boolean DEBUG = FoursquaredSettings.DEBUG;
private static final int[][] WIDGET_VIEW_IDS = {
{
R.id.widgetItem0, R.id.photo0, R.id.user0, R.id.time0, R.id.location0
}, {
R.id.widgetItem1, R.id.photo1, R.id.user1, R.id.time1, R.id.location1
}, {
R.id.widgetItem2, R.id.photo2, R.id.user2, R.id.time2, R.id.location2
}, {
R.id.widgetItem3, R.id.photo3, R.id.user3, R.id.time3, R.id.location3
}, {
R.id.widgetItem4, R.id.photo4, R.id.user4, R.id.time4, R.id.location4
}
};
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
if (DEBUG) Log.d(TAG, "onUpdate()");
Intent intent = new Intent(context, FoursquaredService.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
context.startService(intent);
}
public static void updateAppWidget(Context context, RemoteResourceManager rrm,
AppWidgetManager appWidgetManager, Integer appWidgetId, Group<Checkin> checkins) {
if (DEBUG) Log.d(TAG, "updateAppWidget: " + String.valueOf(appWidgetId));
// Get the layout for the App Widget and attach an on-click listener to the button
RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.friends_appwidget);
if (DEBUG) Log.d(TAG, "adding header intent: " + String.valueOf(appWidgetId));
Intent baseIntent = new Intent(context, MainActivity.class);
views.setOnClickPendingIntent(R.id.widgetHeader, PendingIntent.getActivity(context, 0,
baseIntent, 0));
if (DEBUG) Log.d(TAG, "adding footer intent: " + String.valueOf(appWidgetId));
baseIntent = new Intent(context, FoursquaredService.class);
baseIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
views.setOnClickPendingIntent(R.id.widgetFooter, PendingIntent.getService(context, 0,
baseIntent, 0));
// Now hide all views if checkins is null (a sign of not being logged in), or populate the
// checkins.
if (checkins == null) {
if (DEBUG) Log.d(TAG, "checkins is null, hiding UI.");
views.setViewVisibility(R.id.widgetNotLoggedInTextView, View.VISIBLE);
for (int i = 0; i < WIDGET_VIEW_IDS.length; i++) {
hideCheckinView(views, WIDGET_VIEW_IDS[i]);
}
} else {
if (DEBUG) Log.d(TAG, "Displaying checkins");
views.setViewVisibility(R.id.widgetNotLoggedInTextView, View.GONE);
int numCheckins = checkins.size();
for (int i = 0; i < WIDGET_VIEW_IDS.length; i++) {
if (i < numCheckins) {
updateCheckinView(context, rrm, views, checkins.get(i), WIDGET_VIEW_IDS[i]);
} else {
hideCheckinView(views, WIDGET_VIEW_IDS[i]);
}
}
}
// Lastly, update the refresh timestamp
CharSequence timestamp = DateUtils.formatDateTime(context, new Date().getTime(),
DateUtils.FORMAT_SHOW_TIME);
views.setTextViewText(R.id.widgetFooter, context.getResources().getString(
R.string.friends_appwidget_footer_text, timestamp));
// Tell the AppWidgetManager to perform an update on the current App Widget
try {
appWidgetManager.updateAppWidget(appWidgetId, views);
} catch (Exception e) {
if (DEBUG) Log.d(TAG, "updateAppWidget crashed: ", e);
DumpcatcherHelper.sendException(e);
}
}
private static void updateCheckinView(Context context, RemoteResourceManager rrm,
RemoteViews views, Checkin checkin, int[] viewIds) {
int viewId = viewIds[0];
int photoViewId = viewIds[1];
int userViewId = viewIds[2];
int timeViewId = viewIds[3];
int locationViewId = viewIds[4];
final User user = checkin.getUser();
final Uri photoUri = Uri.parse(user.getPhoto());
views.setViewVisibility(viewId, View.VISIBLE);
Intent baseIntent;
baseIntent = new Intent(context, UserDetailsActivity.class);
baseIntent.putExtra(UserDetailsActivity.EXTRA_USER_ID, checkin.getUser().getId());
baseIntent.setData(Uri.parse("https://foursquare.com/user/" + checkin.getUser().getId()));
views.setOnClickPendingIntent(viewId, PendingIntent.getActivity(context, 0, baseIntent, 0));
try {
Bitmap bitmap = BitmapFactory.decodeStream(rrm.getInputStream(photoUri));
views.setImageViewBitmap(photoViewId, bitmap);
} catch (IOException e) {
if (Foursquare.MALE.equals(checkin.getUser().getGender())) {
views.setImageViewResource(photoViewId, R.drawable.blank_boy);
} else {
views.setImageViewResource(photoViewId, R.drawable.blank_girl);
}
}
views.setTextViewText(userViewId, StringFormatters.getUserAbbreviatedName(user));
views.setTextViewText(timeViewId, StringFormatters.getRelativeTimeSpanString(checkin
.getCreated()));
if (VenueUtils.isValid(checkin.getVenue())) {
views.setTextViewText(locationViewId, checkin.getVenue().getName());
} else {
views.setTextViewText(locationViewId, "");
}
}
private static void hideCheckinView(RemoteViews views, int[] viewIds) {
views.setViewVisibility(viewIds[0], View.GONE);
}
}