Supports for outgoing calls starting up the UI.

- Added the OUTGOING InCallState
- Added support for OUTGOING into InCallState, InCallPresenter, and
  StatusBarNotifier.

Change-Id: I49d5a56a4394d05e948b16a82f23e3eb925fd0a0
diff --git a/InCallUI/src/com/android/incallui/CallButtonPresenter.java b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
index d4b2cf2..114685d 100644
--- a/InCallUI/src/com/android/incallui/CallButtonPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallButtonPresenter.java
@@ -56,9 +56,14 @@
 
     @Override
     public void onStateChange(InCallState state, CallList callList) {
-        getUi().setVisible(state == InCallState.INCALL);
+        final boolean isVisible = state.isConnectingOrConnected() &&
+                !state.isIncoming();
 
-        if (state == InCallState.INCALL) {
+        getUi().setVisible(isVisible);
+
+        if (state == InCallState.OUTGOING) {
+            mCall = callList.getOutgoingCall();
+        } else if (state == InCallState.INCALL) {
             mCall = callList.getActiveOrBackgroundCall();
         } else {
             mCall = null;
diff --git a/InCallUI/src/com/android/incallui/CallCardPresenter.java b/InCallUI/src/com/android/incallui/CallCardPresenter.java
index 06b1157..5f67a51 100644
--- a/InCallUI/src/com/android/incallui/CallCardPresenter.java
+++ b/InCallUI/src/com/android/incallui/CallCardPresenter.java
@@ -72,6 +72,12 @@
 
         if (state == InCallState.INCOMING) {
             primary = callList.getIncomingCall();
+        } else if (state == InCallState.OUTGOING) {
+            primary = callList.getOutgoingCall();
+
+            // Safe to assume that the primary call is valid since we would not be in the
+            // OUTGOING state without an outgoing call.
+            secondary = callList.getBackgroundCall();
         } else if (state == InCallState.INCALL) {
             primary = callList.getActiveCall();
             if (primary != null) {
diff --git a/InCallUI/src/com/android/incallui/CallHandlerService.java b/InCallUI/src/com/android/incallui/CallHandlerService.java
index 8431fc9..f0d98b2 100644
--- a/InCallUI/src/com/android/incallui/CallHandlerService.java
+++ b/InCallUI/src/com/android/incallui/CallHandlerService.java
@@ -94,6 +94,13 @@
         @Override
         public void onUpdate(List<Call> calls, boolean fullUpdate) {
             Logger.d(CallHandlerService.this, "onUpdate ");
+
+            if (Logger.VERBOSE) {
+                for (Call c : calls) {
+                    Logger.v(this, "Call: " + c);
+                }
+            }
+
             // TODO(klp): Add use of fullUpdate to message
             mMainHandler.sendMessage(mMainHandler.obtainMessage(ON_UPDATE_MULTI_CALL, 0, 0, calls));
         }
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index 3a90a7e..5ea4fc5 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -38,15 +38,6 @@
  * Primary lister of changes to this class is InCallPresenter.
  */
 public class CallList {
-    private static final Map<Integer, String> STATE_MAP = ImmutableMap.<Integer, String>builder()
-            .put(Call.State.ACTIVE, "ACTIVE")
-            .put(Call.State.CALL_WAITING, "CALL_WAITING")
-            .put(Call.State.DIALING, "DIALING")
-            .put(Call.State.IDLE, "IDLE")
-            .put(Call.State.INCOMING, "INCOMING")
-            .put(Call.State.ONHOLD, "ONHOLD")
-            .put(Call.State.INVALID, "INVALID")
-            .build();
 
     private static CallList sInstance;
 
@@ -75,7 +66,7 @@
      * Called when a single call has changed.
      */
     public void onUpdate(Call call) {
-        Logger.d(this, "onUpdate - " + safeCallString(call));
+        Logger.d(this, "onUpdate - " + call);
 
         updateCallInMap(call);
 
@@ -86,7 +77,7 @@
      * Called when a single call has changed.
      */
     public void onUpdate(AbstractMap.SimpleEntry<Call, List<String> > incomingCall) {
-        Logger.d(this, "onUpdate - " + safeCallString(incomingCall.getKey()));
+        Logger.d(this, "onUpdate - " + incomingCall.getKey());
 
         updateCallInMap(incomingCall.getKey());
         updateCallTextMap(incomingCall.getKey(), incomingCall.getValue());
@@ -102,7 +93,7 @@
 
         Preconditions.checkNotNull(callsToUpdate);
         for (Call call : callsToUpdate) {
-            Logger.d(this, "\t" + safeCallString(call));
+            Logger.d(this, "\t" + call);
 
             updateCallInMap(call);
             updateCallTextMap(call, null);
@@ -126,7 +117,7 @@
     }
 
     /**
-     * TODO(klp): Change so that this function is not needed. Instead of assuming there is an active
+     * TODO: Change so that this function is not needed. Instead of assuming there is an active
      * call, the code should rely on the status of a specific Call and allow the presenters to
      * update the Call object when the active call changes.
      */
@@ -138,6 +129,10 @@
         return retval;
     }
 
+    public Call getOutgoingCall() {
+        return getFirstCallWithState(Call.State.DIALING);
+    }
+
     public Call getActiveCall() {
         return getFirstCallWithState(Call.State.ACTIVE);
     }
@@ -205,8 +200,7 @@
             }
         }
 
-        Logger.d(this, "Found " + (retval == null ? "no " : "") + "call with state: " +
-                STATE_MAP.get(state));
+        Logger.d(this, "Found call: " + retval);
         return retval;
     }
 
@@ -252,18 +246,6 @@
     }
 
     /**
-     * Creates a log-safe string for call objects.
-     */
-    private String safeCallString(Call call) {
-        final StringBuffer buffer = new StringBuffer();
-        buffer.append("Call (")
-                .append(call.getCallId())
-                .append("), ")
-                .append(STATE_MAP.get(call.getState()));
-        return buffer.toString();
-    }
-
-    /**
      * Listener interface for any class that wants to be notified of changes
      * to the call list.
      */
diff --git a/InCallUI/src/com/android/incallui/InCallPresenter.java b/InCallUI/src/com/android/incallui/InCallPresenter.java
index 47d2d69..72a880a 100644
--- a/InCallUI/src/com/android/incallui/InCallPresenter.java
+++ b/InCallUI/src/com/android/incallui/InCallPresenter.java
@@ -102,6 +102,8 @@
 
         if (callList.getIncomingCall() != null) {
             newState = InCallState.INCOMING;
+        } else if (callList.getOutgoingCall() != null) {
+            newState = InCallState.OUTGOING;
         } else if (callList.getActiveCall() != null ||
                 callList.getBackgroundCall() != null) {
             newState = InCallState.INCALL;
@@ -182,7 +184,10 @@
         INCOMING,
 
         // In-call experience is showing
-        INCALL;
+        INCALL,
+
+        // User is dialing out
+        OUTGOING;
 
         public boolean isIncoming() {
             return (this == INCOMING);
@@ -191,6 +196,12 @@
         public boolean isHidden() {
             return (this == HIDDEN);
         }
+
+        public boolean isConnectingOrConnected() {
+            return (this == INCOMING ||
+                    this == OUTGOING ||
+                    this == INCALL);
+        }
     }
 
     /**
diff --git a/InCallUI/src/com/android/incallui/StatusBarNotifier.java b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
index 617be2f..2324b57 100644
--- a/InCallUI/src/com/android/incallui/StatusBarNotifier.java
+++ b/InCallUI/src/com/android/incallui/StatusBarNotifier.java
@@ -141,7 +141,7 @@
         Logger.d(this, "updateInCallNotification(allowFullScreenIntent = "
                      + allowFullScreenIntent + ")...");
 
-        if (InCallState.INCALL != state && InCallState.INCOMING != state) {
+        if (!state.isConnectingOrConnected()) {
             cancelInCall();
             return;
         }
@@ -153,11 +153,12 @@
          * Set up the Intents that will get fires when the user interacts with the notificaiton.
          */
         builder.setContentIntent(inCallPendingIntent);
-        if (InCallState.INCOMING == state) {
-            if (allowFullScreenIntent) {
-                configureFullScreenIntent(builder, inCallPendingIntent);
-            }
-        } else if (InCallState.INCALL == state) {
+        if (allowFullScreenIntent) {
+            configureFullScreenIntent(builder, inCallPendingIntent);
+        }
+
+        // TODO(klp): Does this need to include OUTGOING state as well?
+        if (InCallState.INCALL == state) {
             addActiveCallIntents(builder);
         }