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