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