All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.robolectric.fakes.RoboWebMessagePort Maven / Gradle / Ivy

The newest version!
package org.robolectric.fakes;

import android.os.Handler;
import android.webkit.WebMessage;
import android.webkit.WebMessagePort;
import android.webkit.WebMessagePort.WebMessageCallback;
import com.google.common.collect.ImmutableList;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javax.annotation.Nullable;

/** Robolectric implementation of {@link WebMessagePort}. */
public class RoboWebMessagePort extends WebMessagePort {
  private final List receivedMessages = Collections.synchronizedList(new ArrayList<>());
  // The connected port receives all messages this port sends. This port receives messages sent by
  // the connected port.
  private RoboWebMessagePort connectedPort;
  private WebMessageCallback callback;
  private boolean closed = false;

  public static RoboWebMessagePort[] createPair() {
    RoboWebMessagePort portA = new RoboWebMessagePort();
    RoboWebMessagePort portB = new RoboWebMessagePort();

    portA.setConnectedPort(portB);
    portB.setConnectedPort(portA);

    return new RoboWebMessagePort[] {portA, portB};
  }

  @Override
  public void postMessage(WebMessage message) {
    if (closed || connectedPort == null) {
      return;
    }

    String data = message.getData();
    if (data == null) {
      return;
    }

    connectedPort.receivedMessages.add(data);
    if (connectedPort.callback != null) {
      connectedPort.callback.onMessage(connectedPort, message);
    }
  }

  @Override
  public void setWebMessageCallback(WebMessagePort.WebMessageCallback callback) {
    setWebMessageCallback(callback, null);
  }

  @Override
  public void setWebMessageCallback(
      WebMessagePort.WebMessageCallback callback, @Nullable Handler handler) {
    this.callback = callback;
  }

  /**
   * Links another port to this port. After set, messages which sent from this port will arrive at
   * the connected one.
   */
  public void setConnectedPort(@Nullable RoboWebMessagePort port) {
    this.connectedPort = port;
  }

  public RoboWebMessagePort getConnectedPort() {
    return this.connectedPort;
  }

  public WebMessageCallback getWebMessageCallback() {
    return this.callback;
  }

  /** Returns the list of all messages sent to its connected ports. */
  public ImmutableList getOutgoingMessages() {
    return ImmutableList.copyOf(getConnectedPort().receivedMessages);
  }

  /** Returns the list of all messages received from its connected ports. */
  public ImmutableList getReceivedMessages() {
    return ImmutableList.copyOf(receivedMessages);
  }

  @Override
  public void close() {
    this.closed = true;
  }

  public boolean isClosed() {
    return this.closed;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy