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