Merge "Add intent broadcast when a PhoneAccount is enabled or disabled. (3/3)" into lmp-dev
diff --git a/res/drawable-hdpi/fab_teal_background.png b/res/drawable-hdpi/fab_teal_background.png
deleted file mode 100644
index e2f01e8..0000000
--- a/res/drawable-hdpi/fab_teal_background.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-mdpi/fab_teal_background.png b/res/drawable-mdpi/fab_teal_background.png
deleted file mode 100644
index c95d124..0000000
--- a/res/drawable-mdpi/fab_teal_background.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xhdpi/fab_teal_background.png b/res/drawable-xhdpi/fab_teal_background.png
deleted file mode 100644
index f94f759..0000000
--- a/res/drawable-xhdpi/fab_teal_background.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable-xxhdpi/fab_teal_background.png b/res/drawable-xxhdpi/fab_teal_background.png
deleted file mode 100644
index cc0ba27..0000000
--- a/res/drawable-xxhdpi/fab_teal_background.png
+++ /dev/null
Binary files differ
diff --git a/res/drawable/floating_action_button.xml b/res/drawable/floating_action_button.xml
index d518ddd..52799e4 100644
--- a/res/drawable/floating_action_button.xml
+++ b/res/drawable/floating_action_button.xml
@@ -16,6 +16,6 @@
 -->
 
 <ripple xmlns:android="http://schemas.android.com/apk/res/android"
-    android:color="@color/dialer_accent_color">
-    <item android:drawable="@drawable/fab_teal_background" />
+    android:color="@color/floating_action_button_touch_tint">
+    <item android:drawable="@drawable/fab_green" />
 </ripple>
diff --git a/res/values/colors.xml b/res/values/colors.xml
index f629da0..c7701fc 100644
--- a/res/values/colors.xml
+++ b/res/values/colors.xml
@@ -45,12 +45,14 @@
     <color name="actionbar_background_color_dark">@color/dialer_theme_color_dark</color>
     <!-- Color for icons in the actionbar. Ensure this stays in sync with Dialer version. -->
     <color name="actionbar_icon_color">#ffffff</color>
+    <!-- Color of title text in actionbar. Ensure this stays in sync with Dialer version. -->
+    <color name="actionbar_text_color">#ffffff</color>
 
     <!-- Color for the setting text. -->
     <color name="setting_primary_color">#4d4c4c</color>
     <!-- Color for the setting description text. -->
     <color name="setting_secondary_color">#989898</color>
-    <color name="dialer_dialpad_touch_tint">#331dc7db</color>
-    <color name="dialer_accent_color">#eeff41</color>
+    <color name="dialer_dialpad_touch_tint">#330288d1</color>
+    <color name="floating_action_button_touch_tint">#80ffffff</color>
     <color name="dialer_theme_color">#0288d1</color>
 </resources>
diff --git a/res/values/dimens.xml b/res/values/dimens.xml
index 0cd350b..267f142 100644
--- a/res/values/dimens.xml
+++ b/res/values/dimens.xml
@@ -69,6 +69,8 @@
     <dimen name="dialpad_horizontal_margin">4dp</dimen>
     <dimen name="dialpad_vertical_margin">2dp</dimen>
     <dimen name="dialpad_digits_text_size">35sp</dimen>
+    <dimen name="dialpad_space_above_keys">29dp</dimen>
+    <dimen name="dialpad_bottom_key_height">113dp</dimen>
 
     <!-- Just used in landscape mode -->
     <dimen name="emergency_dialer_digits_height">0px</dimen>
@@ -98,4 +100,12 @@
     <dimen name="action_bar_height">56dp</dimen>
     <dimen name="action_bar_elevation">2dp</dimen>
     <dimen name="actionbar_contentInsetStart">72dp</dimen>
+
+    <!-- Width, height and bottom margin for the floating action button. These values are
+         intentionally larger than the values used inside Dialer, since the dialpad is larger
+         inside the Emergency Dialer than the regular Dialer. -->
+    <dimen name="floating_action_button_width">67dp</dimen>
+    <dimen name="floating_action_button_height">67dp</dimen>
+    <dimen name="floating_action_button_margin_bottom">26dp</dimen>
+
 </resources>
diff --git a/res/values/styles.xml b/res/values/styles.xml
index afc1bd2..d886dab 100644
--- a/res/values/styles.xml
+++ b/res/values/styles.xml
@@ -234,19 +234,22 @@
     <style name="ContactsActionBarStyle"
            parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
         <item name="android:background">@color/people_app_theme_color</item>
