Clear video pause tracker when video un-pause reported by the modem.
am: 077dd3fef0

Change-Id: I6cfe5969c7c604c34e9a393b6be92789de255262
diff --git a/OWNERS b/OWNERS
new file mode 100644
index 0000000..2f0bcec
--- /dev/null
+++ b/OWNERS
@@ -0,0 +1,3 @@
+breadley@google.com
+hallliu@google.com
+tgunn@google.com
diff --git a/src/java/com/android/ims/ImsCall.java b/src/java/com/android/ims/ImsCall.java
index b6370de..ad289fd 100644
--- a/src/java/com/android/ims/ImsCall.java
+++ b/src/java/com/android/ims/ImsCall.java
@@ -28,6 +28,7 @@
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Message;
+import android.os.Parcel;
 import android.telecom.ConferenceParticipant;
 import android.telecom.Connection;
 import android.telephony.Rlog;
@@ -422,6 +423,33 @@
         }
 
         /**
+         * Called when the remote party issues an RTT modify request
+         *
+         * @param imsCall ImsCall object
+         */
+        public void onRttModifyRequestReceived(ImsCall imsCall) {
+        }
+
+        /**
+         * Called when the remote party responds to a locally-issued RTT request.
+         *
+         * @param imsCall ImsCall object
+         * @param status The status of the request. See
+         *               {@link Connection.RttModifyStatus} for possible values.
+         */
+        public void onRttModifyResponseReceived(ImsCall imsCall, int status) {
+        }
+
+        /**
+         * Called when the remote party has sent some characters via RTT
+         *
+         * @param imsCall ImsCall object
+         * @param message A string containing the transmitted characters.
+         */
+        public void onRttMessageReceived(ImsCall imsCall, String message) {
+        }
+
+        /**
          * Called when handover from one access technology to another fails.
          *
          * @param imsCall call that failed the handover.
@@ -1549,6 +1577,64 @@
         }
     }
 
+    public void sendRttMessage(String rttMessage) {
+        synchronized(mLockObj) {
+            if (mSession == null) {
+                loge("sendRttMessage::no session");
+            }
+            if (!mCallProfile.mMediaProfile.isRttCall()) {
+                logi("sendRttMessage::Not an rtt call, ignoring");
+                return;
+            }
+            mSession.sendRttMessage(rttMessage);
+        }
+    }
+
+    /**
+     * Sends a user-requested RTT upgrade request.
+     */
+    public void sendRttModifyRequest() {
+        logi("sendRttModifyRequest");
+
+        synchronized(mLockObj) {
+            if (mSession == null) {
+                loge("sendRttModifyRequest::no session");
+            }
+            if (mCallProfile.mMediaProfile.isRttCall()) {
+                logi("sendRttModifyRequest::Already RTT call, ignoring.");
+                return;
+            }
+            // Make a copy of the current ImsCallProfile and modify it to enable RTT
+            Parcel p = Parcel.obtain();
+            mCallProfile.writeToParcel(p, 0);
+            ImsCallProfile requestedProfile = new ImsCallProfile(p);
+            requestedProfile.mMediaProfile.setRttMode(ImsStreamMediaProfile.RTT_MODE_FULL);
+
+            mSession.sendRttModifyRequest(requestedProfile);
+        }
+    }
+
+    /**
+     * Sends the user's response to a remotely-issued RTT upgrade request
+     *
+     * @param textStream A valid {@link Connection.RttTextStream} if the user
+     *                   accepts, {@code null} if not.
+     */
+    public void sendRttModifyResponse(boolean status) {
+        logi("sendRttModifyResponse");
+
+        synchronized(mLockObj) {
+            if (mSession == null) {
+                loge("sendRttModifyResponse::no session");
+            }
+            if (mCallProfile.mMediaProfile.isRttCall()) {
+                logi("sendRttModifyResponse::Already RTT call, ignoring.");
+                return;
+            }
+            mSession.sendRttModifyResponse(status);
+        }
+    }
+
     private void clear(ImsReasonInfo lastReasonInfo) {
         mInCall = false;
         mHold = false;
@@ -2953,6 +3039,64 @@
                 }
             }
         }
