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