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

org.robolectric.shadows.ShadowPath Maven / Gradle / Ivy

The newest version!
package org.robolectric.shadows;

import android.graphics.Path;
import org.robolectric.Shadows;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

import java.util.ArrayList;
import java.util.List;

import static org.robolectric.shadows.ShadowPath.Point.Type.LINE_TO;
import static org.robolectric.shadows.ShadowPath.Point.Type.MOVE_TO;

/**
 * The shadow only supports straight-line paths.
 */
@SuppressWarnings({"UnusedDeclaration"})
@Implements(Path.class)
public class ShadowPath {
  private List points = new ArrayList<>();
  private Point wasMovedTo;
  private String quadDescription = "";

  public void __constructor__(Path path) {
    points = new ArrayList<>(Shadows.shadowOf(path).getPoints());
    wasMovedTo = Shadows.shadowOf(path).wasMovedTo;
    quadDescription = Shadows.shadowOf(path).quadDescription;
  }

  @Implementation
  public void moveTo(float x, float y) {
    Point p = new Point(x, y, MOVE_TO);
    points.add(p);
    wasMovedTo = p;
  }

  @Implementation
  public void lineTo(float x, float y) {
    Point point = new Point(x, y, LINE_TO);
    points.add(point);
  }

  @Implementation
  public void quadTo(float x1, float y1, float x2, float y2) {
    quadDescription = "Add a quadratic bezier from last point, approaching (" + x1 + "," + y1 + "), ending at (" + x2 + "," + y2 + ")";
  }

  @Implementation
  public void reset() {
    points.clear();
    wasMovedTo = null;
    quadDescription = "";
  }

  @Implementation // TODO: This should only be used to enable interpolator resource parsing
  public float[] approximate(float acceptableError) {
    return new float[]{0, 0, 0, 1, 1, 1};
  }

  public String getQuadDescription() {
    return quadDescription;
  }

  /**
   * @return all the points that have been added to the {@code Path}
   */
  public List getPoints() {
    return points;
  }

  /**
   * @return whether the {@link #moveTo(float, float)} method was called
   */
  public Point getWasMovedTo() {
    return wasMovedTo;
  }

  public static class Point {
    private final float x;
    private final float y;
    private final Type type;

    public enum Type {
      MOVE_TO,
      LINE_TO
    }

    public Point(float x, float y, Type type) {
      this.x = x;
      this.y = y;
      this.type = type;
    }

    @Override
    public boolean equals(Object o) {
      if (this == o) return true;
      if (!(o instanceof Point)) return false;

      Point point = (Point) o;

      if (Float.compare(point.x, x) != 0) return false;
      if (Float.compare(point.y, y) != 0) return false;
      if (type != point.type) return false;

      return true;
    }

    @Override
    public int hashCode() {
      int result = (x != +0.0f ? Float.floatToIntBits(x) : 0);
      result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0);
      result = 31 * result + (type != null ? type.hashCode() : 0);
      return result;
    }

    @Override
    public String toString() {
      return "Point(" + x + "," + y + "," + type + ")";
    }

    public float getX() {
      return x;
    }

    public float getY() {
      return y;
    }

    public Type getType() {
      return type;
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy