Adding hold support to phone call.

Change-Id: I5290100b93ef56fcd07615e8cd0aeffe443fa4a4
diff --git a/src/com/android/incallui/CallButtonFragment.java b/src/com/android/incallui/CallButtonFragment.java
index 0e9fa9a..619720e 100644
--- a/src/com/android/incallui/CallButtonFragment.java
+++ b/src/com/android/incallui/CallButtonFragment.java
@@ -32,6 +32,11 @@
 public class CallButtonFragment extends BaseFragment<CallButtonPresenter>
         implements CallButtonPresenter.CallButtonUi {
 
+    private ToggleButton mMuteButton;
+    private ToggleButton mAudioButton;
+    private ToggleButton mHoldButton;
+    private View mEndCallButton;
+
     @Override
     CallButtonPresenter createPresenter() {
         return new CallButtonPresenter();
@@ -51,30 +56,38 @@
             Bundle savedInstanceState) {
         final View parent = inflater.inflate(R.layout.call_button_fragment, container, false);
 
-        final View endCallButton = parent.findViewById(R.id.endButton);
-        endCallButton.setOnClickListener(new View.OnClickListener() {
+        mEndCallButton = parent.findViewById(R.id.endButton);
+        mEndCallButton.setOnClickListener(new View.OnClickListener() {
             @Override
             public void onClick(View v) {
                 getPresenter().endCallClicked();
             }
         });
 
-        final ToggleButton toggleButton = (ToggleButton) parent.findViewById(R.id.muteButton);
-        toggleButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+        mMuteButton = (ToggleButton) parent.findViewById(R.id.muteButton);
+        mMuteButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 getPresenter().muteClicked(isChecked);
             }
         });
 
-        final ToggleButton audioButton = (ToggleButton) parent.findViewById(R.id.audioButton);
-        audioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+        mAudioButton = (ToggleButton) parent.findViewById(R.id.audioButton);
+        mAudioButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
             @Override
             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                 getPresenter().speakerClicked(isChecked);
             }
         });
 
+        mHoldButton = (ToggleButton) parent.findViewById(R.id.holdButton);
+        mHoldButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
+            @Override
+            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+                getPresenter().holdClicked(isChecked);
+            }
+        });
+
         return parent;
     }
 
@@ -94,13 +107,19 @@
 
     @Override
     public void setMute(boolean value) {
-        final ToggleButton button = (ToggleButton) getView().findViewById(R.id.muteButton);
-        button.setChecked(value);
+        mMuteButton.setChecked(value);
+    }
+
+    /**
+     * TODO(klp): Rename this from setSpeaker() to setAudio() once it does more than speakerphone.
+     */
+    @Override
+    public void setSpeaker(boolean value) {
+        mAudioButton.setChecked(value);
     }
 
     @Override
-    public void setSpeaker(boolean value) {
-        final ToggleButton button = (ToggleButton) getView().findViewById(R.id.audioButton);
-        button.setChecked(value);
+    public void setHold(boolean value) {
+        mHoldButton.setChecked(value);
     }
 }
diff --git a/src/com/android/incallui/CallButtonPresenter.java b/src/com/android/incallui/CallButtonPresenter.java
index ab47867..be76f2d 100644
--- a/src/com/android/incallui/CallButtonPresenter.java
+++ b/src/com/android/incallui/CallButtonPresenter.java
@@ -46,6 +46,8 @@
         CallCommandClient.getInstance().disconnectCall(1);
 
         mEndCallListener.onCallEnd();
+
+        // TODO(klp): These states should come from Call objects from the CallList.
         reset();
     }
 
@@ -53,6 +55,7 @@
         getUi().setVisible(false);
         getUi().setMute(false);
         getUi().setSpeaker(false);
+        getUi().setHold(false);
     }
 
     public void muteClicked(boolean checked) {
@@ -65,6 +68,12 @@
         getUi().setSpeaker(checked);
     }
 
+    public void holdClicked(boolean checked) {
+        // TODO(klp): use appropriate hold callId.
+        CallCommandClient.getInstance().hold(1, true);
+        getUi().setHold(checked);
+    }
+
     public void setEndCallListener(EndCallListener endCallListener) {
         mEndCallListener = endCallListener;
     }
@@ -73,6 +82,7 @@
         void setVisible(boolean on);
         void setMute(boolean on);
         void setSpeaker(boolean on);
+        void setHold(boolean on);
     }
 
     public interface EndCallListener {
diff --git a/src/com/android/incallui/CallCommandClient.java b/src/com/android/incallui/CallCommandClient.java
index 4b2512b..c631588 100644
--- a/src/com/android/incallui/CallCommandClient.java
+++ b/src/com/android/incallui/CallCommandClient.java
@@ -75,6 +75,14 @@
         }
     }
 
+    public void hold(int callId, boolean onOff) {
+        try {
+            mCommandService.hold(callId, onOff);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Error holding call.", e);
+        }
+    }
+
     public void turnSpeakerOn(boolean onOff) {
         try {
             mCommandService.speaker(onOff);