Use new CallLog number presentation column

Switch to using new number presentation column in the CallLog table and
discontinue using special phone number strings in CallerInfo. Needed for
unbundling.

Bug:6948882
Change-Id: Ibf27ea55cee783c4530101e4e228198e245e6684
diff --git a/src/com/android/dialer/CallDetailActivity.java b/src/com/android/dialer/CallDetailActivity.java
index d716de0..b233923 100644
--- a/src/com/android/dialer/CallDetailActivity.java
+++ b/src/com/android/dialer/CallDetailActivity.java
@@ -208,6 +208,7 @@
         CallLog.Calls.TYPE,
         CallLog.Calls.COUNTRY_ISO,
         CallLog.Calls.GEOCODED_LOCATION,
+        CallLog.Calls.NUMBER_PRESENTATION,
     };
 
     static final int DATE_COLUMN_INDEX = 0;
@@ -216,6 +217,7 @@
     static final int CALL_TYPE_COLUMN_INDEX = 3;
     static final int COUNTRY_ISO_COLUMN_INDEX = 4;
     static final int GEOCODED_LOCATION_COLUMN_INDEX = 5;
+    static final int NUMBER_PRESENTATION_COLUMN_INDEX = 6;
 
     private final View.OnClickListener mPrimaryActionListener = new View.OnClickListener() {
         @Override
@@ -421,6 +423,7 @@
                 // first.
                 PhoneCallDetails firstDetails = details[0];
                 mNumber = firstDetails.number.toString();
+                final int numberPresentation = firstDetails.numberPresentation;
                 final Uri contactUri = firstDetails.contactUri;
                 final Uri photoUri = firstDetails.photoUri;
 
@@ -428,7 +431,8 @@
                 mPhoneCallDetailsHelper.setCallDetailsHeader(mHeaderTextView, firstDetails);
 
                 // Cache the details about the phone number.
-                final boolean canPlaceCallsTo = mPhoneNumberHelper.canPlaceCallsTo(mNumber);
+                final boolean canPlaceCallsTo =
+                    PhoneNumberHelper.canPlaceCallsTo(mNumber, numberPresentation);
                 final boolean isVoicemailNumber = mPhoneNumberHelper.isVoicemailNumber(mNumber);
                 final boolean isSipNumber = mPhoneNumberHelper.isSipNumber(mNumber);
 
@@ -509,7 +513,9 @@
                 if (canPlaceCallsTo) {
                     final CharSequence displayNumber =
                             mPhoneNumberHelper.getDisplayNumber(
-                                    firstDetails.number, firstDetails.formattedNumber);
+                                    firstDetails.number,
+                                    firstDetails.numberPresentation,
+                                    firstDetails.formattedNumber);
 
                     ViewEntry entry = new ViewEntry(
                             getString(R.string.menu_callNumber,
@@ -527,7 +533,7 @@
 
                     // The secondary action allows to send an SMS to the number that placed the
                     // call.
-                    if (mPhoneNumberHelper.canSendSmsTo(mNumber)) {
+                    if (mPhoneNumberHelper.canSendSmsTo(mNumber, numberPresentation)) {
                         entry.setSecondaryAction(
                                 R.drawable.ic_text_holo_dark,
                                 new Intent(Intent.ACTION_SENDTO,
@@ -598,10 +604,12 @@
             }
 
             // Read call log specifics.
-            String number = callCursor.getString(NUMBER_COLUMN_INDEX);
-            long date = callCursor.getLong(DATE_COLUMN_INDEX);
-            long duration = callCursor.getLong(DURATION_COLUMN_INDEX);
-            int callType = callCursor.getInt(CALL_TYPE_COLUMN_INDEX);
+            final String number = callCursor.getString(NUMBER_COLUMN_INDEX);
+            final int numberPresentation = callCursor.getInt(
+                    NUMBER_PRESENTATION_COLUMN_INDEX);
+            final long date = callCursor.getLong(DATE_COLUMN_INDEX);
+            final long duration = callCursor.getLong(DURATION_COLUMN_INDEX);
+            final int callType = callCursor.getInt(CALL_TYPE_COLUMN_INDEX);
             String countryIso = callCursor.getString(COUNTRY_ISO_COLUMN_INDEX);
             final String geocode = callCursor.getString(GEOCODED_LOCATION_COLUMN_INDEX);
 
@@ -619,12 +627,13 @@
             final Uri lookupUri;
             // If this is not a regular number, there is no point in looking it up in the contacts.
             ContactInfo info =
-                    mPhoneNumberHelper.canPlaceCallsTo(number)
+                    PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)
                     && !mPhoneNumberHelper.isVoicemailNumber(number)
                             ? mContactInfoHelper.lookupNumber(number, countryIso)
                             : null;
             if (info == null) {
-                formattedNumber = mPhoneNumberHelper.getDisplayNumber(number, null);
+                formattedNumber = mPhoneNumberHelper.getDisplayNumber(number,
+                        numberPresentation, null);
                 nameText = "";
                 numberType = 0;
                 numberLabel = "";
@@ -638,7 +647,8 @@
                 photoUri = info.photoUri;
                 lookupUri = info.lookupUri;
             }
-            return new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
+            return new PhoneCallDetails(number, numberPresentation,
+                    formattedNumber, countryIso, geocode,
                     new int[]{ callType }, date, duration,
                     nameText, numberType, numberLabel, lookupUri, photoUri);
         } finally {
diff --git a/src/com/android/dialer/PhoneCallDetails.java b/src/com/android/dialer/PhoneCallDetails.java
index 45c29e4..c380b65 100644
--- a/src/com/android/dialer/PhoneCallDetails.java
+++ b/src/com/android/dialer/PhoneCallDetails.java
@@ -26,6 +26,8 @@
 public class PhoneCallDetails {
     /** The number of the other party involved in the call. */
     public final CharSequence number;
+    /** The number presenting rules set by the network, e.g., {@link Calls#PRESENTATION_ALLOWED} */
+    public final int numberPresentation;
     /** The formatted version of {@link #number}. */
     public final CharSequence formattedNumber;
     /** The country corresponding with the phone number. */
@@ -59,18 +61,21 @@
     public final Uri photoUri;
 
     /** Create the details for a call with a number not associated with a contact. */
-    public PhoneCallDetails(CharSequence number, CharSequence formattedNumber,
-            String countryIso, String geocode, int[] callTypes, long date, long duration) {
-        this(number, formattedNumber, countryIso, geocode, callTypes, date, duration, "", 0, "",
-                null, null);
+    public PhoneCallDetails(CharSequence number, int numberPresentation,
+            CharSequence formattedNumber, String countryIso, String geocode,
+            int[] callTypes, long date, long duration) {
+        this(number, numberPresentation, formattedNumber, countryIso, geocode,
+                callTypes, date, duration, "", 0, "", null, null);
     }
 
     /** Create the details for a call with a number associated with a contact. */
-    public PhoneCallDetails(CharSequence number, CharSequence formattedNumber,
-            String countryIso, String geocode, int[] callTypes, long date, long duration,
-            CharSequence name, int numberType, CharSequence numberLabel, Uri contactUri,
+    public PhoneCallDetails(CharSequence number, int numberPresentation,
+            CharSequence formattedNumber, String countryIso, String geocode,
+            int[] callTypes, long date, long duration, CharSequence name,
+            int numberType, CharSequence numberLabel, Uri contactUri,
             Uri photoUri) {
         this.number = number;
+        this.numberPresentation = numberPresentation;
         this.formattedNumber = formattedNumber;
         this.countryIso = countryIso;
         this.geocode = geocode;
diff --git a/src/com/android/dialer/PhoneCallDetailsHelper.java b/src/com/android/dialer/PhoneCallDetailsHelper.java
index 51b1109..37394c3 100644
--- a/src/com/android/dialer/PhoneCallDetailsHelper.java
+++ b/src/com/android/dialer/PhoneCallDetailsHelper.java
@@ -105,7 +105,8 @@
         final CharSequence numberText;
         final CharSequence labelText;
         final CharSequence displayNumber =
-            mPhoneNumberHelper.getDisplayNumber(details.number, details.formattedNumber);
+            mPhoneNumberHelper.getDisplayNumber(details.number,
+                    details.numberPresentation, details.formattedNumber);
         if (TextUtils.isEmpty(details.name)) {
             nameText = displayNumber;
             if (TextUtils.isEmpty(details.geocode)
@@ -135,7 +136,7 @@
     public void setCallDetailsHeader(TextView nameView, PhoneCallDetails details) {
         final CharSequence nameText;
         final CharSequence displayNumber =
-                mPhoneNumberHelper.getDisplayNumber(details.number,
+            mPhoneNumberHelper.getDisplayNumber(details.number, details.numberPresentation,
                         mResources.getString(R.string.recentCalls_addToContact));
         if (TextUtils.isEmpty(details.name)) {
             nameText = displayNumber;
diff --git a/src/com/android/dialer/calllog/CallLogAdapter.java b/src/com/android/dialer/calllog/CallLogAdapter.java
index b0af99a..c78aa53 100644
--- a/src/com/android/dialer/calllog/CallLogAdapter.java
+++ b/src/com/android/dialer/calllog/CallLogAdapter.java
@@ -521,6 +521,7 @@
         views.listHeaderTextView.setVisibility(View.GONE);
 
         final String number = c.getString(CallLogQuery.NUMBER);
+        final int numberPresentation = c.getInt(CallLogQuery.NUMBER_PRESENTATION);
         final long date = c.getLong(CallLogQuery.DATE);
         final long duration = c.getLong(CallLogQuery.DURATION);
         final int callType = c.getInt(CallLogQuery.CALL_TYPE);
@@ -551,7 +552,7 @@
         ExpirableCache.CachedValue<ContactInfo> cachedInfo =
                 mContactInfoCache.getCachedValue(numberCountryIso);
         ContactInfo info = cachedInfo == null ? null : cachedInfo.getValue();
-        if (!mPhoneNumberHelper.canPlaceCallsTo(number)
+        if (!PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)
                 || mPhoneNumberHelper.isVoicemailNumber(number)) {
             // If this is a number that cannot be dialed, there is no point in looking up a contact
             // for it.
@@ -593,12 +594,14 @@
         final String geocode = c.getString(CallLogQuery.GEOCODED_LOCATION);
         final PhoneCallDetails details;
         if (TextUtils.isEmpty(name)) {
-            details = new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
-                    callTypes, date, duration);
+            details = new PhoneCallDetails(number, numberPresentation,
+                    formattedNumber, countryIso, geocode, callTypes, date,
+                    duration);
         } else {
             // We do not pass a photo id since we do not need the high-res picture.
-            details = new PhoneCallDetails(number, formattedNumber, countryIso, geocode,
-                    callTypes, date, duration, name, ntype, label, lookupUri, null);
+            details = new PhoneCallDetails(number, numberPresentation,
+                    formattedNumber, countryIso, geocode, callTypes, date,
+                    duration, name, ntype, label, lookupUri, null);
         }
 
         final boolean isNew = c.getInt(CallLogQuery.IS_READ) == 0;
diff --git a/src/com/android/dialer/calllog/CallLogFragment.java b/src/com/android/dialer/calllog/CallLogFragment.java
index 86a383a..bc0856f 100644
--- a/src/com/android/dialer/calllog/CallLogFragment.java
+++ b/src/com/android/dialer/calllog/CallLogFragment.java
@@ -53,7 +53,6 @@
 import com.android.dialer.voicemail.VoicemailStatusHelper;
 import com.android.dialer.voicemail.VoicemailStatusHelper.StatusMessage;
 import com.android.dialer.voicemail.VoicemailStatusHelperImpl;
-import com.android.internal.telephony.CallerInfo;
 import com.android.internal.telephony.ITelephony;
 import com.google.common.annotations.VisibleForTesting;
 
@@ -460,10 +459,8 @@
         final Cursor cursor = (Cursor)mAdapter.getItem(position);
         if (cursor != null) {
             String number = cursor.getString(CallLogQuery.NUMBER);
-            if (TextUtils.isEmpty(number)
-                    || number.equals(CallerInfo.UNKNOWN_NUMBER)
-                    || number.equals(CallerInfo.PRIVATE_NUMBER)
-                    || number.equals(CallerInfo.PAYPHONE_NUMBER)) {
+            int numberPresentation = cursor.getInt(CallLogQuery.NUMBER_PRESENTATION);
+            if (!PhoneNumberHelper.canPlaceCallsTo(number, numberPresentation)) {
                 // This number can't be called, do nothing
                 return;
             }
diff --git a/src/com/android/dialer/calllog/CallLogListItemHelper.java b/src/com/android/dialer/calllog/CallLogListItemHelper.java
index 20b30b1..bccd4f4 100644
--- a/src/com/android/dialer/calllog/CallLogListItemHelper.java
+++ b/src/com/android/dialer/calllog/CallLogListItemHelper.java
@@ -60,7 +60,8 @@
             boolean isHighlighted) {
         mPhoneCallDetailsHelper.setPhoneCallDetails(views.phoneCallDetailsViews, details,
                 isHighlighted);
-        boolean canCall = mPhoneNumberHelper.canPlaceCallsTo(details.number);
+        boolean canCall = PhoneNumberHelper.canPlaceCallsTo(details.number,
+            details.numberPresentation);
         boolean canPlay = details.callTypes[0] == Calls.VOICEMAIL_TYPE;
 
         if (canPlay) {
@@ -93,7 +94,7 @@
             recipient = details.name;
         } else {
             recipient = mPhoneNumberHelper.getDisplayNumber(
-                    details.number, details.formattedNumber);
+                    details.number, details.numberPresentation, details.formattedNumber);
         }
         return mResources.getString(R.string.description_call, recipient);
     }
diff --git a/src/com/android/dialer/calllog/CallLogQuery.java b/src/com/android/dialer/calllog/CallLogQuery.java
index 5f7b27b..01949e0 100644
--- a/src/com/android/dialer/calllog/CallLogQuery.java
+++ b/src/com/android/dialer/calllog/CallLogQuery.java
@@ -43,6 +43,7 @@
             Calls.CACHED_PHOTO_ID,           // 14
             Calls.CACHED_FORMATTED_NUMBER,   // 15
             Calls.IS_READ,                   // 16
+            Calls.NUMBER_PRESENTATION,       // 17
     };
 
     public static final int ID = 0;
@@ -62,8 +63,9 @@
     public static final int CACHED_PHOTO_ID = 14;
     public static final int CACHED_FORMATTED_NUMBER = 15;
     public static final int IS_READ = 16;
+    public static final int NUMBER_PRESENTATION = 17;
     /** The index of the synthetic "section" column in the extended projection. */
-    public static final int SECTION = 17;
+    public static final int SECTION = 18;
 
     /**
      * The name of the synthetic "section" column.
diff --git a/src/com/android/dialer/calllog/CallLogQueryHandler.java b/src/com/android/dialer/calllog/CallLogQueryHandler.java
index 43b8d21..750b416 100644
--- a/src/com/android/dialer/calllog/CallLogQueryHandler.java
+++ b/src/com/android/dialer/calllog/CallLogQueryHandler.java
@@ -145,7 +145,7 @@
         // plus the section value.
         matrixCursor.addRow(new Object[]{
                 0L, "", 0L, 0L, 0, "", "", "", null, 0, null, null, null, null, 0L, null, 0,
-                section
+                Calls.PRESENTATION_ALLOWED, section
         });
         return matrixCursor;
     }
diff --git a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
index e551e60..8bac657 100644
--- a/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
+++ b/src/com/android/dialer/calllog/DefaultVoicemailNotifier.java
@@ -122,7 +122,8 @@
                 name = mNameLookupQuery.query(newCall.number);
                 // If we cannot lookup the contact, use the number instead.
                 if (name == null) {
-                    name = mPhoneNumberHelper.getDisplayNumber(newCall.number, "").toString();
+                    name = mPhoneNumberHelper.getDisplayNumber(newCall.number,
+                            newCall.numberPresentation, "").toString();
                     if (TextUtils.isEmpty(name)) {
                         name = newCall.number;
                     }
@@ -210,11 +211,14 @@
         public final Uri callsUri;
         public final Uri voicemailUri;
         public final String number;
+        public final int numberPresentation;
 
-        public NewCall(Uri callsUri, Uri voicemailUri, String number) {
+        public NewCall(Uri callsUri, Uri voicemailUri, String number,
+                int numberPresentation) {
             this.callsUri = callsUri;
             this.voicemailUri = voicemailUri;
             this.number = number;
+            this.numberPresentation = numberPresentation;
         }
     }
 
@@ -237,11 +241,13 @@
      */
     private static final class DefaultNewCallsQuery implements NewCallsQuery {
         private static final String[] PROJECTION = {
-            Calls._ID, Calls.NUMBER, Calls.VOICEMAIL_URI
+            Calls._ID, Calls.NUMBER, Calls.NUMBER_PRESENTATION,
+            Calls.VOICEMAIL_URI
         };
         private static final int ID_COLUMN_INDEX = 0;
         private static final int NUMBER_COLUMN_INDEX = 1;
         private static final int VOICEMAIL_URI_COLUMN_INDEX = 2;
+        private static final int NUMBER_PRESENTATION_COLUMN_INDEX = 3;
 
         private final ContentResolver mContentResolver;
 
@@ -276,7 +282,8 @@
             Uri callsUri = ContentUris.withAppendedId(
                     Calls.CONTENT_URI_WITH_VOICEMAIL, cursor.getLong(ID_COLUMN_INDEX));
             Uri voicemailUri = voicemailUriString == null ? null : Uri.parse(voicemailUriString);
-            return new NewCall(callsUri, voicemailUri, cursor.getString(NUMBER_COLUMN_INDEX));
+            return new NewCall(callsUri, voicemailUri, cursor.getString(NUMBER_COLUMN_INDEX),
+                    cursor.getInt(NUMBER_PRESENTATION_COLUMN_INDEX));
         }
     }
 
diff --git a/src/com/android/dialer/calllog/PhoneNumberHelper.java b/src/com/android/dialer/calllog/PhoneNumberHelper.java
index f0b3701..7d46f40 100644
--- a/src/com/android/dialer/calllog/PhoneNumberHelper.java
+++ b/src/com/android/dialer/calllog/PhoneNumberHelper.java
@@ -17,11 +17,11 @@
 package com.android.dialer.calllog;
 
 import android.content.res.Resources;
+import android.provider.CallLog.Calls;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
 
 import com.android.dialer.R;
-import com.android.internal.telephony.CallerInfo;
 
 /**
  * Helper for formatting and managing phone numbers.
@@ -34,16 +34,15 @@
     }
 
     /** Returns true if it is possible to place a call to the given number. */
-    public boolean canPlaceCallsTo(CharSequence number) {
-        return !(TextUtils.isEmpty(number)
-                || number.equals(CallerInfo.UNKNOWN_NUMBER)
-                || number.equals(CallerInfo.PRIVATE_NUMBER)
-                || number.equals(CallerInfo.PAYPHONE_NUMBER));
+    public static boolean canPlaceCallsTo(CharSequence number, int presentation) {
+        return presentation == Calls.PRESENTATION_ALLOWED
+            && !TextUtils.isEmpty(number);
     }
 
     /** Returns true if it is possible to send an SMS to the given number. */
-    public boolean canSendSmsTo(CharSequence number) {
-        return canPlaceCallsTo(number) && !isVoicemailNumber(number) && !isSipNumber(number);
+    public boolean canSendSmsTo(CharSequence number, int presentation) {
+        return canPlaceCallsTo(number, presentation)
+            && !isVoicemailNumber(number) && !isSipNumber(number);
     }
 
     /**
@@ -52,19 +51,20 @@
      * @param number the number to display
      * @param formattedNumber the formatted number if available, may be null
      */
-    public CharSequence getDisplayNumber(CharSequence number, CharSequence formattedNumber) {
-        if (TextUtils.isEmpty(number)) {
-            return "";
-        }
-        if (number.equals(CallerInfo.UNKNOWN_NUMBER)) {
+    public CharSequence getDisplayNumber(CharSequence number,
+            int presentation, CharSequence formattedNumber) {
+        if (presentation == Calls.PRESENTATION_UNKNOWN) {
             return mResources.getString(R.string.unknown);
         }
-        if (number.equals(CallerInfo.PRIVATE_NUMBER)) {
+        if (presentation == Calls.PRESENTATION_RESTRICTED) {
             return mResources.getString(R.string.private_num);
         }
-        if (number.equals(CallerInfo.PAYPHONE_NUMBER)) {
+        if (presentation == Calls.PRESENTATION_PAYPHONE) {
             return mResources.getString(R.string.payphone);
         }
+        if (TextUtils.isEmpty(number)) {
+            return "";
+        }
         if (isVoicemailNumber(number)) {
             return mResources.getString(R.string.voicemail);
         }