package org.runnerup.feedwidget; import android.app.PendingIntent; import android.app.ProgressDialog; import android.appwidget.AppWidgetManager; import android.appwidget.AppWidgetProvider; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import android.widget.Button; import android.widget.RemoteViews; import org.runnerup.R; import org.runnerup.db.DBHelper; import org.runnerup.export.SyncManager; import org.runnerup.export.Synchronizer; import org.runnerup.feed.FeedList; import org.runnerup.view.MainLayout; import java.util.Set; public class FeedWidgetProvider extends AppWidgetProvider { private SQLiteDatabase mDB = null; private SyncManager mSyncManager = null; static private boolean UpdateInProgress = false; private class ProgressDialogStub extends ProgressDialog { public ProgressDialogStub(Context context) { super(context); } public void setCancelable(boolean cancelable) {} public void show() {} public void dismiss() {} public void setTitle(String title) {} public void setMessage(String message) {} public Button getButton(int pos) { return null; } public void cancel() {} public void setCanceledOnTouchOutside(boolean canceled) {} public void setMax(int max) {} public void setButton(int pos, String arg, DialogInterface.OnClickListener listener) {} public void setProgress(int progress) {} } @Override public void onReceive(Context context, Intent intent) { if (intent.hasExtra("reload_feed")) { if (UpdateInProgress) { Log.e(getClass().getSimpleName(), "Feed already being refreshed, cancelling this request"); } else { Log.i(getClass().getSimpleName(), "Downloading latest feed..."); if (mDB == null) { mDB = DBHelper.getReadableDatabase(context); mSyncManager = new SyncManager(context, new ProgressDialogStub(context)); } mSyncManager.clear(); FeedList feed = new FeedList(mDB); feed.reset(); feed.getList().clear(); UpdateInProgress = true; Set<String> set = mSyncManager.feedSynchronizersSet(context); // this will trigger onUpdate automatically mSyncManager.synchronizeFeed(new SyncManager.Callback() { @Override public void run(String synchronizerName, Synchronizer.Status status) { UpdateInProgress = false; } }, set, feed, null); } } else { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] ids = appWidgetManager.getAppWidgetIds( new ComponentName(context, FeedWidgetProvider.class)); onUpdate(context, appWidgetManager, ids); } } public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) { for (int appWidgetId : appWidgetIds) { Log.i(getClass().getSimpleName(), "Updating feed widget with id " + appWidgetId); RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.feed_widget); // FeedWidgetService is taking care of filling the list with latest feed Intent adapterIntent = new Intent(context, FeedWidgetService.class); views.setRemoteAdapter(R.id.widget_list, adapterIntent); views.setEmptyView(R.id.widget_list, R.id.widget_empty); // when we click on Runner Up logo, we launch it Intent mainActivity = new Intent(context, MainLayout.class); views.setOnClickPendingIntent(R.id.widget_app_icon, PendingIntent.getActivity(context, 0, mainActivity, 0)); // on any other click (including on any item of the list), we will retrieve latest feed // and update widget with it Intent updateIntent = new Intent(); updateIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE); updateIntent.putExtra("reload_feed", true); PendingIntent pendingIntent = PendingIntent.getBroadcast( context, 0, updateIntent, PendingIntent.FLAG_UPDATE_CURRENT); views.setOnClickPendingIntent(R.id.widget_layout, pendingIntent); views.setPendingIntentTemplate(R.id.widget_list, pendingIntent); // finally update widget - notifyAppWidgetViewDataChanged is required for data to be // reloaded in FeedWidgetService, otherwise nothing is done... appWidgetManager.updateAppWidget(appWidgetId, views); appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_list); } } public static void RefreshWidget(Context context) { AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context); int[] ids = appWidgetManager.getAppWidgetIds( new ComponentName(context, FeedWidgetProvider.class)); appWidgetManager.notifyAppWidgetViewDataChanged(ids, R.id.widget_list); } }