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