1 package com.xtremelabs.robolectric.shadows;
2 
3 import android.graphics.Path;
4 import com.xtremelabs.robolectric.internal.Implementation;
5 import com.xtremelabs.robolectric.internal.Implements;
6 
7 import java.util.ArrayList;
8 import java.util.List;
9 
10 import static com.xtremelabs.robolectric.shadows.ShadowPath.Point.Type.LINE_TO;
11 import static com.xtremelabs.robolectric.shadows.ShadowPath.Point.Type.MOVE_TO;
12 
13 /**
14  * Shadow of {@code Path} that contains a simplified implementation of the original class that only supports
15  * straight-line {@code Path}s.
16  */
17 @SuppressWarnings({"UnusedDeclaration"})
18 @Implements(Path.class)
19 public class ShadowPath {
20     private List<Point> points = new ArrayList<Point>();
21     private List<Point> pointsMovedTo = new ArrayList<Point>();
22     private List<Point> pointsLinedTo = new ArrayList<Point>();
23     private Point wasMovedTo;
24     private String quadDescription = "";
25 
26     @Implementation
moveTo(float x, float y)27     public void moveTo(float x, float y) {
28         Point p = new Point(x, y, MOVE_TO);
29         points.add(p);
30         wasMovedTo = p;
31     }
32 
33     @Implementation
lineTo(float x, float y)34     public void lineTo(float x, float y) {
35         Point point = new Point(x, y, LINE_TO);
36         points.add(point);
37     }
38 
39     @Implementation
quadTo(float x1, float y1, float x2, float y2)40     public void quadTo(float x1, float y1, float x2, float y2) {
41     	quadDescription = "Add a quadratic bezier from last point, approaching (" + x1 + "," + y1 + "), " +
42     			"ending at (" +x2+","+ y2 + ")";
43     }
44 
getQuadDescription()45     public String getQuadDescription() {
46     	return quadDescription;
47     }
48 
49     /**
50      * Non-Android accessor.
51      *
52      * @return all the points that have been added to the {@code Path}
53      */
getPoints()54     public List<Point> getPoints() {
55         return points;
56     }
57 
58     /**
59      * Non-Android accessor.
60      *
61      * @return whether the {@link #moveTo(float, float)} method was called
62      */
getWasMovedTo()63     public Point getWasMovedTo() {
64         return wasMovedTo;
65     }
66 
67     public static class Point {
68         float x, y;
69         private Type type;
70 
71         public enum Type {
72             MOVE_TO,
73             LINE_TO
74         }
75 
Point(float x, float y, Type type)76         public Point(float x, float y, Type type) {
77             this.x = x;
78             this.y = y;
79             this.type = type;
80         }
81 
82         @Override
equals(Object o)83         public boolean equals(Object o) {
84             if (this == o) return true;
85             if (!(o instanceof Point)) return false;
86 
87             Point point = (Point) o;
88 
89             if (Float.compare(point.x, x) != 0) return false;
90             if (Float.compare(point.y, y) != 0) return false;
91             if (type != point.type) return false;
92 
93             return true;
94         }
95 
96         @Override
hashCode()97         public int hashCode() {
98             int result = (x != +0.0f ? Float.floatToIntBits(x) : 0);
99             result = 31 * result + (y != +0.0f ? Float.floatToIntBits(y) : 0);
100             result = 31 * result + (type != null ? type.hashCode() : 0);
101             return result;
102         }
103 
104         @Override
toString()105         public String toString() {
106             return "Point(" + x + "," + y + "," + type + ")";
107         }
108 
getX()109         public float getX() {
110         	return x;
111         }
112 
getY()113         public float getY() {
114         	return y;
115         }
116 
getType()117         public Type getType() {
118             return type;
119         }
120     }
121 }
122