Merge "Add logging to proximity sensor." into klp-dev
diff --git a/InCallUI/src/com/android/incallui/CallCardFragment.java b/InCallUI/src/com/android/incallui/CallCardFragment.java
index b77dc4c..be1c514 100644
--- a/InCallUI/src/com/android/incallui/CallCardFragment.java
+++ b/InCallUI/src/com/android/incallui/CallCardFragment.java
@@ -16,6 +16,7 @@
 
 package com.android.incallui;
 
+import android.animation.LayoutTransition;
 import android.content.Context;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
@@ -49,6 +50,7 @@
     private View mProviderInfo;
     private TextView mProviderLabel;
     private TextView mProviderNumber;
+    private ViewGroup mSupplementaryInfoContainer;
 
     // Secondary caller info
     private ViewStub mSecondaryCallInfo;
@@ -99,6 +101,8 @@
         mProviderInfo = view.findViewById(R.id.providerInfo);
         mProviderLabel = (TextView) view.findViewById(R.id.providerLabel);
         mProviderNumber = (TextView) view.findViewById(R.id.providerAddress);
+        mSupplementaryInfoContainer =
+            (ViewGroup) view.findViewById(R.id.supplementary_info_container);
     }
 
     @Override
@@ -208,9 +212,23 @@
         Log.v(this, "bluetooth on ", bluetoothOn);
 
         if (!TextUtils.isEmpty(callStateLabel)) {
+            // There are cases where we totally skip the animation
+            final boolean skipAnimation = (state == Call.State.DIALING
+                    || state == Call.State.DISCONNECTED);
+
+            LayoutTransition transition = null;
+            if (skipAnimation) {
+                transition = mSupplementaryInfoContainer.getLayoutTransition();
+                mSupplementaryInfoContainer.setLayoutTransition(null);
+            }
+
             mCallStateLabel.setVisibility(View.VISIBLE);
             mCallStateLabel.setText(callStateLabel);
 
+            if (skipAnimation) {
+                mSupplementaryInfoContainer.setLayoutTransition(transition);
+            }
+
             if (Call.State.INCOMING == state) {
                 setBluetoothOn(bluetoothOn);
             }
diff --git a/InCallUI/src/com/android/incallui/CallList.java b/InCallUI/src/com/android/incallui/CallList.java
index 7890b997..200f10f 100644
--- a/InCallUI/src/com/android/incallui/CallList.java
+++ b/InCallUI/src/com/android/incallui/CallList.java
@@ -38,7 +38,9 @@
  */
 public class CallList {
 
-    private static final int DISCONNECTED_CALL_TIMEOUT_MS = 2000;
+    private static final int DISCONNECTED_CALL_SHORT_TIMEOUT_MS = 200;
+    private static final int DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS = 2000;
+    private static final int DISCONNECTED_CALL_LONG_TIMEOUT_MS = 5000;
 
     private static final int EVENT_DISCONNECTED_TIMEOUT = 1;
 
@@ -264,7 +266,7 @@
 
                 // Set up a timer to destroy the call after X seconds.
                 final Message msg = mHandler.obtainMessage(EVENT_DISCONNECTED_TIMEOUT, call);
-                mHandler.sendMessageDelayed(msg, DISCONNECTED_CALL_TIMEOUT_MS);
+                mHandler.sendMessageDelayed(msg, getDelayForDisconnect(call));
 
                 mCallMap.put(id, call);
             }
@@ -275,6 +277,32 @@
         }
     }
 
+    private int getDelayForDisconnect(Call call) {
+        Preconditions.checkState(call.getState() == Call.State.DISCONNECTED);
+
+
+        final Call.DisconnectCause cause = call.getDisconnectCause();
+        final int delay;
+        switch (cause) {
+            case LOCAL:
+                delay = DISCONNECTED_CALL_SHORT_TIMEOUT_MS;
+                break;
+            case NORMAL:
+                delay = DISCONNECTED_CALL_MEDIUM_TIMEOUT_MS;
+                break;
+            case INCOMING_REJECTED:
+            case INCOMING_MISSED:
+                // no delay for missed/rejected incoming calls
+                delay = 0;
+                break;
+            default:
+                delay = DISCONNECTED_CALL_LONG_TIMEOUT_MS;
+                break;
+        }
+
+        return delay;
+    }
+
     private void updateCallTextMap(Call call, List<String> textResponses) {
         Preconditions.checkNotNull(call);