+
+        @Override
+        public void callSessionRttModifyRequestReceived(ImsCallSession session,
+                ImsCallProfile callProfile) {
+            ImsCall.Listener listener;
+
+            synchronized(ImsCall.this) {
+                listener = mListener;
+            }
+
+            if (!callProfile.mMediaProfile.isRttCall()) {
+                logi("callSessionRttModifyRequestReceived:: ignoring request, requested profile " +
+                        "is not RTT.");
+                return;
+            }
+
+            if (listener != null) {
+                try {
+                    listener.onRttModifyRequestReceived(ImsCall.this);
+                } catch (Throwable t) {
+                    loge("callSessionRttModifyRequestReceived:: ", t);
+                }
+            }
+        }
+
+        @Override
+        public void callSessionRttModifyResponseReceived(int status) {
+            ImsCall.Listener listener;
+
+            synchronized(ImsCall.this) {
+                listener = mListener;
+            }
+
+            if (listener != null) {
+                try {
+                    listener.onRttModifyResponseReceived(ImsCall.this, status);
+                } catch (Throwable t) {
+                    loge("callSessionRttModifyResponseReceived:: ", t);
+                }
+            }
+        }
+
+        @Override
+        public void callSessionRttMessageReceived(String rttMessage) {
+            ImsCall.Listener listener;
+
+            synchronized(ImsCall.this) {
+                listener = mListener;
+            }
+
+            if (listener != null) {
+                try {
+                    listener.onRttMessageReceived(ImsCall.this, rttMessage);
+                } catch (Throwable t) {
+                    loge("callSessionRttModifyResponseReceived:: ", t);
+                }
+            }
+        }
     }
 
     /**
diff --git a/src/java/com/android/ims/ImsManager.java b/src/java/com/android/ims/ImsManager.java
index 07b9ac0..080c372 100644
--- a/src/java/com/android/ims/ImsManager.java
+++ b/src/java/com/android/ims/ImsManager.java
@@ -432,13 +432,23 @@
     }
 
     /**
-     * Indicates whether VoWifi is provisioned on device
+     * Indicates whether VoWifi is provisioned on device.
+     *
+     * When CarrierConfig KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL is true, and VoLTE is not
+     * provisioned on device, this method returns false.
      *
      * @deprecated Does not support MSIM devices. Please use
      * {@link #isWfcProvisionedOnDeviceForSlot()} instead.
      */
     public static boolean isWfcProvisionedOnDevice(Context context) {
         if (getBooleanCarrierConfig(context,
+                CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)) {
+            if (!isVolteProvisionedOnDevice(context)) {
+                return false;
+            }
+        }
+
+        if (getBooleanCarrierConfig(context,
                 CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
             ImsManager mgr = ImsManager.getInstance(context,
                     SubscriptionManager.getDefaultVoicePhoneId());
@@ -452,11 +462,21 @@
 
     /**
      * Indicates whether VoWifi is provisioned on slot.
+     *
+     * When CarrierConfig KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL is true, and VoLTE is not
+     * provisioned on device, this method returns false.
      */
     public boolean isWfcProvisionedOnDeviceForSlot() {
         if (getBooleanCarrierConfigForSlot(
+                CarrierConfigManager.KEY_CARRIER_VOLTE_OVERRIDE_WFC_PROVISIONING_BOOL)) {
+            if (!isVolteProvisionedOnDeviceForSlot()) {
+                return false;
+            }
+        }
+
+        if (getBooleanCarrierConfigForSlot(
                 CarrierConfigManager.KEY_CARRIER_VOLTE_PROVISIONING_REQUIRED_BOOL)) {
-                return isWfcProvisioned();
+            return isWfcProvisioned();
         }
 
         return true;
diff --git a/src/java/com/android/ims/ImsUt.java b/src/java/com/android/ims/ImsUt.java
index 75a0b52..4cc7011 100644
--- a/src/java/com/android/ims/ImsUt.java
+++ b/src/java/com/android/ims/ImsUt.java
@@ -19,6 +19,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import android.content.res.Resources;
 import android.os.AsyncResult;
 import android.os.Bundle;
 import android.os.Message;
@@ -539,7 +540,8 @@
         // If ImsReasonInfo object does not have a String error code, use a
         // default error string.
         if (error.mExtraMessage == null) {
-            errorString = new String("IMS UT exception");
+            errorString = Resources.getSystem().getString(
+                    com.android.internal.R.string.mmiError);
         }
         else {
             errorString = new String(error.mExtraMessage);