Implement Connection.setStatus

Change-Id: I125628b74784d2303b9a429038a9f7ee604f241e
diff --git a/src/com/android/telecomm/Call.java b/src/com/android/telecomm/Call.java
index 99e4b07..49e72b2 100644
--- a/src/com/android/telecomm/Call.java
+++ b/src/com/android/telecomm/Call.java
@@ -29,6 +29,7 @@
 import android.telecomm.GatewayInfo;
 import android.telecomm.PhoneAccount;
 import android.telecomm.Response;
+import android.telecomm.StatusHints;
 import android.telecomm.TelecommConstants;
 import android.telephony.DisconnectCause;
 import android.telephony.PhoneNumberUtils;
@@ -76,6 +77,7 @@
         void onFeaturesChanged(Call call);
         void onCallerInfoChanged(Call call);
         void onAudioModeIsVoipChanged(Call call);
+        void onStatusHintsChanged(Call call);
     }
 
     abstract static class ListenerBase implements Listener {
@@ -113,6 +115,8 @@
         public void onCallerInfoChanged(Call call) {}
         @Override
         public void onAudioModeIsVoipChanged(Call call) {}
+        @Override
+        public void onStatusHintsChanged(Call call) {}
     }
 
     private static final OnQueryCompleteListener sCallerInfoQueryListener =
@@ -232,6 +236,7 @@
     private int mFeatures;
 
     private boolean mAudioModeIsVoip;
