Utils.java revision eb10fa8bee049e0052b5cb53dcfbdaccef9f2740
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; 30146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.text.format.Time; 311ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport android.util.Log; 32146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.animation.AlphaAnimation; 33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ViewFlipper; 34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 3556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashiimport java.util.Calendar; 361ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport java.util.List; 37ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chanimport java.util.Map; 3856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi 39146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class Utils { 40ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final int CLEAR_ALPHA_MASK = 0x00FFFFFF; 41ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final int HIGH_ALPHA = 255 << 24; 42ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final int MED_ALPHA = 180 << 24; 43ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final int LOW_ALPHA = 150 << 24; 44ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 45ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan protected static final String OPEN_EMAIL_MARKER = " <"; 46ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan protected static final String CLOSE_EMAIL_MARKER = ">"; 47ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 48ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan /* The corner should be rounded on the top right and bottom right */ 49ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan private static final float[] CORNERS = new float[] {0, 0, 5, 5, 5, 5, 0, 0}; 50ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 51ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 52146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static void startActivity(Context context, String className, long time) { 53146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Intent intent = new Intent(Intent.ACTION_VIEW); 54146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 55146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project intent.setClassName(context, className); 56146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project intent.putExtra(EVENT_BEGIN_TIME, time); 5723f400cdb34b08d9003f4a96fca5976ad632e4ceMichael Chan intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP); 58146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 59146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project context.startActivity(intent); 60146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 61146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 6245efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan static String getSharedPreference(Context context, String key, String defaultValue) { 63a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context); 6445efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan return prefs.getString(key, defaultValue); 6545efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan } 6645efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan 6745efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan static void setSharedPreference(Context context, String key, String value) { 68a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context); 6945efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan SharedPreferences.Editor editor = prefs.edit(); 7045efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan editor.putString(key, value); 7145efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan editor.commit(); 7245efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan } 7345efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan 74e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan static void setDefaultView(Context context, int viewId) { 75e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan String activityString = CalendarApplication.ACTIVITY_NAMES[viewId]; 76e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan 77a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context); 78e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan SharedPreferences.Editor editor = prefs.edit(); 79e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan if (viewId == CalendarApplication.AGENDA_VIEW_ID || 80e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan viewId == CalendarApplication.DAY_VIEW_ID) { 81e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan // Record the (new) detail start view only for Agenda and Day 82e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan editor.putString(CalendarPreferenceActivity.KEY_DETAILED_VIEW, activityString); 83e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan } 84e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan 85e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan // Record the (new) start view 86e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan editor.putString(CalendarPreferenceActivity.KEY_START_VIEW, activityString); 87e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan editor.commit(); 88e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan } 89e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan 90146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final Time timeFromIntent(Intent intent) { 91146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project Time time = new Time(); 92146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project time.set(timeFromIntentInMillis(intent)); 93146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return time; 94146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 95146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 96a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik public static MatrixCursor matrixCursorFromCursor(Cursor cursor) { 97a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik MatrixCursor newCursor = new MatrixCursor(cursor.getColumnNames()); 98a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik int numColumns = cursor.getColumnCount(); 99a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik String data[] = new String[numColumns]; 100a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik cursor.moveToPosition(-1); 101a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik while (cursor.moveToNext()) { 102a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik for (int i = 0; i < numColumns; i++) { 103a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik data[i] = cursor.getString(i); 104a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 105a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik newCursor.addRow(data); 106a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 107a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik return newCursor; 108a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 109a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik 110a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik /** 111a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik * Compares two cursors to see if they contain the same data. 112a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik * 113a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik * @return Returns true of the cursors contain the same data and are not null, false 114a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik * otherwise 115a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik */ 116a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik public static boolean compareCursors(Cursor c1, Cursor c2) { 117a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik if(c1 == null || c2 == null) { 118a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik return false; 119a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 120a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik 121a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik int numColumns = c1.getColumnCount(); 122a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik if (numColumns != c2.getColumnCount()) { 123a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik return false; 124a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 125a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik 126a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik if (c1.getCount() != c2.getCount()) { 127a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik return false; 128a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 129a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik 130a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik c1.moveToPosition(-1); 131a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik c2.moveToPosition(-1); 132a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik while(c1.moveToNext() && c2.moveToNext()) { 133a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik for(int i = 0; i < numColumns; i++) { 134eb10fa8bee049e0052b5cb53dcfbdaccef9f2740Erik if(!TextUtils.equals(c1.getString(i), c2.getString(i))) { 135a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik return false; 136a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 137a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 138a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 139a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik 140a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik return true; 141a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik } 142a144f86b41170e8ee7fe8d966cc51c5fc90cd44aErik 143146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project /** 144146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * If the given intent specifies a time (in milliseconds since the epoch), 145146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * then that time is returned. Otherwise, the current time is returned. 146146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */ 147146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final long timeFromIntentInMillis(Intent intent) { 148146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // If the time was specified, then use that. Otherwise, use the current time. 1491ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik Uri data = intent.getData(); 150146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project long millis = intent.getLongExtra(EVENT_BEGIN_TIME, -1); 1511ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik if (millis == -1 && data != null && data.isHierarchical()) { 1521ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik List<String> path = data.getPathSegments(); 153eca5d33e4230cf6ac3acfe3fabf853f9275f98caErik if(path.size() == 2 && path.get(0).equals("time")) { 1541ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik try { 1551ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik millis = Long.valueOf(data.getLastPathSegment()); 1561ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik } catch (NumberFormatException e) { 1571ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik Log.i("Calendar", "timeFromIntentInMillis: Data existed but no valid time " + 1581ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik "found. Using current time."); 1591ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik } 1601ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik } 1611ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik } 16276727b7a9cf780f200414548b9d454bf9a701e3eErik if (millis <= 0) { 163146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project millis = System.currentTimeMillis(); 164146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 165146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return millis; 166146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 167146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 168146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final void applyAlphaAnimation(ViewFlipper v) { 169146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project AlphaAnimation in = new AlphaAnimation(0.0f, 1.0f); 170146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 171146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project in.setStartOffset(0); 172146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project in.setDuration(500); 173146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 174146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project AlphaAnimation out = new AlphaAnimation(1.0f, 0.0f); 175146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 176146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project out.setStartOffset(0); 177146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project out.setDuration(500); 178146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 179146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project v.setInAnimation(in); 180146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project v.setOutAnimation(out); 181146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 182146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 183ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan public static Drawable getColorChip(int color) { 184ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan /* 185ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * We want the color chip to have a nice gradient using 186ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * the color of the calendar. To do this we use a GradientDrawable. 187ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * The color supplied has an alpha of FF so we first do: 188ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * color & 0x00FFFFFF 189ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * to clear the alpha. Then we add our alpha to it. 190ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * We use 3 colors to get a step effect where it starts off very 191ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * light and quickly becomes dark and then a slow transition to 192ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * be even darker. 193ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan */ 194ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan color &= CLEAR_ALPHA_MASK; 195ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan int startColor = color | HIGH_ALPHA; 196ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan int middleColor = color | MED_ALPHA; 197ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan int endColor = color | LOW_ALPHA; 198ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan int[] colors = new int[] {startColor, middleColor, endColor}; 199ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan GradientDrawable d = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT, colors); 200ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan d.setCornerRadii(CORNERS); 201ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan return d; 202ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 203ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 204146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project /** 205146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Formats the given Time object so that it gives the month and year 206146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * (for example, "September 2007"). 207146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * 208146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * @param time the time to format 209146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * @return the string containing the weekday and the date 210146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */ 211ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan public static String formatMonthYear(Context context, Time time) { 212ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan return time.format(context.getResources().getString(R.string.month_year)); 213146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 214146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 215146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project // TODO: replace this with the correct i18n way to do this 216146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static final String englishNthDay[] = { 217146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project "", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th", 218146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th", 219146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th", 220146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project "30th", "31st" 221146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project }; 222146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 223146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project public static String formatNth(int nth) { 224146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project return "the " + englishNthDay[nth]; 225146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 226146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project 227146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project /** 228146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * Sets the time to the beginning of the day (midnight) by clearing the 229146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project * hour, minute, and second fields. 230146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project */ 231146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project static void setTimeToStartOfDay(Time time) { 232146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project time.second = 0; 233146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project time.minute = 0; 234146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project time.hour = 0; 235146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project } 23656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi 23756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi /** 23856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * Get first day of week as android.text.format.Time constant. 23956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @return the first day of week in android.text.format.Time 24056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi */ 24156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi public static int getFirstDayOfWeek() { 24256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi int startDay = Calendar.getInstance().getFirstDayOfWeek(); 24356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi if (startDay == Calendar.SATURDAY) { 24456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi return Time.SATURDAY; 24556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi } else if (startDay == Calendar.MONDAY) { 24656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi return Time.MONDAY; 24756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi } else { 24856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi return Time.SUNDAY; 24956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi } 25056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi } 25156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi 25256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi /** 25356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * Determine whether the column position is Saturday or not. 25456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @param column the column position 25556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @param firstDayOfWeek the first day of week in android.text.format.Time 25656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @return true if the column is Saturday position 25756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi */ 25856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi public static boolean isSaturday(int column, int firstDayOfWeek) { 25956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi return (firstDayOfWeek == Time.SUNDAY && column == 6) 26056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi || (firstDayOfWeek == Time.MONDAY && column == 5) 26156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi || (firstDayOfWeek == Time.SATURDAY && column == 0); 26256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi } 26356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi 26456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi /** 26556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * Determine whether the column position is Sunday or not. 26656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @param column the column position 26756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @param firstDayOfWeek the first day of week in android.text.format.Time 26856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi * @return true if the column is Sunday position 26956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi */ 27056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi public static boolean isSunday(int column, int firstDayOfWeek) { 27156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi return (firstDayOfWeek == Time.SUNDAY && column == 0) 27256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi || (firstDayOfWeek == Time.MONDAY && column == 6) 27356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi || (firstDayOfWeek == Time.SATURDAY && column == 1); 27456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi } 275ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan 276ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan /** 277ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * Scan through a cursor of calendars and check if names are duplicated. 278ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * 279ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * This travels a cursor containing calendar display names and fills in the provided map with 280ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * whether or not each name is repeated. 281ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * @param isDuplicateName The map to put the duplicate check results in. 282ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * @param cursor The query of calendars to check 283ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan * @param nameIndex The column of the query that contains the display name 284ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan */ 285ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan public static void checkForDuplicateNames(Map<String, Boolean> isDuplicateName, Cursor cursor, 286ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan int nameIndex) { 287ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan isDuplicateName.clear(); 288ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan cursor.moveToPosition(-1); 289ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan while (cursor.moveToNext()) { 290ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan String displayName = cursor.getString(nameIndex); 291ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan // Set it to true if we've seen this name before, false otherwise 292ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan if (displayName != null) { 293ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan isDuplicateName.put(displayName, isDuplicateName.containsKey(displayName)); 294ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 295ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 296ff6be831fc682374be6b78c13ecf5daca81f86d9Michael Chan } 297146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project} 298