| Index: webrtc/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java
 | 
| diff --git a/webrtc/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java b/webrtc/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java
 | 
| index ca319abde29eb7c2a6125ef04aaaf8758d28296e..258b22f97397fb4a7cc082e07ca080e657709bc1 100644
 | 
| --- a/webrtc/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java
 | 
| +++ b/webrtc/examples/androidapp/src/org/appspot/apprtc/WebSocketRTCClient.java
 | 
| @@ -19,6 +19,7 @@ import org.appspot.apprtc.util.LooperExecutor;
 | 
|  
 | 
|  import android.util.Log;
 | 
|  
 | 
| +import org.json.JSONArray;
 | 
|  import org.json.JSONException;
 | 
|  import org.json.JSONObject;
 | 
|  import org.webrtc.IceCandidate;
 | 
| @@ -252,6 +253,37 @@ public class WebSocketRTCClient implements AppRTCClient,
 | 
|      });
 | 
|    }
 | 
|  
 | 
| +  // Send removed Ice candidates to the other participant.
 | 
| +  @Override
 | 
| +  public void sendLocalIceCandidateRemovals(final IceCandidate[] candidates) {
 | 
| +    executor.execute(new Runnable() {
 | 
| +      @Override
 | 
| +      public void run() {
 | 
| +        JSONObject json = new JSONObject();
 | 
| +        jsonPut(json, "type", "remove-candidates");
 | 
| +        JSONArray jsonArray =  new JSONArray();
 | 
| +        for (final IceCandidate candidate : candidates) {
 | 
| +          jsonArray.put(toJsonCandidate(candidate));
 | 
| +        }
 | 
| +        jsonPut(json, "candidates", jsonArray);
 | 
| +        if (initiator) {
 | 
| +          // Call initiator sends ice candidates to GAE server.
 | 
| +          if (roomState != ConnectionState.CONNECTED) {
 | 
| +            reportError("Sending ICE candidate removals in non connected state.");
 | 
| +            return;
 | 
| +          }
 | 
| +          sendPostMessage(MessageType.MESSAGE, messageUrl, json.toString());
 | 
| +          if (connectionParameters.loopback) {
 | 
| +            events.onRemoteIceCandidatesRemoved(candidates);
 | 
| +          }
 | 
| +        } else {
 | 
| +          // Call receiver sends ice candidates to websocket server.
 | 
| +          wsClient.send(json.toString());
 | 
| +        }
 | 
| +      }
 | 
| +    });
 | 
| +  }
 | 
| +
 | 
|    // --------------------------------------------------------------------
 | 
|    // WebSocketChannelEvents interface implementation.
 | 
|    // All events are called by WebSocketChannelClient on a local looper thread
 | 
| @@ -270,11 +302,14 @@ public class WebSocketRTCClient implements AppRTCClient,
 | 
|          json = new JSONObject(msgText);
 | 
|          String type = json.optString("type");
 | 
|          if (type.equals("candidate")) {
 | 
| -          IceCandidate candidate = new IceCandidate(
 | 
| -              json.getString("id"),
 | 
| -              json.getInt("label"),
 | 
| -              json.getString("candidate"));
 | 
| -          events.onRemoteIceCandidate(candidate);
 | 
| +          events.onRemoteIceCandidate(toJavaCandidate(json));
 | 
| +        } else if (type.equals("remove-candidates")) {
 | 
| +          JSONArray candidateArray = json.getJSONArray("candidates");
 | 
| +          IceCandidate[] candidates = new IceCandidate[candidateArray.length()];
 | 
| +          for (int i =0; i < candidateArray.length(); ++i) {
 | 
| +            candidates[i] = toJavaCandidate(candidateArray.getJSONObject(i));
 | 
| +          }
 | 
| +          events.onRemoteIceCandidatesRemoved(candidates);
 | 
|          } else if (type.equals("answer")) {
 | 
|            if (initiator) {
 | 
|              SessionDescription sdp = new SessionDescription(
 | 
| @@ -376,4 +411,20 @@ public class WebSocketRTCClient implements AppRTCClient,
 | 
|        });
 | 
|      httpConnection.send();
 | 
|    }
 | 
| +
 | 
| +  // Converts a Java candidate to a JSONObject.
 | 
| +  private JSONObject toJsonCandidate(final IceCandidate candidate) {
 | 
| +    JSONObject json = new JSONObject();
 | 
| +    jsonPut(json, "label", candidate.sdpMLineIndex);
 | 
| +    jsonPut(json, "id", candidate.sdpMid);
 | 
| +    jsonPut(json, "candidate", candidate.sdp);
 | 
| +    return json;
 | 
| +  }
 | 
| +
 | 
| +  // Converts a JSON candidate to a Java object.
 | 
| +  IceCandidate toJavaCandidate(JSONObject json) throws JSONException {
 | 
| +    return new IceCandidate(json.getString("id"),
 | 
| +                            json.getInt("label"),
 | 
| +                            json.getString("candidate"));
 | 
| +  }
 | 
|  }
 | 
| 
 |