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