CalendarUtils.java revision a27a886892fe3ec5edbc63c0b58e0a988623011a
1636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden/* 2636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Copyright (C) 2010 The Android Open Source Project 3636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 4636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Licensed under the Apache License, Version 2.0 (the "License"); 5636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * you may not use this file except in compliance with the License. 6636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * You may obtain a copy of the License at 7636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 8636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * http://www.apache.org/licenses/LICENSE-2.0 9636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 10636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Unless required by applicable law or agreed to in writing, software 11636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * distributed under the License is distributed on an "AS IS" BASIS, 12636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * See the License for the specific language governing permissions and 14636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * limitations under the License. 15636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 16636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 17636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenpackage com.android.calendar; 18636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 19636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.content.AsyncQueryHandler; 20636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.content.ContentResolver; 21636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.content.ContentValues; 22636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.content.Context; 23636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.content.SharedPreferences; 24636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.database.Cursor; 25a7c0390d9c5dd4ff730de505682687fae5f5ced0RoboErikimport android.provider.CalendarContract.CalendarCache; 26636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.text.TextUtils; 27636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.text.format.DateUtils; 28636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.text.format.Time; 29636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport android.util.Log; 30636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 31636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport java.util.Formatter; 32636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport java.util.HashSet; 33636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenimport java.util.Locale; 34636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 35636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden/** 36636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * A class containing utility methods related to Calendar apps. 37636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 38636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This class is expected to move into the app framework eventually. 39636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 40636269c7220a2b12e090cab43a91eb34922eb61fAndy McFaddenpublic class CalendarUtils { 41636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static final boolean DEBUG = false; 42636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static final String TAG = "CalendarUtils"; 43636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 44636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 45636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This class contains methods specific to reading and writing time zone 46636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * values. 47636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 48636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public static class TimeZoneUtils { 49636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static final String[] TIMEZONE_TYPE_ARGS = { CalendarCache.TIMEZONE_KEY_TYPE }; 50636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static final String[] TIMEZONE_INSTANCES_ARGS = 51636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden { CalendarCache.TIMEZONE_KEY_INSTANCES }; 52a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik public static final String[] CALENDAR_CACHE_POJECTION = { 53a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik CalendarCache.KEY, CalendarCache.VALUE 54a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik }; 55636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 56636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static StringBuilder mSB = new StringBuilder(50); 57636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static Formatter mF = new Formatter(mSB, Locale.getDefault()); 58636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private volatile static boolean mFirstTZRequest = true; 59636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private volatile static boolean mTZQueryInProgress = false; 60636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 61636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private volatile static boolean mUseHomeTZ = false; 62636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private volatile static String mHomeTZ = Time.getCurrentTimezone(); 63636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 64636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static HashSet<Runnable> mTZCallbacks = new HashSet<Runnable>(); 65636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static int mToken = 1; 66636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private static AsyncTZHandler mHandler; 67636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 68636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // The name of the shared preferences file. This name must be maintained for historical 69636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // reasons, as it's what PreferenceManager assigned the first time the file was created. 70636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private final String mPrefsName; 71636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 72636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 73636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This is the key used for writing whether or not a home time zone should 74636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * be used in the Calendar app to the Calendar Preferences. 75636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 76636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public static final String KEY_HOME_TZ_ENABLED = "preferences_home_tz_enabled"; 77636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 78636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This is the key used for writing the time zone that should be used if 79636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * home time zones are enabled for the Calendar app. 80636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 81636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public static final String KEY_HOME_TZ = "preferences_home_tz"; 82636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 83636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 84636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This is a helper class for handling the async queries and updates for the 85636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * time zone settings in Calendar. 86636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 87636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden private class AsyncTZHandler extends AsyncQueryHandler { 88636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public AsyncTZHandler(ContentResolver cr) { 89636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden super(cr); 90636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 91636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 92636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden @Override 93636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden protected void onQueryComplete(int token, Object cookie, Cursor cursor) { 94636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden synchronized (mTZCallbacks) { 95636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (cursor == null) { 96636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mTZQueryInProgress = false; 97636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mFirstTZRequest = true; 98636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden return; 99636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 100636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 101636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden boolean writePrefs = false; 102636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // Check the values in the db 103636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden int keyColumn = cursor.getColumnIndexOrThrow(CalendarCache.KEY); 104636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden int valueColumn = cursor.getColumnIndexOrThrow(CalendarCache.VALUE); 105636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden while(cursor.moveToNext()) { 106636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden String key = cursor.getString(keyColumn); 107636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden String value = cursor.getString(valueColumn); 108636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (TextUtils.equals(key, CalendarCache.TIMEZONE_KEY_TYPE)) { 109636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden boolean useHomeTZ = !TextUtils.equals( 110636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden value, CalendarCache.TIMEZONE_TYPE_AUTO); 111636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (useHomeTZ != mUseHomeTZ) { 112636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden writePrefs = true; 113636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mUseHomeTZ = useHomeTZ; 114636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 115636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } else if (TextUtils.equals( 116636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden key, CalendarCache.TIMEZONE_KEY_INSTANCES_PREVIOUS)) { 117636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (!TextUtils.isEmpty(value) && !TextUtils.equals(mHomeTZ, value)) { 118636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden writePrefs = true; 119636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHomeTZ = value; 120636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 121636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 122636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 123636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden cursor.close(); 124636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (writePrefs) { 125636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden SharedPreferences prefs = getSharedPreferences((Context)cookie, mPrefsName); 126636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // Write the prefs 127636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden setSharedPreference(prefs, KEY_HOME_TZ_ENABLED, mUseHomeTZ); 128636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden setSharedPreference(prefs, KEY_HOME_TZ, mHomeTZ); 129636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 130636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 131636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mTZQueryInProgress = false; 132636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden for (Runnable callback : mTZCallbacks) { 133636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (callback != null) { 134636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden callback.run(); 135636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 136636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 137636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mTZCallbacks.clear(); 138636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 139636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 140636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 141636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 142636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 143636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * The name of the file where the shared prefs for Calendar are stored 144636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * must be provided. All activities within an app should provide the 145636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * same preferences name or behavior may become erratic. 146636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 147636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param prefsName 148636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 149636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public TimeZoneUtils(String prefsName) { 150636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mPrefsName = prefsName; 151636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 152636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 153636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 154636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Formats a date or a time range according to the local conventions. 155636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 156636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This formats a date/time range using Calendar's time zone and the 157636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * local conventions for the region of the device. 158636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 159636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * If the {@link DateUtils#FORMAT_UTC} flag is used it will pass in 160636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * the UTC time zone instead. 161636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 162636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param context the context is required only if the time is shown 163636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param startMillis the start time in UTC milliseconds 164636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param endMillis the end time in UTC milliseconds 165636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param flags a bit mask of options See 166636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * {@link DateUtils#formatDateRange(Context, Formatter, long, long, int, String) formatDateRange} 167636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @return a string containing the formatted date/time range. 168636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 169636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public String formatDateRange(Context context, long startMillis, 170636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden long endMillis, int flags) { 171636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden String date; 172636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden String tz; 173636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if ((flags & DateUtils.FORMAT_UTC) != 0) { 174636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden tz = Time.TIMEZONE_UTC; 175636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } else { 176636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden tz = getTimeZone(context, null); 177636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 178636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden synchronized (mSB) { 179636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mSB.setLength(0); 180636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden date = DateUtils.formatDateRange(context, mF, startMillis, endMillis, flags, 181636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden tz).toString(); 182636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 183636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden return date; 184636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 185636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 186636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 187636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Writes a new home time zone to the db. 188636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 189636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Updates the home time zone in the db asynchronously and updates 190636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * the local cache. Sending a time zone of 191636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * {@link CalendarCache#TIMEZONE_TYPE_AUTO} will cause it to be set 192636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * to the device's time zone. null or empty tz will be ignored. 193636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 194636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param context The calling activity 195636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param timeZone The time zone to set Calendar to, or 196636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * {@link CalendarCache#TIMEZONE_TYPE_AUTO} 197636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 198636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public void setTimeZone(Context context, String timeZone) { 199636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (TextUtils.isEmpty(timeZone)) { 200636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (DEBUG) { 201636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden Log.d(TAG, "Empty time zone, nothing to be done."); 202636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 203636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden return; 204636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 205636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden boolean updatePrefs = false; 206636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden synchronized (mTZCallbacks) { 207636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (CalendarCache.TIMEZONE_TYPE_AUTO.equals(timeZone)) { 208636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mUseHomeTZ) { 209636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden updatePrefs = true; 210636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 211636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mUseHomeTZ = false; 212636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } else { 213636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (!mUseHomeTZ || !TextUtils.equals(mHomeTZ, timeZone)) { 214636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden updatePrefs = true; 215636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 216636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mUseHomeTZ = true; 217636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHomeTZ = timeZone; 218636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 219636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 220636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (updatePrefs) { 221636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // Write the prefs 222636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden SharedPreferences prefs = getSharedPreferences(context, mPrefsName); 223636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden setSharedPreference(prefs, KEY_HOME_TZ_ENABLED, mUseHomeTZ); 224636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden setSharedPreference(prefs, KEY_HOME_TZ, mHomeTZ); 225636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 226636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // Update the db 227636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden ContentValues values = new ContentValues(); 228636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mHandler != null) { 229636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHandler.cancelOperation(mToken); 230636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 231636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 232636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHandler = new AsyncTZHandler(context.getContentResolver()); 233636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 234636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // skip 0 so query can use it 235636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (++mToken == 0) { 236636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mToken = 1; 237636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 238636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 239636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // Write the use home tz setting 240636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden values.put(CalendarCache.VALUE, mUseHomeTZ ? CalendarCache.TIMEZONE_TYPE_HOME 241636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden : CalendarCache.TIMEZONE_TYPE_AUTO); 242636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHandler.startUpdate(mToken, null, CalendarCache.URI, values, CalendarCache.WHERE, 243636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden TIMEZONE_TYPE_ARGS); 244636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 245636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // If using a home tz write it to the db 246636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mUseHomeTZ) { 247636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden ContentValues values2 = new ContentValues(); 248636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden values2.put(CalendarCache.VALUE, mHomeTZ); 249636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHandler.startUpdate(mToken, null, CalendarCache.URI, values2, 250636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden CalendarCache.WHERE, TIMEZONE_INSTANCES_ARGS); 251636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 252636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 253636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 254636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 255636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 256636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Gets the time zone that Calendar should be displayed in 257636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 258636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This is a helper method to get the appropriate time zone for Calendar. If this 259636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * is the first time this method has been called it will initiate an asynchronous 260636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * query to verify that the data in preferences is correct. The callback supplied 261636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * will only be called if this query returns a value other than what is stored in 262636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * preferences and should cause the calling activity to refresh anything that 263636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * depends on calling this method. 264636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 265636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param context The calling activity 266636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param callback The runnable that should execute if a query returns new values 267636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @return The string value representing the time zone Calendar should display 268636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 269636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public String getTimeZone(Context context, Runnable callback) { 270636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden synchronized (mTZCallbacks){ 271636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mFirstTZRequest) { 272636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mTZQueryInProgress = true; 273636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mFirstTZRequest = false; 274636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 275636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden SharedPreferences prefs = getSharedPreferences(context, mPrefsName); 276636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mUseHomeTZ = prefs.getBoolean(KEY_HOME_TZ_ENABLED, false); 277636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHomeTZ = prefs.getString(KEY_HOME_TZ, Time.getCurrentTimezone()); 278636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 279636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // When the async query returns it should synchronize on 280636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // mTZCallbacks, update mUseHomeTZ, mHomeTZ, and the 281636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // preferences, set mTZQueryInProgress to false, and call all 282636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden // the runnables in mTZCallbacks. 283636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mHandler == null) { 284636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mHandler = new AsyncTZHandler(context.getContentResolver()); 285636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 286a27a886892fe3ec5edbc63c0b58e0a988623011aRoboErik mHandler.startQuery(0, context, CalendarCache.URI, CALENDAR_CACHE_POJECTION, 287636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden null, null, null); 288636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 289636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mTZQueryInProgress) { 290636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mTZCallbacks.add(callback); 291636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 292636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 293636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden return mUseHomeTZ ? mHomeTZ : Time.getCurrentTimezone(); 294636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 295636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 296636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 297636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * Forces a query of the database to check for changes to the time zone. 298636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * This should be called if another app may have modified the db. If a 299636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * query is already in progress the callback will be added to the list 300636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * of callbacks to be called when it returns. 301636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 302636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param context The calling activity 303636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param callback The runnable that should execute if a query returns 304636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * new values 305636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 306636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public void forceDBRequery(Context context, Runnable callback) { 307636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden synchronized (mTZCallbacks){ 308636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden if (mTZQueryInProgress) { 309636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mTZCallbacks.add(callback); 310636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden return; 311636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 312636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden mFirstTZRequest = true; 313636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden getTimeZone(context, callback); 314636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 315636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 316636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 317636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 318636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 319636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * A helper method for writing a String value to the preferences 320636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * asynchronously. 321636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 322636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param context A context with access to the correct preferences 323636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param key The preference to write to 324636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param value The value to write 325636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 326636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public static void setSharedPreference(SharedPreferences prefs, String key, String value) { 327636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden// SharedPreferences prefs = getSharedPreferences(context); 328636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden SharedPreferences.Editor editor = prefs.edit(); 329636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden editor.putString(key, value); 330636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden editor.apply(); 331636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 332636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 333636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** 334636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * A helper method for writing a boolean value to the preferences 335636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * asynchronously. 336636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * 337636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param context A context with access to the correct preferences 338636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param key The preference to write to 339636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden * @param value The value to write 340636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden */ 341636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public static void setSharedPreference(SharedPreferences prefs, String key, boolean value) { 342636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden// SharedPreferences prefs = getSharedPreferences(context, prefsName); 343636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden SharedPreferences.Editor editor = prefs.edit(); 344636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden editor.putBoolean(key, value); 345636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden editor.apply(); 346636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 347636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden 348636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden /** Return a properly configured SharedPreferences instance */ 349636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden public static SharedPreferences getSharedPreferences(Context context, String prefsName) { 350636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden return context.getSharedPreferences(prefsName, Context.MODE_PRIVATE); 351636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden } 352636269c7220a2b12e090cab43a91eb34922eb61fAndy McFadden} 353