diff options
author | Jay Shrauner <shrauner@google.com> | 2014-07-30 14:01:57 -0700 |
---|---|---|
committer | Jay Shrauner <shrauner@google.com> | 2014-07-30 16:25:41 -0700 |
commit | 0ab307238107189b4717127b638e6c7dc9f988f1 (patch) | |
tree | ba826422983b739fb75285ffe93b26077a40c8c0 | |
parent | 9e49d121ea2491aee140a350630ce21ce2c2e89e (diff) | |
download | android_packages_providers_CalendarProvider-0ab307238107189b4717127b638e6c7dc9f988f1.tar.gz android_packages_providers_CalendarProvider-0ab307238107189b4717127b638e6c7dc9f988f1.tar.bz2 android_packages_providers_CalendarProvider-0ab307238107189b4717127b638e6c7dc9f988f1.zip |
Fix stale db handle crash
Need to reacquire db handle before handling requests.
Fix NPEs when timezonetype isn't in the cache.
Bug:16559219
Change-Id: Ie037399aec91feb80312adf7c37d8d210b6aa544
3 files changed, 17 insertions, 13 deletions
diff --git a/src/com/android/providers/calendar/CalendarAlarmManager.java b/src/com/android/providers/calendar/CalendarAlarmManager.java index 266237d..08269eb 100644 --- a/src/com/android/providers/calendar/CalendarAlarmManager.java +++ b/src/com/android/providers/calendar/CalendarAlarmManager.java @@ -364,8 +364,8 @@ public class CalendarAlarmManager { String.valueOf(currentMillis) }; String instancesTimezone = cp2.mCalendarCache.readTimezoneInstances(); - boolean isHomeTimezone = cp2.mCalendarCache.readTimezoneType().equals( - CalendarCache.TIMEZONE_TYPE_HOME); + final String timezoneType = cp2.mCalendarCache.readTimezoneType(); + boolean isHomeTimezone = CalendarCache.TIMEZONE_TYPE_HOME.equals(timezoneType); // expand this range by a day on either end to account for all day // events cp2.acquireInstanceRangeLocked( diff --git a/src/com/android/providers/calendar/CalendarInstancesHelper.java b/src/com/android/providers/calendar/CalendarInstancesHelper.java index 356b442..19b1faa 100644 --- a/src/com/android/providers/calendar/CalendarInstancesHelper.java +++ b/src/com/android/providers/calendar/CalendarInstancesHelper.java @@ -59,7 +59,6 @@ public class CalendarInstancesHelper { private static final String TAG = "CalInstances"; private CalendarDatabaseHelper mDbHelper; - private SQLiteDatabase mDb; private MetaData mMetaData; private CalendarCache mCalendarCache; @@ -130,7 +129,6 @@ public class CalendarInstancesHelper { public CalendarInstancesHelper(CalendarDatabaseHelper calendarDbHelper, MetaData metaData) { mDbHelper = calendarDbHelper; - mDb = mDbHelper.getWritableDatabase(); mMetaData = metaData; mCalendarCache = new CalendarCache(mDbHelper); } @@ -592,7 +590,8 @@ public class CalendarInstancesHelper { "0", // Calendars.SYNC_EVENTS "0", // Events.LAST_SYNCED }; - Cursor c = qb.query(mDb, EXPAND_COLUMNS, null /* selection */, selectionArgs, + final SQLiteDatabase db = mDbHelper.getReadableDatabase(); + Cursor c = qb.query(db, EXPAND_COLUMNS, null /* selection */, selectionArgs, null /* groupBy */, null /* having */, null /* sortOrder */); if (Log.isLoggable(TAG, Log.VERBOSE)) { Log.v(TAG, "Instance expansion: got " + c.getCount() + " entries"); @@ -858,7 +857,8 @@ public class CalendarInstancesHelper { Log.v(TAG, "Retrieving events to expand: " + qb.toString()); } - return qb.query(mDb, EXPAND_COLUMNS, null /* selection */, selectionArgs, + final SQLiteDatabase db = mDbHelper.getReadableDatabase(); + return qb.query(db, EXPAND_COLUMNS, null /* selection */, selectionArgs, null /* groupBy */, null /* having */, null /* sortOrder */); } diff --git a/src/com/android/providers/calendar/CalendarProvider2.java b/src/com/android/providers/calendar/CalendarProvider2.java index cf4f16a..9af4c77 100644 --- a/src/com/android/providers/calendar/CalendarProvider2.java +++ b/src/com/android/providers/calendar/CalendarProvider2.java @@ -773,8 +773,8 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun } private boolean isHomeTimezone() { - String type = mCalendarCache.readTimezoneType(); - return type.equals(CalendarCache.TIMEZONE_TYPE_HOME); + final String type = mCalendarCache.readTimezoneType(); + return CalendarCache.TIMEZONE_TYPE_HOME.equals(type); } private void regenerateInstancesTable() { @@ -1089,6 +1089,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun String sort, boolean searchByDay, boolean forceExpansion, String instancesTimezone, boolean isHomeTimezone) { + mDb = mDbHelper.getWritableDatabase(); qb.setTables(INSTANCE_QUERY_TABLES); qb.setProjectionMap(sInstancesProjectionMap); if (searchByDay) { @@ -1256,6 +1257,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun long rangeBegin, long rangeEnd, String query, String[] projection, String selection, String[] selectionArgs, String sort, boolean searchByDay, String instancesTimezone, boolean isHomeTimezone) { + mDb = mDbHelper.getWritableDatabase(); qb.setTables(INSTANCE_SEARCH_QUERY_TABLES); qb.setProjectionMap(sInstancesProjectionMap); @@ -1311,6 +1313,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun private Cursor handleEventDayQuery(SQLiteQueryBuilder qb, int begin, int end, String[] projection, String selection, String instancesTimezone, boolean isHomeTimezone) { + mDb = mDbHelper.getWritableDatabase(); qb.setTables(INSTANCE_QUERY_TABLES); qb.setProjectionMap(sInstancesProjectionMap); // Convert the first and last Julian day range to a range that uses @@ -1428,14 +1431,14 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun mMetaData.writeLocked(instancesTimezone, expandBegin, expandEnd); - String timezoneType = mCalendarCache.readTimezoneType(); + final String timezoneType = mCalendarCache.readTimezoneType(); // This may cause some double writes but guarantees the time zone in // the db and the time zone the instances are in is the same, which // future changes may affect. mCalendarCache.writeTimezoneInstances(instancesTimezone); // If we're in auto check if we need to fix the previous tz value - if (timezoneType.equals(CalendarCache.TIMEZONE_TYPE_AUTO)) { + if (CalendarCache.TIMEZONE_TYPE_AUTO.equals(timezoneType)) { String prevTZ = mCalendarCache.readTimezoneInstancesPrevious(); if (TextUtils.equals(TIMEZONE_GMT, prevTZ)) { mCalendarCache.writeTimezoneInstancesPrevious(instancesTimezone); @@ -2113,6 +2116,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun final int match = sUriMatcher.match(uri); verifyTransactionAllowed(TRANSACTION_INSERT, uri, values, callerIsSyncAdapter, match, null /* selection */, null /* selection args */); + mDb = mDbHelper.getWritableDatabase(); long id = 0; @@ -3062,6 +3066,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun final int match = sUriMatcher.match(uri); verifyTransactionAllowed(TRANSACTION_DELETE, uri, null, callerIsSyncAdapter, match, selection, selectionArgs); + mDb = mDbHelper.getWritableDatabase(); switch (match) { case SYNCSTATE: @@ -3926,6 +3931,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun final int match = sUriMatcher.match(uri); verifyTransactionAllowed(TRANSACTION_UPDATE, uri, values, callerIsSyncAdapter, match, selection, selectionArgs); + mDb = mDbHelper.getWritableDatabase(); switch (match) { case SYNCSTATE: @@ -4983,9 +4989,7 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun * Makes sure there are no entries for accounts that no longer exist. */ private void removeStaleAccounts(Account[] accounts) { - if (mDb == null) { - mDb = mDbHelper.getWritableDatabase(); - } + mDb = mDbHelper.getWritableDatabase(); if (mDb == null) { return; } |