Utils.java revision 1427657d0bf7e69b831aa495828f67b45b69fd99
1146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project/*
2146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Copyright (C) 2006 The Android Open Source Project
3146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
4146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * you may not use this file except in compliance with the License.
6146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * You may obtain a copy of the License at
7146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
8146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project *
10146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * See the License for the specific language governing permissions and
14146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * limitations under the License.
15146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */
16146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
17146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpackage com.android.calendar;
18146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
19146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport static android.provider.Calendar.EVENT_BEGIN_TIME;
20e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
21146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Context;
22146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.content.Intent;
23e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chanimport android.content.SharedPreferences;
24ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport android.database.Cursor;
25a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErikimport android.database.MatrixCursor;
26ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport android.graphics.drawable.Drawable;
27ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport android.graphics.drawable.GradientDrawable;
281ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport android.net.Uri;
29eb10fa8bee049e0052b5cb53dcfbdaccef9f2740Erikimport android.text.TextUtils;
301427657d0bf7e69b831aa495828f67b45b69fd99Erikimport android.text.format.DateUtils;
31146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.text.format.Time;
321ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport android.util.Log;
33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.animation.AlphaAnimation;
34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ViewFlipper;
35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
3656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashiimport java.util.Calendar;
371427657d0bf7e69b831aa495828f67b45b69fd99Erikimport java.util.Formatter;
38235d59cf61769ec8ab777d81cd1ceb2e7530f439Erikimport java.util.HashSet;
391ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport java.util.List;
401427657d0bf7e69b831aa495828f67b45b69fd99Erikimport java.util.Locale;
41ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport java.util.Map;
4256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class Utils {
443dc5e908a825b879978ba523d9099dc2255da9a5Erik    private static final boolean DEBUG = true;
453dc5e908a825b879978ba523d9099dc2255da9a5Erik    private static final String TAG = "CalUtils";
46ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    private static final int CLEAR_ALPHA_MASK = 0x00FFFFFF;
47ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    private static final int HIGH_ALPHA = 255 << 24;
48ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    private static final int MED_ALPHA = 180 << 24;
49ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    private static final int LOW_ALPHA = 150 << 24;
50ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan
51ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    protected static final String OPEN_EMAIL_MARKER = " <";
52ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    protected static final String CLOSE_EMAIL_MARKER = ">";
53ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    /* The corner should be rounded on the top right and bottom right */
54ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    private static final float[] CORNERS = new float[] {0, 0, 5, 5, 5, 5, 0, 0};
55ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan
561427657d0bf7e69b831aa495828f67b45b69fd99Erik    private static StringBuilder mSB = new StringBuilder(50);
571427657d0bf7e69b831aa495828f67b45b69fd99Erik    private static Formatter mF = new Formatter(mSB, Locale.getDefault());
58235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    private volatile static boolean mFirstTZRequest = true;
59235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    private volatile static boolean mTZQueryInProgress = false;
60235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik
61235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    private volatile static boolean mUseHomeTZ = false;
62235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    private volatile static String mHomeTZ = Time.getCurrentTimezone();
63235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik
64235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    private static HashSet<Runnable> mTZCallbacks = new HashSet<Runnable>();
65ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan
66146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static void startActivity(Context context, String className, long time) {
67146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW);
68146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
69146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        intent.setClassName(context, className);
70146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        intent.putExtra(EVENT_BEGIN_TIME, time);
7123f400cdb34b08d9003f4a96fca5976ad632e4ceMichael Chan        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
72146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        context.startActivity(intent);
74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
7645efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    static String getSharedPreference(Context context, String key, String defaultValue) {
77a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
7845efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        return prefs.getString(key, defaultValue);
7945efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    }
8045efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
81235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    /**
823dc5e908a825b879978ba523d9099dc2255da9a5Erik     * Writes a new home time zone to the db.
833dc5e908a825b879978ba523d9099dc2255da9a5Erik     *
843dc5e908a825b879978ba523d9099dc2255da9a5Erik     * Updates the home time zone in the db asynchronously and updates
853dc5e908a825b879978ba523d9099dc2255da9a5Erik     * the local cache. Sending a time zone of **tbd** will cause it to
863dc5e908a825b879978ba523d9099dc2255da9a5Erik     * be set to the device's time zone. null or empty tz will be ignored.
873dc5e908a825b879978ba523d9099dc2255da9a5Erik     *
883dc5e908a825b879978ba523d9099dc2255da9a5Erik     * @param context The calling activity
893dc5e908a825b879978ba523d9099dc2255da9a5Erik     * @param timeZone The time zone to set Calendar to, or **tbd**
903dc5e908a825b879978ba523d9099dc2255da9a5Erik     */
913dc5e908a825b879978ba523d9099dc2255da9a5Erik    public static void setTimeZone(Context context, String timeZone) {
923dc5e908a825b879978ba523d9099dc2255da9a5Erik        if (TextUtils.isEmpty(timeZone)) {
933dc5e908a825b879978ba523d9099dc2255da9a5Erik            if (DEBUG) {
943dc5e908a825b879978ba523d9099dc2255da9a5Erik                Log.d(TAG, "Empty time zone, nothing to be done.");
953dc5e908a825b879978ba523d9099dc2255da9a5Erik            }
963dc5e908a825b879978ba523d9099dc2255da9a5Erik            return;
973dc5e908a825b879978ba523d9099dc2255da9a5Erik        }
983dc5e908a825b879978ba523d9099dc2255da9a5Erik        synchronized (mTZCallbacks) {
993dc5e908a825b879978ba523d9099dc2255da9a5Erik            if (CalendarPreferenceActivity.LOCAL_TZ.equals(timeZone)) {
1003dc5e908a825b879978ba523d9099dc2255da9a5Erik                if (!mUseHomeTZ) {
1013dc5e908a825b879978ba523d9099dc2255da9a5Erik                    return;
1023dc5e908a825b879978ba523d9099dc2255da9a5Erik                }
1033dc5e908a825b879978ba523d9099dc2255da9a5Erik                mUseHomeTZ = false;
1043dc5e908a825b879978ba523d9099dc2255da9a5Erik            } else {
1053dc5e908a825b879978ba523d9099dc2255da9a5Erik                if (TextUtils.equals(mHomeTZ, timeZone)) {
1063dc5e908a825b879978ba523d9099dc2255da9a5Erik                    return;
1073dc5e908a825b879978ba523d9099dc2255da9a5Erik                }
1083dc5e908a825b879978ba523d9099dc2255da9a5Erik                mUseHomeTZ = true;
1093dc5e908a825b879978ba523d9099dc2255da9a5Erik                mHomeTZ = timeZone;
1103dc5e908a825b879978ba523d9099dc2255da9a5Erik            }
1113dc5e908a825b879978ba523d9099dc2255da9a5Erik        }
1123dc5e908a825b879978ba523d9099dc2255da9a5Erik        setSharedPreference(context, CalendarPreferenceActivity.KEY_HOME_TZ_ENABLED, mUseHomeTZ);
1133dc5e908a825b879978ba523d9099dc2255da9a5Erik        if (mUseHomeTZ) {
1143dc5e908a825b879978ba523d9099dc2255da9a5Erik            setSharedPreference(context, CalendarPreferenceActivity.KEY_HOME_TZ, mHomeTZ);
1153dc5e908a825b879978ba523d9099dc2255da9a5Erik        }
1163dc5e908a825b879978ba523d9099dc2255da9a5Erik        // TODO async update db
1173dc5e908a825b879978ba523d9099dc2255da9a5Erik    }
1183dc5e908a825b879978ba523d9099dc2255da9a5Erik
1193dc5e908a825b879978ba523d9099dc2255da9a5Erik    /**
120235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * Gets the time zone that Calendar should be displayed in
121235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     *
122235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * This is a helper method to get the appropriate time zone for Calendar. If this
123235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * is the first time this method has been called it will initiate an asynchronous
124235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * query to verify that the data in preferences is correct. The callback supplied
125235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * will only be called if this query returns a value other than what is stored in
126235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * preferences and should cause the calling activity to refresh anything that
127235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * depends on calling this method.
128235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     *
129235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * @param context The calling activity
130235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * @param callback The runnable that should execute if a query returns new values
131235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     * @return The string value representing the time zone Calendar should display
132235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik     */
133235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    public static String getTimeZone(Context context, Runnable callback) {
134235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik        synchronized (mTZCallbacks){
135235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik            if (mFirstTZRequest) {
136235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                mTZQueryInProgress = true;
137235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                mFirstTZRequest = false;
138235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik
139235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
140235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                mUseHomeTZ = prefs.getBoolean(
141235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                        CalendarPreferenceActivity.KEY_HOME_TZ_ENABLED, false);
142235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                mHomeTZ = prefs.getString(
143235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                        CalendarPreferenceActivity.KEY_HOME_TZ, Time.getCurrentTimezone());
144235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                // TODO kick off async query
145235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                // When the async query returns it should synchronize on
146235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                // mTZCallbacks, update mUseHomeTZ, mHomeTZ, and the
147235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                // preferences, set mTZQueryInProgress to false, and call all
148235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                // the runnables in mTZCallbacks.
149235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                // TODO remove this line when we have a query
150235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                mTZQueryInProgress = false;
151235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik            }
152235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik            if (mTZQueryInProgress) {
153235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik                mTZCallbacks.add(callback);
154235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik            }
155235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik        }
156235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik        return mUseHomeTZ ? mHomeTZ : Time.getCurrentTimezone();
157235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik    }
158235d59cf61769ec8ab777d81cd1ceb2e7530f439Erik
1591427657d0bf7e69b831aa495828f67b45b69fd99Erik    /**
1601427657d0bf7e69b831aa495828f67b45b69fd99Erik     * Formats a date or a time range according to the local conventions.
1611427657d0bf7e69b831aa495828f67b45b69fd99Erik     *
1621427657d0bf7e69b831aa495828f67b45b69fd99Erik     * @param context the context is required only if the time is shown
1631427657d0bf7e69b831aa495828f67b45b69fd99Erik     * @param startMillis the start time in UTC milliseconds
1641427657d0bf7e69b831aa495828f67b45b69fd99Erik     * @param endMillis the end time in UTC milliseconds
1651427657d0bf7e69b831aa495828f67b45b69fd99Erik     * @param flags a bit mask of options See
1661427657d0bf7e69b831aa495828f67b45b69fd99Erik     * {@link #formatDateRange(Context, Formatter, long, long, int, String) formatDateRange}
1671427657d0bf7e69b831aa495828f67b45b69fd99Erik     * @return a string containing the formatted date/time range.
1681427657d0bf7e69b831aa495828f67b45b69fd99Erik     */
1691427657d0bf7e69b831aa495828f67b45b69fd99Erik    public static String formatDateRange(Context context, long startMillis,
1701427657d0bf7e69b831aa495828f67b45b69fd99Erik            long endMillis, int flags) {
1711427657d0bf7e69b831aa495828f67b45b69fd99Erik        String date;
1721427657d0bf7e69b831aa495828f67b45b69fd99Erik        synchronized (mSB) {
1731427657d0bf7e69b831aa495828f67b45b69fd99Erik            mSB.setLength(0);
1741427657d0bf7e69b831aa495828f67b45b69fd99Erik            date = DateUtils.formatDateRange(context, mF, startMillis, endMillis, flags,
1751427657d0bf7e69b831aa495828f67b45b69fd99Erik                    getTimeZone(context, null)).toString();
1761427657d0bf7e69b831aa495828f67b45b69fd99Erik        }
1771427657d0bf7e69b831aa495828f67b45b69fd99Erik        return date;
1781427657d0bf7e69b831aa495828f67b45b69fd99Erik    }
1791427657d0bf7e69b831aa495828f67b45b69fd99Erik
18045efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    static void setSharedPreference(Context context, String key, String value) {
181a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
18245efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        SharedPreferences.Editor editor = prefs.edit();
18345efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        editor.putString(key, value);
18445efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        editor.commit();
18545efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    }
18645efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
1873dc5e908a825b879978ba523d9099dc2255da9a5Erik    static void setSharedPreference(Context context, String key, boolean value) {
1883dc5e908a825b879978ba523d9099dc2255da9a5Erik        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
1893dc5e908a825b879978ba523d9099dc2255da9a5Erik        SharedPreferences.Editor editor = prefs.edit();
1903dc5e908a825b879978ba523d9099dc2255da9a5Erik        editor.putBoolean(key, value);
1913dc5e908a825b879978ba523d9099dc2255da9a5Erik        editor.commit();
1923dc5e908a825b879978ba523d9099dc2255da9a5Erik    }
1933dc5e908a825b879978ba523d9099dc2255da9a5Erik
194e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan    static void setDefaultView(Context context, int viewId) {
195e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        String activityString = CalendarApplication.ACTIVITY_NAMES[viewId];
196e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
197a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
198e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        SharedPreferences.Editor editor = prefs.edit();
199e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        if (viewId == CalendarApplication.AGENDA_VIEW_ID ||
200e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan                viewId == CalendarApplication.DAY_VIEW_ID) {
201e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan            // Record the (new) detail start view only for Agenda and Day
202e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan            editor.putString(CalendarPreferenceActivity.KEY_DETAILED_VIEW, activityString);
203e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        }
204e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
205e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        // Record the (new) start view
206e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        editor.putString(CalendarPreferenceActivity.KEY_START_VIEW, activityString);
207e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        editor.commit();
208e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan    }
209e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
210146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final Time timeFromIntent(Intent intent) {
211146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Time time = new Time();
212146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.set(timeFromIntentInMillis(intent));
213146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return time;
214146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
215146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
216a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik    public static MatrixCursor matrixCursorFromCursor(Cursor cursor) {
217a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        MatrixCursor newCursor = new MatrixCursor(cursor.getColumnNames());
218a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        int numColumns = cursor.getColumnCount();
219a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        String data[] = new String[numColumns];
220a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        cursor.moveToPosition(-1);
221a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        while (cursor.moveToNext()) {
222a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            for (int i = 0; i < numColumns; i++) {
223a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik                data[i] = cursor.getString(i);
224a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            }
225a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            newCursor.addRow(data);
226a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        }
227a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        return newCursor;
228a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik    }
229a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik
230a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik    /**
231a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik     * Compares two cursors to see if they contain the same data.
232a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik     *
233a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik     * @return Returns true of the cursors contain the same data and are not null, false
234a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik     * otherwise
235a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik     */
236a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik    public static boolean compareCursors(Cursor c1, Cursor c2) {
237a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        if(c1 == null || c2 == null) {
238a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            return false;
239a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        }
240a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik
241a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        int numColumns = c1.getColumnCount();
242a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        if (numColumns != c2.getColumnCount()) {
243a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            return false;
244a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        }
245a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik
246a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        if (c1.getCount() != c2.getCount()) {
247a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            return false;
248a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        }
249a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik
250a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        c1.moveToPosition(-1);
251a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        c2.moveToPosition(-1);
252a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        while(c1.moveToNext() && c2.moveToNext()) {
253a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            for(int i = 0; i < numColumns; i++) {
254eb10fa8bee049e0052b5cb53dcfbdaccef9f2740Erik                if(!TextUtils.equals(c1.getString(i), c2.getString(i))) {
255a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik                    return false;
256a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik                }
257a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik            }
258a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        }
259a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik
260a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik        return true;
261a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik    }
262a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik
263146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
264146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * If the given intent specifies a time (in milliseconds since the epoch),
265146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * then that time is returned. Otherwise, the current time is returned.
266146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
267146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final long timeFromIntentInMillis(Intent intent) {
268146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // If the time was specified, then use that.  Otherwise, use the current time.
2691ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik        Uri data = intent.getData();
270146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        long millis = intent.getLongExtra(EVENT_BEGIN_TIME, -1);
2711ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik        if (millis == -1 && data != null && data.isHierarchical()) {
2721ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik            List<String> path = data.getPathSegments();
273eca5d33e4230cf6ac3acfe3fabf853f9275f98caErik            if(path.size() == 2 && path.get(0).equals("time")) {
2741ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                try {
2751ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                    millis = Long.valueOf(data.getLastPathSegment());
2761ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                } catch (NumberFormatException e) {
2771ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                    Log.i("Calendar", "timeFromIntentInMillis: Data existed but no valid time " +
2781ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                            "found. Using current time.");
2791ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                }
2801ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik            }
2811ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik        }
28276727b7a9cf780f200414548b9d454bf9a701e3eErik        if (millis <= 0) {
283146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            millis = System.currentTimeMillis();
284146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
285146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return millis;
286146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
287146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
288146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final void applyAlphaAnimation(ViewFlipper v) {
289146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        AlphaAnimation in = new AlphaAnimation(0.0f, 1.0f);
290146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
291146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        in.setStartOffset(0);
292146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        in.setDuration(500);
293146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
294146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        AlphaAnimation out = new AlphaAnimation(1.0f, 0.0f);
295146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
296146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        out.setStartOffset(0);
297146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        out.setDuration(500);
298146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
299146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        v.setInAnimation(in);
300146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        v.setOutAnimation(out);
301146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
302146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
303ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    public static Drawable getColorChip(int color) {
304ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        /*
305ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * We want the color chip to have a nice gradient using
306ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * the color of the calendar. To do this we use a GradientDrawable.
307ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * The color supplied has an alpha of FF so we first do:
308ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * color & 0x00FFFFFF
309ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * to clear the alpha. Then we add our alpha to it.
310ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * We use 3 colors to get a step effect where it starts off very
311ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * light and quickly becomes dark and then a slow transition to
312ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         * be even darker.
313ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan         */
314ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        color &= CLEAR_ALPHA_MASK;
315ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        int startColor = color | HIGH_ALPHA;
316ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        int middleColor = color | MED_ALPHA;
317ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        int endColor = color | LOW_ALPHA;
318ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        int[] colors = new int[] {startColor, middleColor, endColor};
319ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        GradientDrawable d = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors);
320ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        d.setCornerRadii(CORNERS);
321ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        return d;
322ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    }
323ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan
324146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
325146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Formats the given Time object so that it gives the month and year
326146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * (for example, "September 2007").
327146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     *
328146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @param time the time to format
329146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @return the string containing the weekday and the date
330146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
331ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public static String formatMonthYear(Context context, Time time) {
332ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return time.format(context.getResources().getString(R.string.month_year));
333146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
334146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
335146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // TODO: replace this with the correct i18n way to do this
336146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final String englishNthDay[] = {
337146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th",
338146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th",
339146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th",
340146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "30th", "31st"
341146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
342146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
343146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static String formatNth(int nth) {
344146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return "the " + englishNthDay[nth];
345146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
346146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
347146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
348d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     * Returns a list joined together by the provided delimiter, for example,
349d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     * ["a", "b", "c"] could be joined into "a,b,c"
350d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     *
351d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     * @param things the things to join together
352d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     * @param delim the delimiter to use
353d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     * @return a string contained the things joined together
354d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang     */
355d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang    public static String join(List<?> things, String delim) {
356d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang        StringBuilder builder = new StringBuilder();
357d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang        boolean first = true;
358d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang        for (Object thing : things) {
359d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang            if (first) {
360d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang                first = false;
361d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang            } else {
362d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang                builder.append(delim);
363d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang            }
364d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang            builder.append(thing.toString());
365d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang        }
366d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang        return builder.toString();
367d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang    }
368d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang
369d7c7f2ab6fdb55451ead2d54819ba8f37af2d0a7Mason Tang    /**
370146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Sets the time to the beginning of the day (midnight) by clearing the
371146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * hour, minute, and second fields.
372146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
373146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    static void setTimeToStartOfDay(Time time) {
374146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.second = 0;
375146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.minute = 0;
376146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.hour = 0;
377146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
37856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
37956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    /**
38056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * Get first day of week as android.text.format.Time constant.
38156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @return the first day of week in android.text.format.Time
38256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     */
38356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    public static int getFirstDayOfWeek() {
38456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        int startDay = Calendar.getInstance().getFirstDayOfWeek();
38556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        if (startDay == Calendar.SATURDAY) {
38656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            return Time.SATURDAY;
38756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        } else if (startDay == Calendar.MONDAY) {
38856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            return Time.MONDAY;
38956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        } else {
39056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            return Time.SUNDAY;
39156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        }
39256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    }
39356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
39456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    /**
39556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * Determine whether the column position is Saturday or not.
39656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param column the column position
39756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param firstDayOfWeek the first day of week in android.text.format.Time
39856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @return true if the column is Saturday position
39956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     */
40056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    public static boolean isSaturday(int column, int firstDayOfWeek) {
40156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        return (firstDayOfWeek == Time.SUNDAY && column == 6)
40256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.MONDAY && column == 5)
40356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.SATURDAY && column == 0);
40456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    }
40556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
40656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    /**
40756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * Determine whether the column position is Sunday or not.
40856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param column the column position
40956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param firstDayOfWeek the first day of week in android.text.format.Time
41056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @return true if the column is Sunday position
41156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     */
41256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    public static boolean isSunday(int column, int firstDayOfWeek) {
41356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        return (firstDayOfWeek == Time.SUNDAY && column == 0)
41456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.MONDAY && column == 6)
41556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.SATURDAY && column == 1);
41656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    }
417ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan
418ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    /**
419ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     * Scan through a cursor of calendars and check if names are duplicated.
420ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     *
421ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     * This travels a cursor containing calendar display names and fills in the provided map with
422ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     * whether or not each name is repeated.
423ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     * @param isDuplicateName The map to put the duplicate check results in.
424ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     * @param cursor The query of calendars to check
425ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     * @param nameIndex The column of the query that contains the display name
426ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan     */
427ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    public static void checkForDuplicateNames(Map<String, Boolean> isDuplicateName, Cursor cursor,
428ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan            int nameIndex) {
429ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        isDuplicateName.clear();
430ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        cursor.moveToPosition(-1);
431ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        while (cursor.moveToNext()) {
432ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan            String displayName = cursor.getString(nameIndex);
433ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan            // Set it to true if we've seen this name before, false otherwise
434ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan            if (displayName != null) {
435ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan                isDuplicateName.put(displayName, isDuplicateName.containsKey(displayName));
436ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan            }
437ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan        }
438ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan    }
439146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project}
440