package novoda.droidcon.homewidget; import android.app.AlarmManager; 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.os.SystemClock; import android.widget.RemoteViews; import com.droidcon.uk.R; import com.google.android.apps.iosched.ui.HomeActivity; import com.google.android.apps.iosched.util.UIUtils; public class CountdownWidget extends AppWidgetProvider { private static PendingIntent refreshIntent; @Override public void onUpdate(final Context context, final AppWidgetManager manager, final int[] widgetIds) { context.startService(new Intent(context, Updater.class)); } @Override public void onEnabled(final Context context) { final Intent intent = new Intent(context, Updater.class); refreshIntent = PendingIntent.getService(context, 0, intent, 0); ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)) .setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock .elapsedRealtime(), 1000 * 60, refreshIntent); // updateScore(context); } @Override public void onDisabled(final Context context) { ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)) .cancel(refreshIntent); } /** * Updates the counter */ private static void updateScore(final Context context) { final RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_countdown); int remainingSec = (int) Math .max(0, (UIUtils.CONFERENCE_START_MILLIS - System .currentTimeMillis()) / 1000); final int secs = remainingSec % 86400; final int days = remainingSec / 86400; final String str = context.getResources().getQuantityString( R.plurals.widget_countdown_title, days, days, formatRemainingTime(secs)); views.setTextViewText(R.id.widget_title, str); final Intent appIntent = new Intent(context, HomeActivity.class); PendingIntent appStartPI = PendingIntent.getActivity( context, 0, appIntent, 0 ); views.setOnClickPendingIntent(R.id.countdown_widget, appStartPI); final ComponentName widget = new ComponentName(context, CountdownWidget.class); AppWidgetManager.getInstance(context).updateAppWidget(widget, views); } /** * Formats a time in the form "HH:MM" * * @param elapsedSeconds * the time in seconds. */ private static String formatRemainingTime(long elapsedSeconds) { long hours = 0; long minutes = 0; if (elapsedSeconds >= 3600) { hours = elapsedSeconds / 3600; elapsedSeconds -= hours * 3600; } if (elapsedSeconds >= 60) { minutes = elapsedSeconds / 60; elapsedSeconds -= minutes * 60; } StringBuilder result = new StringBuilder(5); if(hours < 10) { result.append('0'); } result.append(hours); result.append(':'); if(minutes < 10) { result.append('0'); } result.append(minutes); return result.toString(); } public static class Updater extends Service { @Override public void onStart(final Intent intent, final int startId) { final long nowTime = System.currentTimeMillis(); final boolean eventYetToStart = ((int) Math.max(0, (UIUtils.CONFERENCE_START_MILLIS - nowTime) / 1000)) > 0; if(eventYetToStart){ updateScore(this); }else{ final boolean eventStarted = ((int) Math.max(0, (UIUtils.CONFERENCE_START_MILLIS - nowTime) / 1000)) == 0; final boolean eventYetToEnd = ((int) Math.max(0, (UIUtils.CONFERENCE_END_MILLIS - nowTime) / 1000)) > 0; final boolean eventEnded = ((int) Math.max(0, (UIUtils.CONFERENCE_END_MILLIS - nowTime) / 1000)) == 0; if(eventStarted && eventYetToEnd){ setWidgetTxt(this, getResources().getString(R.string.widget_title_text_during_conf), getResources().getString(R.string.widget_subtitle_text_during_conf)); setAlarmDaily(this); } if(eventEnded){ setWidgetTxt(this, getResources().getString(R.string.widget_title_text_after_conf), getResources().getString(R.string.widget_subtitle_text_after_conf)); } } stopSelf(); } private void setWidgetTxt(Context ctx, String title, String subtitle) { final RemoteViews views = new RemoteViews(ctx.getPackageName(), R.layout.widget_countdown); views.setTextViewText(R.id.widget_title, title); views.setTextViewText(R.id.widget_subtitle, subtitle); final Intent appIntent = new Intent(ctx, HomeActivity.class); PendingIntent appStartPI = PendingIntent.getActivity( ctx, 0, appIntent, 0 ); views.setOnClickPendingIntent(R.id.countdown_widget, appStartPI); final ComponentName widget = new ComponentName(ctx, CountdownWidget.class); AppWidgetManager.getInstance(ctx).updateAppWidget(widget, views); } private void setAlarmDaily(Context ctx) { final Intent intent = new Intent(ctx, Updater.class); refreshIntent = PendingIntent.getService(ctx, 0, intent, 0); ((AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE)) .setInexactRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock .elapsedRealtime(), 1000 * 60 * 1440, refreshIntent); } @Override public IBinder onBind(final Intent intent) { return null; } } }