Merge "Revert "Exercise default phone application request in TestDialer""
diff --git a/res/drawable-xxhdpi/chat_with_others.png b/res/drawable-xxhdpi/chat_with_others.png
new file mode 100644
index 0000000..6f6b03e
--- /dev/null
+++ b/res/drawable-xxhdpi/chat_with_others.png
Binary files differ
diff --git a/res/drawable-xxhdpi/market_wireless.png b/res/drawable-xxhdpi/market_wireless.png
new file mode 100644
index 0000000..e451fe7
--- /dev/null
+++ b/res/drawable-xxhdpi/market_wireless.png
Binary files differ
diff --git a/res/drawable-xxhdpi/q_mobile.png b/res/drawable-xxhdpi/q_mobile.png
new file mode 100644
index 0000000..cfc0624
--- /dev/null
+++ b/res/drawable-xxhdpi/q_mobile.png
Binary files differ
diff --git a/res/drawable-xxhdpi/talk_to_your_circles.png b/res/drawable-xxhdpi/talk_to_your_circles.png
new file mode 100644
index 0000000..d6bc672
--- /dev/null
+++ b/res/drawable-xxhdpi/talk_to_your_circles.png
Binary files differ
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 747eca7..e85d7b6 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -75,4 +75,23 @@
     <!-- "Respond via SMS": Confirmation message shown after sending
         a text response. [CHAR LIMIT=40] -->
     <string name="respond_via_sms_confirmation_format">Message sent to <xliff:g id="phone_number">%s</xliff:g>.</string>
+
+
+    <!-- DO NOT TRANSLATE. Label for test Subscription 0. -->
+    <string name="test_subscription_0_label">Q Mobile</string>
+    <!-- DO NOT TRANSLATE. Label for test Subscription 1. -->
+    <string name="test_subscription_1_label">Market Wireless</string>
+    <!-- DO NOT TRANSLATE. Label for test Subscription 2. -->
+    <string name="test_subscription_2_label">Sonoma Circles Talk Plus</string>
+    <!-- DO NOT TRANSLATE. Label for test Subscription 3. -->
+    <string name="test_subscription_3_label">Bay Voice Chat Pro</string>
+
+    <!-- DO NOT TRANSLATE. Short description for test Subscription 0. -->
+    <string name="test_subscription_0_short_description">Account with Q Mobile</string>
+    <!-- DO NOT TRANSLATE. Short description for test Subscription 1. -->
+    <string name="test_subscription_1_short_description">Account with Market Wireless</string>
+    <!-- DO NOT TRANSLATE. Short description for test Subscription 2. -->
+    <string name="test_subscription_2_short_description">Talk to everyone in your Circles!</string>
+    <!-- DO NOT TRANSLATE. Short description for test Subscription 3. -->
+    <string name="test_subscription_3_short_description">Chat with Chat Network users</string>
 </resources>
diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 104ff4e..bf0f349 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -141,6 +141,8 @@
 
     private boolean mIsEmergencyCall;
 
+    private boolean mSpeakerphoneOn;
+
     /**
      * Disconnect cause for the call. Only valid if the state of the call is DISCONNECTED.
      * See {@link android.telephony.DisconnectCause}.
@@ -1037,4 +1039,20 @@
             Log.d(this, "maybeLoadCannedSmsResponses: doing nothing");
         }
     }
+
+    /**
+     * Sets speakerphone option on when call begins.
+     */
+    public void setStartWithSpeakerphoneOn(boolean startWithSpeakerphone) {
+        mSpeakerphoneOn = startWithSpeakerphone;
+    }
+
+    /**
+     * Returns speakerphone option.
+     *
+     * @return Whether or not speakerphone should be set automatically when call begins.
+     */
+    public boolean getStartWithSpeakerphoneOn() {
+        return mSpeakerphoneOn;
+    }
 }
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index 5e5f710..5753d18 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -278,8 +278,10 @@
      * @param contactInfo Information about the entity being called.
      * @param gatewayInfo Optional gateway information that can be used to route the call to the
      *         actual dialed handle via a gateway provider. May be null.
+     * @param speakerphoneOn Whether or not to turn the speakerphone on once the call connects.
      */
