Merge "Backup call identification information."
diff --git a/src/com/android/calllogbackup/CallLogBackupAgent.java b/src/com/android/calllogbackup/CallLogBackupAgent.java
index 4717496..dabdef5 100644
--- a/src/com/android/calllogbackup/CallLogBackupAgent.java
+++ b/src/com/android/calllogbackup/CallLogBackupAgent.java
@@ -24,11 +24,10 @@
 import android.content.Context;
 import android.database.Cursor;
 import android.os.ParcelFileDescriptor;
-import android.os.UserHandle;
-import android.os.UserManager;
 import android.provider.CallLog;
 import android.provider.CallLog.Calls;
 import android.provider.Settings;
+import android.telecom.CallIdentification;
 import android.telecom.PhoneAccountHandle;
 import android.util.Log;
 
@@ -80,6 +79,12 @@
         int callBlockReason = Calls.BLOCK_REASON_NOT_BLOCKED;
         String callScreeningAppName = null;
         String callScreeningComponentName = null;
+        String callIdPackageName = null;
+        String callIdAppName = null;
+        String callIdName = null;
+        String callIdDescription = null;
+        String callIdDetails = null;
+        Integer callIdNuisanceConfidence = null;
         @Override
         public String toString() {
             if (isDebug()) {
@@ -139,6 +144,12 @@
         CallLog.Calls.BLOCK_REASON,
         CallLog.Calls.CALL_SCREENING_APP_NAME,
         CallLog.Calls.CALL_SCREENING_COMPONENT_NAME,
+        CallLog.Calls.CALL_ID_PACKAGE_NAME,
+        CallLog.Calls.CALL_ID_APP_NAME,
+        CallLog.Calls.CALL_ID_NAME,
+        CallLog.Calls.CALL_ID_DESCRIPTION,
+        CallLog.Calls.CALL_ID_DETAILS,
+        CallLog.Calls.CALL_ID_NUISANCE_CONFIDENCE
     };
 
     /** ${inheritDoc} */
@@ -265,13 +276,24 @@
                     ComponentName.unflattenFromString(call.accountComponentName), call.accountId);
         }
         boolean addForAllUsers = call.addForAllUsers == 1;
+        CallIdentification callIdentification = null;
+        if (call.callIdPackageName != null && call.callIdAppName != null) {
+            callIdentification = new CallIdentification.Builder(call.callIdPackageName,
+                    call.callIdAppName)
+                    .setName(call.callIdName)
+                    .setDescription(call.callIdDescription)
+                    .setDetails(call.callIdDetails)
+                    .setNuisanceConfidence(call.callIdNuisanceConfidence)
+                    .build();
+        }
         // We backup the calllog in the user running this backup agent, so write calls to this user.
         Calls.addCall(null /* CallerInfo */, this, call.number, call.postDialDigits, call.viaNumber,
             call.numberPresentation, call.type, call.features, handle, call.date,
             (int) call.duration, dataUsage, addForAllUsers, null, true /* isRead */,
             call.callBlockReason /*callBlockReason*/,
             call.callScreeningAppName /*callScreeningAppName*/,
-            call.callScreeningComponentName /*callScreeningComponentName*/);
+            call.callScreeningComponentName /*callScreeningComponentName*/,
+            callIdentification);
     }
 
     @VisibleForTesting
@@ -377,7 +399,13 @@
                 call.callScreeningAppName = readString(dataInput);
                 call.callScreeningComponentName = readString(dataInput);
             }
-
+            if(version >= 1007) {
+                call.callIdPackageName = readString(dataInput);
+                call.callIdAppName = readString(dataInput);
+                call.callIdDescription = readString(dataInput);
+                call.callIdDetails = readString(dataInput);
+                call.callIdNuisanceConfidence = readInteger(dataInput);
+            }
             return call;
         } catch (IOException e) {
             Log.e(TAG, "Error reading call data for " + callId, e);
@@ -411,6 +439,22 @@
             .getString(cursor.getColumnIndex(CallLog.Calls.CALL_SCREENING_APP_NAME));
         call.callScreeningComponentName = cursor
             .getString(cursor.getColumnIndex(CallLog.Calls.CALL_SCREENING_COMPONENT_NAME));
+        call.callIdPackageName =
+                cursor.getString(cursor.getColumnIndex(Calls.CALL_ID_PACKAGE_NAME));
+        call.callIdAppName =
+                cursor.getString(cursor.getColumnIndex(Calls.CALL_ID_APP_NAME));
+        call.callIdName =
+                cursor.getString(cursor.getColumnIndex(Calls.CALL_ID_NAME));
+        call.callIdDescription =
+                cursor.getString(cursor.getColumnIndex(Calls.CALL_ID_DESCRIPTION));
+        call.callIdDetails =
+                cursor.getString(cursor.getColumnIndex(Calls.CALL_ID_DETAILS));
+        if (cursor.isNull(cursor.getColumnIndex(Calls.CALL_ID_NUISANCE_CONFIDENCE))) {
+            call.callIdNuisanceConfidence = null;
+        } else {
+            call.callIdNuisanceConfidence = cursor.getInt(cursor.getColumnIndex(
+                    Calls.CALL_ID_NUISANCE_CONFIDENCE));
+        }
         return call;
     }
 
@@ -447,6 +491,13 @@
             writeString(data, call.callScreeningAppName);
             writeString(data, call.callScreeningComponentName);
 
+            writeString(data, call.callIdPackageName);
+            writeString(data, call.callIdAppName);
+            writeString(data, call.callIdName);
+            writeString(data, call.callIdDescription);
+            writeString(data, call.callIdDetails);
+            writeInteger(data, call.callIdNuisanceConfidence);
+
             data.flush();
 
             output.writeEntityHeader(Integer.toString(call.id), baos.size());
@@ -544,6 +595,23 @@
         }
     }
 
+    private void writeInteger(DataOutputStream data, Integer num) throws IOException {
+        if (num == null) {
+            data.writeBoolean(false);
+        } else {
+            data.writeBoolean(true);
+            data.writeInt(num);
+        }
+    }
+
+    private Integer readInteger(DataInputStream data) throws IOException {
+        if (data.readBoolean()) {
+            return data.readInt();
+        } else {
+            return null;
+        }
+    }
+
     private void removeCallFromBackup(BackupDataOutput output, int callId) {
         try {
             output.writeEntityHeader(Integer.toString(callId), -1);