-        <item name="android:backgroundStacked">@color/people_app_theme_color</item>
+        <item name="android:backgroundStacked">@color/people_app_theme_color</item>gs
     </style>
 
     <!-- Style for the call settings action bar.  Should be kept in sync with Dialer. -->
-    <style name="DialtactsActionBarStyle" parent="android:Widget.Material.ActionBar">
+    <style name="DialtactsActionBarStyle" parent="@style/TelephonyActionBarStyle">
+        <!-- Shift the title text to the right -->
+        <item name="android:contentInsetStart">@dimen/actionbar_contentInsetStart</item>
+    </style>
+
+    <style name="TelephonyActionBarStyle" parent="android:Widget.Material.ActionBar">
         <item name="android:background">@color/actionbar_background_color</item>
         <item name="android:titleTextStyle">@style/DialtactsActionBarTitleText</item>
         <item name="android:height">@dimen/action_bar_height</item>
         <item name="android:elevation">@dimen/action_bar_elevation</item>
         <!-- Empty icon -->
         <item name="android:icon">@android:color/transparent</item>
-        <!-- Shift the title text to the right -->
-        <item name="android:contentInsetStart">@dimen/actionbar_contentInsetStart</item>
     </style>
 
     <!-- Text in the action bar at the top of the screen.  Should be kept in sync with Dialer. -->
@@ -263,6 +266,9 @@
 
     <style name="EmergencyDialerTheme" parent="@android:style/Theme.Material.Light">
         <item name="dialpad_key_button_touch_tint">@color/dialer_dialpad_touch_tint</item>
+        <item name="android:actionBarStyle">@style/TelephonyActionBarStyle</item>
+        <item name="android:colorPrimary">@color/dialer_theme_color</item>
+        <item name="android:colorPrimaryDark">@color/dialer_theme_color_dark</item>
     </style>
 
     <style name="SimImportTheme"
diff --git a/sip/src/com/android/services/telephony/sip/SipConnection.java b/sip/src/com/android/services/telephony/sip/SipConnection.java
index bb316e2..dc7f720 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnection.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnection.java
@@ -64,7 +64,7 @@
             getPhone().registerForPreciseCallStateChanged(mHandler, MSG_PRECISE_CALL_STATE_CHANGED,
                     null);
         }
-        updateHandle();
+        updateAddress();
         setInitialized();
     }
 
@@ -226,7 +226,7 @@
                 case ALERTING:
                     setDialing();
                     // For SIP calls, we need to ask the framework to play the ringback for us.
-                    setRequestingRingback(true);
+                    setRingbackRequested(true);
                     break;
                 case INCOMING:
                 case WAITING:
@@ -272,14 +272,14 @@
     /**
      * Updates the handle on this connection based on the original connection.
      */