+    private StatusHints mStatusHints;
 
     /**
      * Creates an empty call object.
@@ -1071,7 +1076,18 @@
     public void setAudioModeIsVoip(boolean audioModeIsVoip) {
         mAudioModeIsVoip = audioModeIsVoip;
         for (Listener l : mListeners) {
-            l.onAudioModeIsVoipChanged(Call.this);
+            l.onAudioModeIsVoipChanged(this);
+        }
+    }
+
+    public StatusHints getStatusHints() {
+        return mStatusHints;
+    }
+
+    public void setStatusHints(StatusHints statusHints) {
+        mStatusHints = statusHints;
+        for (Listener l : mListeners) {
+            l.onStatusHintsChanged(this);
         }
     }
 }
diff --git a/src/com/android/telecomm/CallsManager.java b/src/com/android/telecomm/CallsManager.java
index d451162..ec23222 100644
--- a/src/com/android/telecomm/CallsManager.java
+++ b/src/com/android/telecomm/CallsManager.java
@@ -23,6 +23,7 @@
 import android.telecomm.CallState;
 import android.telecomm.GatewayInfo;
 import android.telecomm.PhoneAccount;
+import android.telecomm.StatusHints;
 import android.telephony.DisconnectCause;
 
 import com.google.common.base.Preconditions;
@@ -62,6 +63,7 @@
         void onCallVideoProviderChanged(Call call);
         void onFeaturesChanged(Call call);
         void onAudioModeIsVoipChanged(Call call);
+        void onStatusHintsChanged(Call call);
     }
 
     private static final CallsManager INSTANCE = new CallsManager();
@@ -234,6 +236,13 @@
         }
     }
 
+    @Override
+    public void onStatusHintsChanged(Call call) {
+        for (CallsManagerListener listener : mListeners) {
+            listener.onStatusHintsChanged(call);
+        }
+    }
+
     ImmutableCollection<Call> getCalls() {
         return ImmutableList.copyOf(mCalls);
     }
diff --git a/src/com/android/telecomm/CallsManagerListenerBase.java b/src/com/android/telecomm/CallsManagerListenerBase.java
index b6eb3b9..77dc7b6 100644
--- a/src/com/android/telecomm/CallsManagerListenerBase.java
+++ b/src/com/android/telecomm/CallsManagerListenerBase.java
@@ -20,6 +20,7 @@
 import android.telecomm.CallAudioState;
 import android.telecomm.CallServiceDescriptor;
 import android.telecomm.CallState;
+import android.telecomm.StatusHints;
 
 /**
  * Provides a default implementation for listeners of CallsManager.
@@ -87,4 +88,8 @@
     @Override
     public void onAudioModeIsVoipChanged(Call call) {
     }
+
+    @Override
+    public void onStatusHintsChanged(Call call) {
+    }
 }
diff --git a/src/com/android/telecomm/ConnectionServiceWrapper.java b/src/com/android/telecomm/ConnectionServiceWrapper.java
index 1bad6fd..e355890 100644
--- a/src/com/android/telecomm/ConnectionServiceWrapper.java
+++ b/src/com/android/telecomm/ConnectionServiceWrapper.java
@@ -27,11 +27,11 @@
 import android.telecomm.CallServiceDescriptor;
 import android.telecomm.ConnectionRequest;
 import android.telecomm.GatewayInfo;
+import android.telecomm.StatusHints;
 import android.telecomm.TelecommConstants;
 import android.telephony.DisconnectCause;
 
 import com.android.internal.os.SomeArgs;
-
 import com.android.internal.telecomm.IConnectionService;
 import com.android.internal.telecomm.IConnectionServiceAdapter;
 import com.android.internal.telecomm.ICallServiceProvider;
@@ -77,6 +77,7 @@
     private static final int MSG_SET_CALL_VIDEO_PROVIDER = 17;
     private static final int MSG_SET_FEATURES = 18;
     private static final int MSG_SET_AUDIO_MODE_IS_VOIP = 19;
+    private static final int MSG_SET_STATUS_HINTS = 20;
 
     private final Handler mHandler = new Handler() {
         @Override
@@ -311,6 +312,19 @@
                     }
                     break;
                 }
+                case MSG_SET_STATUS_HINTS: {
+                    SomeArgs args = (SomeArgs) msg.obj;
+                    try {
+                        call = mCallIdMapper.getCall(args.arg1);
+                        StatusHints statusHints = (StatusHints) args.arg2;
+                        if (call != null) {
+                            call.setStatusHints(statusHints);
+                        }
+                    } finally {
+                        args.recycle();
+                    }
+                    break;
+                }
             }
         }
     };
@@ -490,6 +504,16 @@
             args.argi1 = isVoip ? 1 : 0;
             mHandler.obtainMessage(MSG_SET_AUDIO_MODE_IS_VOIP, args).sendToTarget();
         }
+
+        @Override
+        public void setStatusHints(String callId, StatusHints statusHints) {
+            logIncoming("setStatusHints %s %s", callId, statusHints);
+            mCallIdMapper.checkValidCallId(callId);
+            SomeArgs args = SomeArgs.obtain();
+            args.arg1 = callId;
+            args.arg2 = statusHints;
+            mHandler.obtainMessage(MSG_SET_STATUS_HINTS, args).sendToTarget();
+        }
     }
 
     private final Adapter mAdapter = new Adapter();
diff --git a/src/com/android/telecomm/InCallController.java b/src/com/android/telecomm/InCallController.java
index d1215ae..c80e5af 100644
--- a/src/com/android/telecomm/InCallController.java
+++ b/src/com/android/telecomm/InCallController.java
@@ -159,6 +159,11 @@
         updateCall(call);
     }
 
+    @Override
+    public void onStatusHintsChanged(Call call) {
+        updateCall(call);
+    }
+
     void bringToForeground(boolean showDialpad) {
         if (mInCallService != null) {
             try {
@@ -300,7 +305,7 @@
         return new InCallCall(callId, state, call.getDisconnectCause(), call.getDisconnectMessage(),
                 call.getCannedSmsResponses(), capabilities, connectTimeMillis, call.getHandle(),
                 call.getGatewayInfo(), call.getAccount(), descriptor, call.getCallVideoProvider(),
-                parentCallId, childCallIds, call.getFeatures());
+                parentCallId, childCallIds, call.getFeatures(), call.getStatusHints());
     }
 
 }