113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan/*
213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * Copyright (C) 2009 The Android Open Source Project
313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan *
413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * Licensed under the Apache License, Version 2.0 (the "License");
513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * you may not use this file except in compliance with the License.
613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * You may obtain a copy of the License at
713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan *
813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan *      http://www.apache.org/licenses/LICENSE-2.0
913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan *
1013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * Unless required by applicable law or agreed to in writing, software
1113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * distributed under the License is distributed on an "AS IS" BASIS,
1213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * See the License for the specific language governing permissions and
1413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan * limitations under the License.
1513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan */
1613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
1700b8c1a39d75c1b4626dc987bd1a51cfaf7c9be1Mason Tangpackage com.android.calendar.agenda;
1813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
1900b8c1a39d75c1b4626dc987bd1a51cfaf7c9be1Mason Tangimport com.android.calendar.CalendarController;
209e89dca0902d13fe27fd2680cc15cbb470e40288Michael Chanimport com.android.calendar.CalendarController.EventType;
2100b8c1a39d75c1b4626dc987bd1a51cfaf7c9be1Mason Tangimport com.android.calendar.DeleteEventHelper;
22a9507932dbc49ecb9f5c71fda6af3a47b0b2a39aDaisuke Miyakawaimport com.android.calendar.R;
239a88873f9ec97b47aaaaae47208d22b3998b8e99Erikimport com.android.calendar.Utils;
2400b8c1a39d75c1b4626dc987bd1a51cfaf7c9be1Mason Tangimport com.android.calendar.agenda.AgendaAdapter.ViewHolder;
259a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelsonimport com.android.calendar.agenda.AgendaWindowAdapter.DayAdapterInfo;
26cf31ab351c9becad6785d4d77eefc934f30b92e3James Kungimport com.android.calendar.agenda.AgendaWindowAdapter.AgendaItem;
2788c483a0189cbe7132330cb1b563f07326f3bcf9Erik
289138ce8a14924612c014da2b6e727b4117ba1a92Mason Tangimport android.content.Context;
2913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.graphics.Rect;
302d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelsonimport android.os.Handler;
316bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelsonimport android.provider.CalendarContract.Attendees;
3213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.text.format.Time;
33ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelsonimport android.util.AttributeSet;
3413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.util.Log;
3513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.view.View;
3613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.widget.AdapterView;
379a88873f9ec97b47aaaaae47208d22b3998b8e99Erikimport android.widget.AdapterView.OnItemClickListener;
3813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.widget.ListView;
3913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanimport android.widget.TextView;
4013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
4113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chanpublic class AgendaListView extends ListView implements OnItemClickListener {
4213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
4313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    private static final String TAG = "AgendaListView";
4413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    private static final boolean DEBUG = false;
456467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    private static final int EVENT_UPDATE_TIME = 300000;  // 5 minutes
4613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
4713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    private AgendaWindowAdapter mWindowAdapter;
4813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    private DeleteEventHelper mDeleteEventHelper;
490558defd2215696cee0768ce2bf2cb4da56efc42Michael Chan    private Context mContext;
509a88873f9ec97b47aaaaae47208d22b3998b8e99Erik    private String mTimeZone;
51f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik    private Time mTime;
52b223feb402caabe7d03b9e90318ef22647603e5fIsaac Katzenelson    private boolean mShowEventDetailsWithAgenda;
535d740e1320ba48ba66b72430f9896ab7d481fb54Michael Chan    private Handler mHandler = null;
5413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
556bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Runnable mTZUpdater = new Runnable() {
569a88873f9ec97b47aaaaae47208d22b3998b8e99Erik        @Override
579a88873f9ec97b47aaaaae47208d22b3998b8e99Erik        public void run() {
589a88873f9ec97b47aaaaae47208d22b3998b8e99Erik            mTimeZone = Utils.getTimeZone(mContext, this);
59f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik            mTime.switchTimezone(mTimeZone);
609a88873f9ec97b47aaaaae47208d22b3998b8e99Erik        }
619a88873f9ec97b47aaaaae47208d22b3998b8e99Erik    };
6213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
636467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // runs every midnight and refreshes the view in order to update the past/present
646467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // separator
656bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Runnable mMidnightUpdater = new Runnable() {
662d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson        @Override
672d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson        public void run() {
682d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson            refresh(true);
694bd4a5ccc3efcc282964e789e1e81577c64561c9Isaac Katzenelson            Utils.setMidnightUpdater(mHandler, mMidnightUpdater, mTimeZone);
702d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson        }
712d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson    };
722d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson
736467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // Runs every EVENT_UPDATE_TIME to gray out past events
746bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson    private final Runnable mPastEventUpdater = new Runnable() {
756467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        @Override
766467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        public void run() {
776467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson            if (updatePastEvents() == true) {
786467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson                refresh(true);
796467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson            }
806467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson            setPastEventsUpdater();
816467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        }
826467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    };
832d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson
84ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson    public AgendaListView(Context context, AttributeSet attrs) {
85ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        super(context, attrs);
86ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        initView(context);
87ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson    }
88ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson
89ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson    private void initView(Context context) {
900558defd2215696cee0768ce2bf2cb4da56efc42Michael Chan        mContext = context;
919a88873f9ec97b47aaaaae47208d22b3998b8e99Erik        mTimeZone = Utils.getTimeZone(context, mTZUpdater);
92f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik        mTime = new Time(mTimeZone);
9313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        setOnItemClickListener(this);
9423f400cdb34b08d9003f4a96fca5976ad632e4ceMichael Chan        setVerticalScrollBarEnabled(false);
95ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        mWindowAdapter = new AgendaWindowAdapter(context, this,
96ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                Utils.getConfigBool(context, R.bool.show_event_details_with_agenda));
97ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        mWindowAdapter.setSelectedInstanceId(-1/* TODO:instanceId */);
9813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        setAdapter(mWindowAdapter);
99a9507932dbc49ecb9f5c71fda6af3a47b0b2a39aDaisuke Miyakawa        setCacheColorHint(context.getResources().getColor(R.color.agenda_item_not_selected));
10013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        mDeleteEventHelper =
101ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                new DeleteEventHelper(context, null, false /* don't exit when done */);
102b223feb402caabe7d03b9e90318ef22647603e5fIsaac Katzenelson        mShowEventDetailsWithAgenda = Utils.getConfigBool(mContext,
103b223feb402caabe7d03b9e90318ef22647603e5fIsaac Katzenelson                R.bool.show_event_details_with_agenda);
10480369fe0d18311277cd0ae6472bad7073b9879a3Isaac Katzenelson        // Hide ListView dividers, they are done in the item views themselves
10580369fe0d18311277cd0ae6472bad7073b9879a3Isaac Katzenelson        setDivider(null);
10680369fe0d18311277cd0ae6472bad7073b9879a3Isaac Katzenelson        setDividerHeight(0);
10780369fe0d18311277cd0ae6472bad7073b9879a3Isaac Katzenelson
1085d740e1320ba48ba66b72430f9896ab7d481fb54Michael Chan        mHandler = new Handler();
1092d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson    }
1102d49da2fe5626ee6e3610dc8df23e16e768bc61fIsaac Katzenelson
1116467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // Sets a thread to run every EVENT_UPDATE_TIME in order to update the list
1126467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // with grayed out past events
1136467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    private void setPastEventsUpdater() {
1146467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson
1156467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        // Run the thread in the nearest rounded EVENT_UPDATE_TIME
1166467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        long now = System.currentTimeMillis();
1176467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        long roundedTime = (now / EVENT_UPDATE_TIME) * EVENT_UPDATE_TIME;
1185d740e1320ba48ba66b72430f9896ab7d481fb54Michael Chan        mHandler.removeCallbacks(mPastEventUpdater);
1195d740e1320ba48ba66b72430f9896ab7d481fb54Michael Chan        mHandler.postDelayed(mPastEventUpdater, EVENT_UPDATE_TIME - (now - roundedTime));
1206467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    }
1216467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson
1226467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // Stop the past events thread
1236467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    private void resetPastEventsUpdater() {
1245d740e1320ba48ba66b72430f9896ab7d481fb54Michael Chan        mHandler.removeCallbacks(mPastEventUpdater);
1256467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    }
1266467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson
1276467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // Go over all visible views and checks if all past events are grayed out.
1286467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // Returns true is there is at least one event that ended and it is not
1296467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    // grayed out.
1306467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    private boolean updatePastEvents() {
1316467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson
1326467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        int childCount = getChildCount();
1336467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        boolean needUpdate = false;
1346467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        long now = System.currentTimeMillis();
1356467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        Time time = new Time(mTimeZone);
1366467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        time.set(now);
1376467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        int todayJulianDay = Time.getJulianDay(now, time.gmtoff);
1386467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson
1396467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        // Go over views in list
1406467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        for (int i = 0; i < childCount; ++i) {
1416467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson            View listItem = getChildAt(i);
1426467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson            Object o = listItem.getTag();
143783835bceb03a7598678cd6883ba6bddde387302Michael Chan            if (o instanceof AgendaByDayAdapter.ViewHolder) {
144783835bceb03a7598678cd6883ba6bddde387302Michael Chan                // day view - check if day in the past and not grayed yet
145783835bceb03a7598678cd6883ba6bddde387302Michael Chan                AgendaByDayAdapter.ViewHolder holder = (AgendaByDayAdapter.ViewHolder) o;
146783835bceb03a7598678cd6883ba6bddde387302Michael Chan                if (holder.julianDay <= todayJulianDay && !holder.grayed) {
147783835bceb03a7598678cd6883ba6bddde387302Michael Chan                    needUpdate = true;
148783835bceb03a7598678cd6883ba6bddde387302Michael Chan                    break;
149783835bceb03a7598678cd6883ba6bddde387302Michael Chan                }
150783835bceb03a7598678cd6883ba6bddde387302Michael Chan            } else if (o instanceof AgendaAdapter.ViewHolder) {
15131412a0fea756e0da0bcbdf3cdffe4efae21cdbeIsaac Katzenelson                // meeting view - check if event in the past or started already and not grayed yet
15231412a0fea756e0da0bcbdf3cdffe4efae21cdbeIsaac Katzenelson                // All day meetings for a day are grayed out
1536467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson                AgendaAdapter.ViewHolder holder = (AgendaAdapter.ViewHolder) o;
15431412a0fea756e0da0bcbdf3cdffe4efae21cdbeIsaac Katzenelson                if (!holder.grayed && ((!holder.allDay && holder.startTimeMilli <= now) ||
15531412a0fea756e0da0bcbdf3cdffe4efae21cdbeIsaac Katzenelson                        (holder.allDay && holder.julianDay <= todayJulianDay))) {
1566467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson                    needUpdate = true;
1576467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson                    break;
1586467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson                }
1596467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson            }
1606467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        }
1616467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        return needUpdate;
1626467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson    }
1636467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson
164a9507932dbc49ecb9f5c71fda6af3a47b0b2a39aDaisuke Miyakawa    @Override
165a9507932dbc49ecb9f5c71fda6af3a47b0b2a39aDaisuke Miyakawa    protected void onDetachedFromWindow() {
16613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        super.onDetachedFromWindow();
16713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        mWindowAdapter.close();
16813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
16913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
17013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    // Implementation of the interface OnItemClickListener
171a9507932dbc49ecb9f5c71fda6af3a47b0b2a39aDaisuke Miyakawa    @Override
17213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
17313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        if (id != -1) {
17413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            // Switch to the EventInfo view
175cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            AgendaItem item = mWindowAdapter.getAgendaItemByPosition(position);
17680d5001f42f3d20544337e77beff6afd4767d1d1Michael Chan            long oldInstanceId = mWindowAdapter.getSelectedInstanceId();
177ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan            mWindowAdapter.setSelectedView(v);
178b223feb402caabe7d03b9e90318ef22647603e5fIsaac Katzenelson
179ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            // If events are shown to the side of the agenda list , do nothing
1804b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            // when the same event is selected , otherwise show the selected event.
181b223feb402caabe7d03b9e90318ef22647603e5fIsaac Katzenelson
182cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            if (item != null && (oldInstanceId != mWindowAdapter.getSelectedInstanceId() ||
183b223feb402caabe7d03b9e90318ef22647603e5fIsaac Katzenelson                    !mShowEventDetailsWithAgenda)) {
184cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung                long startTime = item.begin;
185cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung                long endTime = item.end;
1864b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                // Holder in view holds the start of the specific part of a multi-day event ,
1874b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                // use it for the goto
1884b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                long holderStartTime;
1892b965215c52d8632951ccd126431195d529d39cdMichael Chan                Object holder = v.getTag();
1902b965215c52d8632951ccd126431195d529d39cdMichael Chan                if (holder instanceof AgendaAdapter.ViewHolder) {
1912b965215c52d8632951ccd126431195d529d39cdMichael Chan                    holderStartTime = ((AgendaAdapter.ViewHolder) holder).startTimeMilli;
1924b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                } else {
1934b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                    holderStartTime = startTime;
1944b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                }
195f068eabefac222bba99f3967bcbf7869be1065b1James Kung                if (item.allDay) {
196f068eabefac222bba99f3967bcbf7869be1065b1James Kung                    startTime = Utils.convertAlldayLocalToUTC(mTime, startTime, mTimeZone);
197f068eabefac222bba99f3967bcbf7869be1065b1James Kung                    endTime = Utils.convertAlldayLocalToUTC(mTime, endTime, mTimeZone);
198f068eabefac222bba99f3967bcbf7869be1065b1James Kung                }
1996bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                mTime.set(startTime);
2007884c7eeae5bde84841c888a9ec6416ea1513a99Michael Chan                CalendarController controller = CalendarController.getInstance(mContext);
201cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung                controller.sendEventRelatedEventWithExtra(this, EventType.VIEW_EVENT, item.id,
2026bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                        startTime, endTime, 0, 0, CalendarController.EventInfo.buildViewExtraLong(
203cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung                                Attendees.ATTENDEE_STATUS_NONE, item.allDay), holderStartTime);
20413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            }
20513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
20613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
20713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
208c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson    public void goTo(Time time, long id, String searchQuery, boolean forced,
209c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson            boolean refreshEventInfo) {
2104003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang        if (time == null) {
211f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik            time = mTime;
2124b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            long goToTime = getFirstVisibleTime(null);
2134003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            if (goToTime <= 0) {
2144003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang                goToTime = System.currentTimeMillis();
2154003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            }
2164003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang            time.set(goToTime);
2179138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang        }
218f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik        mTime.set(time);
21933de4c48430262a0509ffe50fc376b87520cb938RoboErik        mTime.switchTimezone(mTimeZone);
220f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik        mTime.normalize(true);
221f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik        if (DEBUG) {
222f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik            Log.d(TAG, "Goto with time " + mTime.toString());
223f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik        }
224c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson        mWindowAdapter.refresh(mTime, id, searchQuery, forced, refreshEventInfo);
2259138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang    }
2269138ce8a14924612c014da2b6e727b4117ba1a92Mason Tang
22713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    public void refresh(boolean forced) {
228c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson        mWindowAdapter.refresh(mTime, -1, null, forced, false);
22913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
23013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
2311d423f71b999f72b59e0accc483daa3b3c538ad7James Kung    public void deleteSelectedEvent() {
23213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        int position = getSelectedItemPosition();
233cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung        AgendaItem agendaItem = mWindowAdapter.getAgendaItemByPosition(position);
234cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung        if (agendaItem != null) {
235cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            mDeleteEventHelper.delete(agendaItem.begin, agendaItem.end, agendaItem.id, -1);
23613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
23713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
23813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
23913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    public View getFirstVisibleView() {
24013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        Rect r = new Rect();
24113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        int childCount = getChildCount();
24213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        for (int i = 0; i < childCount; ++i) {
24313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            View listItem = getChildAt(i);
24413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            listItem.getLocalVisibleRect(r);
24513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            if (r.top >= 0) { // if visible
24613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                return listItem;
24713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            }
24813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
24913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        return null;
25013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
25113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
25213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    public long getSelectedTime() {
25313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        int position = getSelectedItemPosition();
25423f400cdb34b08d9003f4a96fca5976ad632e4ceMichael Chan        if (position >= 0) {
255cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            AgendaItem item = mWindowAdapter.getAgendaItemByPosition(position);
256cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            if (item != null) {
257cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung                return item.begin;
25823f400cdb34b08d9003f4a96fca5976ad632e4ceMichael Chan            }
25913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
2604b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson        return getFirstVisibleTime(null);
26113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
26213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
2639fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik    public AgendaAdapter.ViewHolder getSelectedViewHolder() {
2649fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik        return mWindowAdapter.getSelectedViewHolder();
2659fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik    }
2669fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik
267cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung    public long getFirstVisibleTime(AgendaItem item) {
268cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung        AgendaItem agendaItem = item;
269cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung        if (item == null) {
270cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            agendaItem = getFirstVisibleAgendaItem();
2714b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson        }
272cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung        if (agendaItem != null) {
2734b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            Time t = new Time(mTimeZone);
274cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            t.set(agendaItem.begin);
2754b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            // Save and restore the time since setJulianDay sets the time to 00:00:00
2764b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            int hour = t.hour;
2774b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            int minute = t.minute;
2784b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            int second = t.second;
279cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            t.setJulianDay(agendaItem.startDay);
2804b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            t.hour = hour;
2814b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            t.minute = minute;
2824b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            t.second = second;
2834b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            if (DEBUG) {
2844b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                t.normalize(true);
2854b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson                Log.d(TAG, "first position had time " + t.toString());
2864b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            }
2874b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson            return t.normalize(false);
2884b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson        }
2894b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson        return 0;
2904b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson    }
2914b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson
292cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung    public AgendaItem getFirstVisibleAgendaItem() {
29313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        int position = getFirstVisiblePosition();
29413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        if (DEBUG) {
29513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            Log.v(TAG, "getFirstVisiblePosition = " + position);
29613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
29713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
298812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson        // mShowEventDetailsWithAgenda == true implies we have a sticky header. In that case
299812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson        // we may need to take the second visible position, since the first one maybe the one
300812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson        // under the sticky header.
301812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson        if (mShowEventDetailsWithAgenda) {
302812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson            View v = getFirstVisibleView ();
303812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson            if (v != null) {
304812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson                Rect r = new Rect ();
305812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson                v.getLocalVisibleRect(r);
306812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson                if (r.bottom - r.top <=  mWindowAdapter.getStickyHeaderHeight()) {
307812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson                    position ++;
308812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson                }
309812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson            }
310812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson        }
311812da1baf2eaf2951dbd849bed1b365bd2581609Isaac Katzenelson
312cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung        return mWindowAdapter.getAgendaItemByPosition(position,
31396d6163c524b338307b01d25916ccffd495e2f29Michael Chan                false /* startDay = date separator date instead of actual event startday */);
3144b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson
31513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
31613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
3179a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson    public int getJulianDayFromPosition(int position) {
3189a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson        DayAdapterInfo info = mWindowAdapter.getAdapterInfoByPosition(position);
3199a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson        if (info != null) {
3209a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson            return info.dayAdapter.findJulianDayFromPosition(position - info.offset);
3219a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson        }
3229a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson        return 0;
3239a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson    }
3249a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson
325ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson    // Finds is a specific event (defined by start time and id) is visible
326cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung    public boolean isAgendaItemVisible(Time startTime, long id) {
327ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson
328ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        if (id == -1 || startTime == null) {
329ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            return false;
330ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        }
331ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson
332ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        View child = getChildAt(0);
333ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        // View not set yet, so not child - return
334ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        if (child == null) {
335ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            return false;
336ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        }
337ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        int start = getPositionForView(child);
338ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        long milliTime = startTime.toMillis(true);
339ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        int childCount = getChildCount();
340ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        int eventsInAdapter = mWindowAdapter.getCount();
341ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson
342ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        for (int i = 0; i < childCount; i++) {
343ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            if (i + start >= eventsInAdapter) {
344ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                break;
345ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            }
346cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            AgendaItem agendaItem = mWindowAdapter.getAgendaItemByPosition(i + start);
347cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung            if (agendaItem == null) {
348ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                continue;
349ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            }
350f068eabefac222bba99f3967bcbf7869be1065b1James Kung            if (agendaItem.id == id && agendaItem.begin == milliTime) {
351ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                View listItem = getChildAt(i);
3526bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                if (listItem.getTop() <= getHeight() &&
3536bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson                        listItem.getTop() >= mWindowAdapter.getStickyHeaderHeight()) {
354ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                    return true;
355ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                }
356ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            }
357ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        }
358ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson        return false;
359ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson    }
360ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson
361ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan    public long getSelectedInstanceId() {
362ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan        return mWindowAdapter.getSelectedInstanceId();
363ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan    }
364ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan
365f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik    public void setSelectedInstanceId(long id) {
366f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik        mWindowAdapter.setSelectedInstanceId(id);
367f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik    }
368f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik
36913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    // Move the currently selected or visible focus down by offset amount.
37013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    // offset could be negative.
37113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    public void shiftSelection(int offset) {
37213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        shiftPosition(offset);
37313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        int position = getSelectedItemPosition();
37413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        if (position != INVALID_POSITION) {
37513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            setSelectionFromTop(position + offset, 0);
37613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
37713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
37813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
37913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    private void shiftPosition(int offset) {
38013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        if (DEBUG) {
381ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson            Log.v(TAG, "Shifting position " + offset);
38213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
38313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
38413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        View firstVisibleItem = getFirstVisibleView();
38513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
38613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        if (firstVisibleItem != null) {
38713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            Rect r = new Rect();
38813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            firstVisibleItem.getLocalVisibleRect(r);
38913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            // if r.top is < 0, getChildAt(0) and getFirstVisiblePosition() is
39013850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            // returning an item above the first visible item.
39113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            int position = getPositionForView(firstVisibleItem);
39213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            setSelectionFromTop(position + offset, r.top > 0 ? -r.top : r.top);
39313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            if (DEBUG) {
39413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                if (firstVisibleItem.getTag() instanceof AgendaAdapter.ViewHolder) {
395ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                    ViewHolder viewHolder = (AgendaAdapter.ViewHolder) firstVisibleItem.getTag();
39613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                    Log.v(TAG, "Shifting from " + position + " by " + offset + ". Title "
39713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                            + viewHolder.title.getText());
39813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                } else if (firstVisibleItem.getTag() instanceof AgendaByDayAdapter.ViewHolder) {
39913850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                    AgendaByDayAdapter.ViewHolder viewHolder =
400ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson                            (AgendaByDayAdapter.ViewHolder) firstVisibleItem.getTag();
40113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                    Log.v(TAG, "Shifting from " + position + " by " + offset + ". Date  "
40213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                            + viewHolder.dateView.getText());
40313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                } else if (firstVisibleItem instanceof TextView) {
40413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                    Log.v(TAG, "Shifting: Looking at header here. " + getSelectedItemPosition());
40513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan                }
40613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            }
40713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        } else if (getSelectedItemPosition() >= 0) {
40813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            if (DEBUG) {
40996a0b5436f79157e8175b3b761fd5ccfe26a7f62Isaac Katzenelson                Log.v(TAG, "Shifting selection from " + getSelectedItemPosition() +
41096a0b5436f79157e8175b3b761fd5ccfe26a7f62Isaac Katzenelson                        " by " + offset);
41113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            }
41213850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan            setSelection(getSelectedItemPosition() + offset);
41313850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        }
41413850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
41513850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan
41613850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    public void setHideDeclinedEvents(boolean hideDeclined) {
41713850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan        mWindowAdapter.setHideDeclinedEvents(hideDeclined);
41813850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan    }
419609c329fc9a279497aaee1a8062d5430453fbb8cMichael Chan
420609c329fc9a279497aaee1a8062d5430453fbb8cMichael Chan    public void onResume() {
4219a88873f9ec97b47aaaaae47208d22b3998b8e99Erik        mTZUpdater.run();
4224bd4a5ccc3efcc282964e789e1e81577c64561c9Isaac Katzenelson        Utils.setMidnightUpdater(mHandler, mMidnightUpdater, mTimeZone);
4236467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        setPastEventsUpdater();
4249a88873f9ec97b47aaaaae47208d22b3998b8e99Erik        mWindowAdapter.onResume();
425609c329fc9a279497aaee1a8062d5430453fbb8cMichael Chan    }
426ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson
427609c329fc9a279497aaee1a8062d5430453fbb8cMichael Chan    public void onPause() {
4284bd4a5ccc3efcc282964e789e1e81577c64561c9Isaac Katzenelson        Utils.resetMidnightUpdater(mHandler, mMidnightUpdater);
4296467afce8cd7df7d013028462fa6ddf450238a43Isaac Katzenelson        resetPastEventsUpdater();
430609c329fc9a279497aaee1a8062d5430453fbb8cMichael Chan    }
43113850936e579386a0f2ee589607bbf8b7cf1a7d4Michael Chan}
432