-    void placeOutgoingCall(Uri handle, ContactInfo contactInfo, GatewayInfo gatewayInfo) {
+    void placeOutgoingCall(Uri handle, ContactInfo contactInfo, GatewayInfo gatewayInfo,
+            boolean speakerphoneOn) {
         final Uri uriHandle = (gatewayInfo == null) ? handle : gatewayInfo.getGatewayHandle();
 
         if (gatewayInfo == null) {
@@ -291,6 +293,7 @@
 
         Call call = new Call(
                 uriHandle, gatewayInfo, false /* isIncoming */, false /* isConference */);
+        call.setStartWithSpeakerphoneOn(speakerphoneOn);
 
         // TODO(santoscordon): Move this to be a part of addCall()
         call.addListener(this);
@@ -505,6 +508,9 @@
         if (mPendingHandoffCalls.contains(call)) {
             completeHandoff(call, true);
         }
+        if (call.getStartWithSpeakerphoneOn()) {
+            setAudioRoute(CallAudioState.ROUTE_SPEAKER);
+        }
     }
 
     void markCallAsOnHold(Call call) {
diff --git a/src/com/android/telecomm/HeadsetMediaButton.java b/src/com/android/telecomm/HeadsetMediaButton.java
index dab2475..a0d5858 100644
--- a/src/com/android/telecomm/HeadsetMediaButton.java
+++ b/src/com/android/telecomm/HeadsetMediaButton.java
@@ -31,37 +31,6 @@
  */
 final class HeadsetMediaButton extends CallsManagerListenerBase {
 
-    /**
-     * Broadcast receiver for the ACTION_MEDIA_BUTTON broadcast intent.
-     *
-     * This functionality isn't lumped in with the other intents in TelecommBroadcastReceiver
-     * because we instantiate this as a totally separate BroadcastReceiver instance, since we need
-     * to manually adjust its IntentFilter's priority (to make sure we get these intents *before*
-     * the media player.)
-     */
-    private final class MediaButtonBroadcastReceiver extends BroadcastReceiver {
-        @Override
-        public void onReceive(Context context, Intent intent) {
-            KeyEvent event = (KeyEvent) intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
-            Log.v(this, "MediaButtonBroadcastReceiver.onReceive()...  event = %s.", event);
-            if ((event != null) && (event.getKeyCode() == KeyEvent.KEYCODE_HEADSETHOOK)) {
-                boolean consumed = handleHeadsetHook(event);
-                Log.v(this, "==> handleHeadsetHook(): consumed = %b.", consumed);
-                if (consumed) {
-                    abortBroadcast();
-                }
-            } else {
-                if (CallsManager.getInstance().hasAnyCalls()) {
-                    // If the phone is anything other than completely idle, then we consume and
-                    // ignore any media key events, otherwise it is too easy to accidentally start
-                    // playing music while a phone call is in progress.
-                    Log.v(this, "MediaButtonBroadcastReceiver: consumed");
-                    abortBroadcast();
-                }
-            }
-        }
-    }
-
     // Types of media button presses
     static final int SHORT_PRESS = 1;
     static final int LONG_PRESS = 2;
@@ -79,9 +48,6 @@
         }
     };
 
-    private final MediaButtonBroadcastReceiver mMediaButtonReceiver =
-            new MediaButtonBroadcastReceiver();
-
     private final CallsManager mCallsManager;
 
     private final MediaSession mSession;
@@ -89,23 +55,6 @@
     HeadsetMediaButton(Context context, CallsManager callsManager) {
         mCallsManager = callsManager;
 
-        // Use a separate receiver (from TelecommBroadcastReceiver) for ACTION_MEDIA_BUTTON
-        // broadcasts, since we need to manually adjust its priority (to make sure we get these
-        // intents *before* the media player.)
-        IntentFilter mediaButtonIntentFilter =
-                new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
-
-        // Make sure we're higher priority than the media player's MediaButtonIntentReceiver (which
-        // currently has the default priority of zero; see apps/Music/AndroidManifest.xml.)
-        mediaButtonIntentFilter.setPriority(1);
-
-        context.registerReceiver(mMediaButtonReceiver, mediaButtonIntentFilter);
-
-        // register the component so it gets priority for calls
-        AudioManager am = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
-        am.registerMediaButtonEventReceiverForCalls(new ComponentName(context.getPackageName(),
-                MediaButtonBroadcastReceiver.class.getName()));
-
         // Register a MediaSession but don't enable it yet. This is a
         // replacement for MediaButtonReceiver
         MediaSessionManager msm =
diff --git a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
index a0a7c00..c40fde5 100644
--- a/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
+++ b/src/com/android/telecomm/NewOutgoingCallIntentBroadcaster.java
@@ -132,7 +132,9 @@
             }
 
             GatewayInfo gatewayInfo = getGateWayInfoFromIntent(intent, resultHandleUri);
-            mCallsManager.placeOutgoingCall(resultHandleUri, mContactInfo, gatewayInfo);
+            mCallsManager.placeOutgoingCall(resultHandleUri, mContactInfo, gatewayInfo,
+                    mIntent.getBooleanExtra(TelecommConstants.EXTRA_START_CALL_WITH_SPEAKERPHONE,
+                            false));
         }
     }
 
