Event.java revision 6d34cec523930368976bc8d358d0a6de1da3462c
1146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/*
2146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
4146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * you may not use this file except in compliance with the License.
6146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * You may obtain a copy of the License at
7146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
8146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
10146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * See the License for the specific language governing permissions and
14146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * limitations under the License.
15146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */
16146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
17146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpackage com.android.calendar;
18146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
19146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context;
20146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.SharedPreferences;
21146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.res.Resources;
22146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.database.Cursor;
23146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.os.Debug;
24146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.preference.PreferenceManager;
25146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.Attendees;
266d34cec523930368976bc8d358d0a6de1da3462cMichael Chanimport android.provider.Calendar.Events;
27146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.provider.Calendar.Instances;
28146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.text.TextUtils;
29146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.text.format.DateUtils;
30146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.text.format.Time;
31146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.util.Log;
32146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport java.util.ArrayList;
34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport java.util.Iterator;
35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport java.util.concurrent.atomic.AtomicInteger;
36146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
37146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project// TODO: should Event be Parcelable so it can be passed via Intents?
38146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class Event implements Comparable, Cloneable {
39146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final boolean PROFILE = false;
41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
42146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final String[] PROJECTION = new String[] {
43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.TITLE,                 // 0
44146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.EVENT_LOCATION,        // 1
45146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.ALL_DAY,               // 2
46146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.COLOR,                 // 3
47146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.EVENT_TIMEZONE,        // 4
48146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.EVENT_ID,              // 5
49146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.BEGIN,                 // 6
50146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.END,                   // 7
51146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances._ID,                   // 8
52146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.START_DAY,             // 9
53146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.END_DAY,               // 10
54146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.START_MINUTE,          // 11
55146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.END_MINUTE,            // 12
56146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.HAS_ALARM,             // 13
57146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.RRULE,                 // 14
58146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.RDATE,                 // 15
59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Instances.SELF_ATTENDEE_STATUS,  // 16
606d34cec523930368976bc8d358d0a6de1da3462cMichael Chan            Events.ORGANIZER,                // 17
616d34cec523930368976bc8d358d0a6de1da3462cMichael Chan            Events.GUESTS_CAN_MODIFY,        // 18
62146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
63146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
64146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // The indices for the projection array above.
65146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_TITLE_INDEX = 0;
66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_LOCATION_INDEX = 1;
67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_ALL_DAY_INDEX = 2;
68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_COLOR_INDEX = 3;
69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_TIMEZONE_INDEX = 4;
70146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_EVENT_ID_INDEX = 5;
71146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_BEGIN_INDEX = 6;
72146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_END_INDEX = 7;
73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_START_DAY_INDEX = 9;
74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_END_DAY_INDEX = 10;
75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_START_MINUTE_INDEX = 11;
76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_END_MINUTE_INDEX = 12;
77146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_HAS_ALARM_INDEX = 13;
78146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_RRULE_INDEX = 14;
79146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_RDATE_INDEX = 15;
80146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int PROJECTION_SELF_ATTENDEE_STATUS_INDEX = 16;
816d34cec523930368976bc8d358d0a6de1da3462cMichael Chan    private static final int PROJECTION_ORGANIZER_INDEX = 17;
826d34cec523930368976bc8d358d0a6de1da3462cMichael Chan    private static final int PROJECTION_GUESTS_CAN_INVITE_OTHERS_INDEX = 18;
83146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
84146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public long id;
85146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int color;
86146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public CharSequence title;
87146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public CharSequence location;
88146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public boolean allDay;
896d34cec523930368976bc8d358d0a6de1da3462cMichael Chan    public String organizer;
906d34cec523930368976bc8d358d0a6de1da3462cMichael Chan    public boolean guestsCanModify;
91146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
92146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int startDay;       // start Julian day
93146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int endDay;         // end Julian day
94146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int startTime;      // Start and end time are in minutes since midnight
95146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int endTime;
96146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
97146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public long startMillis;   // UTC milliseconds since the epoch
98146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public long endMillis;     // UTC milliseconds since the epoch
99146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private int mColumn;
100146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private int mMaxColumns;
101146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
102146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public boolean hasAlarm;
103146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public boolean isRepeating;
104146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
105146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int selfAttendeeStatus;
106146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
107146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // The coordinates of the event rectangle drawn on the screen.
108146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public float left;
109146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public float right;
110146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public float top;
111146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public float bottom;
112146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
113146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // These 4 fields are used for navigating among events within the selected
114146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // hour in the Day and Week view.
115146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public Event nextRight;
116146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public Event nextLeft;
117146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public Event nextUp;
118146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public Event nextDown;
119146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
120146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int MIDNIGHT_IN_MINUTES = 24 * 60;
121146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
122146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    @Override
12398ab9de2fa5ad8dfd37faa6593dc66fa426d8960Michael Chan    public final Object clone() throws CloneNotSupportedException {
12498ab9de2fa5ad8dfd37faa6593dc66fa426d8960Michael Chan        super.clone();
125146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Event e = new Event();
126146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
127146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.title = title;
128146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.color = color;
129146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.location = location;
130146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.allDay = allDay;
131146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.startDay = startDay;
132146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.endDay = endDay;
133146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.startTime = startTime;
134146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.endTime = endTime;
135146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.startMillis = startMillis;
136146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.endMillis = endMillis;
137146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.hasAlarm = hasAlarm;
138146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.isRepeating = isRepeating;
139146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.selfAttendeeStatus = selfAttendeeStatus;
1406d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        e.organizer = organizer;
1416d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        e.guestsCanModify = guestsCanModify;
142146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
143146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return e;
144146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
145146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
146146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public final void copyTo(Event dest) {
147146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.id = id;
148146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.title = title;
149146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.color = color;
150146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.location = location;
151146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.allDay = allDay;
152146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.startDay = startDay;
153146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.endDay = endDay;
154146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.startTime = startTime;
155146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.endTime = endTime;
156146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.startMillis = startMillis;
157146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.endMillis = endMillis;
158146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.hasAlarm = hasAlarm;
159146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.isRepeating = isRepeating;
160146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        dest.selfAttendeeStatus = selfAttendeeStatus;
1616d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        dest.organizer = organizer;
1626d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        dest.guestsCanModify = guestsCanModify;
163146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
164146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
165146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final Event newInstance() {
166146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Event e = new Event();
167146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
168146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.id = 0;
169146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.title = null;
170146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.color = 0;
171146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.location = null;
172146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.allDay = false;
173146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.startDay = 0;
174146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.endDay = 0;
175146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.startTime = 0;
176146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.endTime = 0;
177146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.startMillis = 0;
178146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.endMillis = 0;
179146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.hasAlarm = false;
180146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.isRepeating = false;
181146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        e.selfAttendeeStatus = Attendees.ATTENDEE_STATUS_NONE;
182146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
183146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return e;
184146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
185146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
186146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
187146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Compares this event to the given event.  This is just used for checking
188146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * if two events differ.  It's not used for sorting anymore.
189146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
190146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public final int compareTo(Object obj) {
191146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Event e = (Event) obj;
192146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
193146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // The earlier start day and time comes first
194146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (startDay < e.startDay) return -1;
195146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (startDay > e.startDay) return 1;
196146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (startTime < e.startTime) return -1;
197146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (startTime > e.startTime) return 1;
198146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
199146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // The later end time comes first (in order to put long strips on
200146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // the left).
201146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (endDay < e.endDay) return 1;
202146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (endDay > e.endDay) return -1;
203146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (endTime < e.endTime) return 1;
204146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (endTime > e.endTime) return -1;
205146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
206146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Sort all-day events before normal events.
207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (allDay && !e.allDay) return -1;
208146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (!allDay && e.allDay) return 1;
209146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
2106d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        if (guestsCanModify && !e.guestsCanModify) return -1;
2116d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        if (!guestsCanModify && e.guestsCanModify) return 1;
2126d34cec523930368976bc8d358d0a6de1da3462cMichael Chan
213146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // If two events have the same time range, then sort them in
214146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // alphabetical order based on their titles.
215146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        int cmp = compareStrings(title, e.title);
216146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (cmp != 0) {
217146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return cmp;
218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
219146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // If the titles are the same then compare the other fields
221146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // so that we can use this function to check for differences
222146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // between events.
223146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        cmp = compareStrings(location, e.location);
224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (cmp != 0) {
225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return cmp;
226146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
2276d34cec523930368976bc8d358d0a6de1da3462cMichael Chan
2286d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        cmp = compareStrings(organizer, e.organizer);
2296d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        if (cmp != 0) {
2306d34cec523930368976bc8d358d0a6de1da3462cMichael Chan            return cmp;
2316d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        }
232146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return 0;
233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
235146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
236146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Compare string a with string b, but if either string is null,
237146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * then treat it (the null) as if it were the empty string ("").
238146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     *
239146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @param a the first string
240146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @param b the second string
241146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @return the result of comparing a with b after replacing null
242146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     *  strings with "".
243146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
244146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private int compareStrings(CharSequence a, CharSequence b) {
245146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        String aStr, bStr;
246146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (a != null) {
247146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            aStr = a.toString();
248146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        } else {
249146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            aStr = "";
250146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
251146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (b != null) {
252146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            bStr = b.toString();
253146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        } else {
254146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            bStr = "";
255146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
256146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return aStr.compareTo(bStr);
257146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
258146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
259146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
260146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Loads <i>days</i> days worth of instances starting at <i>start</i>.
261146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
262146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static void loadEvents(Context context, ArrayList<Event> events,
263146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long start, int days, int requestId, AtomicInteger sequenceNumber) {
264146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
265146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (PROFILE) {
266146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Debug.startMethodTracing("loadEvents");
267146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
268146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
269146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Cursor c = null;
270146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
271146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        events.clear();
272146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        try {
273146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Time local = new Time();
274146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int count;
275146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
276146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            local.set(start);
277146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int startDay = Time.getJulianDay(start, local.gmtoff);
278146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int endDay = startDay + days;
279146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
280146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            local.monthDay += days;
281146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long end = local.normalize(true /* ignore isDst */);
282146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Widen the time range that we query by one day on each end
284146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // so that we can catch all-day events.  All-day events are
285146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // stored starting at midnight in UTC but should be included
286146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // in the list of events starting at midnight local time.
287146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // This may fetch more events than we actually want, so we
288146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // filter them out below.
289146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            //
290146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // The sort order is: events with an earlier start time occur
291146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // first and if the start times are the same, then events with
292146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // a later end time occur first. The later end time is ordered
293146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // first so that long rectangles in the calendar views appear on
294146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // the left side.  If the start and end times of two events are
295146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // the same then we sort alphabetically on the title.  This isn't
296146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // required for correctness, it just adds a nice touch.
297146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
298146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            String orderBy = Instances.SORT_CALENDAR_VIEW;
299146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
300146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Respect the preference to show/hide declined events
301146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
302146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            boolean hideDeclined = prefs.getBoolean(CalendarPreferenceActivity.KEY_HIDE_DECLINED,
303146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    false);
304146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
305146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            String where = null;
306146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (hideDeclined) {
307146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                where = Instances.SELF_ATTENDEE_STATUS + "!=" + Attendees.ATTENDEE_STATUS_DECLINED;
308146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
309146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
310146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            c = Instances.query(context.getContentResolver(), PROJECTION,
311146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    start - DateUtils.DAY_IN_MILLIS, end + DateUtils.DAY_IN_MILLIS, where, orderBy);
312146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
313146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (c == null) {
314146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Log.e("Cal", "loadEvents() returned null cursor!");
315146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                return;
316146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
317146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
318146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Check if we should return early because there are more recent
319146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // load requests waiting.
320146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (requestId != sequenceNumber.get()) {
321146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                return;
322146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
323146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
324146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            count = c.getCount();
325146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
326146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (count == 0) {
327146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                return;
328146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
329146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
330146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Resources res = context.getResources();
331146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            while (c.moveToNext()) {
332146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Event e = new Event();
333146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
334146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.id = c.getLong(PROJECTION_EVENT_ID_INDEX);
335146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.title = c.getString(PROJECTION_TITLE_INDEX);
336146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.location = c.getString(PROJECTION_LOCATION_INDEX);
337146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.allDay = c.getInt(PROJECTION_ALL_DAY_INDEX) != 0;
3386d34cec523930368976bc8d358d0a6de1da3462cMichael Chan                e.organizer = c.getString(PROJECTION_ORGANIZER_INDEX);
3396d34cec523930368976bc8d358d0a6de1da3462cMichael Chan                e.guestsCanModify = c.getInt(PROJECTION_GUESTS_CAN_INVITE_OTHERS_INDEX) != 0;
3406d34cec523930368976bc8d358d0a6de1da3462cMichael Chan
341146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                String timezone = c.getString(PROJECTION_TIMEZONE_INDEX);
342146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
343146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                if (e.title == null || e.title.length() == 0) {
344146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    e.title = res.getString(R.string.no_title_label);
345146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                }
346146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
347146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                if (!c.isNull(PROJECTION_COLOR_INDEX)) {
348146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    // Read the color from the database
349146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    e.color = c.getInt(PROJECTION_COLOR_INDEX);
350146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                } else {
351146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    e.color = res.getColor(R.color.event_center);
352146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                }
353146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
354146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long eStart = c.getLong(PROJECTION_BEGIN_INDEX);
355146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                long eEnd = c.getLong(PROJECTION_END_INDEX);
356146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
357146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.startMillis = eStart;
358146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.startTime = c.getInt(PROJECTION_START_MINUTE_INDEX);
359146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.startDay = c.getInt(PROJECTION_START_DAY_INDEX);
360146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
361146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.endMillis = eEnd;
362146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.endTime = c.getInt(PROJECTION_END_MINUTE_INDEX);
363146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.endDay = c.getInt(PROJECTION_END_DAY_INDEX);
364146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
365146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                if (e.startDay > endDay || e.endDay < startDay) {
366146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    continue;
367146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                }
368146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
369146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.hasAlarm = c.getInt(PROJECTION_HAS_ALARM_INDEX) != 0;
370146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
371146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                // Check if this is a repeating event
372146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                String rrule = c.getString(PROJECTION_RRULE_INDEX);
373146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                String rdate = c.getString(PROJECTION_RDATE_INDEX);
374146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                if (!TextUtils.isEmpty(rrule) || !TextUtils.isEmpty(rdate)) {
375146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    e.isRepeating = true;
376146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                } else {
377146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    e.isRepeating = false;
378146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                }
379146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
380146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                e.selfAttendeeStatus = c.getInt(PROJECTION_SELF_ATTENDEE_STATUS_INDEX);
381146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
382146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                events.add(e);
383146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
384146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
385146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            computePositions(events);
386146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        } finally {
387146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (c != null) {
388146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                c.close();
389146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
390146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (PROFILE) {
391146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Debug.stopMethodTracing();
392146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
393146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
394146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
395146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
396146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
397146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Computes a position for each event.  Each event is displayed
398146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * as a non-overlapping rectangle.  For normal events, these rectangles
399146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * are displayed in separate columns in the week view and day view.  For
400146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * all-day events, these rectangles are displayed in separate rows along
401146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * the top.  In both cases, each event is assigned two numbers: N, and
402146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Max, that specify that this event is the Nth event of Max number of
403146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * events that are displayed in a group. The width and position of each
404146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * rectangle depend on the maximum number of rectangles that occur at
405146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * the same time.
406146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     *
407146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @param eventsList the list of events, sorted into increasing time order
408146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
409146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    static void computePositions(ArrayList<Event> eventsList) {
410146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (eventsList == null)
411146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return;
412146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
413146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Compute the column positions separately for the all-day events
414146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        doComputePositions(eventsList, false);
415146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        doComputePositions(eventsList, true);
416146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
417146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
418146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static void doComputePositions(ArrayList<Event> eventsList,
419146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            boolean doAllDayEvents) {
420146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ArrayList<Event> activeList = new ArrayList<Event>();
421146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ArrayList<Event> groupList = new ArrayList<Event>();
422146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
423146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        long colMask = 0;
424146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        int maxCols = 0;
425146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        for (Event event : eventsList) {
426146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Process all-day events separately
427146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (event.allDay != doAllDayEvents)
428146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                continue;
429146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
430146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            long start = event.getStartMillis();
431146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (false && event.allDay) {
432146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Event e = event;
433146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Log.i("Cal", "event start,end day: " + e.startDay + "," + e.endDay
434146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        + " start,end time: " + e.startTime + "," + e.endTime
435146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        + " start,end millis: " + e.getStartMillis() + "," + e.getEndMillis()
436146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        + " "  + e.title);
437146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
438146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
439146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Remove the inactive events. An event on the active list
440146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // becomes inactive when its end time is less than or equal to
441146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // the current event's start time.
442146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            Iterator<Event> iter = activeList.iterator();
443146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            while (iter.hasNext()) {
444146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                Event active = iter.next();
445146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                if (active.getEndMillis() <= start) {
446146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    if (false && event.allDay) {
447146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        Event e = active;
448146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                        Log.i("Cal", "  removing: start,end day: " + e.startDay + "," + e.endDay
449146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                                + " start,end time: " + e.startTime + "," + e.endTime
450146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                                + " start,end millis: " + e.getStartMillis() + "," + e.getEndMillis()
451146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                                + " "  + e.title);
452146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    }
453146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    colMask &= ~(1L << active.getColumn());
454146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    iter.remove();
455146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                }
456146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
457146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
458146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // If the active list is empty, then reset the max columns, clear
459146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // the column bit mask, and empty the groupList.
460146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (activeList.isEmpty()) {
461146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                for (Event ev : groupList) {
462146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    ev.setMaxColumns(maxCols);
463146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                }
464146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                maxCols = 0;
465146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                colMask = 0;
466146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                groupList.clear();
467146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
468146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
469146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // Find the first empty column.  Empty columns are represented by
470146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // zero bits in the column mask "colMask".
471146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int col = findFirstZeroBit(colMask);
472146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (col == 64)
473146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                col = 63;
474146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            colMask |= (1L << col);
475146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            event.setColumn(col);
476146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            activeList.add(event);
477146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            groupList.add(event);
478146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int len = activeList.size();
479146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (maxCols < len)
480146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                maxCols = len;
481146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
482146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        for (Event ev : groupList) {
483146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            ev.setMaxColumns(maxCols);
484146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
485146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
486146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
487146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static int findFirstZeroBit(long val) {
488146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        for (int ii = 0; ii < 64; ++ii) {
489146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if ((val & (1L << ii)) == 0)
490146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                return ii;
491146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
492146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return 64;
493146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
494146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
495146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
496146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Returns a darker version of the given color.  It does this by dividing
497146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * each of the red, green, and blue components by 2.  The alpha value is
498146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * preserved.
499146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
500146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static final int getDarkerColor(int color) {
501146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        int darker = (color >> 1) & 0x007f7f7f;
502146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        int alpha = color & 0xff000000;
503146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return alpha | darker;
504146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
505146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
506146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // For testing. This method can be removed at any time.
507146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static ArrayList<Event> createTestEventList() {
508146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ArrayList<Event> evList = new ArrayList<Event>();
509146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 1, 5, 10);
510146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 2, 5, 10);
511146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 3, 15, 20);
512146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 4, 20, 25);
513146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 5, 30, 70);
514146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 6, 32, 40);
515146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 7, 32, 40);
516146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 8, 34, 38);
517146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 9, 34, 38);
518146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 10, 42, 50);
519146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 11, 45, 60);
520146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 12, 55, 90);
521146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 13, 65, 75);
522146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
523146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 21, 105, 130);
524146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 22, 110, 120);
525146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 23, 115, 130);
526146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 24, 125, 140);
527146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 25, 127, 135);
528146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
529146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 31, 150, 160);
530146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 32, 152, 162);
531146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 33, 153, 163);
532146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 34, 155, 170);
533146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 35, 158, 175);
534146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        createTestEvent(evList, 36, 165, 180);
535146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
536146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return evList;
537146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
538146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
539146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // For testing. This method can be removed at any time.
540146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    private static Event createTestEvent(ArrayList<Event> evList, int id,
541146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int startMinute, int endMinute) {
542146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Event ev = new Event();
543146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ev.title = "ev" + id;
544146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ev.startDay = 1;
545146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ev.endDay = 1;
546146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ev.setStartMillis(startMinute);
547146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        ev.setEndMillis(endMinute);
548146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        evList.add(ev);
549146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return ev;
550146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
551146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
552146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public final void dump() {
553146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+-----------------------------------------+");
554146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+        id = " + id);
555146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+     color = " + color);
556146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+     title = " + title);
557146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+  location = " + location);
558146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+    allDay = " + allDay);
559146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+  startDay = " + startDay);
560146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+    endDay = " + endDay);
561146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+ startTime = " + startTime);
562146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Log.e("Cal", "+   endTime = " + endTime);
5636d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        Log.e("Cal", "+ organizer = " + organizer);
5646d34cec523930368976bc8d358d0a6de1da3462cMichael Chan        Log.e("Cal", "+  guestwrt = " + guestsCanModify);
565146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
566146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
567146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public final boolean intersects(int julianDay, int startMinute,
568146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            int endMinute) {
569146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (endDay < julianDay) {
570146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return false;
571146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
572146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
573146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (startDay > julianDay) {
574146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return false;
575146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
576146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
577146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (endDay == julianDay) {
578146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (endTime < startMinute) {
579146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                return false;
580146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
581146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // An event that ends at the start minute should not be considered
582146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // as intersecting the given time span, but don't exclude
583146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            // zero-length (or very short) events.
584146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (endTime == startMinute
585146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                    && (startTime != endTime || startDay != endDay)) {
586146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                return false;
587146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
588146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
589146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
590146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (startDay == julianDay && startTime > endMinute) {
591146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            return false;
592146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
593146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
594146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return true;
595146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
596146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
597146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
598146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Returns the event title and location separated by a comma.  If the
599146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * location is already part of the title (at the end of the title), then
600146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * just the title is returned.
601146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     *
602146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @return the event title and location as a String
603146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
604146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public String getTitleAndLocation() {
605146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        String text = title.toString();
606146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
607146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // Append the location to the title, unless the title ends with the
608146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // location (for example, "meeting in building 42" ends with the
609146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // location).
610146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        if (location != null) {
611146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            String locationString = location.toString();
612146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            if (!text.endsWith(locationString)) {
613146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project                text += ", " + locationString;
614146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            }
615146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
616146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return text;
617146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
618146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
619146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public void setColumn(int column) {
620146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mColumn = column;
621146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
622146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
623146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int getColumn() {
624146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return mColumn;
625146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
626146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
627146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public void setMaxColumns(int maxColumns) {
628146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        mMaxColumns = maxColumns;
629146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
630146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
631146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public int getMaxColumns() {
632146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return mMaxColumns;
633146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
634146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
635146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public void setStartMillis(long startMillis) {
636146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        this.startMillis = startMillis;
637146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
638146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
639146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public long getStartMillis() {
640146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return startMillis;
641146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
642146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
643146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public void setEndMillis(long endMillis) {
644146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        this.endMillis = endMillis;
645146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
646146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
647146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public long getEndMillis() {
648146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return endMillis;
649146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
650146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project}
651