Merge "Import translations. DO NOT MERGE" into lmp-dev
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index c0cdc3e..cdc6a4c 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -427,6 +427,7 @@
             <intent-filter>
                 <action android:name="android.intent.action.VIEW" />
                 <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.telecomm.intent.action.SHOW_CALL_SETTINGS" />
                 <action android:name="com.android.phone.CallFeaturesSetting.ADD_VOICEMAIL" />
                 <category android:name="android.intent.category.DEFAULT" />
             </intent-filter>
@@ -585,7 +586,8 @@
             </intent-filter>
         </provider>
 
-        <receiver android:name="com.android.services.telephony.AddAccountsReceiver">
+        <receiver android:name="com.android.services.telephony.AddAccountsReceiver"
+                 android:singleUser="true" >
             <intent-filter>
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
                 <category android:name="android.intent.category.DEFAULT" />
diff --git a/src/com/android/phone/PhoneUtils.java b/src/com/android/phone/PhoneUtils.java
index 60950a5..19361ba 100644
--- a/src/com/android/phone/PhoneUtils.java
+++ b/src/com/android/phone/PhoneUtils.java
@@ -731,12 +731,7 @@
 
         // On GSM phones, null is returned for MMI codes
         if (null == connection) {
-            if (phoneType == PhoneConstants.PHONE_TYPE_GSM && gatewayUri == null) {
-                if (DBG) log("dialed MMI code: " + number);
-                status = CALL_STATUS_DIALED_MMI;
-            } else {
-                status = CALL_STATUS_FAILED;
-            }
+            status = CALL_STATUS_FAILED;
         } else {
             // Now that the call is successful, we can save the gateway info for the call
             if (callGateway != null) {
diff --git a/src/com/android/services/telephony/GsmConnection.java b/src/com/android/services/telephony/GsmConnection.java
index a385b9f..298f3d9 100644
--- a/src/com/android/services/telephony/GsmConnection.java
+++ b/src/com/android/services/telephony/GsmConnection.java
@@ -51,7 +51,7 @@
     void setIsConferenceCapable(boolean isConferenceCapable) {
         if (mIsConferenceCapable != isConferenceCapable) {
             mIsConferenceCapable = isConferenceCapable;
-            updateCallCapabilities(false);
+            updateCallCapabilities();
         }
     }
 
diff --git a/src/com/android/services/telephony/TelecommAccountRegistry.java b/src/com/android/services/telephony/TelecommAccountRegistry.java
index 0ab76d9..509a410 100644
--- a/src/com/android/services/telephony/TelecommAccountRegistry.java
+++ b/src/com/android/services/telephony/TelecommAccountRegistry.java
@@ -101,6 +101,8 @@
      * Sets up all the phone accounts for SIM and SIP accounts on first boot.
      */
     void setup() {
+        // Initialize the PhoneFactory, since the PhoneApp may not yet have been set up
+        PhoneFactory.makeDefaultPhones(mContext);
         // Before we do anything, we need to clear whatever entries we registered at boot.
         mTelecommManager.clearAccounts(mContext.getPackageName());
 
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 6803bdd..16e167b 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -22,6 +22,7 @@
 import android.os.Message;
 import android.telecomm.CallAudioState;
 import android.telecomm.CallCapabilities;
+import android.telecomm.CallVideoProvider;
 import android.telephony.DisconnectCause;
 
 import com.android.internal.telephony.Call;
@@ -32,6 +33,7 @@
 
 import android.telecomm.Connection;
 
+import java.lang.Override;
 import java.util.List;
 import java.util.Objects;
 
@@ -48,7 +50,7 @@
             switch (msg.what) {
                 case MSG_PRECISE_CALL_STATE_CHANGED:
                     Log.v(TelephonyConnection.this, "MSG_PRECISE_CALL_STATE_CHANGED");
-                    updateState(false);
+                    updateState();
                     break;
                 case MSG_RINGBACK_TONE:
                     Log.v(TelephonyConnection.this, "MSG_RINGBACK_TONE");
@@ -106,6 +108,17 @@
         public void onRemoteVideoCapabilityChanged(boolean capable) {
             setRemoteVideoCapable(capable);
         }
+
+        /**
+         * The {@link com.android.internal.telephony.Connection} has reported a change in the
+         * call video provider.
+         *
+         * @param callVideoProvider The call video provider.
+         */
+        @Override
+        public void onCallVideoProviderChanged(CallVideoProvider callVideoProvider) {
+            setCallVideoProvider(callVideoProvider);
+        }
     };
 
     private com.android.internal.telephony.Connection mOriginalConnection;
@@ -144,6 +157,9 @@
         setVideoState(mOriginalConnection.getVideoState());
         setLocalVideoCapable(mOriginalConnection.isLocalVideoCapable());
         setRemoteVideoCapable(mOriginalConnection.isRemoteVideoCapable());
+        setCallVideoProvider(mOriginalConnection.getCallVideoProvider());
+
+        updateHandle();
     }
 
     @Override
@@ -285,22 +301,21 @@
 
     protected abstract int buildCallCapabilities();
 
-    protected final void updateCallCapabilities(boolean force) {
+    protected final void updateCallCapabilities() {
         int newCallCapabilities = buildCallCapabilities();
         newCallCapabilities = applyVideoCapabilities(newCallCapabilities);
 
-        if (force || getCallCapabilities() != newCallCapabilities) {
+        if (getCallCapabilities() != newCallCapabilities) {
             setCallCapabilities(newCallCapabilities);
         }
     }
 
-    protected final void updateHandle(boolean force) {
-        updateCallCapabilities(force);
+    protected final void updateHandle() {
+        updateCallCapabilities();
         if (mOriginalConnection != null) {
-            Uri handle = TelephonyConnectionService.getHandleFromAddress(
-                    mOriginalConnection.getAddress());
+            Uri handle = getHandleFromAddress(mOriginalConnection.getAddress());
             int presentation = mOriginalConnection.getNumberPresentation();
-            if (force || !Objects.equals(handle, getHandle()) ||
+            if (!Objects.equals(handle, getHandle()) ||
                     presentation != getHandlePresentation()) {
                 Log.v(this, "updateHandle, handle changed");
                 setHandle(handle, presentation);
@@ -308,7 +323,7 @@
 
             String name = mOriginalConnection.getCnapName();
             int namePresentation = mOriginalConnection.getCnapNamePresentation();
-            if (force || !Objects.equals(name, getCallerDisplayName()) ||
+            if (!Objects.equals(name, getCallerDisplayName()) ||
                     namePresentation != getCallerDisplayNamePresentation()) {
                 Log.v(this, "updateHandle, caller display name changed");
                 setCallerDisplayName(name, namePresentation);
@@ -316,10 +331,6 @@
         }
     }
 
-    void onAddedToCallService() {
-        updateState(false);
-    }
-
     void onRemovedFromCallService() {
         // Subclass can override this to do cleanup.
     }
@@ -395,14 +406,14 @@
         return true;
     }
 
-    private void updateState(boolean force) {
+    private void updateState() {
         if (mOriginalConnection == null) {
             return;
         }
 
         Call.State newState = mOriginalConnection.getState();
         Log.v(this, "Update state from %s to %s for %s", mOriginalConnectionState, newState, this);
-        if (force || mOriginalConnectionState != newState) {
+        if (mOriginalConnectionState != newState) {
             mOriginalConnectionState = newState;
             switch (newState) {
                 case IDLE:
@@ -429,8 +440,8 @@
                     break;
             }
         }
-        updateCallCapabilities(force);
-        updateHandle(force);
+        updateCallCapabilities();
+        updateHandle();
     }
 
     private void close() {
@@ -491,7 +502,7 @@
      */
     public void setLocalVideoCapable(boolean capable) {
         mLocalVideoCapable = capable;
-        updateCallCapabilities(false);
+        updateCallCapabilities();
     }
 
     /**
@@ -502,6 +513,14 @@
      */
     public void setRemoteVideoCapable(boolean capable) {
         mRemoteVideoCapable = capable;
-        updateCallCapabilities(false);
+        updateCallCapabilities();
+    }
+
+    private static Uri getHandleFromAddress(String address) {
+        // Address can be null for blocked calls.
+        if (address == null) {
+            address = "";
+        }
+        return Uri.fromParts(TelephonyConnectionService.SCHEME_TEL, address, null);
     }
 }
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 41b6b9e..b3467a6 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -33,6 +33,8 @@
 import com.android.internal.telephony.Call;
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Phone;
+
+import com.android.internal.telephony.PhoneConstants;
 import com.android.internal.telephony.PhoneFactory;
 import com.android.internal.telephony.SubscriptionController;
 
@@ -42,7 +44,7 @@
  * Service for making GSM and CDMA connections.
  */
 public class TelephonyConnectionService extends ConnectionService {
-    private static String SCHEME_TEL = "tel";
+    static String SCHEME_TEL = "tel";
 
     private ComponentName mExpectedComponentName = null;
     private EmergencyCallHelper mEmergencyCallHelper;
@@ -180,15 +182,6 @@
             return;
         }
 
-        Uri handle = getHandleFromAddress(originalConnection.getAddress());
-        ConnectionRequest telephonyRequest = new ConnectionRequest(
-                request.getAccountHandle(),
-                request.getCallId(),
-                handle,
-                originalConnection.getNumberPresentation(),
-                request.getExtras(),
-                request.getVideoState());
-
         TelephonyConnection connection = null;
         if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
             connection = new GsmConnection(originalConnection);
@@ -199,16 +192,13 @@
         if (connection == null) {
             response.onCancel(request);
         } else {
-            response.onSuccess(telephonyRequest, connection);
+            response.onSuccess(request, connection);
         }
     }
 
     @Override
     public void onConnectionAdded(Connection connection) {
         Log.v(this, "onConnectionAdded, connection: " + connection);
-        if (connection instanceof TelephonyConnection) {
-            ((TelephonyConnection) connection).onAddedToCallService();
-        }
     }
 
     @Override
@@ -236,23 +226,21 @@
         }
 
         if (originalConnection == null) {
+            int disconnectCause = DisconnectCause.ERROR_UNSPECIFIED;
+
+            // On GSM phones, null connection means that we dialed an MMI code
+            if (phone.getPhoneType() == PhoneConstants.PHONE_TYPE_GSM) {
+                disconnectCause = DisconnectCause.DIALED_MMI;
+            }
             Log.d(this, "startOutgoingCall, phone.dial returned null");
-            response.onFailure(request, DisconnectCause.ERROR_UNSPECIFIED, "Connection is null");
+            response.onFailure(request, disconnectCause, "Connection is null");
             return;
         }
 
-        ConnectionRequest telephonyRequest = new ConnectionRequest(
-                request.getAccountHandle(),
-                request.getCallId(),
-                request.getHandle(),
-                request.getHandlePresentation(),
-                request.getExtras(),
-                request.getVideoState());
-
         if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_GSM) {
-            response.onSuccess(telephonyRequest, new GsmConnection(originalConnection));
+            response.onSuccess(request, new GsmConnection(originalConnection));
         } else if (phone.getPhoneType() == TelephonyManager.PHONE_TYPE_CDMA) {
-            response.onSuccess(telephonyRequest, new CdmaConnection(originalConnection));
+            response.onSuccess(request, new CdmaConnection(originalConnection));
         } else {
             // TODO(ihab): Tear down 'originalConnection' here, or move recognition of
             // getPhoneType() earlier in this method before we've already asked phone to dial()
@@ -281,12 +269,4 @@
         }
         return null;
     }
-
-    static Uri getHandleFromAddress(String address) {
-        // Address can be null for blocked calls.
-        if (address == null) {
-            address = "";
-        }
-        return Uri.fromParts(SCHEME_TEL, address, null);
-    }
 }