Merge "New apn overwrites existing apn, when created with same name but different apn type"
diff --git a/src/com/android/providers/telephony/TelephonyProvider.java b/src/com/android/providers/telephony/TelephonyProvider.java
index 8994b83..b720c0b 100644
--- a/src/com/android/providers/telephony/TelephonyProvider.java
+++ b/src/com/android/providers/telephony/TelephonyProvider.java
@@ -164,6 +164,9 @@
private static final String OTA_UPDATED_APNS_PATH = "misc/apns-conf.xml";
private static final String OLD_APNS_PATH = "etc/old-apns-conf.xml";
+ private static final String DEFAULT_PROTOCOL = "IP";
+ private static final String DEFAULT_ROAMING_PROTOCOL = "IP";
+
private static final UriMatcher s_urlMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final ContentValues s_currentNullMap;
@@ -245,8 +248,8 @@
AUTH_TYPE + " INTEGER DEFAULT -1," +
TYPE + " TEXT DEFAULT ''," +
CURRENT + " INTEGER," +
- PROTOCOL + " TEXT DEFAULT 'IP'," +
- ROAMING_PROTOCOL + " TEXT DEFAULT 'IP'," +
+ PROTOCOL + " TEXT DEFAULT " + DEFAULT_PROTOCOL + "," +
+ ROAMING_PROTOCOL + " TEXT DEFAULT " + DEFAULT_ROAMING_PROTOCOL + "," +
CARRIER_ENABLED + " BOOLEAN DEFAULT 1," +
BEARER + " INTEGER DEFAULT 0," +
BEARER_BITMASK + " INTEGER DEFAULT 0," +
@@ -1054,9 +1057,9 @@
whereArgs[i++] = values.containsKey(TYPE) ?
values.getAsString(TYPE) : "";
whereArgs[i++] = values.containsKey(PROTOCOL) ?
- values.getAsString(PROTOCOL) : "IP";
+ values.getAsString(PROTOCOL) : DEFAULT_PROTOCOL;
whereArgs[i++] = values.containsKey(ROAMING_PROTOCOL) ?
- values.getAsString(ROAMING_PROTOCOL) : "IP";
+ values.getAsString(ROAMING_PROTOCOL) : DEFAULT_ROAMING_PROTOCOL;
if (values.containsKey(CARRIER_ENABLED) &&
(values.getAsString(CARRIER_ENABLED).
@@ -1901,6 +1904,7 @@
SQLiteDatabase db = getWritableDatabase();
// query all unique fields from id
String[] proj = CARRIERS_UNIQUE_FIELDS.toArray(new String[CARRIERS_UNIQUE_FIELDS.size()]);
+
Cursor c = db.query(CARRIERS_TABLE, proj, "_id=" + id, null, null, null, null);
if (c != null) {
if (c.getCount() == 1) {
@@ -2557,6 +2561,21 @@
count = db.updateWithOnConflict(CARRIERS_TABLE, values,
_ID + "=?" + " and " + NOT_OWNED_BY_DPC,
new String[] { url.getLastPathSegment() }, SQLiteDatabase.CONFLICT_REPLACE);
+ try {
+ count = db.updateWithOnConflict(CARRIERS_TABLE, values,
+ _ID + "=?" + " and " + NOT_OWNED_BY_DPC,
+ new String[] { url.getLastPathSegment() }, SQLiteDatabase.CONFLICT_ABORT);
+ } catch (SQLException e) {
+ // Update failed which could be due to a conflict. Check if that is
+ // the case and merge the entries
+ Cursor oldRow = DatabaseHelper.selectConflictingRow(db, CARRIERS_TABLE, values);
+ if (oldRow != null) {
+ ContentValues mergedValues = new ContentValues();
+ DatabaseHelper.mergeFieldsAndUpdateDb(db, CARRIERS_TABLE, oldRow, values,
+ mergedValues, false, getContext());
+ oldRow.close();
+ }
+ }
break;
}