package by.fksis.schedule.widget;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.os.SystemClock;
import android.widget.RemoteViews;
import by.fksis.schedule.L;
import by.fksis.schedule.Preferences;
import by.fksis.schedule.R;
import by.fksis.schedule.Util;
import by.fksis.schedule.app.MainActivity;
import by.fksis.schedule.dal.ScheduleClass;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
public class Widget extends AppWidgetProvider {
public static int WIDGET_ID = 1;
private static DateFormat sdf_all = new SimpleDateFormat("yyyy-MM-dd hh:mm");
private static DateFormat sdf_date = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void onEnabled(Context context) {
Intent updaterIntent = new Intent();
updaterIntent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
updaterIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{WIDGET_ID});
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, updaterIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 1000, pendingIntent);
super.onEnabled(context);
}
@Override
public void onDeleted(Context context, int[] ids) {
for (int id : ids) {
Intent intent = new Intent();
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{id});
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
}
super.onDeleted(context, ids);
}
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
Intent appLaunch = new Intent(context, MainActivity.class);
appLaunch.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent appLaunchPending = PendingIntent.getActivity(context, 0, appLaunch, 0);
Calendar time = Calendar.getInstance();
ComponentName thisWidget = new ComponentName(context, Widget.class);
int[] allWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
int weekNumber = Util.getScheduleWeek(time.getTime());
int dayOfWeek = Util.getDayOfWeekIndex(time);
for (int widgetId : allWidgetIds) {
RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget_main);
remoteViews.setOnClickPendingIntent(R.id.widget, appLaunchPending);
remoteViews.setTextViewText(R.id.widget_current, context.getString(R.string.no_classes));
remoteViews.setTextViewText(R.id.widget_next, context.getString(R.string.no_classes));
time.setTimeInMillis(System.currentTimeMillis());
time.set(Calendar.HOUR, 0);
time.set(Calendar.MINUTE, 00);
time.set(Calendar.AM_PM, Calendar.AM);
time.add(Calendar.DATE, 1);
try {
List<ScheduleClass> classes = ScheduleClass.get(ScheduleClass.class)
.filter("weeks%", "%" + weekNumber + "%")
.filter("day", dayOfWeek)
.filter("studentGroup", new Preferences(context).getGroup())
.filter("subgroups%", "%" + new Preferences(context).getSubgroupString() + "%")
.list();
if ((classes != null) && (classes.size() > 0)) {
boolean found = false;
for (Iterator<ScheduleClass> i = classes.iterator(); i.hasNext() && !found; ) {
ScheduleClass l = i.next();
Date dateStart = sdf_all.parse(sdf_date.format(Calendar.getInstance().getTime()) + " " + context.getResources().getStringArray(R.array.timeSlotStart)[l.timeSlot]);
Date dateEnd = sdf_all.parse(sdf_date.format(Calendar.getInstance().getTime()) + " " + context.getResources().getStringArray(R.array.timeSlotEnd)[l.timeSlot]);
if ((dateStart.getTime() <= Calendar.getInstance().getTime().getTime())
&& (dateEnd.getTime() >= Calendar.getInstance().getTime().getTime())) {
remoteViews.setTextViewText(R.id.widget_current, l.name + " " + ((l.room != null) ? l.room : ""));
time.setTime(dateEnd);
if (i.hasNext()) {
ScheduleClass l_next = i.next();
remoteViews.setTextViewText(R.id.widget_next, l_next.name + Util.defaultValue (l.room, ""));
} else {
remoteViews.setTextViewText(R.id.widget_next, context.getString(R.string.no_classes));
}
found = true;
}
}
if (!found) {
found = false;
for (Iterator<ScheduleClass> i = classes.iterator(); i.hasNext() && !found; ) {
ScheduleClass l = i.next();
Date dateStart = sdf_all.parse(sdf_date.format(Calendar.getInstance().getTime()) + " " + context.getResources().getStringArray(R.array.timeSlotStart)[l.timeSlot]);
Date dateEnd = sdf_all.parse(sdf_date.format(Calendar.getInstance().getTime()) + " " + context.getResources().getStringArray(R.array.timeSlotEnd)[l.timeSlot]);
if (dateStart.getTime() > Calendar.getInstance().getTime().getTime()) {
found = true;
remoteViews.setTextViewText(R.id.widget_current, context.getString(R.string.no_classes));
remoteViews.setTextViewText(R.id.widget_next, l.name + " " + Util.defaultValue (l.room, ""));
time.setTime(dateStart);
}
}
}
}
} catch (Exception e) {
L.d(e.getMessage());
} finally {
appWidgetManager.updateAppWidget(widgetId, remoteViews);
}
}
for (int id : appWidgetIds) {
Intent intent = new Intent();
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[]{id});
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
alarmManager.cancel(pendingIntent);
alarmManager.set(AlarmManager.RTC, time.getTimeInMillis(), pendingIntent);
}
super.onUpdate(context, appWidgetManager, appWidgetIds);
}
}