-    private void updateHandle() {
+    private void updateAddress() {
         if (mOriginalConnection != null) {
-            Uri handle = getHandleFromAddress(mOriginalConnection.getAddress());
+            Uri address = getAddressFromNumber(mOriginalConnection.getAddress());
             int presentation = mOriginalConnection.getNumberPresentation();
-            if (!Objects.equals(handle, getHandle()) ||
-                    presentation != getHandlePresentation()) {
-                com.android.services.telephony.Log.v(this, "updateHandle, handle changed");
-                setHandle(handle, presentation);
+            if (!Objects.equals(address, getAddress()) ||
+                    presentation != getAddressPresentation()) {
+                com.android.services.telephony.Log.v(this, "updateAddress, address changed");
+                setAddress(address, presentation);
             }
 
             String name = mOriginalConnection.getCnapName();
@@ -287,24 +287,24 @@
             if (!Objects.equals(name, getCallerDisplayName()) ||
                     namePresentation != getCallerDisplayNamePresentation()) {
                 com.android.services.telephony.Log
-                        .v(this, "updateHandle, caller display name changed");
+                        .v(this, "updateAddress, caller display name changed");
                 setCallerDisplayName(name, namePresentation);
             }
         }
     }
 
     /**
-     * Determines the handle for an incoming number.
+     * Determines the address for an incoming number.
      *
-     * @param address The incoming number.
+     * @param number The incoming number.
      * @return The Uri representing the number.
      */
-    private static Uri getHandleFromAddress(String address) {
+    private static Uri getAddressFromNumber(String number) {
         // Address can be null for blocked calls.
-        if (address == null) {
-            address = "";
+        if (number == null) {
+            number = "";
         }
-        return Uri.fromParts(PhoneAccount.SCHEME_SIP, address, null);
+        return Uri.fromParts(PhoneAccount.SCHEME_SIP, number, null);
     }
 
     private void close() {
diff --git a/sip/src/com/android/services/telephony/sip/SipConnectionService.java b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
index 16efc4d..74d66f9 100644
--- a/sip/src/com/android/services/telephony/sip/SipConnectionService.java
+++ b/sip/src/com/android/services/telephony/sip/SipConnectionService.java
@@ -68,7 +68,8 @@
         if (VERBOSE) log("onCreateOutgoingConnection, request: " + request);
 
         Bundle extras = request.getExtras();
-        if (extras != null && extras.getString(SipUtil.GATEWAY_PROVIDER_PACKAGE) != null) {
+        if (extras != null &&
+                extras.getString(TelecommManager.GATEWAY_PROVIDER_PACKAGE) != null) {
             return Connection.createFailedConnection(
                     DisconnectCause.CALL_BARRED, "Cannot make a SIP call with a gateway number.");
         }
@@ -81,7 +82,7 @@
         }
 
         final SipConnection connection = new SipConnection();
-        connection.setHandle(request.getAddress(), TelecommManager.PRESENTATION_ALLOWED);
+        connection.setAddress(request.getAddress(), TelecommManager.PRESENTATION_ALLOWED);
         connection.setInitializing();
         connection.onAddedToCallService();
         boolean attemptCall = true;
diff --git a/sip/src/com/android/services/telephony/sip/SipUtil.java b/sip/src/com/android/services/telephony/sip/SipUtil.java
index ee28d6d..6194902 100644
--- a/sip/src/com/android/services/telephony/sip/SipUtil.java
+++ b/sip/src/com/android/services/telephony/sip/SipUtil.java
@@ -31,8 +31,7 @@
 import android.telecomm.TelecommManager;
 import android.text.TextUtils;
 
-import java.util.Arrays;
-import java.util.List;
+import java.util.ArrayList;
 
 public class SipUtil {
     static final String LOG_TAG = "SIP";
@@ -40,8 +39,6 @@
             "com.android.services.telephony.sip.incoming_call_intent";
     static final String EXTRA_PHONE_ACCOUNT =
             "com.android.services.telephony.sip.phone_account";
-    static final String GATEWAY_PROVIDER_PACKAGE =
-            "com.android.phone.extra.GATEWAY_PROVIDER_PACKAGE";
 
     private SipUtil() {
     }
@@ -123,7 +120,8 @@
         PhoneAccountHandle accountHandle =
                 SipUtil.createAccountHandle(context, profile.getUriString());
 
-        List supportedUriSchemes = Arrays.asList(PhoneAccount.SCHEME_SIP);
+        final ArrayList<String> supportedUriSchemes = new ArrayList<String>();
+        supportedUriSchemes.add(PhoneAccount.SCHEME_SIP);
         if (useSipForPstnCalls(context)) {
             supportedUriSchemes.add(PhoneAccount.SCHEME_TEL);
         }
diff --git a/src/com/android/services/telephony/TelephonyConnection.java b/src/com/android/services/telephony/TelephonyConnection.java
index 31b6f01..91fd49e 100644
--- a/src/com/android/services/telephony/TelephonyConnection.java
+++ b/src/com/android/services/telephony/TelephonyConnection.java
@@ -30,6 +30,7 @@
 import com.android.internal.telephony.CallStateException;
 import com.android.internal.telephony.Connection.PostDialListener;
 import com.android.internal.telephony.Phone;
+import com.android.internal.telephony.imsphone.ImsPhoneConnection;
 
 import java.lang.Override;
 import java.util.Objects;
@@ -66,7 +67,7 @@
                                 "not foreground connection, skipping");
                         return;
                     }
-                    setRequestingRingback((Boolean) ((AsyncResult) msg.obj).result);
+                    setRingbackRequested((Boolean) ((AsyncResult) msg.obj).result);
                     break;
             }
         }
@@ -326,28 +327,29 @@
         int newCallCapabilities = buildCallCapabilities();
         newCallCapabilities = applyVideoCapabilities(newCallCapabilities);
         newCallCapabilities = applyAudioQualityCapabilities(newCallCapabilities);
+        newCallCapabilities = applyConferenceTerminationCapabilities(newCallCapabilities);
 
         if (getCallCapabilities() != newCallCapabilities) {
             setCallCapabilities(newCallCapabilities);
         }
     }
 
-    protected final void updateHandle() {
+    protected final void updateAddress() {
         updateCallCapabilities();
         if (mOriginalConnection != null) {
-            Uri handle = getHandleFromAddress(mOriginalConnection.getAddress());
+            Uri address = getAddressFromNumber(mOriginalConnection.getAddress());
             int presentation = mOriginalConnection.getNumberPresentation();
-            if (!Objects.equals(handle, getHandle()) ||
-                    presentation != getHandlePresentation()) {
-                Log.v(this, "updateHandle, handle changed");
-                setHandle(handle, presentation);
+            if (!Objects.equals(address, getAddress()) ||
+                    presentation != getAddressPresentation()) {
+                Log.v(this, "updateAddress, address changed");
+                setAddress(address, presentation);
             }
 
             String name = mOriginalConnection.getCnapName();
             int namePresentation = mOriginalConnection.getCnapNamePresentation();
             if (!Objects.equals(name, getCallerDisplayName()) ||
                     namePresentation != getCallerDisplayNamePresentation()) {
-                Log.v(this, "updateHandle, caller display name changed");
+                Log.v(this, "updateAddress, caller display name changed");
                 setCallerDisplayName(name, namePresentation);
             }
         }
@@ -380,7 +382,7 @@
         setVideoProvider(mOriginalConnection.getVideoProvider());
         setAudioQuality(mOriginalConnection.getAudioQuality());
 
-        updateHandle();
+        updateAddress();
     }
 
     protected void hangup(int disconnectCause) {
@@ -518,7 +520,7 @@
             }
         }
         updateCallCapabilities();
-        updateHandle();
+        updateAddress();
     }
 
     private void close() {
@@ -580,6 +582,27 @@
     }
 
     /**
+     * Applies capabilities specific to conferences termination to the
+     * {@code CallCapabilities} bit-mask.
+     *
+     * @param callCapabilities The {@code CallCapabilities} bit-mask.
+     * @return The capabilities with the IMS conference capabilities applied.
+     */
+    private int applyConferenceTerminationCapabilities(int callCapabilities) {
+        int currentCapabilities = callCapabilities;
+
+        // An IMS call cannot be individually disconnected or separated from its parent conference
+        boolean isImsCall = getOriginalConnection() instanceof ImsPhoneConnection;
+        if (!isImsCall) {
+            currentCapabilities |=
+                    PhoneCapabilities.DISCONNECT_FROM_CONFERENCE
+                    | PhoneCapabilities.SEPARATE_FROM_CONFERENCE;
+        }
+
+        return currentCapabilities;
+    }
+
+    /**
      * Returns the local video capability state for the connection.
      *
      * @return {@code True} if the connection has local video capabilities.
@@ -630,12 +653,19 @@
         updateCallCapabilities();
     }
 
-    private static Uri getHandleFromAddress(String address) {
+    /**
+     * Obtains the current call audio quality.
+     */
+    public int getAudioQuality() {
+        return mAudioQuality;
+    }
+
+    private static Uri getAddressFromNumber(String number) {
         // Address can be null for blocked calls.
-        if (address == null) {
-            address = "";
+        if (number == null) {
+            number = "";
         }
-        return Uri.fromParts(PhoneAccount.SCHEME_TEL, address, null);
+        return Uri.fromParts(PhoneAccount.SCHEME_TEL, number, null);
     }
 
     /**
diff --git a/src/com/android/services/telephony/TelephonyConnectionService.java b/src/com/android/services/telephony/TelephonyConnectionService.java
index 29e78fa..38b6001 100644
--- a/src/com/android/services/telephony/TelephonyConnectionService.java
+++ b/src/com/android/services/telephony/TelephonyConnectionService.java
@@ -143,7 +143,7 @@
             return Connection.createFailedConnection(
                     DisconnectCause.OUTGOING_FAILURE, "Invalid phone type");
         }
-        connection.setHandle(handle, PhoneConstants.PRESENTATION_ALLOWED);
+        connection.setAddress(handle, PhoneConstants.PRESENTATION_ALLOWED);
         connection.setInitializing();
         connection.setVideoState(request.getVideoState());
 
@@ -224,7 +224,7 @@
 
     private void placeOutgoingConnection(
             TelephonyConnection connection, Phone phone, ConnectionRequest request) {
-        String number = connection.getHandle().getSchemeSpecificPart();
+        String number = connection.getAddress().getSchemeSpecificPart();
 
         com.android.internal.telephony.Connection originalConnection;
         try {