package com.newsrob.appwidget;
import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.view.View;
import android.widget.RemoteViews;
import com.newsrob.DBQuery;
import com.newsrob.EntryManager;
import com.newsrob.PL;
import com.newsrob.R;
import com.newsrob.activities.ArticleListActivity;
import com.newsrob.activities.UIHelper;
import com.newsrob.util.Timing;
public class UnreadWidgetProvider extends AppWidgetProvider {
static final String TAG = UnreadWidgetProvider.class.getSimpleName();
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
context.startService(new Intent(context, UpdateService.class));
}
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
super.onDeleted(context, appWidgetIds);
EntryManager entryManager = EntryManager.getInstance(context);
for (int appWidgetId : appWidgetIds)
entryManager.clearWidgetPreferences(appWidgetId);
}
public static RemoteViews buildUpdate(Context context, int appWidgetId) {
RemoteViews updateViews = null;
Timing t = new Timing("buildUpdate for widget " + appWidgetId, context);
try {
EntryManager entryManager = EntryManager.getInstance(context);
WidgetPreferences wp = entryManager.getWidgetPreferences(appWidgetId);
updateViews = new RemoteViews(context.getPackageName(), R.layout.unread_widget);
if (wp == null) {
PL.log(TAG + "Nothing stored for appWidgetId=" + appWidgetId, context);
updateViews.setTextViewText(R.id.unread_count, "oops!");
updateViews.setViewVisibility(R.id.unread_count, View.VISIBLE);
return updateViews;
}
int count = getCount(entryManager, wp.getDBQuery());
updateViews.setViewVisibility(R.id.unread_count, count > 0 ? View.VISIBLE : View.INVISIBLE);
updateViews.setTextViewText(R.id.unread_count, String.valueOf(count));
updateViews.setViewVisibility(R.id.label,
wp.getLabel() != null && wp.getLabel().trim().length() > 0 ? View.VISIBLE : View.INVISIBLE);
updateViews.setTextViewText(R.id.label, wp.getLabel() == null ? "" : wp.getLabel());
Class startingActivityClass = ArticleListActivity.class;
if (wp.getStartingActivityName() != null) {
try {
startingActivityClass = Class.forName(wp.getStartingActivityName());
} catch (ClassNotFoundException e) {
throw e;
}
}
Intent intent = new Intent(context, startingActivityClass);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
// intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
// intent.addCategory(Intent.CATEGORY_LAUNCHER);
// intent.setFlags(Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED |
// Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET
// | Intent.FLAG_ACTIVITY_CLEAR_TOP);
UIHelper.addExtrasFromDBQuery(intent, wp.getDBQuery());
PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0); //
// | Intent.FLAG_DEBUG_LOG_RESOLUTION
updateViews.setOnClickPendingIntent(R.id.container, pendingIntent);
} catch (Throwable throwable) {
PL.log("Exception during buildUpdate()", throwable, context);
} finally {
t.stop();
return updateViews;
}
}
private static int getCount(EntryManager entryManager, DBQuery dbq) {
return entryManager.getContentCount(dbq);
}
public static void requestWidgetsUpdate(Context ctx) {
AppWidgetManager awm = AppWidgetManager.getInstance(ctx);
int[] appWidgetIds = awm.getAppWidgetIds(new ComponentName(ctx, UnreadWidgetProvider.class));
Timing t = new Timing(TAG + " requestWidgetsUpdate for " + appWidgetIds.length + " widget(s)", ctx);
for (int appWidgetId : appWidgetIds) {
PL.log("UnreadWidgetProvider.requestWidgetsUpdate, about to call UWP.buildUpdate for widget id "
+ appWidgetId + ".", ctx);
awm.updateAppWidget(appWidgetId, UnreadWidgetProvider.buildUpdate(ctx, appWidgetId));
}
t.stop();
}
public static class UpdateService extends Service {
@Override
public void onStart(Intent intent, int startId) {
requestWidgetsUpdate(this);
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
}