am d616ee6f: Added a new URI updating preferred APN w/o change notification
* commit 'd616ee6fd5f752cc59eae90388f588c0f2e615a0':
Added a new URI updating preferred APN w/o change notification
diff --git a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
index 62e435a..3ba6e78 100644
--- a/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
+++ b/src/com/android/providers/telephony/MmsSmsDatabaseHelper.java
@@ -21,6 +21,8 @@
import java.io.FileInputStream;
import java.io.File;
import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
import android.content.BroadcastReceiver;
import android.content.ContentValues;
@@ -235,6 +237,51 @@
return sInstance;
}
+ /**
+ * Look through all the recipientIds referenced by the threads and then delete any
+ * unreferenced rows from the canonical_addresses table.
+ */
+ private static void removeUnferencedCanonicalAddresses(SQLiteDatabase db) {
+ Cursor c = db.query("threads", new String[] { "recipient_ids" },
+ null, null, null, null, null);
+ if (c != null) {
+ try {
+ if (c.getCount() == 0) {
+ // no threads, delete all addresses
+ int rows = db.delete("canonical_addresses", null, null);
+ } else {
+ // Find all the referenced recipient_ids from the threads. recipientIds is
+ // a space-separated list of recipient ids: "1 14 21"
+ HashSet<Integer> recipientIds = new HashSet<Integer>();
+ while (c.moveToNext()) {
+ String[] recips = c.getString(0).split(" ");
+ for (String recip : recips) {
+ try {
+ int recipientId = Integer.parseInt(recip);
+ recipientIds.add(recipientId);
+ } catch (Exception e) {
+ }
+ }
+ }
+ // Now build a selection string of all the unique recipient ids
+ StringBuilder sb = new StringBuilder();
+ Iterator<Integer> iter = recipientIds.iterator();
+ while (iter.hasNext()) {
+ sb.append("_id != " + iter.next());
+ if (iter.hasNext()) {
+ sb.append(" AND ");
+ }
+ }
+ if (sb.length() > 0) {
+ int rows = db.delete("canonical_addresses", sb.toString(), null);
+ }
+ }
+ } finally {
+ c.close();
+ }
+ }
+ }
+
public static void updateThread(SQLiteDatabase db, long thread_id) {
if (thread_id < 0) {
updateAllThreads(db, null, null);
@@ -251,8 +298,7 @@
new String[] { String.valueOf(thread_id) });
if (rows > 0) {
// If this deleted a row, let's remove orphaned canonical_addresses and get outta here
- db.delete("canonical_addresses",
- "_id NOT IN (SELECT DISTINCT recipient_ids FROM threads)", null);
+ removeUnferencedCanonicalAddresses(db);
return;
}
// Update the message count in the threads table as the sum
@@ -354,8 +400,7 @@
"UNION SELECT DISTINCT thread_id FROM pdu)", null);
// remove orphaned canonical_addresses
- db.delete("canonical_addresses",
- "_id NOT IN (SELECT DISTINCT recipient_ids FROM threads)", null);
+ removeUnferencedCanonicalAddresses(db);
}
public static int deleteOneSms(SQLiteDatabase db, int message_id) {