1981874e61ecf29a96a77601a3172b2503b6537eeErik/*
2981874e61ecf29a96a77601a3172b2503b6537eeErik * Copyright (C) 2010 The Android Open Source Project
3981874e61ecf29a96a77601a3172b2503b6537eeErik *
4981874e61ecf29a96a77601a3172b2503b6537eeErik * Licensed under the Apache License, Version 2.0 (the "License");
5981874e61ecf29a96a77601a3172b2503b6537eeErik * you may not use this file except in compliance with the License.
6981874e61ecf29a96a77601a3172b2503b6537eeErik * You may obtain a copy of the License at
7981874e61ecf29a96a77601a3172b2503b6537eeErik *
8981874e61ecf29a96a77601a3172b2503b6537eeErik *      http://www.apache.org/licenses/LICENSE-2.0
9981874e61ecf29a96a77601a3172b2503b6537eeErik *
10981874e61ecf29a96a77601a3172b2503b6537eeErik * Unless required by applicable law or agreed to in writing, software
11981874e61ecf29a96a77601a3172b2503b6537eeErik * distributed under the License is distributed on an "AS IS" BASIS,
12981874e61ecf29a96a77601a3172b2503b6537eeErik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13981874e61ecf29a96a77601a3172b2503b6537eeErik * See the License for the specific language governing permissions and
14981874e61ecf29a96a77601a3172b2503b6537eeErik * limitations under the License.
15981874e61ecf29a96a77601a3172b2503b6537eeErik */
16981874e61ecf29a96a77601a3172b2503b6537eeErik
17981874e61ecf29a96a77601a3172b2503b6537eeErikpackage com.android.calendar.month;
18981874e61ecf29a96a77601a3172b2503b6537eeErik
19981874e61ecf29a96a77601a3172b2503b6537eeErikimport com.android.calendar.CalendarController;
20981874e61ecf29a96a77601a3172b2503b6537eeErikimport com.android.calendar.CalendarController.EventType;
21981874e61ecf29a96a77601a3172b2503b6537eeErikimport com.android.calendar.CalendarController.ViewType;
22981874e61ecf29a96a77601a3172b2503b6537eeErikimport com.android.calendar.Event;
236a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelsonimport com.android.calendar.R;
24981874e61ecf29a96a77601a3172b2503b6537eeErikimport com.android.calendar.Utils;
25981874e61ecf29a96a77601a3172b2503b6537eeErik
26981874e61ecf29a96a77601a3172b2503b6537eeErikimport android.content.Context;
273553621c824afe1f3eacbe8555678005ca1264a1Erikimport android.content.res.Configuration;
28981874e61ecf29a96a77601a3172b2503b6537eeErikimport android.text.format.Time;
29981874e61ecf29a96a77601a3172b2503b6537eeErikimport android.util.Log;
303553621c824afe1f3eacbe8555678005ca1264a1Erikimport android.view.View;
313553621c824afe1f3eacbe8555678005ca1264a1Erikimport android.view.ViewGroup;
323553621c824afe1f3eacbe8555678005ca1264a1Erikimport android.widget.AbsListView.LayoutParams;
33981874e61ecf29a96a77601a3172b2503b6537eeErik
34981874e61ecf29a96a77601a3172b2503b6537eeErikimport java.util.ArrayList;
3582b318634af1b6594e60cfd1f2df4d3845f80587Erikimport java.util.HashMap;
36981874e61ecf29a96a77601a3172b2503b6537eeErik
37e21674aefc9755ba519dfc5b3ff4348be4814903Erikpublic class MonthByWeekAdapter extends SimpleWeeksAdapter {
383553621c824afe1f3eacbe8555678005ca1264a1Erik    private static final String TAG = "MonthByWeek";
393553621c824afe1f3eacbe8555678005ca1264a1Erik
403553621c824afe1f3eacbe8555678005ca1264a1Erik    public static final String WEEK_PARAMS_IS_MINI = "mini_month";
4182b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected static int DEFAULT_QUERY_DAYS = 7 * 8; // 8 weeks
425b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik    private static final long ANIMATE_TODAY_TIMEOUT = 1000;
43981874e61ecf29a96a77601a3172b2503b6537eeErik
4482b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected CalendarController mController;
45981874e61ecf29a96a77601a3172b2503b6537eeErik    protected String mHomeTimeZone;
4682b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected Time mTempTime;
4782b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected Time mToday;
4882b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected int mFirstJulianDay;
4940bcd101b212c9863c3110c05a487a7ae6ebc3caErik    protected int mQueryDays;
503553621c824afe1f3eacbe8555678005ca1264a1Erik    protected boolean mIsMiniMonth = true;
513553621c824afe1f3eacbe8555678005ca1264a1Erik    protected int mOrientation = Configuration.ORIENTATION_LANDSCAPE;
526a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson    private boolean mShowAgendaWithMonth;
53981874e61ecf29a96a77601a3172b2503b6537eeErik
5482b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected ArrayList<ArrayList<Event>> mEventDayList = new ArrayList<ArrayList<Event>>();
55092caec951caa0fabcd51729678e3ddcd6ca2f03RoboErik    protected ArrayList<Event> mEvents = null;
56981874e61ecf29a96a77601a3172b2503b6537eeErik
575b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik    private boolean mAnimateToday = false;
585b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik    private long mAnimateTime = 0;
595b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik
6082b318634af1b6594e60cfd1f2df4d3845f80587Erik    public MonthByWeekAdapter(Context context, HashMap<String, Integer> params) {
6182b318634af1b6594e60cfd1f2df4d3845f80587Erik        super(context, params);
623553621c824afe1f3eacbe8555678005ca1264a1Erik        if (params.containsKey(WEEK_PARAMS_IS_MINI)) {
633553621c824afe1f3eacbe8555678005ca1264a1Erik            mIsMiniMonth = params.get(WEEK_PARAMS_IS_MINI) != 0;
643553621c824afe1f3eacbe8555678005ca1264a1Erik        }
656a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson        mShowAgendaWithMonth = Utils.getConfigBool(context, R.bool.show_agenda_with_month);
66981874e61ecf29a96a77601a3172b2503b6537eeErik    }
67981874e61ecf29a96a77601a3172b2503b6537eeErik
685b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik    public void animateToday() {
695b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        mAnimateToday = true;
705b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        mAnimateTime = System.currentTimeMillis();
715b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik    }
725b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik
7382b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
7482b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void init() {
7582b318634af1b6594e60cfd1f2df4d3845f80587Erik        super.init();
7682b318634af1b6594e60cfd1f2df4d3845f80587Erik        mController = CalendarController.getInstance(mContext);
7782b318634af1b6594e60cfd1f2df4d3845f80587Erik        mHomeTimeZone = Utils.getTimeZone(mContext, null);
7882b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.switchTimezone(mHomeTimeZone);
79981874e61ecf29a96a77601a3172b2503b6537eeErik        mToday = new Time(mHomeTimeZone);
80981874e61ecf29a96a77601a3172b2503b6537eeErik        mToday.setToNow();
81981874e61ecf29a96a77601a3172b2503b6537eeErik        mTempTime = new Time(mHomeTimeZone);
82981874e61ecf29a96a77601a3172b2503b6537eeErik    }
83981874e61ecf29a96a77601a3172b2503b6537eeErik
8482b318634af1b6594e60cfd1f2df4d3845f80587Erik    private void updateTimeZones() {
8582b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.timezone = mHomeTimeZone;
8682b318634af1b6594e60cfd1f2df4d3845f80587Erik        mSelectedDay.normalize(true);
8782b318634af1b6594e60cfd1f2df4d3845f80587Erik        mToday.timezone = mHomeTimeZone;
8882b318634af1b6594e60cfd1f2df4d3845f80587Erik        mToday.setToNow();
8982b318634af1b6594e60cfd1f2df4d3845f80587Erik        mTempTime.switchTimezone(mHomeTimeZone);
9082b318634af1b6594e60cfd1f2df4d3845f80587Erik    }
91981874e61ecf29a96a77601a3172b2503b6537eeErik
9240bcd101b212c9863c3110c05a487a7ae6ebc3caErik    @Override
9340bcd101b212c9863c3110c05a487a7ae6ebc3caErik    public void setSelectedDay(Time selectedTime) {
9440bcd101b212c9863c3110c05a487a7ae6ebc3caErik        mSelectedDay.set(selectedTime);
9540bcd101b212c9863c3110c05a487a7ae6ebc3caErik        long millis = mSelectedDay.normalize(true);
9640bcd101b212c9863c3110c05a487a7ae6ebc3caErik        mSelectedWeek = Utils.getWeeksSinceEpochFromJulianDay(
9740bcd101b212c9863c3110c05a487a7ae6ebc3caErik                Time.getJulianDay(millis, mSelectedDay.gmtoff), mFirstDayOfWeek);
9840bcd101b212c9863c3110c05a487a7ae6ebc3caErik        notifyDataSetChanged();
9940bcd101b212c9863c3110c05a487a7ae6ebc3caErik    }
10040bcd101b212c9863c3110c05a487a7ae6ebc3caErik
10182b318634af1b6594e60cfd1f2df4d3845f80587Erik    public void setEvents(int firstJulianDay, int numDays, ArrayList<Event> events) {
1023553621c824afe1f3eacbe8555678005ca1264a1Erik        if (mIsMiniMonth) {
1033553621c824afe1f3eacbe8555678005ca1264a1Erik            if (Log.isLoggable(TAG, Log.ERROR)) {
1043553621c824afe1f3eacbe8555678005ca1264a1Erik                Log.e(TAG, "Attempted to set events for mini view. Events only supported in full"
1053553621c824afe1f3eacbe8555678005ca1264a1Erik                        + " view.");
1063553621c824afe1f3eacbe8555678005ca1264a1Erik            }
1073553621c824afe1f3eacbe8555678005ca1264a1Erik            return;
1083553621c824afe1f3eacbe8555678005ca1264a1Erik        }
109092caec951caa0fabcd51729678e3ddcd6ca2f03RoboErik        mEvents = events;
11082b318634af1b6594e60cfd1f2df4d3845f80587Erik        mFirstJulianDay = firstJulianDay;
11140bcd101b212c9863c3110c05a487a7ae6ebc3caErik        mQueryDays = numDays;
11240bcd101b212c9863c3110c05a487a7ae6ebc3caErik        // Create a new list, this is necessary since the weeks are referencing
11340bcd101b212c9863c3110c05a487a7ae6ebc3caErik        // pieces of the old list
11440bcd101b212c9863c3110c05a487a7ae6ebc3caErik        ArrayList<ArrayList<Event>> eventDayList = new ArrayList<ArrayList<Event>>();
11540bcd101b212c9863c3110c05a487a7ae6ebc3caErik        for (int i = 0; i < numDays; i++) {
11640bcd101b212c9863c3110c05a487a7ae6ebc3caErik            eventDayList.add(new ArrayList<Event>());
117981874e61ecf29a96a77601a3172b2503b6537eeErik        }
118981874e61ecf29a96a77601a3172b2503b6537eeErik
119981874e61ecf29a96a77601a3172b2503b6537eeErik        if (events == null || events.size() == 0) {
120981874e61ecf29a96a77601a3172b2503b6537eeErik            if(Log.isLoggable(TAG, Log.DEBUG)) {
121981874e61ecf29a96a77601a3172b2503b6537eeErik                Log.d(TAG, "No events. Returning early--go schedule something fun.");
122981874e61ecf29a96a77601a3172b2503b6537eeErik            }
123b331a8217f09c2d48960bc192fc1cda1e6a35faeErik            mEventDayList = eventDayList;
124981874e61ecf29a96a77601a3172b2503b6537eeErik            refresh();
125981874e61ecf29a96a77601a3172b2503b6537eeErik            return;
126981874e61ecf29a96a77601a3172b2503b6537eeErik        }
127981874e61ecf29a96a77601a3172b2503b6537eeErik
128981874e61ecf29a96a77601a3172b2503b6537eeErik        // Compute the new set of days with events
129981874e61ecf29a96a77601a3172b2503b6537eeErik        for (Event event : events) {
13082b318634af1b6594e60cfd1f2df4d3845f80587Erik            int startDay = event.startDay - mFirstJulianDay;
13182b318634af1b6594e60cfd1f2df4d3845f80587Erik            int endDay = event.endDay - mFirstJulianDay + 1;
132981874e61ecf29a96a77601a3172b2503b6537eeErik            if (startDay < numDays || endDay >= 0) {
133981874e61ecf29a96a77601a3172b2503b6537eeErik                if (startDay < 0) {
134981874e61ecf29a96a77601a3172b2503b6537eeErik                    startDay = 0;
135981874e61ecf29a96a77601a3172b2503b6537eeErik                }
136981874e61ecf29a96a77601a3172b2503b6537eeErik                if (startDay > numDays) {
137981874e61ecf29a96a77601a3172b2503b6537eeErik                    continue;
138981874e61ecf29a96a77601a3172b2503b6537eeErik                }
139981874e61ecf29a96a77601a3172b2503b6537eeErik                if (endDay < 0) {
140981874e61ecf29a96a77601a3172b2503b6537eeErik                    continue;
141981874e61ecf29a96a77601a3172b2503b6537eeErik                }
142981874e61ecf29a96a77601a3172b2503b6537eeErik                if (endDay > numDays) {
143981874e61ecf29a96a77601a3172b2503b6537eeErik                    endDay = numDays;
144981874e61ecf29a96a77601a3172b2503b6537eeErik                }
145981874e61ecf29a96a77601a3172b2503b6537eeErik                for (int j = startDay; j < endDay; j++) {
14640bcd101b212c9863c3110c05a487a7ae6ebc3caErik                    eventDayList.get(j).add(event);
147981874e61ecf29a96a77601a3172b2503b6537eeErik                }
148981874e61ecf29a96a77601a3172b2503b6537eeErik            }
149981874e61ecf29a96a77601a3172b2503b6537eeErik        }
150981874e61ecf29a96a77601a3172b2503b6537eeErik        if(Log.isLoggable(TAG, Log.DEBUG)) {
151981874e61ecf29a96a77601a3172b2503b6537eeErik            Log.d(TAG, "Processed " + events.size() + " events.");
152981874e61ecf29a96a77601a3172b2503b6537eeErik        }
15340bcd101b212c9863c3110c05a487a7ae6ebc3caErik        mEventDayList = eventDayList;
154981874e61ecf29a96a77601a3172b2503b6537eeErik        refresh();
155981874e61ecf29a96a77601a3172b2503b6537eeErik    }
156981874e61ecf29a96a77601a3172b2503b6537eeErik
1573553621c824afe1f3eacbe8555678005ca1264a1Erik    @SuppressWarnings("unchecked")
1583553621c824afe1f3eacbe8555678005ca1264a1Erik    @Override
1593553621c824afe1f3eacbe8555678005ca1264a1Erik    public View getView(int position, View convertView, ViewGroup parent) {
1603553621c824afe1f3eacbe8555678005ca1264a1Erik        if (mIsMiniMonth) {
1613553621c824afe1f3eacbe8555678005ca1264a1Erik            return super.getView(position, convertView, parent);
1623553621c824afe1f3eacbe8555678005ca1264a1Erik        }
1633553621c824afe1f3eacbe8555678005ca1264a1Erik        MonthWeekEventsView v;
1643553621c824afe1f3eacbe8555678005ca1264a1Erik        LayoutParams params = new LayoutParams(
1653553621c824afe1f3eacbe8555678005ca1264a1Erik                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
1663553621c824afe1f3eacbe8555678005ca1264a1Erik        HashMap<String, Integer> drawingParams = null;
1675b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        boolean isAnimatingToday = false;
1683553621c824afe1f3eacbe8555678005ca1264a1Erik        if (convertView != null) {
1693553621c824afe1f3eacbe8555678005ca1264a1Erik            v = (MonthWeekEventsView) convertView;
1705b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            // Checking updateToday uses the current params instead of the new
1715b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            // params, so this is assuming the view is relatively stable
1725b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            if (mAnimateToday && v.updateToday(mSelectedDay.timezone)) {
1735b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                long currentTime = System.currentTimeMillis();
1745b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                // If it's been too long since we tried to start the animation
1755b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                // don't show it. This can happen if the user stops a scroll
1765b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                // before reaching today.
1775b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                if (currentTime - mAnimateTime > ANIMATE_TODAY_TIMEOUT) {
1785b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                    mAnimateToday = false;
1795b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                    mAnimateTime = 0;
1805b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                } else {
1815b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                    isAnimatingToday = true;
1825b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                    // There is a bug that causes invalidates to not work some
1835b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                    // of the time unless we recreate the view.
1845b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                    v = new MonthWeekEventsView(mContext);
1855b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                }
1865b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            } else {
1875b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik                drawingParams = (HashMap<String, Integer>) v.getTag();
1885b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            }
1893553621c824afe1f3eacbe8555678005ca1264a1Erik        } else {
1903553621c824afe1f3eacbe8555678005ca1264a1Erik            v = new MonthWeekEventsView(mContext);
1913553621c824afe1f3eacbe8555678005ca1264a1Erik        }
1923553621c824afe1f3eacbe8555678005ca1264a1Erik        if (drawingParams == null) {
1933553621c824afe1f3eacbe8555678005ca1264a1Erik            drawingParams = new HashMap<String, Integer>();
1943553621c824afe1f3eacbe8555678005ca1264a1Erik        }
1953553621c824afe1f3eacbe8555678005ca1264a1Erik        drawingParams.clear();
1963553621c824afe1f3eacbe8555678005ca1264a1Erik
1973553621c824afe1f3eacbe8555678005ca1264a1Erik        v.setLayoutParams(params);
1983553621c824afe1f3eacbe8555678005ca1264a1Erik        v.setClickable(true);
1993553621c824afe1f3eacbe8555678005ca1264a1Erik        v.setOnTouchListener(this);
2003553621c824afe1f3eacbe8555678005ca1264a1Erik
2013553621c824afe1f3eacbe8555678005ca1264a1Erik        int selectedDay = -1;
2023553621c824afe1f3eacbe8555678005ca1264a1Erik        if (mSelectedWeek == position) {
2033553621c824afe1f3eacbe8555678005ca1264a1Erik            selectedDay = mSelectedDay.weekDay;
2043553621c824afe1f3eacbe8555678005ca1264a1Erik        }
2053553621c824afe1f3eacbe8555678005ca1264a1Erik
206e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_HEIGHT,
2073bff945d29d6ef277391745cd160f3bf16b98905RoboErik                (parent.getHeight() + parent.getTop()) / mNumWeeks);
208e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_SELECTED_DAY, selectedDay);
209e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_SHOW_WK_NUM, mShowWeekNumber ? 1 : 0);
210e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_WEEK_START, mFirstDayOfWeek);
211e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_NUM_DAYS, mDaysPerWeek);
212e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_WEEK, position);
213e21674aefc9755ba519dfc5b3ff4348be4814903Erik        drawingParams.put(SimpleWeekView.VIEW_PARAMS_FOCUS_MONTH, mFocusMonth);
2143553621c824afe1f3eacbe8555678005ca1264a1Erik        drawingParams.put(MonthWeekEventsView.VIEW_PARAMS_ORIENTATION, mOrientation);
2153553621c824afe1f3eacbe8555678005ca1264a1Erik
2165b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        if (isAnimatingToday) {
2175b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            drawingParams.put(MonthWeekEventsView.VIEW_PARAMS_ANIMATE_TODAY, 1);
2185b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik            mAnimateToday = false;
2195b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        }
22040bcd101b212c9863c3110c05a487a7ae6ebc3caErik
2215b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        v.setWeekParams(drawingParams, mSelectedDay.timezone);
2225b872523e28fc778a3fc34e7e9096ca1197c6509RoboErik        sendEventsToView(v);
2233553621c824afe1f3eacbe8555678005ca1264a1Erik        return v;
2243553621c824afe1f3eacbe8555678005ca1264a1Erik    }
2253553621c824afe1f3eacbe8555678005ca1264a1Erik
22640bcd101b212c9863c3110c05a487a7ae6ebc3caErik    private void sendEventsToView(MonthWeekEventsView v) {
22740bcd101b212c9863c3110c05a487a7ae6ebc3caErik        if (mEventDayList.size() == 0) {
22840bcd101b212c9863c3110c05a487a7ae6ebc3caErik            if (Log.isLoggable(TAG, Log.DEBUG)) {
22940bcd101b212c9863c3110c05a487a7ae6ebc3caErik                Log.d(TAG, "No events loaded, did not pass any events to view.");
23040bcd101b212c9863c3110c05a487a7ae6ebc3caErik            }
231092caec951caa0fabcd51729678e3ddcd6ca2f03RoboErik            v.setEvents(null, null);
23240bcd101b212c9863c3110c05a487a7ae6ebc3caErik            return;
23340bcd101b212c9863c3110c05a487a7ae6ebc3caErik        }
23440bcd101b212c9863c3110c05a487a7ae6ebc3caErik        int viewJulianDay = v.getFirstJulianDay();
23540bcd101b212c9863c3110c05a487a7ae6ebc3caErik        int start = viewJulianDay - mFirstJulianDay;
23640bcd101b212c9863c3110c05a487a7ae6ebc3caErik        int end = start + v.mNumDays;
23740bcd101b212c9863c3110c05a487a7ae6ebc3caErik        if (start < 0 || end > mEventDayList.size()) {
23840bcd101b212c9863c3110c05a487a7ae6ebc3caErik            if (Log.isLoggable(TAG, Log.DEBUG)) {
23940bcd101b212c9863c3110c05a487a7ae6ebc3caErik                Log.d(TAG, "Week is outside range of loaded events. viewStart: " + viewJulianDay
24040bcd101b212c9863c3110c05a487a7ae6ebc3caErik                        + " eventsStart: " + mFirstJulianDay);
24140bcd101b212c9863c3110c05a487a7ae6ebc3caErik            }
242092caec951caa0fabcd51729678e3ddcd6ca2f03RoboErik            v.setEvents(null, null);
24340bcd101b212c9863c3110c05a487a7ae6ebc3caErik            return;
24440bcd101b212c9863c3110c05a487a7ae6ebc3caErik        }
245092caec951caa0fabcd51729678e3ddcd6ca2f03RoboErik        v.setEvents(mEventDayList.subList(start, end), mEvents);
24640bcd101b212c9863c3110c05a487a7ae6ebc3caErik    }
24740bcd101b212c9863c3110c05a487a7ae6ebc3caErik
24882b318634af1b6594e60cfd1f2df4d3845f80587Erik    @Override
24982b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void refresh() {
250981874e61ecf29a96a77601a3172b2503b6537eeErik        mFirstDayOfWeek = Utils.getFirstDayOfWeek(mContext);
251981874e61ecf29a96a77601a3172b2503b6537eeErik        mShowWeekNumber = Utils.getShowWeekNumber(mContext);
252981874e61ecf29a96a77601a3172b2503b6537eeErik        mHomeTimeZone = Utils.getTimeZone(mContext, null);
2533553621c824afe1f3eacbe8555678005ca1264a1Erik        mOrientation = mContext.getResources().getConfiguration().orientation;
25482b318634af1b6594e60cfd1f2df4d3845f80587Erik        updateTimeZones();
255e566836781f2a653624dceee3399bef25a0ea119Erik        notifyDataSetChanged();
256981874e61ecf29a96a77601a3172b2503b6537eeErik    }
257981874e61ecf29a96a77601a3172b2503b6537eeErik
258981874e61ecf29a96a77601a3172b2503b6537eeErik    @Override
25982b318634af1b6594e60cfd1f2df4d3845f80587Erik    protected void onDayTapped(Time day) {
26040bcd101b212c9863c3110c05a487a7ae6ebc3caErik        day.timezone = mHomeTimeZone;
26140bcd101b212c9863c3110c05a487a7ae6ebc3caErik        Time currTime = new Time(mHomeTimeZone);
26240bcd101b212c9863c3110c05a487a7ae6ebc3caErik        currTime.set(mController.getTime());
26340bcd101b212c9863c3110c05a487a7ae6ebc3caErik        day.hour = currTime.hour;
26440bcd101b212c9863c3110c05a487a7ae6ebc3caErik        day.minute = currTime.minute;
26590b01744006009ed5ca7205099523f83ced380f5Michael Chan        day.allDay = false;
26640bcd101b212c9863c3110c05a487a7ae6ebc3caErik        day.normalize(true);
2676a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson         if (mShowAgendaWithMonth && !mIsMiniMonth) {
2686a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson            // If agenda view is visible with month view , refresh the views
2696a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson            // with the selected day's info
2706a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson            mController.sendEvent(mContext, EventType.GO_TO, day, day, -1,
2716a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson                    ViewType.CURRENT, CalendarController.EXTRA_GOTO_DATE, null, null);
2726a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson        } else {
2736a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson            // Else , switch to the detailed view
2746a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson            mController.sendEvent(mContext, EventType.GO_TO, day, day, -1,
2756a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson                    mIsMiniMonth ? ViewType.CURRENT : ViewType.DETAIL,
276fb0ec227f0d4b3108438c88a6b6d234f5e40fb5cMichael Chan                    CalendarController.EXTRA_GOTO_DATE
277fb0ec227f0d4b3108438c88a6b6d234f5e40fb5cMichael Chan                            | CalendarController.EXTRA_GOTO_BACK_TO_PREVIOUS, null, null);
2786a18258975212568af7f2ce94f4044d5865a39d9Isaac Katzenelson        }
279981874e61ecf29a96a77601a3172b2503b6537eeErik    }
280981874e61ecf29a96a77601a3172b2503b6537eeErik
281981874e61ecf29a96a77601a3172b2503b6537eeErik}
282