Utils.java revision eca5d33e4230cf6ac3acfe3fabf853f9275f98ca
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;
241ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport android.net.Uri;
25146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.text.format.Time;
261ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport android.util.Log;
27146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.view.animation.AlphaAnimation;
28146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectimport android.widget.ViewFlipper;
29146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
3056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashiimport java.util.Calendar;
311ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erikimport java.util.List;
3256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
33146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Projectpublic class Utils {
34146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static void startActivity(Context context, String className, long time) {
35146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Intent intent = new Intent(Intent.ACTION_VIEW);
36146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
37146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        intent.setClassName(context, className);
38146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        intent.putExtra(EVENT_BEGIN_TIME, time);
3923f400cdb34b08d9003f4a96fca5976ad632e4ceMichael Chan        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP);
40146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
41146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        context.startActivity(intent);
42146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
43146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
4445efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    static String getSharedPreference(Context context, String key, String defaultValue) {
45a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
4645efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        return prefs.getString(key, defaultValue);
4745efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    }
4845efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
4945efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    static void setSharedPreference(Context context, String key, String value) {
50a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
5145efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        SharedPreferences.Editor editor = prefs.edit();
5245efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        editor.putString(key, value);
5345efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan        editor.commit();
5445efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan    }
5545efa09d6e06f5569b2c0ae0dae0436dbfe6cb28Michael Chan
56e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan    static void setDefaultView(Context context, int viewId) {
57e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        String activityString = CalendarApplication.ACTIVITY_NAMES[viewId];
58e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
59a17725e24d51b7a6f002dd5afd3270c8eeea0dbeJeff Hamilton        SharedPreferences prefs = CalendarPreferenceActivity.getSharedPreferences(context);
60e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        SharedPreferences.Editor editor = prefs.edit();
61e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        if (viewId == CalendarApplication.AGENDA_VIEW_ID ||
62e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan                viewId == CalendarApplication.DAY_VIEW_ID) {
63e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan            // Record the (new) detail start view only for Agenda and Day
64e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan            editor.putString(CalendarPreferenceActivity.KEY_DETAILED_VIEW, activityString);
65e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        }
66e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
67e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        // Record the (new) start view
68e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        editor.putString(CalendarPreferenceActivity.KEY_START_VIEW, activityString);
69e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan        editor.commit();
70e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan    }
71e8aa59d4575d712601a133a9263acc23adbc8c17Michael Chan
72146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final Time timeFromIntent(Intent intent) {
73146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        Time time = new Time();
74146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.set(timeFromIntentInMillis(intent));
75146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return time;
76146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
77146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
78146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
79146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * If the given intent specifies a time (in milliseconds since the epoch),
80146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * then that time is returned. Otherwise, the current time is returned.
81146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
82146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final long timeFromIntentInMillis(Intent intent) {
83146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        // If the time was specified, then use that.  Otherwise, use the current time.
841ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik        Uri data = intent.getData();
85146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        long millis = intent.getLongExtra(EVENT_BEGIN_TIME, -1);
861ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik        if (millis == -1 && data != null && data.isHierarchical()) {
871ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik            List<String> path = data.getPathSegments();
88eca5d33e4230cf6ac3acfe3fabf853f9275f98caErik            if(path.size() == 2 && path.get(0).equals("time")) {
891ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                try {
901ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                    millis = Long.valueOf(data.getLastPathSegment());
911ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                } catch (NumberFormatException e) {
921ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                    Log.i("Calendar", "timeFromIntentInMillis: Data existed but no valid time " +
931ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                            "found. Using current time.");
941ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik                }
951ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik            }
961ef7f3ae2831dce8fa5e350f78ac4258c1a0a605Erik        }
9776727b7a9cf780f200414548b9d454bf9a701e3eErik        if (millis <= 0) {
98146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project            millis = System.currentTimeMillis();
99146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        }
100146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return millis;
101146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
102146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
103146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final void applyAlphaAnimation(ViewFlipper v) {
104146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        AlphaAnimation in = new AlphaAnimation(0.0f, 1.0f);
105146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
106146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        in.setStartOffset(0);
107146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        in.setDuration(500);
108146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
109146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        AlphaAnimation out = new AlphaAnimation(1.0f, 0.0f);
110146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
111146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        out.setStartOffset(0);
112146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        out.setDuration(500);
113146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
114146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        v.setInAnimation(in);
115146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        v.setOutAnimation(out);
116146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
117146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
118146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
119146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Formats the given Time object so that it gives the month and year
120146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * (for example, "September 2007").
121146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     *
122146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @param time the time to format
123146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * @return the string containing the weekday and the date
124146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
125ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan    public static String formatMonthYear(Context context, Time time) {
126ad36a3c3cde7a2ec6d3a35d2529d46f03bd8d59dMichael Chan        return time.format(context.getResources().getString(R.string.month_year));
127146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
128146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
129146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    // TODO: replace this with the correct i18n way to do this
130146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static final String englishNthDay[] = {
131146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "", "1st", "2nd", "3rd", "4th", "5th", "6th", "7th", "8th", "9th",
132146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "10th", "11th", "12th", "13th", "14th", "15th", "16th", "17th", "18th", "19th",
133146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "20th", "21st", "22nd", "23rd", "24th", "25th", "26th", "27th", "28th", "29th",
134146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        "30th", "31st"
135146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    };
136146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
137146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    public static String formatNth(int nth) {
138146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        return "the " + englishNthDay[nth];
139146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
140146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project
141146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    /**
142146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * Sets the time to the beginning of the day (midnight) by clearing the
143146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     * hour, minute, and second fields.
144146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project     */
145146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    static void setTimeToStartOfDay(Time time) {
146146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.second = 0;
147146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.minute = 0;
148146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project        time.hour = 0;
149146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project    }
15056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
15156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    /**
15256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * Get first day of week as android.text.format.Time constant.
15356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @return the first day of week in android.text.format.Time
15456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     */
15556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    public static int getFirstDayOfWeek() {
15656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        int startDay = Calendar.getInstance().getFirstDayOfWeek();
15756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        if (startDay == Calendar.SATURDAY) {
15856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            return Time.SATURDAY;
15956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        } else if (startDay == Calendar.MONDAY) {
16056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            return Time.MONDAY;
16156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        } else {
16256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            return Time.SUNDAY;
16356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        }
16456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    }
16556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
16656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    /**
16756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * Determine whether the column position is Saturday or not.
16856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param column the column position
16956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param firstDayOfWeek the first day of week in android.text.format.Time
17056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @return true if the column is Saturday position
17156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     */
17256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    public static boolean isSaturday(int column, int firstDayOfWeek) {
17356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        return (firstDayOfWeek == Time.SUNDAY && column == 6)
17456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.MONDAY && column == 5)
17556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.SATURDAY && column == 0);
17656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    }
17756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi
17856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    /**
17956adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * Determine whether the column position is Sunday or not.
18056adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param column the column position
18156adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @param firstDayOfWeek the first day of week in android.text.format.Time
18256adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     * @return true if the column is Sunday position
18356adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi     */
18456adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    public static boolean isSunday(int column, int firstDayOfWeek) {
18556adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi        return (firstDayOfWeek == Time.SUNDAY && column == 0)
18656adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.MONDAY && column == 6)
18756adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi            || (firstDayOfWeek == Time.SATURDAY && column == 1);
18856adc7b3f9e62ada7f3708c5c7228e8ac5af1755Takaoka G. Tadashi    }
189146de36083f6ce8b7e8a1f974d3990594a36bfecThe Android Open Source Project}
190