131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang/* 231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * Copyright (C) 2007 The Android Open Source Project 331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * 431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * Licensed under the Apache License, Version 2.0 (the "License"); 531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * you may not use this file except in compliance with the License. 631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * You may obtain a copy of the License at 731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * 831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * http://www.apache.org/licenses/LICENSE-2.0 931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * 1031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * Unless required by applicable law or agreed to in writing, software 1131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * distributed under the License is distributed on an "AS IS" BASIS, 1231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * See the License for the specific language governing permissions and 1431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang * limitations under the License. 1531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang */ 1631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 1700b8c1a39d75c1b4626dc987bd1a51cfaf7c9be1Mason Tangpackage com.android.calendar.agenda; 180558defd2215696cee0768ce2bf2cb4da56efc42Michael Chan 19ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 20c8d2e7499d516cf7c6fd5756f8097d682ac26e8bDaisuke Miyakawaimport android.app.Activity; 2131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.app.Fragment; 22ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelsonimport android.app.FragmentManager; 23ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelsonimport android.app.FragmentTransaction; 2431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.content.SharedPreferences; 2531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.os.Bundle; 266bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelsonimport android.provider.CalendarContract.Attendees; 2731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.text.format.Time; 2831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.util.Log; 2931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.view.LayoutInflater; 3031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.view.View; 3131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tangimport android.view.ViewGroup; 329a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelsonimport android.widget.AbsListView; 339a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelsonimport android.widget.AbsListView.OnScrollListener; 3437f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelsonimport android.widget.Adapter; 3537f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelsonimport android.widget.HeaderViewListAdapter; 3631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 37c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController; 38c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventInfo; 39c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.CalendarController.EventType; 409a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelsonimport com.android.calendar.CalendarController.ViewType; 4110b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelsonimport com.android.calendar.EventInfoFragment; 42c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.GeneralPreferences; 43c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.R; 44c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.StickyHeaderListView; 45c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chanimport com.android.calendar.Utils; 46c250e2eae5156fdc5233b7f1d319ee81dfc1cbd9Michael Chan 471d423f71b999f72b59e0accc483daa3b3c538ad7James Kungimport java.util.Date; 481d423f71b999f72b59e0accc483daa3b3c538ad7James Kung 499a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelsonpublic class AgendaFragment extends Fragment implements CalendarController.EventHandler, 509a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson OnScrollListener { 5131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 5231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang private static final String TAG = AgendaFragment.class.getSimpleName(); 5331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang private static boolean DEBUG = false; 5431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 5531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang protected static final String BUNDLE_KEY_RESTORE_TIME = "key_restore_time"; 56ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan protected static final String BUNDLE_KEY_RESTORE_INSTANCE_ID = "key_restore_instance_id"; 5731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 5831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang private AgendaListView mAgendaListView; 59ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson private Activity mActivity; 6080d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson private final Time mTime; 619a88873f9ec97b47aaaaae47208d22b3998b8e99Erik private String mTimeZone; 6280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson private final long mInitialTimeMillis; 63ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson private boolean mShowEventDetailsWithAgenda; 64ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson private CalendarController mController; 6510b60216d349641dd03eb65407807539b0b626dfIsaac Katzenelson private EventInfoFragment mEventFragment; 664003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private String mQuery; 67ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson private boolean mUsedForSearch = false; 689a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson private boolean mIsTabletConfig; 690d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik private EventInfo mOnAttachedInfo = null; 709fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik private boolean mOnAttachAllDay = false; 71c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson private AgendaWindowAdapter mAdapter = null; 7280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson private boolean mForceReplace = true; 734b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson private long mLastShownEventId = -1; 744b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson 754b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson 76ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 779a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // Tracks the time of the top visible view in order to send UPDATE_TITLE messages to the action 789a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // bar. 799a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson int mJulianDayOnTop = -1; 8031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 8180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson private final Runnable mTZUpdater = new Runnable() { 829a88873f9ec97b47aaaaae47208d22b3998b8e99Erik @Override 839a88873f9ec97b47aaaaae47208d22b3998b8e99Erik public void run() { 849a88873f9ec97b47aaaaae47208d22b3998b8e99Erik mTimeZone = Utils.getTimeZone(getActivity(), this); 85f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mTime.switchTimezone(mTimeZone); 869a88873f9ec97b47aaaaae47208d22b3998b8e99Erik } 879a88873f9ec97b47aaaaae47208d22b3998b8e99Erik }; 889a88873f9ec97b47aaaaae47208d22b3998b8e99Erik 8931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public AgendaFragment() { 90ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson this(0, false); 9131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 9231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 93ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 94ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson // timeMillis - time of first event to show 95ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson // usedForSearch - indicates if this fragment is used in the search fragment 96ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson public AgendaFragment(long timeMillis, boolean usedForSearch) { 97c8d2e7499d516cf7c6fd5756f8097d682ac26e8bDaisuke Miyakawa mInitialTimeMillis = timeMillis; 9881850b1cca167351db9c3bc3ba64f7af053c4998Erik mTime = new Time(); 994b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mLastHandledEventTime = new Time(); 1004b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson 101f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (mInitialTimeMillis == 0) { 102f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mTime.setToNow(); 103f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } else { 104f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mTime.set(mInitialTimeMillis); 105f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 1064b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mLastHandledEventTime.set(mTime); 107ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson mUsedForSearch = usedForSearch; 108c8d2e7499d516cf7c6fd5756f8097d682ac26e8bDaisuke Miyakawa } 1099a88873f9ec97b47aaaaae47208d22b3998b8e99Erik 110c8d2e7499d516cf7c6fd5756f8097d682ac26e8bDaisuke Miyakawa @Override 111c8d2e7499d516cf7c6fd5756f8097d682ac26e8bDaisuke Miyakawa public void onAttach(Activity activity) { 112c8d2e7499d516cf7c6fd5756f8097d682ac26e8bDaisuke Miyakawa super.onAttach(activity); 11301b1689b504173ba1263d7e28533ef20779c4591Daisuke Miyakawa mTimeZone = Utils.getTimeZone(activity, mTZUpdater); 114f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mTime.switchTimezone(mTimeZone); 115ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson mActivity = activity; 1160d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik if (mOnAttachedInfo != null) { 11780d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson showEventInfo(mOnAttachedInfo, mOnAttachAllDay, true); 1180d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik mOnAttachedInfo = null; 1190d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik } 12031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 12131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 12231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 12331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public void onCreate(Bundle icicle) { 12431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang super.onCreate(icicle); 125ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson mController = CalendarController.getInstance(mActivity); 126ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson mShowEventDetailsWithAgenda = 127ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson Utils.getConfigBool(mActivity, R.bool.show_event_details_with_agenda); 1289a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson mIsTabletConfig = 1299a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson Utils.getConfigBool(mActivity, R.bool.tablet_config); 130f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (icicle != null) { 131f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik long prevTime = icicle.getLong(BUNDLE_KEY_RESTORE_TIME, -1); 132f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (prevTime != -1) { 133f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mTime.set(prevTime); 134f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (DEBUG) { 135f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik Log.d(TAG, "Restoring time to " + mTime.toString()); 136f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 137f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 138f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 13931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 14031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 14131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 14231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public View onCreateView(LayoutInflater inflater, ViewGroup container, 14331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang Bundle savedInstanceState) { 144ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan 145ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan 1460ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson int screenWidth = mActivity.getResources().getDisplayMetrics().widthPixels; 147ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson View v = inflater.inflate(R.layout.agenda_fragment, null); 148ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 149ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson mAgendaListView = (AgendaListView)v.findViewById(R.id.agenda_events_list); 150eedc9fc0631f3c8727df3c0e73474ebcdecd89feRoboErik mAgendaListView.setClickable(true); 151f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik 152f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (savedInstanceState != null) { 153f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik long instanceId = savedInstanceState.getLong(BUNDLE_KEY_RESTORE_INSTANCE_ID, -1); 154f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (instanceId != -1) { 155f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mAgendaListView.setSelectedInstanceId(instanceId); 156f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 157f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 158f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik 1590ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson View eventView = v.findViewById(R.id.agenda_event_info); 160ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson if (!mShowEventDetailsWithAgenda) { 1610ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson eventView.setVisibility(View.GONE); 162ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson } 16337f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson 1640ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson View topListView; 16537f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson // Set adapter & HeaderIndexer for StickyHeaderListView 16637f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson StickyHeaderListView lv = 16737f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson (StickyHeaderListView)v.findViewById(R.id.agenda_sticky_header_list); 16837f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson if (lv != null) { 16937f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson Adapter a = mAgendaListView.getAdapter(); 17037f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson lv.setAdapter(a); 17137f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson if (a instanceof HeaderViewListAdapter) { 172c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAdapter = (AgendaWindowAdapter) ((HeaderViewListAdapter)a).getWrappedAdapter(); 173c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson lv.setIndexer(mAdapter); 174c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson lv.setHeaderHeightListener(mAdapter); 17537f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson } else if (a instanceof AgendaWindowAdapter) { 176c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAdapter = (AgendaWindowAdapter)a; 177c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson lv.setIndexer(mAdapter); 178c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson lv.setHeaderHeightListener(mAdapter); 17937f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson } else { 18037f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson Log.wtf(TAG, "Cannot find HeaderIndexer for StickyHeaderListView"); 18137f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson } 1829a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson 1839a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // Set scroll listener so that the date on the ActionBar can be set while 1849a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // the user scrolls the view 185f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik lv.setOnScrollListener(this); 186e0983f72aa6b33e8733699b6f72d67126fc785bdIsaac Katzenelson lv.setHeaderSeparator(getResources().getColor(R.color.agenda_list_separator_color), 1); 1870ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson topListView = lv; 1880ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson } else { 1890ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson topListView = mAgendaListView; 1900ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson } 1910ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson 1920ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson // Since using weight for sizing the two panes of the agenda fragment causes the whole 1930ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson // fragment to re-measure when the sticky header is replaced, calculate the weighted 1940ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson // size of each pane here and set it 1950ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson 1960ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson if (!mShowEventDetailsWithAgenda) { 1970ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson ViewGroup.LayoutParams params = topListView.getLayoutParams(); 1980ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson params.width = screenWidth; 1990ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson topListView.setLayoutParams(params); 2000ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson } else { 2010ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson ViewGroup.LayoutParams listParams = topListView.getLayoutParams(); 2020ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson listParams.width = screenWidth * 4 / 10; 2030ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson topListView.setLayoutParams(listParams); 2040ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson ViewGroup.LayoutParams detailsParams = eventView.getLayoutParams(); 2050ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson detailsParams.width = screenWidth - listParams.width; 2060ce416c7673469476475174ec1c31270bf675c8aIsaac Katzenelson eventView.setLayoutParams(detailsParams); 20737f12e5cee7ed2d354e9366bd6d8e15d1a934f2aIsaac Katzenelson } 208ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson return v; 20931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 21031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 21131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 21231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public void onResume() { 21331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang super.onResume(); 21431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang if (DEBUG) { 21531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang Log.v(TAG, "OnResume to " + mTime.toString()); 21631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 21731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 2184b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa SharedPreferences prefs = GeneralPreferences.getSharedPreferences( 21931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang getActivity()); 22031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang boolean hideDeclined = prefs.getBoolean( 2214b441bd6544fe6d11be75f974a41afd8fa040a4fDaisuke Miyakawa GeneralPreferences.KEY_HIDE_DECLINED, false); 22231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 22331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang mAgendaListView.setHideDeclinedEvents(hideDeclined); 224c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson if (mLastHandledEventId != -1) { 225c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAgendaListView.goTo(mLastHandledEventTime, mLastHandledEventId, mQuery, true, false); 226c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mLastHandledEventTime = null; 227c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mLastHandledEventId = -1; 228c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson } else { 229c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAgendaListView.goTo(mTime, -1, mQuery, true, false); 230c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson } 23131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang mAgendaListView.onResume(); 23231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 23331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// // Register for Intent broadcasts 23431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// IntentFilter filter = new IntentFilter(); 23531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// filter.addAction(Intent.ACTION_TIME_CHANGED); 23631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// filter.addAction(Intent.ACTION_DATE_CHANGED); 23731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// filter.addAction(Intent.ACTION_TIMEZONE_CHANGED); 23831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// registerReceiver(mIntentReceiver, filter); 23931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// 24031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// mContentResolver.registerContentObserver(Events.CONTENT_URI, true, mObserver); 24131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 24231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 24331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 24431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public void onSaveInstanceState(Bundle outState) { 24531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang super.onSaveInstanceState(outState); 2466e66ebd491b38b47bdc1de7ed5d9f1eeda1302eaRoboErik if (mAgendaListView == null) { 2476e66ebd491b38b47bdc1de7ed5d9f1eeda1302eaRoboErik return; 2486e66ebd491b38b47bdc1de7ed5d9f1eeda1302eaRoboErik } 2494b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson if (mShowEventDetailsWithAgenda) { 2504b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson long timeToSave; 2514b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson if (mLastHandledEventTime != null) { 2524b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson timeToSave = mLastHandledEventTime.toMillis(true); 2534b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mTime.set(mLastHandledEventTime); 2544b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } else { 2554b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson timeToSave = System.currentTimeMillis(); 2564b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mTime.set(timeToSave); 25731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 2584b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson outState.putLong(BUNDLE_KEY_RESTORE_TIME, timeToSave); 2594b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mController.setTime(timeToSave); 2604b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } else { 261cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung AgendaWindowAdapter.AgendaItem item = mAgendaListView.getFirstVisibleAgendaItem(); 262cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung if (item != null) { 263cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung long firstVisibleTime = mAgendaListView.getFirstVisibleTime(item); 2644b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson if (firstVisibleTime > 0) { 2654b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mTime.set(firstVisibleTime); 2664b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mController.setTime(firstVisibleTime); 2674b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson outState.putLong(BUNDLE_KEY_RESTORE_TIME, firstVisibleTime); 2684b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } 269da22a2c81a2454224f9f7940762d2e18b35ad8e3Isaac Katzenelson // Tell AllInOne the event id of the first visible event in the list. The id will be 270da22a2c81a2454224f9f7940762d2e18b35ad8e3Isaac Katzenelson // used in the GOTO when AllInOne is restored so that Agenda Fragment can select a 271da22a2c81a2454224f9f7940762d2e18b35ad8e3Isaac Katzenelson // specific event and not just the time. 272cf31ab351c9becad6785d4d77eefc934f30b92e3James Kung mLastShownEventId = item.id; 2734b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } 2744b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } 2754b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson if (DEBUG) { 2764b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson Log.v(TAG, "onSaveInstanceState " + mTime.toString()); 27731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 278ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan 279ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan long selectedInstance = mAgendaListView.getSelectedInstanceId(); 280ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan if (selectedInstance >= 0) { 281ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan outState.putLong(BUNDLE_KEY_RESTORE_INSTANCE_ID, selectedInstance); 282ffbc790abf31576c84af7ddeab090fcd93ef3299Michael Chan } 28331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 28431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 285d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik /** 286d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik * This cleans up the event info fragment since the FragmentManager doesn't 287d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik * handle nested fragments. Without this, the action bar buttons added by 288d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik * the info fragment can come back on a rotation. 289d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik * 290d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik * @param fragmentManager 291d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik */ 292d725bfc473078409b7e4c676ac410cf061ed45b4RoboErik public void removeFragments(FragmentManager fragmentManager) { 293888ffcf22fe26989736b80d826aac211f5ad5c43Isaac Katzenelson if (getActivity().isFinishing()) { 294888ffcf22fe26989736b80d826aac211f5ad5c43Isaac Katzenelson return; 295888ffcf22fe26989736b80d826aac211f5ad5c43Isaac Katzenelson } 296056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson FragmentTransaction ft = fragmentManager.beginTransaction(); 297056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson Fragment f = fragmentManager.findFragmentById(R.id.agenda_event_info); 298056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson if (f != null) { 299888ffcf22fe26989736b80d826aac211f5ad5c43Isaac Katzenelson ft.remove(f); 300056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 301056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson ft.commit(); 302056079920bc9d141241648662ad4ebdea91b1fd4Isaac Katzenelson } 303888ffcf22fe26989736b80d826aac211f5ad5c43Isaac Katzenelson 30431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 30531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public void onPause() { 30631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang super.onPause(); 30731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 30831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang mAgendaListView.onPause(); 30980d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson 31031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// mContentResolver.unregisterContentObserver(mObserver); 31131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// unregisterReceiver(mIntentReceiver); 31231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 31331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang // Record Agenda View as the (new) default detailed view. 31431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang// Utils.setDefaultView(this, CalendarApplication.AGENDA_VIEW_ID); 31531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 31631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 317ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson private void goTo(EventInfo event, boolean animate) { 3184b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson if (event.selectedTime != null) { 3194b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mTime.set(event.selectedTime); 3204b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } else if (event.startTime != null) { 3214b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mTime.set(event.startTime); 3224b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } 32331df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang if (mAgendaListView == null) { 32431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang // The view hasn't been set yet. Just save the time and use it 32531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang // later. 32631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang return; 32731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 328c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAgendaListView.goTo(mTime, event.id, mQuery, false, 329c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson ((event.extraLong & CalendarController.EXTRA_GOTO_TODAY) != 0 && 330c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mShowEventDetailsWithAgenda) ? true : false); 3319fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik AgendaAdapter.ViewHolder vh = mAgendaListView.getSelectedViewHolder(); 33280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson // Make sure that on the first time the event info is shown to recreate it 3331d423f71b999f72b59e0accc483daa3b3c538ad7James Kung Log.d(TAG, "selected viewholder is null: " + (vh == null)); 33480d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson showEventInfo(event, vh != null ? vh.allDay : false, mForceReplace); 33580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson mForceReplace = false; 3364003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3374003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang 3384003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang private void search(String query, Time time) { 3394003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mQuery = query; 3404003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (time != null) { 3414003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang mTime.set(time); 3424003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 3434003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang if (mAgendaListView == null) { 3444003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang // The view hasn't been set yet. Just return. 3454003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang return; 3464003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } 347c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAgendaListView.goTo(time, -1, mQuery, true, false); 34831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 34931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 35031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 35131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public void eventsChanged() { 352a5fefbc7b86817973a90e2e8e209f3e8aa8900cbMichael Chan if (mAgendaListView != null) { 353a5fefbc7b86817973a90e2e8e209f3e8aa8900cbMichael Chan mAgendaListView.refresh(true); 354a5fefbc7b86817973a90e2e8e209f3e8aa8900cbMichael Chan } 35531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 35631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 35731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 35831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public long getSupportedEventTypes() { 359ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson return EventType.GO_TO | EventType.EVENTS_CHANGED | ((mUsedForSearch)?EventType.SEARCH:0); 36031df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 36131df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang 362c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson private long mLastHandledEventId = -1; 363c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson private Time mLastHandledEventTime = null; 36431df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang @Override 36531df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang public void handleEvent(EventInfo event) { 36631df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang if (event.eventType == EventType.GO_TO) { 36731df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang // TODO support a range of time 36831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang // TODO support event_id 36931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang // TODO figure out the animate bit 370c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mLastHandledEventId = event.id; 3714b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mLastHandledEventTime = 3724b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson (event.selectedTime != null) ? event.selectedTime : event.startTime; 373ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson goTo(event, true); 3744003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang } else if (event.eventType == EventType.SEARCH) { 3754003d1cd4d1ebe3863c9d3e92cd4232595183064Mason Tang search(event.query, event.startTime); 376954c871f4753d3182314d7027c0dd17c236d9ca7Erik } else if (event.eventType == EventType.EVENTS_CHANGED) { 377954c871f4753d3182314d7027c0dd17c236d9ca7Erik eventsChanged(); 37831df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 37931df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang } 380ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 3814b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson public long getLastShowEventId() { 3824b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson return mLastShownEventId; 3834b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson } 384ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 385ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson // Shows the selected event in the Agenda view 38680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson private void showEventInfo(EventInfo event, boolean allDay, boolean replaceFragment) { 387ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 388ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson // Ignore unknown events 389ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson if (event.id == -1) { 390ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson Log.e(TAG, "showEventInfo, event ID = " + event.id); 391ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson return; 392ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson } 393ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson 3944b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson mLastShownEventId = event.id; 3954b46839d81e351314da1bdf7cad1f111dd6d671cIsaac Katzenelson 396ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson // Create a fragment to show the event to the side of the agenda list 397ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson if (mShowEventDetailsWithAgenda) { 398ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson FragmentManager fragmentManager = getFragmentManager(); 3990d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik if (fragmentManager == null) { 4000d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik // Got a goto event before the fragment finished attaching, 4010d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik // stash the event and handle it later. 4020d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik mOnAttachedInfo = event; 4039fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik mOnAttachAllDay = allDay; 4040d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik return; 4050d6d6289ce9e0d8c864883112de365f46117a5b6RoboErik } 406ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson FragmentTransaction ft = fragmentManager.beginTransaction(); 4079fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik 4089fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik if (allDay) { 4099fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik event.startTime.timezone = Time.TIMEZONE_UTC; 4109fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik event.endTime.timezone = Time.TIMEZONE_UTC; 4119fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik } 4129fb45ac4a8796afb05915fb152e74d02506f59c6RoboErik 4131d423f71b999f72b59e0accc483daa3b3c538ad7James Kung if (DEBUG) { 4141d423f71b999f72b59e0accc483daa3b3c538ad7James Kung Log.d(TAG, "***"); 4151d423f71b999f72b59e0accc483daa3b3c538ad7James Kung Log.d(TAG, "showEventInfo: start: " + new Date(event.startTime.toMillis(true))); 4161d423f71b999f72b59e0accc483daa3b3c538ad7James Kung Log.d(TAG, "showEventInfo: end: " + new Date(event.endTime.toMillis(true))); 4171d423f71b999f72b59e0accc483daa3b3c538ad7James Kung Log.d(TAG, "showEventInfo: all day: " + allDay); 4181d423f71b999f72b59e0accc483daa3b3c538ad7James Kung Log.d(TAG, "***"); 4191d423f71b999f72b59e0accc483daa3b3c538ad7James Kung } 4201d423f71b999f72b59e0accc483daa3b3c538ad7James Kung 42180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson long startMillis = event.startTime.toMillis(true); 42280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson long endMillis = event.endTime.toMillis(true); 42380d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson EventInfoFragment fOld = 42480d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson (EventInfoFragment)fragmentManager.findFragmentById(R.id.agenda_event_info); 42580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson if (fOld == null || replaceFragment || fOld.getStartMillis() != startMillis || 42680d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson fOld.getEndMillis() != endMillis || fOld.getEventId() != event.id) { 42780d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson mEventFragment = new EventInfoFragment(mActivity, event.id, 4281d423f71b999f72b59e0accc483daa3b3c538ad7James Kung startMillis, endMillis, 4296bcafcf4f28c2d1053547694bd60b3dd9c7fbaa1Isaac Katzenelson Attendees.ATTENDEE_STATUS_NONE, false, 43094a1f1a1020f0e06df42ffe6edc315106cb45ecdSam Blitzstein EventInfoFragment.DIALOG_WINDOW_STYLE, null); 43180d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson ft.replace(R.id.agenda_event_info, mEventFragment); 43280d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson ft.commit(); 43380d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } else { 43480d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson fOld.reloadEvents(); 43580d640f3edc455d053a0e71a419f222a6f03385eIsaac Katzenelson } 436ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson } 437ccf565b6a00e1df8c0de824ac91e9f6746e246b5Isaac Katzenelson } 4389a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson 4399a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // OnScrollListener implementation to update the date on the pull-down menu of the app 4409a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson 441c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson @Override 4429a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson public void onScrollStateChanged(AbsListView view, int scrollState) { 443c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson // Save scroll state so that the adapter can stop the scroll when the 444c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson // agenda list is fling state and it needs to set the agenda list to a new position 445c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson if (mAdapter != null) { 446c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson mAdapter.setScrollState(scrollState); 447c1fae4df6202ac82c3facd76e5f33c7cbacb39d1Isaac Katzenelson } 4489a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson } 4499a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson 4509a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // Gets the time of the first visible view. If it is a new time, send a message to update 4519a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // the time on the ActionBar 452f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik @Override 4539a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, 4549a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson int totalItemCount) { 455f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik int julianDay = mAgendaListView.getJulianDayFromPosition(firstVisibleItem 456f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik - mAgendaListView.getHeaderViewsCount()); 4579a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // On error - leave the old view 4589a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson if (julianDay == 0) { 4599a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson return; 4609a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson } 4619a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson // If the day changed, update the ActionBar 4629a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson if (mJulianDayOnTop != julianDay) { 4639a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson mJulianDayOnTop = julianDay; 464f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik Time t = new Time(mTimeZone); 465f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik t.setJulianDay(mJulianDayOnTop); 466f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mController.setTime(t.toMillis(true)); 46701d3697a814fc1edcb1783c2f0f5b38dbbbe9879Isaac Katzenelson // Cannot sent a message that eventually may change the layout of the views 46801d3697a814fc1edcb1783c2f0f5b38dbbbe9879Isaac Katzenelson // so instead post a runnable that will run when the layout is done 469f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik if (!mIsTabletConfig) { 470f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik view.post(new Runnable() { 471f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik @Override 472f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik public void run() { 473f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik Time t = new Time(mTimeZone); 474f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik t.setJulianDay(mJulianDayOnTop); 475f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik mController.sendEvent(this, EventType.UPDATE_TITLE, t, t, null, -1, 476f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik ViewType.CURRENT, 0, null, null); 477f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 478f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik }); 479f836d4af478310abc9b63f1afa6ab964e2478fedRoboErik } 4809a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson } 4819a39bddb8e519b710a06d1c77257de6962ae5f72Isaac Katzenelson } 48231df4265e34c36df56e8b49de5cd0b24c02701e6Mason Tang} 483