133873d2b41a5cd2597b20a4e88eb8942944c0f23Tyler Schultzpackage com.xtremelabs.robolectric.shadows; 256a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 356a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richardimport android.graphics.Path; 422c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation; 522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements; 656a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richardimport java.util.ArrayList; 856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richardimport java.util.List; 956a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 1080110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richardimport static com.xtremelabs.robolectric.shadows.ShadowPath.Point.Type.LINE_TO; 1180110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richardimport static com.xtremelabs.robolectric.shadows.ShadowPath.Point.Type.MOVE_TO; 1280110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard 1359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin/** 1459d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * Shadow of {@code Path} that contains a simplified implementation of the original class that only supports 1559d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * straight-line {@code Path}s. 1659d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */ 1756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard@SuppressWarnings({"UnusedDeclaration"}) 1856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard@Implements(Path.class) 19afe0a89d904a7fe2f5980b9deb26cc3240192459Christian Williamspublic class ShadowPath { 2056a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard private List<Point> points = new ArrayList<Point>(); 2180110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard private List<Point> pointsMovedTo = new ArrayList<Point>(); 2280110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard private List<Point> pointsLinedTo = new ArrayList<Point>(); 234d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin private Point wasMovedTo; 24c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles private String quadDescription = ""; 2556a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 26de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 2756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public void moveTo(float x, float y) { 2880110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard Point p = new Point(x, y, MOVE_TO); 2956a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard points.add(p); 3056a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard wasMovedTo = p; 3156a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 3256a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 33de9feed5ddf1d91a3e76cbc71712c36a7652201eChristian Williams @Implementation 3456a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public void lineTo(float x, float y) { 3580110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard Point point = new Point(x, y, LINE_TO); 3680110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard points.add(point); 3756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 3856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 39c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles @Implementation 40c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles public void quadTo(float x1, float y1, float x2, float y2) { 41c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles quadDescription = "Add a quadratic bezier from last point, approaching (" + x1 + "," + y1 + "), " + 42c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles "ending at (" +x2+","+ y2 + ")"; 43c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles } 44c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles 45c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles public String getQuadDescription() { 46c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles return quadDescription; 47c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles } 4856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 4959d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin /** 50de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 5159d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * 5259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * @return all the points that have been added to the {@code Path} 5359d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */ 5456a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public List<Point> getPoints() { 5556a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard return points; 5656a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 5756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 5859d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin /** 59de2143a1bef92c4ef270d3391b9201e8b8af7051Christian Williams * Non-Android accessor. 6059d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * 6159d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin * @return whether the {@link #moveTo(float, float)} method was called 6259d9df0f147b94712b36ad44939ebd2afa4cf1b7Phil Goodwin */ 634d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin public Point getWasMovedTo() { 644d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin return wasMovedTo; 654d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin } 664d709f74a8a630e677915cff8fba5e8b4888800fChristian Williams & Phil Goodwin 6756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public static class Point { 6856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard float x, y; 6980110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard private Type type; 7080110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard 7180110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard public enum Type { 7280110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard MOVE_TO, 7380110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard LINE_TO 7480110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard } 7556a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 7680110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard public Point(float x, float y, Type type) { 7756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard this.x = x; 7856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard this.y = y; 7980110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard this.type = type; 8056a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 8156a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 8256a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard @Override 8356a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public boolean equals(Object o) { 8456a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard if (this == o) return true; 8580110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard if (!(o instanceof Point)) return false; 8656a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 8756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard Point point = (Point) o; 8856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 8956a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard if (Float.compare(point.x, x) != 0) return false; 9056a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard if (Float.compare(point.y, y) != 0) return false; 9180110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard if (type != point.type) return false; 9256a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 9356a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard return true; 9456a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 9556a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 9656a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard @Override 9756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public int hashCode() { 9856a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard int result = (x != +0.0f ? Float.floatToIntBits(x) : 0); 9956a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0); 10080110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard result = 31 * result + (type != null ? type.hashCode() : 0); 10156a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard return result; 10256a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 10356a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard 10456a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard @Override 10556a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard public String toString() { 10680110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard return "Point(" + x + "," + y + "," + type + ")"; 10756a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 108c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles 109c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles public float getX() { 110c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles return x; 111c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles } 112c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles 113c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles public float getY() { 114c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles return y; 115c3f77896cb2eb511d6aee0b27d010c4def7730a9Zoodles } 11680110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard 11780110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard public Type getType() { 11880110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard return type; 11980110a017e1d24f038b646ec4de64c7cc94867b3Ryan Richard } 12056a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard } 12156a2a9db15f97a56b5eacef4645bc8ba8790ba6cChee Wong & Ryan Richard} 122