/** * This file is part of TuCan Mobile. * * TuCan Mobile 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, or * (at your option) any later version. * * TuCan Mobile 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 TuCan Mobile. If not, see <http://www.gnu.org/licenses/>. */ package com.dalthed.tucan.widget; import java.util.ArrayList; import java.util.Calendar; import java.util.GregorianCalendar; import android.annotation.TargetApi; import android.appwidget.AppWidgetManager; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.os.Build; import android.preference.PreferenceManager; import android.view.View; import android.widget.RemoteViews; import android.widget.RemoteViewsService.RemoteViewsFactory; import com.dalthed.tucan.R; import com.dalthed.tucan.datamodel.Appointment; import com.dalthed.tucan.util.ScheduleSaver; /** * Aktualisiert die Homescreen-Widget Eintraege aus der Stundenplanliste * @author Tim Kranz * */ @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class AppointmentViewsFactory implements RemoteViewsFactory { private ArrayList<Appointment> items = ScheduleSaver.loadSchedule(); private Context ctxt = null; private int appWidgetID; public static final String INTENT_CLICK_POSITION = "INTENT_CLICK_POSITION"; public static final String INTENT_TYPE = "INTENT_TYPE"; public static final String INTENT_TYPE_OPEN_APP = "OPEN TUCAB APP"; public AppointmentViewsFactory() { removeOldEntries(); } private void removeOldEntries() { Calendar now = GregorianCalendar.getInstance(); //now contains date and time int i = 0; boolean changed = false; while (i < items.size()) { if (items.get(i).getEndTime().before(now)) { //remove only if appointment is ended items.remove(0); changed = true; } else { break; } } if(changed) ScheduleSaver.saveSchedule(items); } public AppointmentViewsFactory(Context ctxt, Intent intent) { this.ctxt = ctxt; appWidgetID = intent.getIntExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID); } @Override public void onCreate() { } @Override public void onDestroy() { } @Override public int getCount() { removeOldEntries(); if(items == null || items.isEmpty()) return 1; //limit to (value from settings) entries SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(ctxt.getApplicationContext()); int maxEntries = Integer.parseInt(prefs.getString("widget_max_entries", "25")); //a bit dirty... return Math.min(items.size(), Math.max(maxEntries,1)); } @Override public RemoteViews getViewAt(int position) { RemoteViews row = new RemoteViews(ctxt.getPackageName(), R.layout.widget_schedule_row); Intent i = new Intent(); i.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetID); if(items == null || items.isEmpty()){ // empty list -> user has to login and open schedule first row.setTextViewText(R.id.widget_event_room, ctxt.getResources().getString(R.string.widget_no_data_msg_title)); row.setTextViewText(R.id.widget_event_name, ctxt.getResources().getString(R.string.widget_no_data_msg)); i.putExtra(INTENT_TYPE, INTENT_TYPE_OPEN_APP); }else{ Appointment item = items.get(position); if (position == 0 || !item.getDateDescr().equals(items.get(position - 1).getDateDescr())) { row.setTextViewText(R.id.widget_daytitlebartext, item.getDateDescr()); row.setViewVisibility(R.id.widget_daytitle, View.VISIBLE); } else { row.setViewVisibility(R.id.widget_daytitle, View.GONE); } row.setTextViewText(R.id.widget_event_name, item.getName()); row.setTextViewText(R.id.widget_event_time, item.getTimeInterval()); row.setTextViewText(R.id.widget_event_room, item.getRoom()); // set onclick-Acton i.putExtra(INTENT_CLICK_POSITION, position); } row.setOnClickFillInIntent(R.id.widget_row, i); return row; } @Override public RemoteViews getLoadingView() { return (null); } @Override public int getViewTypeCount() { return 1; } @Override public long getItemId(int position) { return position; } @Override public boolean hasStableIds() { return false; } @Override public void onDataSetChanged() { //force update data items = ScheduleSaver.loadSchedule(); removeOldEntries(); } }