/*******************************************************************************
* Copyright (c) 2011 Michel DAVID mimah35-at-gmail.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
******************************************************************************/
package fr.gotorennes;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.SystemClock;
import android.widget.RemoteViews;
import fr.gotorennes.util.UpdateUtils;
public abstract class AbstractWidgetProvider extends AppWidgetProvider {
private int updateCount = 0;
public AbstractWidgetProvider() {
super();
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
RemoteViews views = updateRemoteViews(context, appWidgetId);
appWidgetManager.updateAppWidget(appWidgetId, views);
}
updateCount++;
if (updateCount >= (1440 / scheduleInMinutes())) {
UpdateUtils.checkUpdate(context);
updateCount = 0;
}
}
protected abstract RemoteViews updateRemoteViews(Context context, int appWidgetId);
@Override
public void onDeleted(Context context, int[] appWidgetIds) {
for (int appWidgetId : appWidgetIds) {
stopAlarm(context, appWidgetId);
}
super.onDeleted(context, appWidgetIds);
}
protected void stopAlarm(Context context, int widgetId) {
Intent widgetUpdate = new Intent();
widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetId);
widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(getScheme() + "://widget/id/"), String.valueOf(widgetId)));
PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.cancel(newPending);
}
protected void startAlarm(Context context, int widgetId) {
Intent widgetUpdate = new Intent();
widgetUpdate.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
widgetUpdate.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] { widgetId });
widgetUpdate.setData(Uri.withAppendedPath(Uri.parse(getScheme() + "://widget/id/"), String.valueOf(widgetId)));
PendingIntent newPending = PendingIntent.getBroadcast(context, 0, widgetUpdate, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarms.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 60 * 1000 * scheduleInMinutes(), newPending);
}
protected void restartAlarm(Context context, int widgetId) {
stopAlarm(context, widgetId);
startAlarm(context, widgetId);
}
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(action)) {
if (!getScheme().equals(intent.getScheme()) && intent.getExtras() != null) {
final int[] appWidgetIds = intent.getExtras().getIntArray(AppWidgetManager.EXTRA_APPWIDGET_IDS);
for (int appWidgetId : appWidgetIds) {
restartAlarm(context, appWidgetId);
}
}
}
super.onReceive(context, intent);
}
protected abstract int scheduleInMinutes();
protected abstract String getScheme();
}