Merge "DO NOT MERGE Ensure call subject is hidden if disabled for carrier." into ub-contactsdialer-b-dev
diff --git a/InCallUI/src/com/android/incallui/Call.java b/InCallUI/src/com/android/incallui/Call.java
index 9d9e7bf..7b2724a 100644
--- a/InCallUI/src/com/android/incallui/Call.java
+++ b/InCallUI/src/com/android/incallui/Call.java
@@ -33,6 +33,7 @@
 import android.telecom.InCallService.VideoCall;
 import android.telecom.PhoneAccount;
 import android.telecom.PhoneAccountHandle;
+import android.telecom.TelecomManager;
 import android.telecom.VideoProfile;
 import android.telephony.PhoneNumberUtils;
 import android.text.TextUtils;
@@ -372,6 +373,13 @@
     private String mChildNumber;
     private String mLastForwardedNumber;
     private String mCallSubject;
+    private PhoneAccountHandle mPhoneAccountHandle;
+
+    /**
+     * Indicates whether the phone account associated with this call supports specifying a call
+     * subject.
+     */
+    private boolean mIsCallSubjectSupported;
 
     private long mTimeAddedMs;
 
@@ -497,6 +505,22 @@
             mHandle = newHandle;
             updateEmergencyCallState();
         }
+
+        // If the phone account handle of the call is set, cache capability bit indicating whether
+        // the phone account supports call subjects.
+        PhoneAccountHandle newPhoneAccountHandle = mTelecomCall.getDetails().getAccountHandle();
+        if (!Objects.equals(mPhoneAccountHandle, newPhoneAccountHandle)) {
+            mPhoneAccountHandle = newPhoneAccountHandle;
+
+            if (mPhoneAccountHandle != null) {
+                TelecomManager mgr = InCallPresenter.getInstance().getTelecomManager();
+                PhoneAccount phoneAccount = mgr.getPhoneAccount(mPhoneAccountHandle);
+                if (phoneAccount != null) {
+                    mIsCallSubjectSupported = phoneAccount.hasCapabilities(
+                            PhoneAccount.CAPABILITY_CALL_SUBJECT);
+                }
+            }
+        }
     }
 
     private static int translateState(int state) {
@@ -609,6 +633,14 @@
         return mCallSubject;
     }
 
+    /**
+     * @return {@code true} if the call's phone account supports call subjects, {@code false}
+     *      otherwise.
+     */
+    public boolean isCallSubjectSupported() {
+        return mIsCallSubjectSupported;
+    }
+
     /** Returns call disconnect cause, defined by {@link DisconnectCause}. */
     public DisconnectCause getDisconnectCause() {
         if (mState == State.DISCONNECTED || mState == State.IDLE) {
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 28311c9..58722a1 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -1031,7 +1031,9 @@
 
         boolean isIncomingOrWaiting = mPrimary.getState() == Call.State.INCOMING ||
                 mPrimary.getState() == Call.State.CALL_WAITING;
-        return isIncomingOrWaiting && !TextUtils.isEmpty(call.getCallSubject());
+        return isIncomingOrWaiting && !TextUtils.isEmpty(call.getCallSubject()) &&
+                call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED &&
+                call.isCallSubjectSupported();
     }
 
     /**
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 12764fe..4b57278 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -29,6 +29,7 @@
 import android.net.Uri;
 import android.telecom.Call.Details;
 import android.telecom.PhoneAccount;
+import android.telecom.TelecomManager;
 import android.text.BidiFormatter;
 import android.text.TextDirectionHeuristics;
 import android.text.TextUtils;
@@ -438,7 +439,9 @@
         boolean isIncomingOrWaiting = call.getState() == Call.State.INCOMING ||
                 call.getState() == Call.State.CALL_WAITING;
 
-        if (isIncomingOrWaiting && !TextUtils.isEmpty(call.getCallSubject())) {
+        if (isIncomingOrWaiting && !TextUtils.isEmpty(call.getCallSubject()) &&
+                call.getNumberPresentation() == TelecomManager.PRESENTATION_ALLOWED &&
+                call.isCallSubjectSupported()) {
             return call.getCallSubject();
         }