Merge "Move RCS specific canonical address handling"
am: f93a422a30

Change-Id: Icb60640b3eec9318a2045c2e954ef20cd027f7a1
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 125a3ae..9ac0815 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -116,8 +116,7 @@
                   android:authorities="rcs"
                   android:multiprocess="false"
                   android:exported="true"
-                  android:singleUser="true"
-                  android:readPermission="android.permission.READ_SMS" />
+                  android:singleUser="true" />
 
         <service
             android:name=".TelephonyBackupAgent$DeferredSmsMmsRestoreService"
diff --git a/src/com/android/providers/telephony/MmsSmsProvider.java b/src/com/android/providers/telephony/MmsSmsProvider.java
index e2e9a1c..8c3555c 100644
--- a/src/com/android/providers/telephony/MmsSmsProvider.java
+++ b/src/com/android/providers/telephony/MmsSmsProvider.java
@@ -110,7 +110,7 @@
     /**
      * the name of the table that is used to store the canonical addresses for both SMS and MMS.
      */
-    private static final String TABLE_CANONICAL_ADDRESSES = "canonical_addresses";
+    static final String TABLE_CANONICAL_ADDRESSES = "canonical_addresses";
 
     /**
      * the name of the table that is used to store the conversation threads.
diff --git a/src/com/android/providers/telephony/RcsProvider.java b/src/com/android/providers/telephony/RcsProvider.java
index db45402..c0ca9e1 100644
--- a/src/com/android/providers/telephony/RcsProvider.java
+++ b/src/com/android/providers/telephony/RcsProvider.java
@@ -119,6 +119,7 @@
     private static final int OUTGOING_MESSAGE_ON_GROUP_THREAD_WITH_ID = 41;
     private static final int FILE_TRANSFER_WITH_ID = 42;
     private static final int EVENT = 43;
+    private static final int CANONICAL_ADDRESS = 44;
 
     SQLiteOpenHelper mDbOpenHelper;
 
@@ -130,6 +131,8 @@
     RcsProviderMessageHelper mMessageHelper;
     @VisibleForTesting
     RcsProviderEventHelper mEventHelper;
+    @VisibleForTesting
+    RcsProviderCanonicalAddressHelper mCanonicalAddressHelper;
 
     static {
         // example URI: content://rcs/thread
@@ -294,17 +297,19 @@
 
         // example URI: content://rcs/event
         URL_MATCHER.addURI(AUTHORITY, "event", EVENT);
+
+        URL_MATCHER.addURI(AUTHORITY, "canonical-address", CANONICAL_ADDRESS);
     }
 
     @Override
     public boolean onCreate() {
-        setAppOps(AppOpsManager.OP_READ_SMS, AppOpsManager.OP_WRITE_SMS);
         // Use the credential encrypted mmssms.db for RCS messages.
         mDbOpenHelper = MmsSmsDatabaseHelper.getInstanceForCe(getContext());
         mParticipantHelper = new RcsProviderParticipantHelper(mDbOpenHelper);
         mThreadHelper = new RcsProviderThreadHelper(mDbOpenHelper);
         mMessageHelper = new RcsProviderMessageHelper(mDbOpenHelper);
         mEventHelper = new RcsProviderEventHelper(mDbOpenHelper);
+        mCanonicalAddressHelper = new RcsProviderCanonicalAddressHelper(mDbOpenHelper);
         return true;
     }
 
@@ -447,6 +452,9 @@
                 return mMessageHelper.queryFileTransfer(uri);
             case EVENT:
                 return mEventHelper.queryEvents(queryArgs);
+            case CANONICAL_ADDRESS:
+                String canonicalAddress = uri.getQueryParameter("address");
+                return mCanonicalAddressHelper.getOrCreateCanonicalAddress(canonicalAddress);
             default:
                 Log.e(TAG, "Invalid query: " + uri);
         }
diff --git a/src/com/android/providers/telephony/RcsProviderCanonicalAddressHelper.java b/src/com/android/providers/telephony/RcsProviderCanonicalAddressHelper.java
new file mode 100644
index 0000000..496b512
--- /dev/null
+++ b/src/com/android/providers/telephony/RcsProviderCanonicalAddressHelper.java
@@ -0,0 +1,54 @@
+package com.android.providers.telephony;
+
+import android.content.ContentValues;
+import android.database.Cursor;
+import android.database.MatrixCursor;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteOpenHelper;
+import android.provider.BaseColumns;
+import android.provider.Telephony;
+
+public class RcsProviderCanonicalAddressHelper {
+    SQLiteOpenHelper mSQLiteOpenHelper;
+
+    RcsProviderCanonicalAddressHelper(SQLiteOpenHelper sqLiteOpenHelper) {
+        mSQLiteOpenHelper = sqLiteOpenHelper;
+    }
+
+    Cursor getOrCreateCanonicalAddress(String canonicalAddress) {
+        SQLiteDatabase db = mSQLiteOpenHelper.getReadableDatabase();
+
+        Cursor cursor = db.query(
+                MmsSmsProvider.TABLE_CANONICAL_ADDRESSES,
+                new String[]{BaseColumns._ID}, Telephony.CanonicalAddressesColumns.ADDRESS + "=?",
+                new String[]{canonicalAddress}, null, null, null);
+
+        if (cursor != null && cursor.getCount() > 0) {
+            return cursor;
+        }
+
+        if (cursor != null) {
+            cursor.close();
+        }
+
+        return insertCanonicalAddress(canonicalAddress);
+    }
+
+    private Cursor insertCanonicalAddress(String canonicalAddress) {
+        ContentValues contentValues = new ContentValues();
+        contentValues.put(Telephony.CanonicalAddressesColumns.ADDRESS, canonicalAddress);
+
+        SQLiteDatabase db = mSQLiteOpenHelper.getWritableDatabase();
+
+        long id = db.insert(MmsSmsProvider.TABLE_CANONICAL_ADDRESSES, null, contentValues);
+
+        if (id == -1) {
+            return null;
+        }
+
+        MatrixCursor matrixCursor = new MatrixCursor(new String[]{BaseColumns._ID}, 1);
+        matrixCursor.addRow(new Object[]{id});
+
+        return matrixCursor;
+    }
+}
diff --git a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
index 065cf81..57223c2 100644
--- a/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
+++ b/src/com/android/providers/telephony/RcsProviderParticipantHelper.java
@@ -259,7 +259,12 @@
             return TRANSACTION_FAILED;
         }
         SQLiteDatabase db = mSqLiteOpenHelper.getWritableDatabase();
-        return db.insert(RCS_PARTICIPANT_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
+        long rowId = db.insert(RCS_PARTICIPANT_TABLE, RCS_PARTICIPANT_ID_COLUMN, contentValues);
+        Log.e(TAG, "Inserted participant with rowId=" + rowId);
+        if (rowId < 0) {
+            return TRANSACTION_FAILED;
+        }
+        return rowId;
     }
 
     long insertParticipantIntoP2pThread(Uri uri) {