From dad908b741d7d0a7e4a573030baeb74319ad9411 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Tue, 8 Sep 2009 10:52:58 -0700 Subject: [PATCH] b/2102011 Fix the problem where multi-day events may appear multiple times in the Agenda view. --- src/com/android/calendar/AgendaByDayAdapter.java | 29 ++++++++++++----------- src/com/android/calendar/AgendaWindowAdapter.java | 4 ++-- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/com/android/calendar/AgendaByDayAdapter.java b/src/com/android/calendar/AgendaByDayAdapter.java index 5349350..e7c74a2 100644 --- a/src/com/android/calendar/AgendaByDayAdapter.java +++ b/src/com/android/calendar/AgendaByDayAdapter.java @@ -26,6 +26,8 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; +import com.android.calendar.AgendaWindowAdapter.DayAdapterInfo; + import java.util.ArrayList; import java.util.Formatter; import java.util.Iterator; @@ -168,12 +170,13 @@ public class AgendaByDayAdapter extends BaseAdapter { mRowInfo = null; } - public void changeCursor(Cursor cursor) { - calculateDays(cursor); - mAgendaAdapter.changeCursor(cursor); + public void changeCursor(DayAdapterInfo info) { + calculateDays(info); + mAgendaAdapter.changeCursor(info.cursor); } - public void calculateDays(Cursor cursor) { + public void calculateDays(DayAdapterInfo dayAdapterInfo) { + Cursor cursor = dayAdapterInfo.cursor; ArrayList rowInfo = new ArrayList(); int prevStartDay = -1; Time time = new Time(); @@ -185,6 +188,9 @@ public class AgendaByDayAdapter extends BaseAdapter { boolean allDay = cursor.getInt(AgendaWindowAdapter.INDEX_ALL_DAY) != 0; int startDay = cursor.getInt(AgendaWindowAdapter.INDEX_START_DAY); + // Skip over the days outside of the adapter's range + startDay = Math.max(startDay, dayAdapterInfo.start); + if (startDay != prevStartDay) { // Check if we skipped over any empty days if (prevStartDay == -1) { @@ -231,6 +237,9 @@ public class AgendaByDayAdapter extends BaseAdapter { // If this event spans multiple days, then add it to the multipleDay // list. int endDay = cursor.getInt(AgendaWindowAdapter.INDEX_END_DAY); + + // Skip over the days outside of the adapter's range + endDay = Math.min(endDay, dayAdapterInfo.end); if (endDay > startDay) { multipleDayList.add(new MultipleDayInfo(position, endDay)); } @@ -239,16 +248,8 @@ public class AgendaByDayAdapter extends BaseAdapter { // There are no more cursor events but we might still have multiple-day // events left. So create day headers and events for those. if (prevStartDay > 0) { - // Get the Julian day for the last day of this month. To do that, - // we set the date to one less than the first day of the next month, - // and then normalize. - time.setJulianDay(prevStartDay); - time.month += 1; // TODO remove month query reference - time.monthDay = 0; // monthDay starts with 1, so this is the previous day - long millis = time.normalize(true /* ignore isDst */); - int lastDayOfMonth = Time.getJulianDay(millis, time.gmtoff); - - for (int currentDay = prevStartDay + 1; currentDay <= lastDayOfMonth; currentDay++) { + for (int currentDay = prevStartDay + 1; currentDay <= dayAdapterInfo.end; + currentDay++) { boolean dayHeaderAdded = false; Iterator iter = multipleDayList.iterator(); while (iter.hasNext()) { diff --git a/src/com/android/calendar/AgendaWindowAdapter.java b/src/com/android/calendar/AgendaWindowAdapter.java index cee686b..cc915c2 100644 --- a/src/com/android/calendar/AgendaWindowAdapter.java +++ b/src/com/android/calendar/AgendaWindowAdapter.java @@ -228,7 +228,7 @@ public class AgendaWindowAdapter extends BaseAdapter { long id; } - private static class DayAdapterInfo { + static class DayAdapterInfo { Cursor cursor; AgendaByDayAdapter dayAdapter; @@ -816,7 +816,7 @@ public class AgendaWindowAdapter extends BaseAdapter { info.start = data.start; info.end = data.end; info.cursor = cursor; - info.dayAdapter.changeCursor(cursor); + info.dayAdapter.changeCursor(info); info.size = info.dayAdapter.getCount(); // Insert into adapterInfos -- 2.11.0