Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Fixed the problem where updating event colors would cause exceptions

Bug: 6742712
Change-Id: Ie097e05c74995513b5b6fc04efd8e0d35876b698
  • Loading branch information...
commit f98ed2e5c5e08cac159ce4cf22ab86a718f0bb0b 1 parent 35225e0
Michael Chan authored
20 src/com/android/providers/calendar/CalendarProvider2.java
View
@@ -203,8 +203,9 @@
private static final String SQL_WHERE_CALENDAR_COLOR = Calendars.ACCOUNT_NAME + "=? AND "
+ Calendars.ACCOUNT_TYPE + "=? AND " + Calendars.CALENDAR_COLOR_KEY + "=?";
- private static final String SQL_WHERE_EVENT_COLOR = Events.ACCOUNT_NAME + "=? AND "
- + Events.ACCOUNT_TYPE + "=? AND " + Events.EVENT_COLOR_KEY + "=?";
+ private static final String SQL_WHERE_EVENT_COLOR = Calendars._ID + " in (SELECT _id from "
+ + Tables.CALENDARS + " WHERE " + Events.ACCOUNT_NAME + "=? AND " + Events.ACCOUNT_TYPE
+ + "=?) AND " + Events.EVENT_COLOR_KEY + "=?";
protected static final String SQL_WHERE_ID = GENERIC_ID + "=?";
private static final String SQL_WHERE_EVENT_ID = GENERIC_EVENT_ID + "=?";
@@ -3875,10 +3876,17 @@ protected int updateInTransaction(Uri uri, ContentValues values, String selectio
}
case COLORS:
- Integer color = values.getAsInteger(Colors.COLOR);
- if (values.size() > 1 || (values.size() == 1 && color == null)) {
- throw new UnsupportedOperationException("You may only change the COLOR "
- + "for an existing Colors entry.");
+ int validValues = 0;
+ if (values.getAsInteger(Colors.COLOR) != null) {
+ validValues++;
+ }
+ if (values.getAsString(Colors.DATA) != null) {
+ validValues++;
+ }
+
+ if (values.size() != validValues) {
+ throw new UnsupportedOperationException("You may only change the COLOR and"
+ + " DATA columns for an existing Colors entry.");
}
return handleUpdateColors(values, appendAccountToSelection(uri, selection,
Calendars.ACCOUNT_NAME, Calendars.ACCOUNT_TYPE),
75 tests/src/com/android/providers/calendar/CalendarProvider2Test.java
View
@@ -1072,7 +1072,7 @@ private String obsToString(Object... objs) {
return bob.toString();
}
- private long insertColor(long colorType, String colorKey, long color) {
+ private Uri insertColor(long colorType, String colorKey, long color) {
ContentValues m = new ContentValues();
m.put(Colors.ACCOUNT_NAME, DEFAULT_ACCOUNT);
m.put(Colors.ACCOUNT_TYPE, DEFAULT_ACCOUNT_TYPE);
@@ -1083,9 +1083,31 @@ private long insertColor(long colorType, String colorKey, long color) {
Uri uri = CalendarContract.Colors.CONTENT_URI;
- uri = mResolver.insert(addSyncQueryParams(uri, DEFAULT_ACCOUNT, DEFAULT_ACCOUNT_TYPE), m);
- String id = uri.getLastPathSegment();
- return Long.parseLong(id);
+ return mResolver.insert(addSyncQueryParams(uri, DEFAULT_ACCOUNT, DEFAULT_ACCOUNT_TYPE), m);
+ }
+
+ private void updateAndCheckColor(long colorId, long colorType, String colorKey, long color) {
+
+ Uri uri = CalendarContract.Colors.CONTENT_URI;
+
+ final String where = Colors.ACCOUNT_NAME + "=? AND " + Colors.ACCOUNT_TYPE + "=? AND "
+ + Colors.COLOR_TYPE + "=? AND " + Colors.COLOR_KEY + "=?";
+
+ String[] selectionArgs = new String[] {
+ DEFAULT_ACCOUNT, DEFAULT_ACCOUNT_TYPE, Long.toString(colorType), colorKey
+ };
+
+ ContentValues cv = new ContentValues();
+ cv.put(Colors.COLOR, color);
+ cv.put(Colors.DATA, obsToString(colorType, colorKey, color));
+
+ int count = mResolver.update(
+ addSyncQueryParams(uri, DEFAULT_ACCOUNT, DEFAULT_ACCOUNT_TYPE), cv, where,
+ selectionArgs);
+
+ checkColor(colorId, colorType, colorKey, color);
+
+ assertEquals(1, count);
}
/**
@@ -1293,19 +1315,42 @@ private void deleteAllEvents() {
mMetaData.clearInstanceRange();
}
- public void testInsertColor() throws Exception {
- checkColor(Colors.TYPE_EVENT, "1" /* color key */, 11 /* color */);
+ public void testInsertAndUpdateColor() throws Exception {
+ // Calendar Color
+ long colorType = Colors.TYPE_CALENDAR;
+ String colorKey = "123";
+ long colorValue = 11;
+ long colorId = insertAndCheckColor(colorType, colorKey, colorValue);
+
try {
- checkColor(Colors.TYPE_EVENT, "1" /* color key */, 11 /* color */);
+ insertAndCheckColor(colorType, colorKey, colorValue);
fail("Expected to fail with duplicate insertion");
} catch (IllegalArgumentException iae) {
// good
}
- checkColor(Colors.TYPE_CALENDAR, "1" /* color key */, 22 /* color */);
+ // Test Update
+ colorValue += 11;
+ updateAndCheckColor(colorId, colorType, colorKey, colorValue);
+
+ // Event Color
+ colorType = Colors.TYPE_EVENT;
+ colorValue += 11;
+
+ colorId = insertAndCheckColor(colorType, colorKey, colorValue);
+ try {
+ insertAndCheckColor(colorType, colorKey, colorValue);
+ fail("Expected to fail with duplicate insertion");
+ } catch (IllegalArgumentException iae) {
+ // good
+ }
+
+ // Test Update
+ colorValue += 11;
+ updateAndCheckColor(colorId, colorType, colorKey, colorValue);
}
- private void checkColor(long colorType, String colorKey, long color) {
+ private void checkColor(long colorId, long colorType, String colorKey, long color) {
String[] projection = new String[] {
Colors.ACCOUNT_NAME, // 0
Colors.ACCOUNT_TYPE, // 1
@@ -1316,8 +1361,6 @@ private void checkColor(long colorType, String colorKey, long color) {
Colors.DATA, // 6
};
- long color1Id = insertColor(colorType, colorKey, color);
-
Cursor cursor = mResolver.query(Colors.CONTENT_URI, projection, Colors.COLOR_KEY
+ "=? AND " + Colors.COLOR_TYPE + "=?", new String[] {
colorKey, Long.toString(colorType)
@@ -1331,11 +1374,19 @@ private void checkColor(long colorType, String colorKey, long color) {
assertEquals(colorType, cursor.getLong(2));
assertEquals(colorKey, cursor.getString(3));
assertEquals(color, cursor.getLong(4));
- assertEquals(color1Id, cursor.getLong(5));
+ assertEquals(colorId, cursor.getLong(5));
assertEquals(obsToString(colorType, colorKey, color), cursor.getString(6));
cursor.close();
}
+ private long insertAndCheckColor(long colorType, String colorKey, long color) {
+ Uri uri = insertColor(colorType, colorKey, color);
+ long id = Long.parseLong(uri.getLastPathSegment());
+
+ checkColor(id, colorType, colorKey, color);
+ return id;
+ }
+
public void testInsertNormalEvents() throws Exception {
final int calId = insertCal("Calendar0", DEFAULT_TIMEZONE);
Cursor cursor = mResolver.query(mEventsUri, null, null, null, null);
Please sign in to comment.
Something went wrong with that request. Please try again.