173714169d34a55fc01e14b30897a1ebbacf9934eErik/*
273714169d34a55fc01e14b30897a1ebbacf9934eErik * Copyright (C) 2010 The Android Open Source Project
373714169d34a55fc01e14b30897a1ebbacf9934eErik *
473714169d34a55fc01e14b30897a1ebbacf9934eErik * Licensed under the Apache License, Version 2.0 (the "License"); you may not
573714169d34a55fc01e14b30897a1ebbacf9934eErik * use this file except in compliance with the License. You may obtain a copy of
673714169d34a55fc01e14b30897a1ebbacf9934eErik * the License at
773714169d34a55fc01e14b30897a1ebbacf9934eErik *
873714169d34a55fc01e14b30897a1ebbacf9934eErik * http://www.apache.org/licenses/LICENSE-2.0
973714169d34a55fc01e14b30897a1ebbacf9934eErik *
1073714169d34a55fc01e14b30897a1ebbacf9934eErik * Unless required by applicable law or agreed to in writing, software
1173714169d34a55fc01e14b30897a1ebbacf9934eErik * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
1273714169d34a55fc01e14b30897a1ebbacf9934eErik * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
1373714169d34a55fc01e14b30897a1ebbacf9934eErik * License for the specific language governing permissions and limitations under
1473714169d34a55fc01e14b30897a1ebbacf9934eErik * the License.
1573714169d34a55fc01e14b30897a1ebbacf9934eErik */
1673714169d34a55fc01e14b30897a1ebbacf9934eErik
17fbce65e53c7a111955f638db5bf8bee35381e5b7Erikpackage com.android.calendar.event;
18fbce65e53c7a111955f638db5bf8bee35381e5b7Erik
1973714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.content.ContentProvider;
2073714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.content.ContentProviderOperation;
2173714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.content.ContentProviderResult;
2273714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.content.ContentValues;
2373714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.content.res.Resources;
2473714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.database.Cursor;
2573714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.database.MatrixCursor;
2673714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.net.Uri;
27a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Attendees;
28a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Events;
29a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.Reminders;
3073714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.test.AndroidTestCase;
3173714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.test.mock.MockResources;
3273714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.test.suitebuilder.annotation.SmallTest;
337e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chanimport android.test.suitebuilder.annotation.Smoke;
3473714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.text.TextUtils;
35e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tangimport android.text.format.DateUtils;
3673714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.text.format.Time;
3773714169d34a55fc01e14b30897a1ebbacf9934eErikimport android.text.util.Rfc822Token;
385cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport android.util.Log;
395cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan
405cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport com.android.calendar.AbstractCalendarActivity;
415cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport com.android.calendar.AsyncQueryService;
425cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport com.android.calendar.CalendarEventModel;
435cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport com.android.calendar.CalendarEventModel.ReminderEntry;
445cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport com.android.calendar.R;
455cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chanimport com.android.common.Rfc822Validator;
46eca82e9468c002590045338f98588ad3ce1a0bb3Erik
47eca82e9468c002590045338f98588ad3ce1a0bb3Erikimport java.util.ArrayList;
488e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tangimport java.util.Calendar;
49eca82e9468c002590045338f98588ad3ce1a0bb3Erikimport java.util.LinkedHashSet;
50eca82e9468c002590045338f98588ad3ce1a0bb3Erikimport java.util.TimeZone;
5173714169d34a55fc01e14b30897a1ebbacf9934eErik
5273714169d34a55fc01e14b30897a1ebbacf9934eErikpublic class EditEventHelperTest extends AndroidTestCase {
5373714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int TEST_EVENT_ID = 1;
5473714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int TEST_EVENT_INDEX_ID = 0;
5573714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final long TEST_END = 1272931200000L;
566ae7d69b90f22fd51ab677036ba987dbdc35a62dErik    private static long TEST_END2 = 1272956400000L;
5773714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final long TEST_START = 1272844800000L;
586ae7d69b90f22fd51ab677036ba987dbdc35a62dErik    private static long TEST_START2 = 1272870000000L;
596ae7d69b90f22fd51ab677036ba987dbdc35a62dErik    private static final String LOCAL_TZ = TimeZone.getDefault().getID();
6073714169d34a55fc01e14b30897a1ebbacf9934eErik
6173714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_NEW_EVENT = 1;
6273714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_MOD_RECUR = 2;
6373714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_RECUR_TO_NORECUR = 3;
6473714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_NORECUR_TO_RECUR= 4;
6573714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_MOD_NORECUR = 5;
6673714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_MOD_INSTANCE = 6;
6773714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_ALLFOLLOW_TO_NORECUR = 7;
6873714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_FIRST_TO_NORECUR = 8;
6973714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_FIRST_TO_RECUR = 9;
7073714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final int SAVE_EVENT_ALLFOLLOW_TO_RECUR = 10;
7173714169d34a55fc01e14b30897a1ebbacf9934eErik
7273714169d34a55fc01e14b30897a1ebbacf9934eErik    private static String[] TEST_CURSOR_DATA = new String[] {
7373714169d34a55fc01e14b30897a1ebbacf9934eErik            Integer.toString(TEST_EVENT_ID), // 0 _id
7473714169d34a55fc01e14b30897a1ebbacf9934eErik            "The Question", // 1 title
7573714169d34a55fc01e14b30897a1ebbacf9934eErik            "Evaluating Life, the Universe, and Everything",// 2 description
7673714169d34a55fc01e14b30897a1ebbacf9934eErik            "Earth Mk2", // 3 location
7773714169d34a55fc01e14b30897a1ebbacf9934eErik            "1", // 4 All Day
7873714169d34a55fc01e14b30897a1ebbacf9934eErik            "0", // 5 Has alarm
7973714169d34a55fc01e14b30897a1ebbacf9934eErik            "2", // 6 Calendar id
8073714169d34a55fc01e14b30897a1ebbacf9934eErik            "1272844800000", // 7 dtstart, Monday, May 3rd midnight UTC
8173714169d34a55fc01e14b30897a1ebbacf9934eErik            "1272931200000", // 8 dtend, Tuesday, May 4th midnight UTC
8273714169d34a55fc01e14b30897a1ebbacf9934eErik            "P3652421990D", // 9 duration, (10 million years)
8373714169d34a55fc01e14b30897a1ebbacf9934eErik            "UTC", // 10 event timezone
8473714169d34a55fc01e14b30897a1ebbacf9934eErik            "FREQ=DAILY;WKST=SU", // 11 rrule
8573714169d34a55fc01e14b30897a1ebbacf9934eErik            "unique per calendar stuff", // 12 sync id
8673714169d34a55fc01e14b30897a1ebbacf9934eErik            "0", // 13 transparency
8773714169d34a55fc01e14b30897a1ebbacf9934eErik            "3", // 14 visibility
8873714169d34a55fc01e14b30897a1ebbacf9934eErik            "steve@gmail.com", // 15 owner account
8973714169d34a55fc01e14b30897a1ebbacf9934eErik            "1", // 16 has attendee data
905cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan            null, //17 originalSyncId
915cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan            "organizer@gmail.com", // 18 organizer
925cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan            "0", // 19 guest can modify
935cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan            null, // 20 original id
945cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan            "1" // event status
9573714169d34a55fc01e14b30897a1ebbacf9934eErik    }; // These should match up with EditEventHelper.EVENT_PROJECTION
9673714169d34a55fc01e14b30897a1ebbacf9934eErik
9773714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final String AUTHORITY_URI = "content://EditEventHelperAuthority/";
9873714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final String AUTHORITY = "EditEventHelperAuthority";
9973714169d34a55fc01e14b30897a1ebbacf9934eErik
10073714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final String TEST_ADDRESSES =
10173714169d34a55fc01e14b30897a1ebbacf9934eErik            "no good, ad1@email.com, \"First Last\" <first@email.com> (comment), " +
10273714169d34a55fc01e14b30897a1ebbacf9934eErik            "one.two.three@email.grue";
10373714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final String TEST_ADDRESSES2 =
10473714169d34a55fc01e14b30897a1ebbacf9934eErik            "no good, ad1@email.com, \"First Last\" <first@email.com> (comment), " +
10573714169d34a55fc01e14b30897a1ebbacf9934eErik            "different@email.bit";
10673714169d34a55fc01e14b30897a1ebbacf9934eErik
10773714169d34a55fc01e14b30897a1ebbacf9934eErik
10873714169d34a55fc01e14b30897a1ebbacf9934eErik    private static final String TAG = "EEHTest";
10973714169d34a55fc01e14b30897a1ebbacf9934eErik
11073714169d34a55fc01e14b30897a1ebbacf9934eErik    private CalendarEventModel mModel1;
11173714169d34a55fc01e14b30897a1ebbacf9934eErik    private CalendarEventModel mModel2;
11273714169d34a55fc01e14b30897a1ebbacf9934eErik
11373714169d34a55fc01e14b30897a1ebbacf9934eErik    private ContentValues mValues;
11473714169d34a55fc01e14b30897a1ebbacf9934eErik    private ContentValues mExpectedValues;
11573714169d34a55fc01e14b30897a1ebbacf9934eErik
11673714169d34a55fc01e14b30897a1ebbacf9934eErik    private EditEventHelper mHelper;
11737960c091b5912dd45beb561a85a9064ea42e616Erik    private AbstractCalendarActivity mActivity;
11873714169d34a55fc01e14b30897a1ebbacf9934eErik    private int mCurrentSaveTest = 0;
11973714169d34a55fc01e14b30897a1ebbacf9934eErik
1206ae7d69b90f22fd51ab677036ba987dbdc35a62dErik    @Override
1216ae7d69b90f22fd51ab677036ba987dbdc35a62dErik    public void setUp() {
1226ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        Time time = new Time(Time.TIMEZONE_UTC);
1236ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        time.set(TEST_START);
1246ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        time.timezone = LOCAL_TZ;
1256ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        TEST_START2 = time.normalize(true);
1266ae7d69b90f22fd51ab677036ba987dbdc35a62dErik
1276ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        time.timezone = Time.TIMEZONE_UTC;
1286ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        time.set(TEST_END);
1296ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        time.timezone = LOCAL_TZ;
1306ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        TEST_END2 = time.normalize(true);
1316ae7d69b90f22fd51ab677036ba987dbdc35a62dErik    }
1326ae7d69b90f22fd51ab677036ba987dbdc35a62dErik
13337960c091b5912dd45beb561a85a9064ea42e616Erik    private class MockAbsCalendarActivity extends AbstractCalendarActivity {
13437960c091b5912dd45beb561a85a9064ea42e616Erik        @Override
13537960c091b5912dd45beb561a85a9064ea42e616Erik        public AsyncQueryService getAsyncQueryService() {
13637960c091b5912dd45beb561a85a9064ea42e616Erik            if (mService == null) {
13737960c091b5912dd45beb561a85a9064ea42e616Erik                mService = new AsyncQueryService(this) {
13873714169d34a55fc01e14b30897a1ebbacf9934eErik                    @Override
13937960c091b5912dd45beb561a85a9064ea42e616Erik                    public void startBatch(int token, Object cookie, String authority,
14037960c091b5912dd45beb561a85a9064ea42e616Erik                            ArrayList<ContentProviderOperation> cpo, long delayMillis) {
14137960c091b5912dd45beb561a85a9064ea42e616Erik                        mockApplyBatch(authority, cpo);
14273714169d34a55fc01e14b30897a1ebbacf9934eErik                    }
14373714169d34a55fc01e14b30897a1ebbacf9934eErik                };
14473714169d34a55fc01e14b30897a1ebbacf9934eErik            }
14537960c091b5912dd45beb561a85a9064ea42e616Erik            return mService;
14637960c091b5912dd45beb561a85a9064ea42e616Erik        }
14737960c091b5912dd45beb561a85a9064ea42e616Erik
14837960c091b5912dd45beb561a85a9064ea42e616Erik        @Override
14937960c091b5912dd45beb561a85a9064ea42e616Erik        public Resources getResources() {
15037960c091b5912dd45beb561a85a9064ea42e616Erik            Resources res = new MockResources() {
15137960c091b5912dd45beb561a85a9064ea42e616Erik                @Override
15237960c091b5912dd45beb561a85a9064ea42e616Erik                // The actual selects singular vs plural as well and in the given language
15337960c091b5912dd45beb561a85a9064ea42e616Erik                public String getQuantityString(int id, int quantity) {
15437960c091b5912dd45beb561a85a9064ea42e616Erik                    if (id == R.plurals.Nmins) {
15537960c091b5912dd45beb561a85a9064ea42e616Erik                        return quantity + " mins";
15637960c091b5912dd45beb561a85a9064ea42e616Erik                    }
15737960c091b5912dd45beb561a85a9064ea42e616Erik                    if (id == R.plurals.Nminutes) {
15837960c091b5912dd45beb561a85a9064ea42e616Erik                        return quantity + " minutes";
15937960c091b5912dd45beb561a85a9064ea42e616Erik                    }
16037960c091b5912dd45beb561a85a9064ea42e616Erik                    if (id == R.plurals.Nhours) {
16137960c091b5912dd45beb561a85a9064ea42e616Erik                        return quantity + " hours";
16237960c091b5912dd45beb561a85a9064ea42e616Erik                    }
16337960c091b5912dd45beb561a85a9064ea42e616Erik                    if (id == R.plurals.Ndays) {
16437960c091b5912dd45beb561a85a9064ea42e616Erik                        return quantity + " days";
16537960c091b5912dd45beb561a85a9064ea42e616Erik                    }
16637960c091b5912dd45beb561a85a9064ea42e616Erik                    return id + " " + quantity;
16737960c091b5912dd45beb561a85a9064ea42e616Erik                }
16837960c091b5912dd45beb561a85a9064ea42e616Erik            };
16937960c091b5912dd45beb561a85a9064ea42e616Erik            return res;
17037960c091b5912dd45beb561a85a9064ea42e616Erik        }
17137960c091b5912dd45beb561a85a9064ea42e616Erik    }
17237960c091b5912dd45beb561a85a9064ea42e616Erik
17337960c091b5912dd45beb561a85a9064ea42e616Erik    private AbstractCalendarActivity buildTestContext() {
17437960c091b5912dd45beb561a85a9064ea42e616Erik        MockAbsCalendarActivity context = new MockAbsCalendarActivity();
17573714169d34a55fc01e14b30897a1ebbacf9934eErik        return context;
17673714169d34a55fc01e14b30897a1ebbacf9934eErik    }
17773714169d34a55fc01e14b30897a1ebbacf9934eErik
17873714169d34a55fc01e14b30897a1ebbacf9934eErik    private ContentProviderResult[] mockApplyBatch(String authority,
17973714169d34a55fc01e14b30897a1ebbacf9934eErik            ArrayList<ContentProviderOperation> operations) {
18073714169d34a55fc01e14b30897a1ebbacf9934eErik        switch (mCurrentSaveTest) {
18173714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_NEW_EVENT:
18273714169d34a55fc01e14b30897a1ebbacf9934eErik                // new recurring event
18373714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventNewEvent(operations);
18473714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
18573714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_MOD_RECUR:
18673714169d34a55fc01e14b30897a1ebbacf9934eErik                // update to recurring event
18773714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventModifyRecurring(operations);
18873714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
18973714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_RECUR_TO_NORECUR:
19073714169d34a55fc01e14b30897a1ebbacf9934eErik                // replace recurring event with non-recurring event
19173714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventRecurringToNonRecurring(operations);
19273714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
19373714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_NORECUR_TO_RECUR:
19473714169d34a55fc01e14b30897a1ebbacf9934eErik                // update non-recurring event with recurring event
19573714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventNonRecurringToRecurring(operations);
19673714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
19773714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_MOD_NORECUR:
19873714169d34a55fc01e14b30897a1ebbacf9934eErik                // update to non-recurring
19973714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventUpdateNonRecurring(operations);
20073714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
20173714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_MOD_INSTANCE:
20273714169d34a55fc01e14b30897a1ebbacf9934eErik                // update to single instance of recurring event
20373714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventModifySingleInstance(operations);
20473714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
20573714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_ALLFOLLOW_TO_NORECUR:
20673714169d34a55fc01e14b30897a1ebbacf9934eErik                // update all following with non-recurring event
20773714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventModifyAllFollowingWithNonRecurring(operations);
20873714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
20973714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_FIRST_TO_NORECUR:
21073714169d34a55fc01e14b30897a1ebbacf9934eErik                // update all following with non-recurring event on first event in series
21173714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventModifyAllFollowingFirstWithNonRecurring(operations);
21273714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
21373714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_FIRST_TO_RECUR:
21473714169d34a55fc01e14b30897a1ebbacf9934eErik                // update all following with recurring event on first event in series
21573714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventModifyAllFollowingFirstWithRecurring(operations);
21673714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
21773714169d34a55fc01e14b30897a1ebbacf9934eErik            case SAVE_EVENT_ALLFOLLOW_TO_RECUR:
21873714169d34a55fc01e14b30897a1ebbacf9934eErik                // update all following with recurring event on second event in series
21973714169d34a55fc01e14b30897a1ebbacf9934eErik                verifySaveEventModifyAllFollowingWithRecurring(operations);
22073714169d34a55fc01e14b30897a1ebbacf9934eErik                break;
22173714169d34a55fc01e14b30897a1ebbacf9934eErik        }
22273714169d34a55fc01e14b30897a1ebbacf9934eErik        return new ContentProviderResult[] {new ContentProviderResult(5)};
22373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
22473714169d34a55fc01e14b30897a1ebbacf9934eErik
22573714169d34a55fc01e14b30897a1ebbacf9934eErik    private void addOwnerAttendeeToOps(ArrayList<ContentProviderOperation> expectedOps, int id) {
22673714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendee();
22773714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b;
22873714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Attendees.CONTENT_URI).withValues(mExpectedValues);
22973714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withValueBackReference(Reminders.EVENT_ID, id);
23073714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
23173714169d34a55fc01e14b30897a1ebbacf9934eErik    }
23273714169d34a55fc01e14b30897a1ebbacf9934eErik
23373714169d34a55fc01e14b30897a1ebbacf9934eErik    // Some tests set the time values to one day later, this does that move in the values
23473714169d34a55fc01e14b30897a1ebbacf9934eErik    private void moveExpectedTimeValuesForwardOneDay() {
23573714169d34a55fc01e14b30897a1ebbacf9934eErik        long dayInMs = EditEventHelper.DAY_IN_SECONDS*1000;
23673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DTSTART, TEST_START + dayInMs);
23773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DTEND, TEST_END + dayInMs);
23873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
23973714169d34a55fc01e14b30897a1ebbacf9934eErik
24073714169d34a55fc01e14b30897a1ebbacf9934eErik    // Duplicates the delete and add for changing a single email address
24173714169d34a55fc01e14b30897a1ebbacf9934eErik    private void addAttendeeChangesOps(ArrayList<ContentProviderOperation> expectedOps) {
24273714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b =
24373714169d34a55fc01e14b30897a1ebbacf9934eErik            ContentProviderOperation.newDelete(Attendees.CONTENT_URI);
24473714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withSelection(EditEventHelper.ATTENDEES_DELETE_PREFIX + "?)",
24573714169d34a55fc01e14b30897a1ebbacf9934eErik                new String[] {"one.two.three@email.grue"});
24673714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
24773714169d34a55fc01e14b30897a1ebbacf9934eErik
24873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.clear();
24973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_NAME, (String)null);
25073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_EMAIL, "different@email.bit");
25173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
25273714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE);
25373714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_NONE);
25473714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.EVENT_ID, TEST_EVENT_ID);
25573714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation
25673714169d34a55fc01e14b30897a1ebbacf9934eErik                .newInsert(Attendees.CONTENT_URI)
25773714169d34a55fc01e14b30897a1ebbacf9934eErik                .withValues(mExpectedValues);
25873714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
25973714169d34a55fc01e14b30897a1ebbacf9934eErik    }
26073714169d34a55fc01e14b30897a1ebbacf9934eErik
26173714169d34a55fc01e14b30897a1ebbacf9934eErik    // This is a commonly added set of values
26273714169d34a55fc01e14b30897a1ebbacf9934eErik    private void addOwnerAttendee() {
26373714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.clear();
26473714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_EMAIL, mModel1.mOwnerAccount);
26573714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ORGANIZER);
26673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE);
26773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_ACCEPTED);
26873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
26973714169d34a55fc01e14b30897a1ebbacf9934eErik
27073714169d34a55fc01e14b30897a1ebbacf9934eErik    /** Some tests add all the attendees to the db, the names and emails should match
27173714169d34a55fc01e14b30897a1ebbacf9934eErik     * with {@link #TEST_ADDRESSES2} minus the 'no good'
27273714169d34a55fc01e14b30897a1ebbacf9934eErik     */
27373714169d34a55fc01e14b30897a1ebbacf9934eErik    private void addTestAttendees(ArrayList<ContentProviderOperation> ops,
27473714169d34a55fc01e14b30897a1ebbacf9934eErik            boolean newEvent, int id) {
27573714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b;
27673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.clear();
27773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_NAME, (String)null);
27873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_EMAIL, "ad1@email.com");
27973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
28073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE);
28173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_NONE);
28273714169d34a55fc01e14b30897a1ebbacf9934eErik
28373714169d34a55fc01e14b30897a1ebbacf9934eErik        if (newEvent) {
28473714169d34a55fc01e14b30897a1ebbacf9934eErik            b = ContentProviderOperation
28573714169d34a55fc01e14b30897a1ebbacf9934eErik                    .newInsert(Attendees.CONTENT_URI)
28673714169d34a55fc01e14b30897a1ebbacf9934eErik                    .withValues(mExpectedValues);
28773714169d34a55fc01e14b30897a1ebbacf9934eErik            b.withValueBackReference(Attendees.EVENT_ID, id);
28873714169d34a55fc01e14b30897a1ebbacf9934eErik        } else {
28973714169d34a55fc01e14b30897a1ebbacf9934eErik            mExpectedValues.put(Attendees.EVENT_ID, id);
29073714169d34a55fc01e14b30897a1ebbacf9934eErik            b = ContentProviderOperation
29173714169d34a55fc01e14b30897a1ebbacf9934eErik                    .newInsert(Attendees.CONTENT_URI)
29273714169d34a55fc01e14b30897a1ebbacf9934eErik                    .withValues(mExpectedValues);
29373714169d34a55fc01e14b30897a1ebbacf9934eErik        }
29473714169d34a55fc01e14b30897a1ebbacf9934eErik        ops.add(b.build());
29573714169d34a55fc01e14b30897a1ebbacf9934eErik
29673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.clear();
29773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_NAME, "First Last");
29873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_EMAIL, "first@email.com");
29973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
30073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE);
30173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_NONE);
30273714169d34a55fc01e14b30897a1ebbacf9934eErik
30373714169d34a55fc01e14b30897a1ebbacf9934eErik        if (newEvent) {
30473714169d34a55fc01e14b30897a1ebbacf9934eErik            b = ContentProviderOperation
30573714169d34a55fc01e14b30897a1ebbacf9934eErik                    .newInsert(Attendees.CONTENT_URI)
30673714169d34a55fc01e14b30897a1ebbacf9934eErik                    .withValues(mExpectedValues);
30773714169d34a55fc01e14b30897a1ebbacf9934eErik            b.withValueBackReference(Attendees.EVENT_ID, id);
30873714169d34a55fc01e14b30897a1ebbacf9934eErik        } else {
30973714169d34a55fc01e14b30897a1ebbacf9934eErik            mExpectedValues.put(Attendees.EVENT_ID, id);
31073714169d34a55fc01e14b30897a1ebbacf9934eErik            b = ContentProviderOperation
31173714169d34a55fc01e14b30897a1ebbacf9934eErik                    .newInsert(Attendees.CONTENT_URI)
31273714169d34a55fc01e14b30897a1ebbacf9934eErik                    .withValues(mExpectedValues);
31373714169d34a55fc01e14b30897a1ebbacf9934eErik        }
31473714169d34a55fc01e14b30897a1ebbacf9934eErik        ops.add(b.build());
31573714169d34a55fc01e14b30897a1ebbacf9934eErik
31673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.clear();
31773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_NAME, (String)null);
31873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_EMAIL, "different@email.bit");
31973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_RELATIONSHIP, Attendees.RELATIONSHIP_ATTENDEE);
32073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_TYPE, Attendees.TYPE_NONE);
32173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Attendees.ATTENDEE_STATUS, Attendees.ATTENDEE_STATUS_NONE);
32273714169d34a55fc01e14b30897a1ebbacf9934eErik
32373714169d34a55fc01e14b30897a1ebbacf9934eErik        if (newEvent) {
32473714169d34a55fc01e14b30897a1ebbacf9934eErik            b = ContentProviderOperation
32573714169d34a55fc01e14b30897a1ebbacf9934eErik                    .newInsert(Attendees.CONTENT_URI)
32673714169d34a55fc01e14b30897a1ebbacf9934eErik                    .withValues(mExpectedValues);
32773714169d34a55fc01e14b30897a1ebbacf9934eErik            b.withValueBackReference(Attendees.EVENT_ID, id);
32873714169d34a55fc01e14b30897a1ebbacf9934eErik        } else {
32973714169d34a55fc01e14b30897a1ebbacf9934eErik            mExpectedValues.put(Attendees.EVENT_ID, id);
33073714169d34a55fc01e14b30897a1ebbacf9934eErik            b = ContentProviderOperation
33173714169d34a55fc01e14b30897a1ebbacf9934eErik                    .newInsert(Attendees.CONTENT_URI)
33273714169d34a55fc01e14b30897a1ebbacf9934eErik                    .withValues(mExpectedValues);
33373714169d34a55fc01e14b30897a1ebbacf9934eErik        }
33473714169d34a55fc01e14b30897a1ebbacf9934eErik        ops.add(b.build());
33573714169d34a55fc01e14b30897a1ebbacf9934eErik    }
33673714169d34a55fc01e14b30897a1ebbacf9934eErik
3377e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
33873714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
33973714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventFailures() {
34037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
34137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
34273714169d34a55fc01e14b30897a1ebbacf9934eErik
34373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
34473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
34573714169d34a55fc01e14b30897a1ebbacf9934eErik
34673714169d34a55fc01e14b30897a1ebbacf9934eErik        // saveEvent should return false early if:
34773714169d34a55fc01e14b30897a1ebbacf9934eErik        // -it was set to not ok
34873714169d34a55fc01e14b30897a1ebbacf9934eErik        // -the model was null
34973714169d34a55fc01e14b30897a1ebbacf9934eErik        // -the event doesn't represent the same event as the original event
35073714169d34a55fc01e14b30897a1ebbacf9934eErik        // -there's a uri but an original event is not provided
35173714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.mEventOk = false;
35273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(mHelper.saveEvent(null, null, 0));
35373714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.mEventOk = true;
35473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(mHelper.saveEvent(null, null, 0));
35573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mId = 13;
35673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(mHelper.saveEvent(mModel1, mModel2, 0));
35773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mId = mModel1.mId;
35859ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
35959ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel2.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
36073714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(mHelper.saveEvent(mModel1, null, 0));
36173714169d34a55fc01e14b30897a1ebbacf9934eErik    }
36273714169d34a55fc01e14b30897a1ebbacf9934eErik
3637e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
36473714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
36573714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventNewEvent() {
36673714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates a model of a new event for saving
36737960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
36837960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
36973714169d34a55fc01e14b30897a1ebbacf9934eErik
37073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
371d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
37273714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_NEW_EVENT;
37373714169d34a55fc01e14b30897a1ebbacf9934eErik
37473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, null, 0));
37573714169d34a55fc01e14b30897a1ebbacf9934eErik    }
37673714169d34a55fc01e14b30897a1ebbacf9934eErik
37773714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventNewEvent(ArrayList<ContentProviderOperation> ops) {
37873714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
37973714169d34a55fc01e14b30897a1ebbacf9934eErik        int br_id = 0;
38073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
38173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
38273714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ATTENDEE_DATA, 1);
38373714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b = ContentProviderOperation
38473714169d34a55fc01e14b30897a1ebbacf9934eErik                .newInsert(Events.CONTENT_URI)
38573714169d34a55fc01e14b30897a1ebbacf9934eErik                .withValues(mExpectedValues);
38673714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
38773714169d34a55fc01e14b30897a1ebbacf9934eErik
38873714169d34a55fc01e14b30897a1ebbacf9934eErik        // This call has a separate unit test so we'll use it to simplify making the expected vals
389fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveRemindersWithBackRef(expectedOps, br_id, mModel1.mReminders,
390fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                new ArrayList<ReminderEntry>(), true);
39173714169d34a55fc01e14b30897a1ebbacf9934eErik
39273714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendeeToOps(expectedOps, br_id);
39373714169d34a55fc01e14b30897a1ebbacf9934eErik
39473714169d34a55fc01e14b30897a1ebbacf9934eErik        addTestAttendees(expectedOps, true, br_id);
39573714169d34a55fc01e14b30897a1ebbacf9934eErik
39673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
39773714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
39873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
39973714169d34a55fc01e14b30897a1ebbacf9934eErik
4007e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
40173714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
40273714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventModifyRecurring() {
40373714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original and an updated recurring event model
40437960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
40537960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
40673714169d34a55fc01e14b30897a1ebbacf9934eErik
40773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
40873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
409d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
41073714169d34a55fc01e14b30897a1ebbacf9934eErik
41173714169d34a55fc01e14b30897a1ebbacf9934eErik        // Updating a recurring event with a new attendee list
41259ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
41373714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
414eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
41573714169d34a55fc01e14b30897a1ebbacf9934eErik
41673714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
417d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
418d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
41973714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_MOD_RECUR;
42073714169d34a55fc01e14b30897a1ebbacf9934eErik
42173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL));
42273714169d34a55fc01e14b30897a1ebbacf9934eErik    }
42373714169d34a55fc01e14b30897a1ebbacf9934eErik
42473714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventModifyRecurring(ArrayList<ContentProviderOperation> ops) {
42573714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
42673714169d34a55fc01e14b30897a1ebbacf9934eErik        int br_id = 0;
42773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
42873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
42973714169d34a55fc01e14b30897a1ebbacf9934eErik        // This is tested elsewhere, used for convenience here
43073714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel2, mModel1, mExpectedValues,
43173714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_ALL);
43273714169d34a55fc01e14b30897a1ebbacf9934eErik
43359ead671b50514b49749fcd6a1d4186a270239d2Erik        expectedOps.add(ContentProviderOperation.newUpdate(Uri.parse(mModel1.mUri)).withValues(
43459ead671b50514b49749fcd6a1d4186a270239d2Erik                mExpectedValues).build());
43573714169d34a55fc01e14b30897a1ebbacf9934eErik
43673714169d34a55fc01e14b30897a1ebbacf9934eErik        // This call has a separate unit test so we'll use it to simplify making the expected vals
437fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveReminders(expectedOps, TEST_EVENT_ID, mModel1.mReminders,
438fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, false);
43973714169d34a55fc01e14b30897a1ebbacf9934eErik
44073714169d34a55fc01e14b30897a1ebbacf9934eErik        addAttendeeChangesOps(expectedOps);
44173714169d34a55fc01e14b30897a1ebbacf9934eErik
44273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
44373714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
44473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
44573714169d34a55fc01e14b30897a1ebbacf9934eErik
4467e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
44773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
44873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventRecurringToNonRecurring() {
44973714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original and an updated recurring event model
45037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
45137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
45273714169d34a55fc01e14b30897a1ebbacf9934eErik
45373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
45473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
455d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
45673714169d34a55fc01e14b30897a1ebbacf9934eErik
45773714169d34a55fc01e14b30897a1ebbacf9934eErik        // Updating a recurring event with a new attendee list
45859ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
45973714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
460eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
46173714169d34a55fc01e14b30897a1ebbacf9934eErik
46273714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
463d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
464d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
46573714169d34a55fc01e14b30897a1ebbacf9934eErik
46673714169d34a55fc01e14b30897a1ebbacf9934eErik        // Replace an existing recurring event with a non-recurring event
46773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = null;
468eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mEnd = TEST_END;
46973714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_RECUR_TO_NORECUR;
47073714169d34a55fc01e14b30897a1ebbacf9934eErik
47173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL));
47273714169d34a55fc01e14b30897a1ebbacf9934eErik    }
47373714169d34a55fc01e14b30897a1ebbacf9934eErik
47473714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventRecurringToNonRecurring(ArrayList<ContentProviderOperation> ops)
47573714169d34a55fc01e14b30897a1ebbacf9934eErik            {
47673714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
47773714169d34a55fc01e14b30897a1ebbacf9934eErik        int id = 0;
47873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildNonRecurringTestValues();
47973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
48073714169d34a55fc01e14b30897a1ebbacf9934eErik        // This is tested elsewhere, used for convenience here
48173714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel1, mExpectedValues,
48273714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_ALL);
48373714169d34a55fc01e14b30897a1ebbacf9934eErik
48459ead671b50514b49749fcd6a1d4186a270239d2Erik        expectedOps.add(ContentProviderOperation.newDelete(Uri.parse(mModel1.mUri)).build());
48573714169d34a55fc01e14b30897a1ebbacf9934eErik        id = expectedOps.size();
48673714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(ContentProviderOperation
48773714169d34a55fc01e14b30897a1ebbacf9934eErik                        .newInsert(Events.CONTENT_URI)
48873714169d34a55fc01e14b30897a1ebbacf9934eErik                        .withValues(mExpectedValues)
48973714169d34a55fc01e14b30897a1ebbacf9934eErik                        .build());
49073714169d34a55fc01e14b30897a1ebbacf9934eErik
491fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveRemindersWithBackRef(expectedOps, id, mModel1.mReminders,
492fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, true);
49373714169d34a55fc01e14b30897a1ebbacf9934eErik
49473714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendeeToOps(expectedOps, id);
49573714169d34a55fc01e14b30897a1ebbacf9934eErik
49673714169d34a55fc01e14b30897a1ebbacf9934eErik        addTestAttendees(expectedOps, true, id);
49773714169d34a55fc01e14b30897a1ebbacf9934eErik
49873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
49973714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
50073714169d34a55fc01e14b30897a1ebbacf9934eErik    }
50173714169d34a55fc01e14b30897a1ebbacf9934eErik
5027e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
50373714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
50473714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventNonRecurringToRecurring() {
50573714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original non-recurring and an updated recurring event model
50637960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
50737960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
50873714169d34a55fc01e14b30897a1ebbacf9934eErik
50973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
51073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
511d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
51273714169d34a55fc01e14b30897a1ebbacf9934eErik
51373714169d34a55fc01e14b30897a1ebbacf9934eErik        // Updating a recurring event with a new attendee list
51459ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
51573714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
516eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
51773714169d34a55fc01e14b30897a1ebbacf9934eErik
51873714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
519d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
520d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
52173714169d34a55fc01e14b30897a1ebbacf9934eErik
52273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = null;
523eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel2.mEnd = TEST_END;
52473714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_NORECUR_TO_RECUR;
52573714169d34a55fc01e14b30897a1ebbacf9934eErik
52673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL));
52773714169d34a55fc01e14b30897a1ebbacf9934eErik    }
52873714169d34a55fc01e14b30897a1ebbacf9934eErik
52973714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventNonRecurringToRecurring(ArrayList<ContentProviderOperation> ops)
53073714169d34a55fc01e14b30897a1ebbacf9934eErik            {
53173714169d34a55fc01e14b30897a1ebbacf9934eErik        // Changing a non-recurring event to a recurring event should generate the same operations
53273714169d34a55fc01e14b30897a1ebbacf9934eErik        // as just modifying a recurring event.
53373714169d34a55fc01e14b30897a1ebbacf9934eErik        return verifySaveEventModifyRecurring(ops);
53473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
53573714169d34a55fc01e14b30897a1ebbacf9934eErik
5367e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
53773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
53873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventUpdateNonRecurring() {
53973714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original non-recurring and an updated recurring event model
54037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
54137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
54273714169d34a55fc01e14b30897a1ebbacf9934eErik
54373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
54473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
545d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
54673714169d34a55fc01e14b30897a1ebbacf9934eErik
54773714169d34a55fc01e14b30897a1ebbacf9934eErik        // Updating a recurring event with a new attendee list
54859ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
54973714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
550eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
55173714169d34a55fc01e14b30897a1ebbacf9934eErik
55273714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
553d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
554d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
55573714169d34a55fc01e14b30897a1ebbacf9934eErik
55673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = null;
55773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mEnd = TEST_END2;
55873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = null;
55973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mEnd = TEST_END2;
56073714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_MOD_NORECUR;
56173714169d34a55fc01e14b30897a1ebbacf9934eErik
56273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL));
56373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
56473714169d34a55fc01e14b30897a1ebbacf9934eErik
56573714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventUpdateNonRecurring(ArrayList<ContentProviderOperation> ops) {
56673714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
56773714169d34a55fc01e14b30897a1ebbacf9934eErik        int id = TEST_EVENT_ID;
56873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildNonRecurringTestValues();
56973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
57073714169d34a55fc01e14b30897a1ebbacf9934eErik        // This is tested elsewhere, used for convenience here
57173714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel1, mExpectedValues,
57273714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_ALL);
57359ead671b50514b49749fcd6a1d4186a270239d2Erik        expectedOps.add(ContentProviderOperation.newUpdate(Uri.parse(mModel1.mUri)).withValues(
57459ead671b50514b49749fcd6a1d4186a270239d2Erik                mExpectedValues).build());
57573714169d34a55fc01e14b30897a1ebbacf9934eErik        // This call has a separate unit test so we'll use it to simplify making the expected vals
576fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveReminders(expectedOps, TEST_EVENT_ID, mModel1.mReminders,
577fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, false);
57873714169d34a55fc01e14b30897a1ebbacf9934eErik        addAttendeeChangesOps(expectedOps);
57973714169d34a55fc01e14b30897a1ebbacf9934eErik
58073714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
58173714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
58273714169d34a55fc01e14b30897a1ebbacf9934eErik    }
58373714169d34a55fc01e14b30897a1ebbacf9934eErik
5847e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
58573714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
58673714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventModifySingleInstance() {
58773714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original non-recurring and an updated recurring event model
58837960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
58937960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
59073714169d34a55fc01e14b30897a1ebbacf9934eErik
59173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
59273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
593d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
59473714169d34a55fc01e14b30897a1ebbacf9934eErik
59559ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
59673714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
597eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
59873714169d34a55fc01e14b30897a1ebbacf9934eErik
59973714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
600d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
601d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
60273714169d34a55fc01e14b30897a1ebbacf9934eErik
60373714169d34a55fc01e14b30897a1ebbacf9934eErik        // Modify the second instance of the event
60473714169d34a55fc01e14b30897a1ebbacf9934eErik        long dayInMs = EditEventHelper.DAY_IN_SECONDS*1000;
60573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = null;
606eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mEnd = TEST_END + dayInMs;
60773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart += dayInMs;
60873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mOriginalStart = mModel1.mStart;
60973714169d34a55fc01e14b30897a1ebbacf9934eErik
61073714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_MOD_INSTANCE;
61173714169d34a55fc01e14b30897a1ebbacf9934eErik        // Only modify this instance
61273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_SELECTED));
61373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
61473714169d34a55fc01e14b30897a1ebbacf9934eErik
61573714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventModifySingleInstance(ArrayList<ContentProviderOperation> ops) {
61673714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
61773714169d34a55fc01e14b30897a1ebbacf9934eErik        int id = 0;
61873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildNonRecurringTestValues();
61973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
62073714169d34a55fc01e14b30897a1ebbacf9934eErik        // This is tested elsewhere, used for convenience here
62173714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel1, mExpectedValues,
62273714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_ALL);
62373714169d34a55fc01e14b30897a1ebbacf9934eErik
62473714169d34a55fc01e14b30897a1ebbacf9934eErik        moveExpectedTimeValuesForwardOneDay();
6250e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik        mExpectedValues.put(Events.ORIGINAL_SYNC_ID, mModel2.mSyncId);
62673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.ORIGINAL_INSTANCE_TIME, mModel1.mOriginalStart);
62773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.ORIGINAL_ALL_DAY, 1);
62873714169d34a55fc01e14b30897a1ebbacf9934eErik
62973714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b = ContentProviderOperation
63073714169d34a55fc01e14b30897a1ebbacf9934eErik                .newInsert(Events.CONTENT_URI)
63173714169d34a55fc01e14b30897a1ebbacf9934eErik                .withValues(mExpectedValues);
63273714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
63373714169d34a55fc01e14b30897a1ebbacf9934eErik
634fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveRemindersWithBackRef(expectedOps, id, mModel1.mReminders,
635fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, true);
63673714169d34a55fc01e14b30897a1ebbacf9934eErik
63773714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendeeToOps(expectedOps, id);
63873714169d34a55fc01e14b30897a1ebbacf9934eErik
63973714169d34a55fc01e14b30897a1ebbacf9934eErik        addTestAttendees(expectedOps, true, id);
64073714169d34a55fc01e14b30897a1ebbacf9934eErik
64173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
64273714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
64373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
64473714169d34a55fc01e14b30897a1ebbacf9934eErik
6457e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
64673714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
64773714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventModifyAllFollowingWithNonRecurring() {
64873714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original and an updated recurring event model. The update starts on the 2nd
64973714169d34a55fc01e14b30897a1ebbacf9934eErik        // instance of the original.
65037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
65137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
65273714169d34a55fc01e14b30897a1ebbacf9934eErik
65373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
65473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
655d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
65673714169d34a55fc01e14b30897a1ebbacf9934eErik
65759ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
65859ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel2.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
65973714169d34a55fc01e14b30897a1ebbacf9934eErik
66073714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
661d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
662d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
66373714169d34a55fc01e14b30897a1ebbacf9934eErik
66473714169d34a55fc01e14b30897a1ebbacf9934eErik        // Modify the second instance of the event
66573714169d34a55fc01e14b30897a1ebbacf9934eErik        long dayInMs = EditEventHelper.DAY_IN_SECONDS*1000;
66673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = null;
667eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mEnd = TEST_END + dayInMs;
66873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart += dayInMs;
66973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mOriginalStart = mModel1.mStart;
67073714169d34a55fc01e14b30897a1ebbacf9934eErik
67173714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_ALLFOLLOW_TO_NORECUR;
67273714169d34a55fc01e14b30897a1ebbacf9934eErik        // Only modify this instance
67373714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL_FOLLOWING));
67473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
67573714169d34a55fc01e14b30897a1ebbacf9934eErik
67673714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventModifyAllFollowingWithNonRecurring(
67773714169d34a55fc01e14b30897a1ebbacf9934eErik            ArrayList<ContentProviderOperation> ops) {
67873714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
67973714169d34a55fc01e14b30897a1ebbacf9934eErik        int id = 0;
68073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildNonRecurringTestValues();
68173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
68273714169d34a55fc01e14b30897a1ebbacf9934eErik        moveExpectedTimeValuesForwardOneDay();
68373714169d34a55fc01e14b30897a1ebbacf9934eErik        // This has a separate test
68473714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.updatePastEvents(expectedOps, mModel2, mModel1.mOriginalStart);
68573714169d34a55fc01e14b30897a1ebbacf9934eErik        id = expectedOps.size();
68673714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(ContentProviderOperation
68773714169d34a55fc01e14b30897a1ebbacf9934eErik                .newInsert(Events.CONTENT_URI)
68873714169d34a55fc01e14b30897a1ebbacf9934eErik                .withValues(mExpectedValues)
68973714169d34a55fc01e14b30897a1ebbacf9934eErik                .build());
69073714169d34a55fc01e14b30897a1ebbacf9934eErik
691fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveRemindersWithBackRef(expectedOps, id, mModel1.mReminders,
692fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, true);
69373714169d34a55fc01e14b30897a1ebbacf9934eErik
69473714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendeeToOps(expectedOps, id);
69573714169d34a55fc01e14b30897a1ebbacf9934eErik
69673714169d34a55fc01e14b30897a1ebbacf9934eErik        addTestAttendees(expectedOps, true, id);
69773714169d34a55fc01e14b30897a1ebbacf9934eErik
69873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
69973714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
70073714169d34a55fc01e14b30897a1ebbacf9934eErik    }
70173714169d34a55fc01e14b30897a1ebbacf9934eErik
7027e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
70373714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
70473714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventModifyAllFollowingFirstWithNonRecurring() {
70573714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original recurring and an updated non-recurring event model for the first
70673714169d34a55fc01e14b30897a1ebbacf9934eErik        // instance. This should replace the original event with a non-recurring event.
70737960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
70837960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
70973714169d34a55fc01e14b30897a1ebbacf9934eErik
71073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
71173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
712d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
71373714169d34a55fc01e14b30897a1ebbacf9934eErik
71459ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
7156ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        mModel2.mUri = mModel1.mUri;
71673714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
717eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
71873714169d34a55fc01e14b30897a1ebbacf9934eErik
71973714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
720d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
721d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
72273714169d34a55fc01e14b30897a1ebbacf9934eErik
72373714169d34a55fc01e14b30897a1ebbacf9934eErik        // Move the event one day but keep original start set to the first instance
72473714169d34a55fc01e14b30897a1ebbacf9934eErik        long dayInMs = EditEventHelper.DAY_IN_SECONDS*1000;
72573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = null;
726eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mEnd = TEST_END + dayInMs;
72773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart += dayInMs;
72873714169d34a55fc01e14b30897a1ebbacf9934eErik
72973714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_FIRST_TO_NORECUR;
73073714169d34a55fc01e14b30897a1ebbacf9934eErik        // Only modify this instance
73173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL_FOLLOWING));
73273714169d34a55fc01e14b30897a1ebbacf9934eErik    }
73373714169d34a55fc01e14b30897a1ebbacf9934eErik
73473714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventModifyAllFollowingFirstWithNonRecurring(
73573714169d34a55fc01e14b30897a1ebbacf9934eErik            ArrayList<ContentProviderOperation> ops) {
73673714169d34a55fc01e14b30897a1ebbacf9934eErik
73773714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
73873714169d34a55fc01e14b30897a1ebbacf9934eErik        int id = 0;
73973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildNonRecurringTestValues();
74073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
74173714169d34a55fc01e14b30897a1ebbacf9934eErik        moveExpectedTimeValuesForwardOneDay();
74273714169d34a55fc01e14b30897a1ebbacf9934eErik
74359ead671b50514b49749fcd6a1d4186a270239d2Erik        expectedOps.add(ContentProviderOperation.newDelete(Uri.parse(mModel1.mUri)).build());
74473714169d34a55fc01e14b30897a1ebbacf9934eErik        id = expectedOps.size();
74573714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(ContentProviderOperation
74673714169d34a55fc01e14b30897a1ebbacf9934eErik                        .newInsert(Events.CONTENT_URI)
74773714169d34a55fc01e14b30897a1ebbacf9934eErik                        .withValues(mExpectedValues)
74873714169d34a55fc01e14b30897a1ebbacf9934eErik                        .build());
74973714169d34a55fc01e14b30897a1ebbacf9934eErik
750fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveRemindersWithBackRef(expectedOps, id, mModel1.mReminders,
751fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, true);
75273714169d34a55fc01e14b30897a1ebbacf9934eErik
75373714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendeeToOps(expectedOps, id);
75473714169d34a55fc01e14b30897a1ebbacf9934eErik
75573714169d34a55fc01e14b30897a1ebbacf9934eErik        addTestAttendees(expectedOps, true, id);
75673714169d34a55fc01e14b30897a1ebbacf9934eErik
75773714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
75873714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
75973714169d34a55fc01e14b30897a1ebbacf9934eErik    }
76073714169d34a55fc01e14b30897a1ebbacf9934eErik
7617e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
76273714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
76373714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventModifyAllFollowingFirstWithRecurring() {
76473714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original recurring and an updated recurring event model for the first instance
76573714169d34a55fc01e14b30897a1ebbacf9934eErik        // This should replace the original event with a new recurrence
76637960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
76737960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
76873714169d34a55fc01e14b30897a1ebbacf9934eErik
76973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
77073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
771d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
77273714169d34a55fc01e14b30897a1ebbacf9934eErik
77359ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
7746ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        mModel2.mUri = mModel1.mUri;
77573714169d34a55fc01e14b30897a1ebbacf9934eErik        // And a new start time to ensure the time fields aren't removed
776eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mOriginalStart = TEST_START;
77773714169d34a55fc01e14b30897a1ebbacf9934eErik
77873714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
779d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
780d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
78173714169d34a55fc01e14b30897a1ebbacf9934eErik
78273714169d34a55fc01e14b30897a1ebbacf9934eErik        // Move the event one day but keep original start set to the first instance
78373714169d34a55fc01e14b30897a1ebbacf9934eErik        long dayInMs = EditEventHelper.DAY_IN_SECONDS*1000;
78473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart += dayInMs;
78573714169d34a55fc01e14b30897a1ebbacf9934eErik
78673714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_FIRST_TO_RECUR;
78773714169d34a55fc01e14b30897a1ebbacf9934eErik        // Only modify this instance
78873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL_FOLLOWING));
78973714169d34a55fc01e14b30897a1ebbacf9934eErik    }
79073714169d34a55fc01e14b30897a1ebbacf9934eErik
79173714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventModifyAllFollowingFirstWithRecurring(
79273714169d34a55fc01e14b30897a1ebbacf9934eErik            ArrayList<ContentProviderOperation> ops) {
79373714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
79473714169d34a55fc01e14b30897a1ebbacf9934eErik        int br_id = 0;
79573714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
79673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
79773714169d34a55fc01e14b30897a1ebbacf9934eErik        moveExpectedTimeValuesForwardOneDay();
79873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DTEND, (Long)null);
79973714169d34a55fc01e14b30897a1ebbacf9934eErik        // This is tested elsewhere, used for convenience here
80073714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel2, mModel1, mExpectedValues,
80173714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_ALL_FOLLOWING);
80273714169d34a55fc01e14b30897a1ebbacf9934eErik
80359ead671b50514b49749fcd6a1d4186a270239d2Erik        expectedOps.add(ContentProviderOperation.newUpdate(Uri.parse(mModel1.mUri)).withValues(
80459ead671b50514b49749fcd6a1d4186a270239d2Erik                mExpectedValues).build());
80573714169d34a55fc01e14b30897a1ebbacf9934eErik
80673714169d34a55fc01e14b30897a1ebbacf9934eErik        // This call has a separate unit test so we'll use it to simplify making the expected vals
807fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveReminders(expectedOps, TEST_EVENT_ID, mModel1.mReminders,
808fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, true);
80973714169d34a55fc01e14b30897a1ebbacf9934eErik
81073714169d34a55fc01e14b30897a1ebbacf9934eErik        addAttendeeChangesOps(expectedOps);
81173714169d34a55fc01e14b30897a1ebbacf9934eErik
81273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
81373714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
81473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
81573714169d34a55fc01e14b30897a1ebbacf9934eErik
8167e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
81773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
81873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveEventModifyAllFollowingWithRecurring() {
81973714169d34a55fc01e14b30897a1ebbacf9934eErik        // Creates an original recurring and an updated recurring event model
82073714169d34a55fc01e14b30897a1ebbacf9934eErik        // for the second instance. This should end the original recurrence and add a new
82173714169d34a55fc01e14b30897a1ebbacf9934eErik        // recurrence.
82237960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
82337960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
82473714169d34a55fc01e14b30897a1ebbacf9934eErik
82573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
82673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
827d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel1.mAttendees = TEST_ADDRESSES2;
82873714169d34a55fc01e14b30897a1ebbacf9934eErik
82959ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
83059ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel2.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
83173714169d34a55fc01e14b30897a1ebbacf9934eErik
83273714169d34a55fc01e14b30897a1ebbacf9934eErik        // The original model is assumed correct so drop the no good bit
833d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//        mModel2.mAttendees = "ad1@email.com, \"First Last\" <first@email.com> (comment), " +
834d845fbe558d5229102b58cce70a1b29fe6cb6967Erik//            "one.two.three@email.grue";
83573714169d34a55fc01e14b30897a1ebbacf9934eErik
83673714169d34a55fc01e14b30897a1ebbacf9934eErik        // Move the event one day and the original start so it references the second instance
83773714169d34a55fc01e14b30897a1ebbacf9934eErik        long dayInMs = EditEventHelper.DAY_IN_SECONDS*1000;
83873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart += dayInMs;
83973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mOriginalStart = mModel1.mStart;
84073714169d34a55fc01e14b30897a1ebbacf9934eErik
84173714169d34a55fc01e14b30897a1ebbacf9934eErik        mCurrentSaveTest = SAVE_EVENT_ALLFOLLOW_TO_RECUR;
84273714169d34a55fc01e14b30897a1ebbacf9934eErik        // Only modify this instance
84373714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(mHelper.saveEvent(mModel1, mModel2, EditEventHelper.MODIFY_ALL_FOLLOWING));
84473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
84573714169d34a55fc01e14b30897a1ebbacf9934eErik
84673714169d34a55fc01e14b30897a1ebbacf9934eErik    private boolean verifySaveEventModifyAllFollowingWithRecurring(
84773714169d34a55fc01e14b30897a1ebbacf9934eErik            ArrayList<ContentProviderOperation> ops) {
84873714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
84973714169d34a55fc01e14b30897a1ebbacf9934eErik        int br_id = 0;
85073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
85173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.HAS_ALARM, 0);
85273714169d34a55fc01e14b30897a1ebbacf9934eErik        moveExpectedTimeValuesForwardOneDay();
85373714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DTEND, (Long)null);
85473714169d34a55fc01e14b30897a1ebbacf9934eErik        // This is tested elsewhere, used for convenience here
85573714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.updatePastEvents(expectedOps, mModel2, mModel1.mOriginalStart);
85673714169d34a55fc01e14b30897a1ebbacf9934eErik
85773714169d34a55fc01e14b30897a1ebbacf9934eErik        br_id = expectedOps.size();
85873714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(ContentProviderOperation
85973714169d34a55fc01e14b30897a1ebbacf9934eErik                .newInsert(Events.CONTENT_URI)
86073714169d34a55fc01e14b30897a1ebbacf9934eErik                .withValues(mExpectedValues)
86173714169d34a55fc01e14b30897a1ebbacf9934eErik                .build());
86273714169d34a55fc01e14b30897a1ebbacf9934eErik
86373714169d34a55fc01e14b30897a1ebbacf9934eErik        // This call has a separate unit test so we'll use it to simplify making the expected vals
864fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        mHelper.saveRemindersWithBackRef(expectedOps, br_id, mModel1.mReminders,
865fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mModel2.mReminders, true);
86673714169d34a55fc01e14b30897a1ebbacf9934eErik
86773714169d34a55fc01e14b30897a1ebbacf9934eErik        addOwnerAttendeeToOps(expectedOps, br_id);
86873714169d34a55fc01e14b30897a1ebbacf9934eErik
86973714169d34a55fc01e14b30897a1ebbacf9934eErik        addTestAttendees(expectedOps, true, br_id);
87073714169d34a55fc01e14b30897a1ebbacf9934eErik
87173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
87273714169d34a55fc01e14b30897a1ebbacf9934eErik        return true;
87373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
87473714169d34a55fc01e14b30897a1ebbacf9934eErik
8757e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
87673714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
87773714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testGetAddressesFromList() {
87837960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
87937960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
88073714169d34a55fc01e14b30897a1ebbacf9934eErik
88173714169d34a55fc01e14b30897a1ebbacf9934eErik        LinkedHashSet<Rfc822Token> expected = new LinkedHashSet<Rfc822Token>();
88273714169d34a55fc01e14b30897a1ebbacf9934eErik        expected.add(new Rfc822Token(null, "ad1@email.com", ""));
88373714169d34a55fc01e14b30897a1ebbacf9934eErik        expected.add(new Rfc822Token("First Last", "first@email.com", "comment"));
88473714169d34a55fc01e14b30897a1ebbacf9934eErik        expected.add(new Rfc822Token(null, "one.two.three@email.grue", ""));
88573714169d34a55fc01e14b30897a1ebbacf9934eErik
886f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        LinkedHashSet<Rfc822Token> actual = mHelper.getAddressesFromList(TEST_ADDRESSES,
887f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting                new Rfc822Validator(null));
888f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        assertEquals(expected, actual);
88973714169d34a55fc01e14b30897a1ebbacf9934eErik    }
89073714169d34a55fc01e14b30897a1ebbacf9934eErik
8917e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
89273714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
893e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    public void testConstructDefaultStartTime() {
894e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        mActivity = buildTestContext();
895e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        mHelper = new EditEventHelper(mActivity, null);
896e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
897e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        long now = 0;
898e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        long expected = now + 30 * DateUtils.MINUTE_IN_MILLIS;
899e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultStartTime(now));
900e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
901e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        // 2:00 -> 2:30
902e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        now = 1262340000000L; // Fri Jan 01 2010 02:00:00 GMT-0800 (PST)
903e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        expected = now + 30 * DateUtils.MINUTE_IN_MILLIS;
904e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultStartTime(now));
905e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
906e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        // 2:01 -> 2:30
907e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        now += DateUtils.MINUTE_IN_MILLIS;
908e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultStartTime(now));
909e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
910e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        // 2:02 -> 2:30
911e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        now += DateUtils.MINUTE_IN_MILLIS;
912e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultStartTime(now));
913e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
914e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        // 2:32 -> 3:00
915e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        now += 30 * DateUtils.MINUTE_IN_MILLIS;
916e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        expected += 30 * DateUtils.MINUTE_IN_MILLIS;
917e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultStartTime(now));
918e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
919e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        // 2:33 -> 3:00
920e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        now += DateUtils.MINUTE_IN_MILLIS;
921e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultStartTime(now));
922e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
923e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    }
924e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
925e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    @Smoke
926e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    @SmallTest
927e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    public void testConstructDefaultEndTime() {
928e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        mActivity = buildTestContext();
929e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        mHelper = new EditEventHelper(mActivity, null);
930e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
931e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        long start = 1262340000000L;
932e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        long expected = start + DateUtils.HOUR_IN_MILLIS;
933e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang        assertEquals(expected, mHelper.constructDefaultEndTime(start));
934e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    }
935e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang
936e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    @Smoke
937e700c16ec2464cbba86f91f8f757ae59cbed34b0Mason Tang    @SmallTest
93873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testCheckTimeDependentFieldsNoChanges() {
93937960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
94037960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
94173714169d34a55fc01e14b30897a1ebbacf9934eErik
94273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
94373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
94473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = null;
94573714169d34a55fc01e14b30897a1ebbacf9934eErik
94673714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues = buildTestValues();
94773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
94873714169d34a55fc01e14b30897a1ebbacf9934eErik
94973714169d34a55fc01e14b30897a1ebbacf9934eErik        // if any time/recurrence vals are different but there's no new rrule it
95073714169d34a55fc01e14b30897a1ebbacf9934eErik        // shouldn't change
95173714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel2, mValues, EditEventHelper.MODIFY_ALL);
95273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mValues, mExpectedValues);
95373714169d34a55fc01e14b30897a1ebbacf9934eErik
95473714169d34a55fc01e14b30897a1ebbacf9934eErik        // also, if vals are different and it's not modifying all it shouldn't
95573714169d34a55fc01e14b30897a1ebbacf9934eErik        // change.
95673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = "something else";
95773714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel2, mValues,
95873714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_SELECTED);
95973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mValues, mExpectedValues);
96073714169d34a55fc01e14b30897a1ebbacf9934eErik
96173714169d34a55fc01e14b30897a1ebbacf9934eErik        // if vals changed and modify all is selected dtstart should be updated
96273714169d34a55fc01e14b30897a1ebbacf9934eErik        // by the difference
96373714169d34a55fc01e14b30897a1ebbacf9934eErik        // between originalStart and start
96473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mOriginalStart = mModel2.mStart + 60000; // set the old time to
96573714169d34a55fc01e14b30897a1ebbacf9934eErik                                                         // one minute later
96673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mStart += 120000; // move the event another 1 minute.
96773714169d34a55fc01e14b30897a1ebbacf9934eErik
96873714169d34a55fc01e14b30897a1ebbacf9934eErik        // shouldn't change for an allday event
96973714169d34a55fc01e14b30897a1ebbacf9934eErik        // expectedVals.put(Events.DTSTART, mModel1.mStart + 60000); // should
97073714169d34a55fc01e14b30897a1ebbacf9934eErik        // now be 1 minute later
97173714169d34a55fc01e14b30897a1ebbacf9934eErik        // dtstart2 shouldn't change since it gets rezeroed in the local
97273714169d34a55fc01e14b30897a1ebbacf9934eErik        // timezone for allDay events
97373714169d34a55fc01e14b30897a1ebbacf9934eErik
97473714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel2, mValues,
97573714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_SELECTED);
97673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mValues, mExpectedValues);
97773714169d34a55fc01e14b30897a1ebbacf9934eErik    }
97873714169d34a55fc01e14b30897a1ebbacf9934eErik
9797e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
98073714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
98173714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testCheckTimeDependentFieldsChanges() {
98237960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
98337960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
98473714169d34a55fc01e14b30897a1ebbacf9934eErik
98573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
98673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
98773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = null;
98873714169d34a55fc01e14b30897a1ebbacf9934eErik
98973714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues = buildTestValues();
99073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
99173714169d34a55fc01e14b30897a1ebbacf9934eErik
99273714169d34a55fc01e14b30897a1ebbacf9934eErik        // if all the time values are the same it should remove them from vals
99373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = mModel1.mRrule;
99473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mStart = mModel1.mStart;
99573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mOriginalStart = mModel2.mStart;
99673714169d34a55fc01e14b30897a1ebbacf9934eErik
99773714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.remove(Events.DTSTART);
99873714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.remove(Events.DTEND);
99973714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.remove(Events.DURATION);
100073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.remove(Events.ALL_DAY);
100173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.remove(Events.RRULE);
100273714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.remove(Events.EVENT_TIMEZONE);
100373714169d34a55fc01e14b30897a1ebbacf9934eErik
100473714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.checkTimeDependentFields(mModel1, mModel2, mValues,
100573714169d34a55fc01e14b30897a1ebbacf9934eErik                EditEventHelper.MODIFY_SELECTED);
100673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mValues, mExpectedValues);
100773714169d34a55fc01e14b30897a1ebbacf9934eErik
100873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
100973714169d34a55fc01e14b30897a1ebbacf9934eErik
10107e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
101173714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
101273714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testUpdatePastEvents() {
101373714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
101473714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
1015eca82e9468c002590045338f98588ad3ce1a0bb3Erik        long initialBeginTime = 1472864400000L; // Sep 3, 2016, 12AM UTC time
101673714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues = new ContentValues();
101773714169d34a55fc01e14b30897a1ebbacf9934eErik
101873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
101959ead671b50514b49749fcd6a1d4186a270239d2Erik        mModel1.mUri = (AUTHORITY_URI + TEST_EVENT_ID);
102037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
102137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
102273714169d34a55fc01e14b30897a1ebbacf9934eErik
102373714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Events.RRULE, "FREQ=DAILY;UNTIL=20160903;WKST=SU"); // yyyymmddThhmmssZ
1024eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mValues.put(Events.DTSTART, TEST_START);
102573714169d34a55fc01e14b30897a1ebbacf9934eErik
102659ead671b50514b49749fcd6a1d4186a270239d2Erik        ContentProviderOperation.Builder b = ContentProviderOperation.newUpdate(
102759ead671b50514b49749fcd6a1d4186a270239d2Erik                Uri.parse(mModel1.mUri)).withValues(mValues);
102873714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
102973714169d34a55fc01e14b30897a1ebbacf9934eErik
103073714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.updatePastEvents(ops, mModel1, initialBeginTime);
103173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
103273714169d34a55fc01e14b30897a1ebbacf9934eErik
103373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mAllDay = false;
103473714169d34a55fc01e14b30897a1ebbacf9934eErik
103573714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Events.RRULE, "FREQ=DAILY;UNTIL=20160903T005959Z;WKST=SU"); // yyyymmddThhmmssZ
103673714169d34a55fc01e14b30897a1ebbacf9934eErik
103773714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.clear();
103859ead671b50514b49749fcd6a1d4186a270239d2Erik        b = ContentProviderOperation.newUpdate(Uri.parse(mModel1.mUri)).withValues(mValues);
103973714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
104073714169d34a55fc01e14b30897a1ebbacf9934eErik
104173714169d34a55fc01e14b30897a1ebbacf9934eErik        ops.clear();
104273714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.updatePastEvents(ops, mModel1, initialBeginTime);
104373714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
104473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
104573714169d34a55fc01e14b30897a1ebbacf9934eErik
10467e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
104773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
104873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testConstructReminderLabel() {
104937960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
105073714169d34a55fc01e14b30897a1ebbacf9934eErik
1051ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden        String label = EventViewUtils.constructReminderLabel(mActivity, 35, true);
105273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(label, "35 mins");
105373714169d34a55fc01e14b30897a1ebbacf9934eErik
1054ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden        label = EventViewUtils.constructReminderLabel(mActivity, 72, false);
105573714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(label, "72 minutes");
105673714169d34a55fc01e14b30897a1ebbacf9934eErik
1057ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden        label = EventViewUtils.constructReminderLabel(mActivity, 60, true);
105873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(label, "1 hours");
105973714169d34a55fc01e14b30897a1ebbacf9934eErik
1060ae5bcce4a24c1ef3a2db2493b3dedd64a6aa35ffAndy McFadden        label = EventViewUtils.constructReminderLabel(mActivity, 60 * 48, true);
106173714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(label, "2 days");
106273714169d34a55fc01e14b30897a1ebbacf9934eErik    }
106373714169d34a55fc01e14b30897a1ebbacf9934eErik
10647e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
106573714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
106673714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testIsSameEvent() {
106773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = new CalendarEventModel();
106873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = new CalendarEventModel();
106973714169d34a55fc01e14b30897a1ebbacf9934eErik
107073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mId = 1;
107173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mCalendarId = 1;
107273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mId = 1;
107373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mCalendarId = 1;
107473714169d34a55fc01e14b30897a1ebbacf9934eErik
107573714169d34a55fc01e14b30897a1ebbacf9934eErik        // considered the same if the event and calendar ids both match
107673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(EditEventHelper.isSameEvent(mModel1, mModel2));
107773714169d34a55fc01e14b30897a1ebbacf9934eErik
107873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mId = 2;
107973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(EditEventHelper.isSameEvent(mModel1, mModel2));
108073714169d34a55fc01e14b30897a1ebbacf9934eErik
108173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mId = 1;
108273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mCalendarId = 2;
108373714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(EditEventHelper.isSameEvent(mModel1, mModel2));
108473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
108573714169d34a55fc01e14b30897a1ebbacf9934eErik
10867e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
108773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
108873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveReminders() {
108973714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
109073714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
109173714169d34a55fc01e14b30897a1ebbacf9934eErik        long eventId = TEST_EVENT_ID;
1092fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        ArrayList<ReminderEntry> reminders = new ArrayList<ReminderEntry>();
1093fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        ArrayList<ReminderEntry> originalReminders = new ArrayList<ReminderEntry>();
109473714169d34a55fc01e14b30897a1ebbacf9934eErik        boolean forceSave = true;
109573714169d34a55fc01e14b30897a1ebbacf9934eErik        boolean result;
109637960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
109737960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
109873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertNotNull(mHelper);
109973714169d34a55fc01e14b30897a1ebbacf9934eErik
110073714169d34a55fc01e14b30897a1ebbacf9934eErik        // First test forcing a delete with no reminders.
110173714169d34a55fc01e14b30897a1ebbacf9934eErik        String where = Reminders.EVENT_ID + "=?";
110273714169d34a55fc01e14b30897a1ebbacf9934eErik        String[] args = new String[] {Long.toString(eventId)};
110373714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b =
110473714169d34a55fc01e14b30897a1ebbacf9934eErik                ContentProviderOperation.newDelete(Reminders.CONTENT_URI);
110573714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withSelection(where, args);
110673714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
110773714169d34a55fc01e14b30897a1ebbacf9934eErik
1108fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        result = mHelper.saveReminders(ops, eventId, reminders, originalReminders, forceSave);
110973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(result);
1110f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        assertEquals(expectedOps, ops);
111173714169d34a55fc01e14b30897a1ebbacf9934eErik
111273714169d34a55fc01e14b30897a1ebbacf9934eErik        // Now test calling save with identical reminders and no forcing
1113fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        reminders.add(ReminderEntry.valueOf(5));
1114fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        reminders.add(ReminderEntry.valueOf(10));
1115fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        reminders.add(ReminderEntry.valueOf(15));
111673714169d34a55fc01e14b30897a1ebbacf9934eErik
1117fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.add(ReminderEntry.valueOf(5));
1118fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.add(ReminderEntry.valueOf(10));
1119fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.add(ReminderEntry.valueOf(15));
112073714169d34a55fc01e14b30897a1ebbacf9934eErik
112173714169d34a55fc01e14b30897a1ebbacf9934eErik        forceSave = false;
112273714169d34a55fc01e14b30897a1ebbacf9934eErik
112373714169d34a55fc01e14b30897a1ebbacf9934eErik        ops.clear();
112473714169d34a55fc01e14b30897a1ebbacf9934eErik
112573714169d34a55fc01e14b30897a1ebbacf9934eErik        // Should fail to create any ops since nothing changed
1126fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        result = mHelper.saveReminders(ops, eventId, reminders, originalReminders, forceSave);
112773714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(result);
112873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops.size(), 0);
112973714169d34a55fc01e14b30897a1ebbacf9934eErik
113073714169d34a55fc01e14b30897a1ebbacf9934eErik        //Now test adding a single reminder
1131fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.remove(2);
113273714169d34a55fc01e14b30897a1ebbacf9934eErik
113373714169d34a55fc01e14b30897a1ebbacf9934eErik        addExpectedMinutes(expectedOps);
113473714169d34a55fc01e14b30897a1ebbacf9934eErik
1135fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        result = mHelper.saveReminders(ops, eventId, reminders, originalReminders, forceSave);
113673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(result);
1137f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        assertEquals(expectedOps, ops);
113873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
113973714169d34a55fc01e14b30897a1ebbacf9934eErik
11407e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
114173714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
114273714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSaveRemindersWithBackRef() {
114373714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
114473714169d34a55fc01e14b30897a1ebbacf9934eErik        ArrayList<ContentProviderOperation> expectedOps = new ArrayList<ContentProviderOperation>();
114573714169d34a55fc01e14b30897a1ebbacf9934eErik        long eventId = TEST_EVENT_ID;
1146fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        ArrayList<ReminderEntry> reminders = new ArrayList<ReminderEntry>();
1147fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        ArrayList<ReminderEntry> originalReminders = new ArrayList<ReminderEntry>();
114873714169d34a55fc01e14b30897a1ebbacf9934eErik        boolean forceSave = true;
114973714169d34a55fc01e14b30897a1ebbacf9934eErik        boolean result;
115037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
115137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
115273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertNotNull(mHelper);
115373714169d34a55fc01e14b30897a1ebbacf9934eErik
115473714169d34a55fc01e14b30897a1ebbacf9934eErik        // First test forcing a delete with no reminders.
115573714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b =
115673714169d34a55fc01e14b30897a1ebbacf9934eErik                ContentProviderOperation.newDelete(Reminders.CONTENT_URI);
115773714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withSelection(Reminders.EVENT_ID + "=?", new String[1]);
115873714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withSelectionBackReference(0, TEST_EVENT_INDEX_ID);
115973714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
116073714169d34a55fc01e14b30897a1ebbacf9934eErik
116173714169d34a55fc01e14b30897a1ebbacf9934eErik        result =
1162fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                mHelper.saveRemindersWithBackRef(ops, TEST_EVENT_INDEX_ID, reminders,
1163fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden                        originalReminders, forceSave);
116473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(result);
116573714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
116673714169d34a55fc01e14b30897a1ebbacf9934eErik
116773714169d34a55fc01e14b30897a1ebbacf9934eErik        // Now test calling save with identical reminders and no forcing
1168fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        reminders.add(ReminderEntry.valueOf(5));
1169fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        reminders.add(ReminderEntry.valueOf(10));
1170fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        reminders.add(ReminderEntry.valueOf(15));
117173714169d34a55fc01e14b30897a1ebbacf9934eErik
1172fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.add(ReminderEntry.valueOf(5));
1173fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.add(ReminderEntry.valueOf(10));
1174fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.add(ReminderEntry.valueOf(15));
117573714169d34a55fc01e14b30897a1ebbacf9934eErik
117673714169d34a55fc01e14b30897a1ebbacf9934eErik        forceSave = false;
117773714169d34a55fc01e14b30897a1ebbacf9934eErik
117873714169d34a55fc01e14b30897a1ebbacf9934eErik        ops.clear();
117973714169d34a55fc01e14b30897a1ebbacf9934eErik
1180fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        result = mHelper.saveRemindersWithBackRef(ops, ops.size(), reminders, originalReminders,
118173714169d34a55fc01e14b30897a1ebbacf9934eErik                        forceSave);
118273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(result);
118373714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops.size(), 0);
118473714169d34a55fc01e14b30897a1ebbacf9934eErik
118573714169d34a55fc01e14b30897a1ebbacf9934eErik        //Now test adding a single reminder
1186fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        originalReminders.remove(2);
118773714169d34a55fc01e14b30897a1ebbacf9934eErik
118873714169d34a55fc01e14b30897a1ebbacf9934eErik        addExpectedMinutesWithBackRef(expectedOps);
118973714169d34a55fc01e14b30897a1ebbacf9934eErik
1190fea9af5d69ad3e5687a4efd72d7d3adfb8d056c8Andy McFadden        result = mHelper.saveRemindersWithBackRef(ops, ops.size(), reminders, originalReminders,
119173714169d34a55fc01e14b30897a1ebbacf9934eErik                        forceSave);
119273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(result);
119373714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(ops, expectedOps);
119473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
119573714169d34a55fc01e14b30897a1ebbacf9934eErik
11967e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
119773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
119873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testIsFirstEventInSeries() {
119973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = new CalendarEventModel();
120073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = new CalendarEventModel();
120173714169d34a55fc01e14b30897a1ebbacf9934eErik
120273714169d34a55fc01e14b30897a1ebbacf9934eErik        // It's considered the first event if the original start of the new model matches the
120373714169d34a55fc01e14b30897a1ebbacf9934eErik        // start of the old model
120473714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mOriginalStart = 100;
120573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart = 200;
120673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mOriginalStart = 100;
120773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mStart = 100;
120873714169d34a55fc01e14b30897a1ebbacf9934eErik
120973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertTrue(EditEventHelper.isFirstEventInSeries(mModel1, mModel2));
121073714169d34a55fc01e14b30897a1ebbacf9934eErik
121173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mOriginalStart = 80;
121273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertFalse(EditEventHelper.isFirstEventInSeries(mModel1, mModel2));
121373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
121473714169d34a55fc01e14b30897a1ebbacf9934eErik
12157e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
121673714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
121773714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testAddRecurrenceRule() {
121837960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
121937960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
122073714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues = new ContentValues();
122173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = new ContentValues();
122273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = new CalendarEventModel();
122373714169d34a55fc01e14b30897a1ebbacf9934eErik
122473714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.RRULE, "Weekly, Monday");
122573714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DURATION, "P60S");
122673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DTEND, (Long) null);
122773714169d34a55fc01e14b30897a1ebbacf9934eErik
122873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = "Weekly, Monday";
122973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart = 1;
123073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mEnd = 60001;
123173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mAllDay = false;
123273714169d34a55fc01e14b30897a1ebbacf9934eErik
123373714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.addRecurrenceRule(mValues, mModel1);
123473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mValues, mExpectedValues);
123573714169d34a55fc01e14b30897a1ebbacf9934eErik
123673714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DURATION, "P1D");
123773714169d34a55fc01e14b30897a1ebbacf9934eErik
123873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mAllDay = true;
123973714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
124073714169d34a55fc01e14b30897a1ebbacf9934eErik
124173714169d34a55fc01e14b30897a1ebbacf9934eErik        mHelper.addRecurrenceRule(mValues, mModel1);
124273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mValues, mExpectedValues);
124373714169d34a55fc01e14b30897a1ebbacf9934eErik
124473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
124573714169d34a55fc01e14b30897a1ebbacf9934eErik
12467e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
124773714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
124873714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testUpdateRecurrenceRule() {
124973714169d34a55fc01e14b30897a1ebbacf9934eErik        int selection = EditEventHelper.DOES_NOT_REPEAT;
12508e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        int weekStart = Calendar.SUNDAY;
125173714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = new CalendarEventModel();
125273714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mTimezone = Time.TIMEZONE_UTC;
125373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mStart = 1272665741000L; // Fri, April 30th ~ 3:17PM
125473714169d34a55fc01e14b30897a1ebbacf9934eErik
125573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = "This should go away";
125673714169d34a55fc01e14b30897a1ebbacf9934eErik
12578e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
125873714169d34a55fc01e14b30897a1ebbacf9934eErik        assertNull(mModel1.mRrule);
125973714169d34a55fc01e14b30897a1ebbacf9934eErik
126073714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = "This shouldn't change";
126173714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_CUSTOM;
126273714169d34a55fc01e14b30897a1ebbacf9934eErik
12638e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
126473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "This shouldn't change");
126573714169d34a55fc01e14b30897a1ebbacf9934eErik
126673714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_DAILY;
126773714169d34a55fc01e14b30897a1ebbacf9934eErik
12688e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
126973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "FREQ=DAILY;WKST=SU");
127073714169d34a55fc01e14b30897a1ebbacf9934eErik
127173714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_EVERY_WEEKDAY;
127273714169d34a55fc01e14b30897a1ebbacf9934eErik
12738e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
127473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "FREQ=WEEKLY;WKST=SU;BYDAY=MO,TU,WE,TH,FR");
127573714169d34a55fc01e14b30897a1ebbacf9934eErik
127673714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_WEEKLY_ON_DAY;
127773714169d34a55fc01e14b30897a1ebbacf9934eErik
12788e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
127973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "FREQ=WEEKLY;WKST=SU;BYDAY=FR");
128073714169d34a55fc01e14b30897a1ebbacf9934eErik
128173714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_MONTHLY_ON_DAY;
128273714169d34a55fc01e14b30897a1ebbacf9934eErik
12838e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
128473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "FREQ=MONTHLY;WKST=SU;BYMONTHDAY=30");
128573714169d34a55fc01e14b30897a1ebbacf9934eErik
128673714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_MONTHLY_ON_DAY_COUNT;
128773714169d34a55fc01e14b30897a1ebbacf9934eErik
12888e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
128973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "FREQ=MONTHLY;WKST=SU;BYDAY=-1FR");
129073714169d34a55fc01e14b30897a1ebbacf9934eErik
129173714169d34a55fc01e14b30897a1ebbacf9934eErik        selection = EditEventHelper.REPEATS_YEARLY;
129273714169d34a55fc01e14b30897a1ebbacf9934eErik
12938e3d430a020744faa21bf4ca24f1a99c36ec5c4fMason Tang        EditEventHelper.updateRecurrenceRule(selection, mModel1, weekStart);
129473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1.mRrule, "FREQ=YEARLY;WKST=SU");
129573714169d34a55fc01e14b30897a1ebbacf9934eErik    }
129673714169d34a55fc01e14b30897a1ebbacf9934eErik
12977e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
129873714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
129973714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testSetModelFromCursor() {
130037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
130137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
130273714169d34a55fc01e14b30897a1ebbacf9934eErik        MatrixCursor c = new MatrixCursor(EditEventHelper.EVENT_PROJECTION);
130373714169d34a55fc01e14b30897a1ebbacf9934eErik        c.addRow(TEST_CURSOR_DATA);
130473714169d34a55fc01e14b30897a1ebbacf9934eErik
130573714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = new CalendarEventModel();
130673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2 = buildTestModel();
130773714169d34a55fc01e14b30897a1ebbacf9934eErik
130888c483a0189cbe7132330cb1b563f07326f3bcf9Erik        EditEventHelper.setModelFromCursor(mModel1, c);
130973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1, mModel2);
131073714169d34a55fc01e14b30897a1ebbacf9934eErik
131173714169d34a55fc01e14b30897a1ebbacf9934eErik        TEST_CURSOR_DATA[EditEventHelper.EVENT_INDEX_ALL_DAY] = "0";
131273714169d34a55fc01e14b30897a1ebbacf9934eErik        c.close();
131373714169d34a55fc01e14b30897a1ebbacf9934eErik        c = new MatrixCursor(EditEventHelper.EVENT_PROJECTION);
131473714169d34a55fc01e14b30897a1ebbacf9934eErik        c.addRow(TEST_CURSOR_DATA);
131573714169d34a55fc01e14b30897a1ebbacf9934eErik
131673714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mAllDay = false;
1317eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel2.mStart = TEST_START; // UTC time
131873714169d34a55fc01e14b30897a1ebbacf9934eErik
131988c483a0189cbe7132330cb1b563f07326f3bcf9Erik        EditEventHelper.setModelFromCursor(mModel1, c);
132073714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1, mModel2);
132173714169d34a55fc01e14b30897a1ebbacf9934eErik
132273714169d34a55fc01e14b30897a1ebbacf9934eErik        TEST_CURSOR_DATA[EditEventHelper.EVENT_INDEX_RRULE] = null;
132373714169d34a55fc01e14b30897a1ebbacf9934eErik        c.close();
132473714169d34a55fc01e14b30897a1ebbacf9934eErik        c = new MatrixCursor(EditEventHelper.EVENT_PROJECTION);
132573714169d34a55fc01e14b30897a1ebbacf9934eErik        c.addRow(TEST_CURSOR_DATA);
132673714169d34a55fc01e14b30897a1ebbacf9934eErik
132773714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mRrule = null;
132873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mEnd = TEST_END;
132973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mDuration = null;
133073714169d34a55fc01e14b30897a1ebbacf9934eErik
133188c483a0189cbe7132330cb1b563f07326f3bcf9Erik        EditEventHelper.setModelFromCursor(mModel1, c);
133273714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1, mModel2);
133373714169d34a55fc01e14b30897a1ebbacf9934eErik
133473714169d34a55fc01e14b30897a1ebbacf9934eErik        TEST_CURSOR_DATA[EditEventHelper.EVENT_INDEX_ALL_DAY] = "1";
133573714169d34a55fc01e14b30897a1ebbacf9934eErik        c.close();
133673714169d34a55fc01e14b30897a1ebbacf9934eErik        c = new MatrixCursor(EditEventHelper.EVENT_PROJECTION);
133773714169d34a55fc01e14b30897a1ebbacf9934eErik        c.addRow(TEST_CURSOR_DATA);
133873714169d34a55fc01e14b30897a1ebbacf9934eErik
133973714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel2.mAllDay = true;
1340eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel2.mStart = TEST_START; // Monday, May 3rd, midnight
1341eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel2.mEnd = TEST_END; // Tuesday, May 4th, midnight
134273714169d34a55fc01e14b30897a1ebbacf9934eErik
134388c483a0189cbe7132330cb1b563f07326f3bcf9Erik        EditEventHelper.setModelFromCursor(mModel1, c);
134473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(mModel1, mModel2);
134573714169d34a55fc01e14b30897a1ebbacf9934eErik    }
134673714169d34a55fc01e14b30897a1ebbacf9934eErik
13477e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
134873714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
134973714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testGetContentValuesFromModel() {
135037960c091b5912dd45beb561a85a9064ea42e616Erik        mActivity = buildTestContext();
135137960c091b5912dd45beb561a85a9064ea42e616Erik        mHelper = new EditEventHelper(mActivity, null);
135273714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues = buildTestValues();
135373714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1 = buildTestModel();
135473714169d34a55fc01e14b30897a1ebbacf9934eErik
135573714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentValues values = mHelper.getContentValuesFromModel(mModel1);
135673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(values, mExpectedValues);
135773714169d34a55fc01e14b30897a1ebbacf9934eErik
135873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mRrule = null;
1359eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mModel1.mEnd = TEST_END;
136073714169d34a55fc01e14b30897a1ebbacf9934eErik
136173714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.RRULE, (String) null);
136273714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DURATION, (String) null);
136373714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.DTEND, TEST_END); // UTC time
136473714169d34a55fc01e14b30897a1ebbacf9934eErik
136573714169d34a55fc01e14b30897a1ebbacf9934eErik        values = mHelper.getContentValuesFromModel(mModel1);
136673714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(values, mExpectedValues);
136773714169d34a55fc01e14b30897a1ebbacf9934eErik
136873714169d34a55fc01e14b30897a1ebbacf9934eErik        mModel1.mAllDay = false;
136973714169d34a55fc01e14b30897a1ebbacf9934eErik
137073714169d34a55fc01e14b30897a1ebbacf9934eErik        mExpectedValues.put(Events.ALL_DAY, 0);
1371eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mExpectedValues.put(Events.DTSTART, TEST_START);
1372eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mExpectedValues.put(Events.DTEND, TEST_END);
137373714169d34a55fc01e14b30897a1ebbacf9934eErik        // not an allday event so timezone isn't modified
1374eca82e9468c002590045338f98588ad3ce1a0bb3Erik        mExpectedValues.put(Events.EVENT_TIMEZONE, "UTC");
137573714169d34a55fc01e14b30897a1ebbacf9934eErik
137673714169d34a55fc01e14b30897a1ebbacf9934eErik        values = mHelper.getContentValuesFromModel(mModel1);
137773714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(values, mExpectedValues);
137873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
137973714169d34a55fc01e14b30897a1ebbacf9934eErik
13807e4b2c1ddb6680d5b413c5f25592b0128e5f14dcMichael Chan    @Smoke
138173714169d34a55fc01e14b30897a1ebbacf9934eErik    @SmallTest
138273714169d34a55fc01e14b30897a1ebbacf9934eErik    public void testExtractDomain() {
138373714169d34a55fc01e14b30897a1ebbacf9934eErik        String domain = EditEventHelper.extractDomain("test.email@gmail.com");
138473714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(domain, "gmail.com");
138573714169d34a55fc01e14b30897a1ebbacf9934eErik
138673714169d34a55fc01e14b30897a1ebbacf9934eErik        domain = EditEventHelper.extractDomain("bademail.no#$%at symbol");
138773714169d34a55fc01e14b30897a1ebbacf9934eErik        assertNull(domain);
138873714169d34a55fc01e14b30897a1ebbacf9934eErik    }
138973714169d34a55fc01e14b30897a1ebbacf9934eErik
139073714169d34a55fc01e14b30897a1ebbacf9934eErik    private void addExpectedMinutes(ArrayList<ContentProviderOperation> expectedOps) {
139173714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b;
139273714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues = new ContentValues();
139373714169d34a55fc01e14b30897a1ebbacf9934eErik
139473714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
139573714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.MINUTES, 5);
1396f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        mValues.put(Reminders.METHOD, Reminders.METHOD_DEFAULT);
139773714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.EVENT_ID, TEST_EVENT_ID);
139873714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Reminders.CONTENT_URI).withValues(mValues);
139973714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
140073714169d34a55fc01e14b30897a1ebbacf9934eErik
140173714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
140273714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.MINUTES, 10);
1403f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        mValues.put(Reminders.METHOD, Reminders.METHOD_DEFAULT);
140473714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.EVENT_ID, TEST_EVENT_ID);
140573714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Reminders.CONTENT_URI).withValues(mValues);
140673714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
140773714169d34a55fc01e14b30897a1ebbacf9934eErik
140873714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
140973714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.MINUTES, 15);
1410f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        mValues.put(Reminders.METHOD, Reminders.METHOD_DEFAULT);
141173714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.EVENT_ID, TEST_EVENT_ID);
141273714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Reminders.CONTENT_URI).withValues(mValues);
141373714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
141473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
141573714169d34a55fc01e14b30897a1ebbacf9934eErik
141673714169d34a55fc01e14b30897a1ebbacf9934eErik    private void addExpectedMinutesWithBackRef(ArrayList<ContentProviderOperation> expectedOps) {
141773714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentProviderOperation.Builder b;
141873714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues = new ContentValues();
141973714169d34a55fc01e14b30897a1ebbacf9934eErik
142073714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
142173714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.MINUTES, 5);
1422f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        mValues.put(Reminders.METHOD, Reminders.METHOD_DEFAULT);
142373714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Reminders.CONTENT_URI).withValues(mValues);
142473714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withValueBackReference(Reminders.EVENT_ID, TEST_EVENT_INDEX_ID);
142573714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
142673714169d34a55fc01e14b30897a1ebbacf9934eErik
142773714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
142873714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.MINUTES, 10);
1429f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        mValues.put(Reminders.METHOD, Reminders.METHOD_DEFAULT);
143073714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Reminders.CONTENT_URI).withValues(mValues);
143173714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withValueBackReference(Reminders.EVENT_ID, TEST_EVENT_INDEX_ID);
143273714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
143373714169d34a55fc01e14b30897a1ebbacf9934eErik
143473714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.clear();
143573714169d34a55fc01e14b30897a1ebbacf9934eErik        mValues.put(Reminders.MINUTES, 15);
1436f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting        mValues.put(Reminders.METHOD, Reminders.METHOD_DEFAULT);
143773714169d34a55fc01e14b30897a1ebbacf9934eErik        b = ContentProviderOperation.newInsert(Reminders.CONTENT_URI).withValues(mValues);
143873714169d34a55fc01e14b30897a1ebbacf9934eErik        b.withValueBackReference(Reminders.EVENT_ID, TEST_EVENT_INDEX_ID);
143973714169d34a55fc01e14b30897a1ebbacf9934eErik        expectedOps.add(b.build());
144073714169d34a55fc01e14b30897a1ebbacf9934eErik    }
144173714169d34a55fc01e14b30897a1ebbacf9934eErik
144273714169d34a55fc01e14b30897a1ebbacf9934eErik    private static void assertEquals(ArrayList<ContentProviderOperation> expected,
144373714169d34a55fc01e14b30897a1ebbacf9934eErik            ArrayList<ContentProviderOperation> actual) {
144473714169d34a55fc01e14b30897a1ebbacf9934eErik        if (expected == null) {
144573714169d34a55fc01e14b30897a1ebbacf9934eErik            assertNull(actual);
144673714169d34a55fc01e14b30897a1ebbacf9934eErik        }
144773714169d34a55fc01e14b30897a1ebbacf9934eErik        int size = expected.size();
144873714169d34a55fc01e14b30897a1ebbacf9934eErik
144973714169d34a55fc01e14b30897a1ebbacf9934eErik        assertEquals(size, actual.size());
145073714169d34a55fc01e14b30897a1ebbacf9934eErik
145173714169d34a55fc01e14b30897a1ebbacf9934eErik        for (int i = 0; i < size; i++) {
1452f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting            assertTrue("At index " + i + ", expected:\n" + String.valueOf(expected) +
1453f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting                    "\nActual:\n" + String.valueOf(actual),
1454f09a2bf6f6db31ca5a73150169085ecf6473ba85Sara Ting                    cpoEquals(expected.get(i), actual.get(i)));
145573714169d34a55fc01e14b30897a1ebbacf9934eErik        }
145673714169d34a55fc01e14b30897a1ebbacf9934eErik
145773714169d34a55fc01e14b30897a1ebbacf9934eErik    }
145873714169d34a55fc01e14b30897a1ebbacf9934eErik
145973714169d34a55fc01e14b30897a1ebbacf9934eErik    private static boolean cpoEquals(ContentProviderOperation cpo1, ContentProviderOperation cpo2) {
146073714169d34a55fc01e14b30897a1ebbacf9934eErik        if (cpo1 == null && cpo2 != null) {
146173714169d34a55fc01e14b30897a1ebbacf9934eErik            return false;
146273714169d34a55fc01e14b30897a1ebbacf9934eErik        }
146373714169d34a55fc01e14b30897a1ebbacf9934eErik        if (cpo1 == cpo2) {
146473714169d34a55fc01e14b30897a1ebbacf9934eErik            return true;
146573714169d34a55fc01e14b30897a1ebbacf9934eErik        }
146673714169d34a55fc01e14b30897a1ebbacf9934eErik        if (cpo2 == null) {
146773714169d34a55fc01e14b30897a1ebbacf9934eErik            return false;
146873714169d34a55fc01e14b30897a1ebbacf9934eErik        }
146973714169d34a55fc01e14b30897a1ebbacf9934eErik
147073714169d34a55fc01e14b30897a1ebbacf9934eErik        return TextUtils.equals(cpo1.toString(), cpo2.toString());
147173714169d34a55fc01e14b30897a1ebbacf9934eErik    }
147273714169d34a55fc01e14b30897a1ebbacf9934eErik
147373714169d34a55fc01e14b30897a1ebbacf9934eErik    // Generates a default model for testing. Should match up with
147473714169d34a55fc01e14b30897a1ebbacf9934eErik    // generateTestValues
147573714169d34a55fc01e14b30897a1ebbacf9934eErik    private CalendarEventModel buildTestModel() {
147673714169d34a55fc01e14b30897a1ebbacf9934eErik        CalendarEventModel model = new CalendarEventModel();
147773714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mId = TEST_EVENT_ID;
147873714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mTitle = "The Question";
147973714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mDescription = "Evaluating Life, the Universe, and Everything";
148073714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mLocation = "Earth Mk2";
148173714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mAllDay = true;
148273714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mHasAlarm = false;
148373714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mCalendarId = 2;
1484eca82e9468c002590045338f98588ad3ce1a0bb3Erik        model.mStart = TEST_START; // Monday, May 3rd, local Time
148573714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mDuration = "P3652421990D";
14866ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        // The model uses the local timezone for allday
1487eca82e9468c002590045338f98588ad3ce1a0bb3Erik        model.mTimezone = "UTC";
148873714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mRrule = "FREQ=DAILY;WKST=SU";
148973714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mSyncId = "unique per calendar stuff";
1490c6680c5819b6ad0d1914420902746fe5f86ba403RoboErik        model.mAvailability = 0;
1491ced0eb67ef49c3203f72520c296e73d9cb4f654bMichael Chan        model.mAccessLevel = 2; // This is one less than the values written if >0
149273714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mOwnerAccount = "steve@gmail.com";
149373714169d34a55fc01e14b30897a1ebbacf9934eErik        model.mHasAttendeeData = true;
1494e3f85db16cfc50b25b97c64d8ab99820d579e5deMichael Chan        model.mEventStatus = Events.STATUS_CONFIRMED;
14955cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan        model.mOrganizer = "organizer@gmail.com";
14965cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan        model.mGuestsCanModify = false;
14975cde0374a28f91dd02e515d2956c6028144d0a9cMichael Chan        model.mModelUpdatedWithEventCursor = true;
149873714169d34a55fc01e14b30897a1ebbacf9934eErik        return model;
149973714169d34a55fc01e14b30897a1ebbacf9934eErik    }
150073714169d34a55fc01e14b30897a1ebbacf9934eErik
150173714169d34a55fc01e14b30897a1ebbacf9934eErik    // Generates a default set of values for testing. Should match up with
150273714169d34a55fc01e14b30897a1ebbacf9934eErik    // generateTestModel
150373714169d34a55fc01e14b30897a1ebbacf9934eErik    private ContentValues buildTestValues() {
150473714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentValues values = new ContentValues();
150573714169d34a55fc01e14b30897a1ebbacf9934eErik
150673714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.CALENDAR_ID, 2L);
150773714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.EVENT_TIMEZONE, "UTC"); // Allday events are converted
150873714169d34a55fc01e14b30897a1ebbacf9934eErik                                                  // to UTC for the db
150973714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.TITLE, "The Question");
151073714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.ALL_DAY, 1);
15116ae7d69b90f22fd51ab677036ba987dbdc35a62dErik        values.put(Events.DTSTART, TEST_START); // Monday, May 3rd, midnight UTC time
151288c483a0189cbe7132330cb1b563f07326f3bcf9Erik        values.put(Events.HAS_ATTENDEE_DATA, 1);
15136ae7d69b90f22fd51ab677036ba987dbdc35a62dErik
151473714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.RRULE, "FREQ=DAILY;WKST=SU");
151573714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.DURATION, "P3652421990D");
151673714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.DTEND, (Long) null);
151773714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.DESCRIPTION, "Evaluating Life, the Universe, and Everything");
151873714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.EVENT_LOCATION, "Earth Mk2");
15190e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik        values.put(Events.AVAILABILITY, 0);
1520e3f85db16cfc50b25b97c64d8ab99820d579e5deMichael Chan        values.put(Events.STATUS, Events.STATUS_CONFIRMED);
15210e1e62408b96e1532eb6f6a609ae4c817751aaf3RoboErik        values.put(Events.ACCESS_LEVEL, 3); // This is one more than the model if
152273714169d34a55fc01e14b30897a1ebbacf9934eErik                                          // >0
152373714169d34a55fc01e14b30897a1ebbacf9934eErik
152473714169d34a55fc01e14b30897a1ebbacf9934eErik        return values;
152573714169d34a55fc01e14b30897a1ebbacf9934eErik    }
152673714169d34a55fc01e14b30897a1ebbacf9934eErik
152773714169d34a55fc01e14b30897a1ebbacf9934eErik    private ContentValues buildNonRecurringTestValues() {
152873714169d34a55fc01e14b30897a1ebbacf9934eErik        ContentValues values = buildTestValues();
152973714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.DURATION, (String)null);
153073714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.DTEND, TEST_END);
153173714169d34a55fc01e14b30897a1ebbacf9934eErik        values.put(Events.RRULE, (String)null);
153273714169d34a55fc01e14b30897a1ebbacf9934eErik        return values;
153373714169d34a55fc01e14b30897a1ebbacf9934eErik    }
153473714169d34a55fc01e14b30897a1ebbacf9934eErik
153573714169d34a55fc01e14b30897a1ebbacf9934eErik    // This gets called by EditEventHelper to read or write the data
153673714169d34a55fc01e14b30897a1ebbacf9934eErik    class TestProvider extends ContentProvider {
153773714169d34a55fc01e14b30897a1ebbacf9934eErik        int index = 0;
153873714169d34a55fc01e14b30897a1ebbacf9934eErik
153973714169d34a55fc01e14b30897a1ebbacf9934eErik        public TestProvider() {
154073714169d34a55fc01e14b30897a1ebbacf9934eErik        }
154173714169d34a55fc01e14b30897a1ebbacf9934eErik
154273714169d34a55fc01e14b30897a1ebbacf9934eErik        @Override
154373714169d34a55fc01e14b30897a1ebbacf9934eErik        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
154473714169d34a55fc01e14b30897a1ebbacf9934eErik                String orderBy) {
154573714169d34a55fc01e14b30897a1ebbacf9934eErik            return null;
154673714169d34a55fc01e14b30897a1ebbacf9934eErik        }
154773714169d34a55fc01e14b30897a1ebbacf9934eErik
154873714169d34a55fc01e14b30897a1ebbacf9934eErik        @Override
154973714169d34a55fc01e14b30897a1ebbacf9934eErik        public int delete(Uri uri, String selection, String[] selectionArgs) {
155073714169d34a55fc01e14b30897a1ebbacf9934eErik            return 0;
155173714169d34a55fc01e14b30897a1ebbacf9934eErik        }
155273714169d34a55fc01e14b30897a1ebbacf9934eErik
155373714169d34a55fc01e14b30897a1ebbacf9934eErik        @Override
155473714169d34a55fc01e14b30897a1ebbacf9934eErik        public String getType(Uri uri) {
155573714169d34a55fc01e14b30897a1ebbacf9934eErik            return null;
155673714169d34a55fc01e14b30897a1ebbacf9934eErik        }
155773714169d34a55fc01e14b30897a1ebbacf9934eErik
155873714169d34a55fc01e14b30897a1ebbacf9934eErik        @Override
155973714169d34a55fc01e14b30897a1ebbacf9934eErik        public boolean onCreate() {
156073714169d34a55fc01e14b30897a1ebbacf9934eErik            return false;
156173714169d34a55fc01e14b30897a1ebbacf9934eErik        }
156273714169d34a55fc01e14b30897a1ebbacf9934eErik
156373714169d34a55fc01e14b30897a1ebbacf9934eErik        @Override
156473714169d34a55fc01e14b30897a1ebbacf9934eErik        public Uri insert(Uri uri, ContentValues values) {
156573714169d34a55fc01e14b30897a1ebbacf9934eErik            // TODO Auto-generated method stub
156673714169d34a55fc01e14b30897a1ebbacf9934eErik            return null;
156773714169d34a55fc01e14b30897a1ebbacf9934eErik        }
156873714169d34a55fc01e14b30897a1ebbacf9934eErik
156973714169d34a55fc01e14b30897a1ebbacf9934eErik        @Override
157073714169d34a55fc01e14b30897a1ebbacf9934eErik        public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
157173714169d34a55fc01e14b30897a1ebbacf9934eErik            // TODO Auto-generated method stub
157273714169d34a55fc01e14b30897a1ebbacf9934eErik            return 0;
157373714169d34a55fc01e14b30897a1ebbacf9934eErik        }
157473714169d34a55fc01e14b30897a1ebbacf9934eErik    }
157573714169d34a55fc01e14b30897a1ebbacf9934eErik
157673714169d34a55fc01e14b30897a1ebbacf9934eErik}
1577