/******************************************************************************* * BBC News Reader * Released under the BSD License. See README or LICENSE. * Copyright (c) 2011, Digital Lizard (Oscar Key, Thomas Boby) * All rights reserved. ******************************************************************************/ package com.digitallizard.bbcnewsreader.widget; import android.app.PendingIntent; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.widget.RemoteViews; import com.digitallizard.bbcnewsreader.ArticleActivity; import com.digitallizard.bbcnewsreader.Item; import com.digitallizard.bbcnewsreader.R; import com.digitallizard.bbcnewsreader.ReaderActivity; import com.digitallizard.bbcnewsreader.data.DatabaseHandler; import com.digitallizard.bbcnewsreader.data.DatabaseProvider; public class ReaderWidget extends AppWidgetProvider { private static final int NUM_ITEMS = 5; // the number of items to flip through public static final String PREF_KEY_CATEGORY = "widget_category_"; // key for the category public static final String DEFAULT_CATEGORY = "Headlines"; // the default category @Override public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { // retrieve the news from the database DatabaseHandler database = new DatabaseHandler(context); SharedPreferences settings = context.getSharedPreferences(ReaderActivity.PREFS_FILE_NAME, Context.MODE_PRIVATE); for (int i = 0; i < appWidgetIds.length; i++) { String category = settings.getString(PREF_KEY_CATEGORY + appWidgetIds[i], DEFAULT_CATEGORY); Item[] items = database.getItems(category, NUM_ITEMS); // create references to the required view RemoteViews view = new RemoteViews(context.getPackageName(), R.layout.widget); // make the bbc news logo clickable Intent appIntent = new Intent(context, ReaderActivity.class); appIntent.addCategory(Intent.CATEGORY_LAUNCHER); appIntent.setAction(Intent.ACTION_MAIN); PendingIntent appPendingIntent = PendingIntent.getActivity(context, 0, appIntent, PendingIntent.FLAG_UPDATE_CURRENT); view.setOnClickPendingIntent(R.id.widgetLogo, appPendingIntent); // remote existing views from the flipper view.removeAllViews(R.id.widgetFlipper); // loop through and add the latest news to the item for (int j = 0; j < NUM_ITEMS && j < items.length; j++) { // create a view for this item RemoteViews item = new RemoteViews(context.getPackageName(), R.layout.widget_item); // set the text item.setTextViewText(R.id.widgetItemTitle, items[j].getTitle()); item.setTextViewText(R.id.widgetItemDesc, items[j].getDescription()); // make the item clickable Intent itemIntent = new Intent(context, ArticleActivity.class); itemIntent.setData(Uri.withAppendedPath(DatabaseProvider.CONTENT_URI_ITEMS, Integer.toString(items[j].getId()))); itemIntent.putExtra(ArticleActivity.EXTRA_KEY_ITEM_ID, items[j].getId()); itemIntent.addCategory(Intent.CATEGORY_LAUNCHER); itemIntent.setAction(Intent.ACTION_MAIN); PendingIntent itemPendingIntent = PendingIntent.getActivity(context, j, itemIntent, PendingIntent.FLAG_UPDATE_CURRENT); item.setOnClickPendingIntent(R.id.widgetItemTitle, itemPendingIntent); item.setOnClickPendingIntent(R.id.widgetItemDesc, itemPendingIntent); // add this item to the flipper view.addView(R.id.widgetFlipper, item); } // update the widget with the updated views AppWidgetManager manager = AppWidgetManager.getInstance(context); manager.updateAppWidget(appWidgetIds[i], view); } } }