Skip to content
This repository has been archived by the owner on Nov 8, 2023. It is now read-only.

Commit

Permalink
Fixed the problem where updating event colors would cause exceptions
Browse files Browse the repository at this point in the history
Bug: 6742712
Change-Id: Ie097e05c74995513b5b6fc04efd8e0d35876b698
  • Loading branch information
Michael Chan committed Jul 24, 2012
1 parent 35225e0 commit f98ed2e
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 18 deletions.
20 changes: 14 additions & 6 deletions src/com/android/providers/calendar/CalendarProvider2.java
Expand Up @@ -203,8 +203,9 @@ public class CalendarProvider2 extends SQLiteContentProvider implements OnAccoun
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 + "=?";
Expand Down Expand Up @@ -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),
Expand Down
75 changes: 63 additions & 12 deletions tests/src/com/android/providers/calendar/CalendarProvider2Test.java
Expand Up @@ -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);
Expand All @@ -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);
}

/**
Expand Down Expand Up @@ -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
Expand All @@ -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)
Expand All @@ -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);
Expand Down

0 comments on commit f98ed2e

Please sign in to comment.