@@ -199,7 +201,9 @@
                     + " OutgoingCallBroadcastReceiver: %s", intent);
             String scheme = isUriNumber ? SCHEME_SIP : SCHEME_TEL;
             mCallsManager.placeOutgoingCall(
-                    Uri.fromParts(scheme, handle, null), mContactInfo, null);
+                    Uri.fromParts(scheme, handle, null), mContactInfo, null,
+                    mIntent.getBooleanExtra(TelecommConstants.EXTRA_START_CALL_WITH_SPEAKERPHONE,
+                            false));
 
             // Don't return but instead continue and send the ACTION_NEW_OUTGOING_CALL broadcast
             // so that third parties can still inspect (but not intercept) the outgoing call. When
diff --git a/src/com/android/telecomm/TelecommServiceImpl.java b/src/com/android/telecomm/TelecommServiceImpl.java
index e3f8bcb..ef26a33 100644
--- a/src/com/android/telecomm/TelecommServiceImpl.java
+++ b/src/com/android/telecomm/TelecommServiceImpl.java
@@ -16,15 +16,20 @@
 
 package com.android.telecomm;
 
+import com.google.android.collect.Lists;
+
+import com.android.internal.telecomm.ITelecommService;
+
 import android.content.ComponentName;
-import android.content.Context;
 import android.content.res.Resources;
+import android.net.Uri;
 import android.os.Handler;
 import android.os.Message;
 import android.os.ServiceManager;
+import android.telecomm.Subscription;
 import android.text.TextUtils;
 
-import com.android.internal.telecomm.ITelecommService;
+import java.util.List;
 
 /**
  * Implementation of the ITelecomm interface.
@@ -136,4 +141,68 @@
 
         return new ComponentName(packageName, className);
     }
+
+    // TODO (STOPSHIP): Static list of Subscriptions for testing and UX work only.
+
+    private  static final ComponentName sComponentName = new ComponentName(
+            "com.android.telecomm",
+            TelecommServiceImpl.class.getName());  // This field is a no-op
+
+    private static final List<Subscription> sSubscriptions = Lists.newArrayList(
+            new Subscription(
+                    sComponentName,
+                    "subscription0",
+                    Uri.parse("tel:999-555-1212"),
+                    R.string.test_subscription_0_label,
+                    R.string.test_subscription_0_short_description,
+                    R.drawable.q_mobile,
+                    true,
+                    true),
+            new Subscription(
+                    sComponentName,
+                    "subscription1",
+                    Uri.parse("tel:333-111-2222"),
+                    R.string.test_subscription_1_label,
+                    R.string.test_subscription_1_short_description,
+                    R.drawable.market_wireless,
+                    true,
+                    false),
+            new Subscription(
+                    sComponentName,
+                    "subscription2",
+                    Uri.parse("mailto:two@example.com"),
+                    R.string.test_subscription_2_label,
+                    R.string.test_subscription_2_short_description,
+                    R.drawable.talk_to_your_circles,
+                    true,
+                    false),
+            new Subscription(
+                    sComponentName,
+                    "subscription3",
+                    Uri.parse("mailto:three@example.com"),
+                    R.string.test_subscription_3_label,
+                    R.string.test_subscription_3_short_description,
+                    R.drawable.chat_with_others,
+                    true,
+                    false)
+    );
+
+
+
+    @Override
+    public List<Subscription> getSubscriptions() {
+        return sSubscriptions;
+    }
+
+    @Override
+    public void setEnabled(Subscription subscription, boolean enabled) {
+        // Enforce MODIFY_PHONE_STATE ?
+        // TODO
+    }
+
+    @Override
+    public void setSystemDefault(Subscription subscription) {
+        // Enforce MODIFY_PHONE_STATE ?
+        // TODO
+    }
 }