1 package org.robolectric.shadows;
2 
3 import static android.os.Build.VERSION_CODES.N_MR1;
4 import static android.os.Build.VERSION_CODES.O;
5 
6 import android.graphics.Matrix;
7 import android.graphics.RectF;
8 import java.util.List;
9 import java.util.Map;
10 import org.robolectric.annotation.Implementation;
11 import org.robolectric.annotation.Implements;
12 import org.robolectric.nativeruntime.DefaultNativeRuntimeLoader;
13 import org.robolectric.nativeruntime.MatrixNatives;
14 import org.robolectric.versioning.AndroidVersions.U;
15 import org.robolectric.versioning.AndroidVersions.V;
16 
17 /** Shadow for {@link Matrix} that is backed by native code */
18 @Implements(
19     value = Matrix.class,
20     minSdk = O,
21     isInAndroidSdk = false,
22     callNativeMethodsByDefault = true)
23 public class ShadowNativeMatrix extends ShadowMatrix {
24 
25   @Implementation(maxSdk = N_MR1)
native_create(long nSrcOrZero)26   protected static long native_create(long nSrcOrZero) {
27     return nCreate(nSrcOrZero);
28   }
29 
30   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nCreate(long nSrcOrZero)31   protected static long nCreate(long nSrcOrZero) {
32     DefaultNativeRuntimeLoader.injectAndLoad();
33     return MatrixNatives.nCreate(nSrcOrZero);
34   }
35 
36   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nGetNativeFinalizer()37   protected static long nGetNativeFinalizer() {
38     return MatrixNatives.nGetNativeFinalizer();
39   }
40 
41   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetRectToRect(long nObject, RectF src, RectF dst, int stf)42   protected static boolean nSetRectToRect(long nObject, RectF src, RectF dst, int stf) {
43     return MatrixNatives.nSetRectToRect(nObject, src, dst, stf);
44   }
45 
46   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetPolyToPoly( long nObject, float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount)47   protected static boolean nSetPolyToPoly(
48       long nObject, float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount) {
49     return MatrixNatives.nSetPolyToPoly(nObject, src, srcIndex, dst, dstIndex, pointCount);
50   }
51 
52   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nMapPoints( long nObject, float[] dst, int dstIndex, float[] src, int srcIndex, int ptCount, boolean isPts)53   protected static void nMapPoints(
54       long nObject,
55       float[] dst,
56       int dstIndex,
57       float[] src,
58       int srcIndex,
59       int ptCount,
60       boolean isPts) {
61     MatrixNatives.nMapPoints(nObject, dst, dstIndex, src, srcIndex, ptCount, isPts);
62   }
63 
64   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nMapRect(long nObject, RectF dst, RectF src)65   protected static boolean nMapRect(long nObject, RectF dst, RectF src) {
66     return MatrixNatives.nMapRect(nObject, dst, src);
67   }
68 
69   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nGetValues(long nObject, float[] values)70   protected static void nGetValues(long nObject, float[] values) {
71     MatrixNatives.nGetValues(nObject, values);
72   }
73 
74   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetValues(long nObject, float[] values)75   protected static void nSetValues(long nObject, float[] values) {
76     MatrixNatives.nSetValues(nObject, values);
77   }
78 
79   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nIsIdentity(long nObject)80   protected static boolean nIsIdentity(long nObject) {
81     return MatrixNatives.nIsIdentity(nObject);
82   }
83 
84   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nIsAffine(long nObject)85   protected static boolean nIsAffine(long nObject) {
86     return MatrixNatives.nIsAffine(nObject);
87   }
88 
89   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nRectStaysRect(long nObject)90   protected static boolean nRectStaysRect(long nObject) {
91     return MatrixNatives.nRectStaysRect(nObject);
92   }
93 
94   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nReset(long nObject)95   protected static void nReset(long nObject) {
96     MatrixNatives.nReset(nObject);
97   }
98 
99   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSet(long nObject, long nOther)100   protected static void nSet(long nObject, long nOther) {
101     MatrixNatives.nSet(nObject, nOther);
102   }
103 
104   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetTranslate(long nObject, float dx, float dy)105   protected static void nSetTranslate(long nObject, float dx, float dy) {
106     MatrixNatives.nSetTranslate(nObject, dx, dy);
107   }
108 
109   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetScale(long nObject, float sx, float sy, float px, float py)110   protected static void nSetScale(long nObject, float sx, float sy, float px, float py) {
111     MatrixNatives.nSetScale(nObject, sx, sy, px, py);
112   }
113 
114   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetScale(long nObject, float sx, float sy)115   protected static void nSetScale(long nObject, float sx, float sy) {
116     MatrixNatives.nSetScale(nObject, sx, sy);
117   }
118 
119   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetRotate(long nObject, float degrees, float px, float py)120   protected static void nSetRotate(long nObject, float degrees, float px, float py) {
121     MatrixNatives.nSetRotate(nObject, degrees, px, py);
122   }
123 
124   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetRotate(long nObject, float degrees)125   protected static void nSetRotate(long nObject, float degrees) {
126     MatrixNatives.nSetRotate(nObject, degrees);
127   }
128 
129   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetSinCos( long nObject, float sinValue, float cosValue, float px, float py)130   protected static void nSetSinCos(
131       long nObject, float sinValue, float cosValue, float px, float py) {
132     MatrixNatives.nSetSinCos(nObject, sinValue, cosValue, px, py);
133   }
134 
135   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetSinCos(long nObject, float sinValue, float cosValue)136   protected static void nSetSinCos(long nObject, float sinValue, float cosValue) {
137     MatrixNatives.nSetSinCos(nObject, sinValue, cosValue);
138   }
139 
140   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetSkew(long nObject, float kx, float ky, float px, float py)141   protected static void nSetSkew(long nObject, float kx, float ky, float px, float py) {
142     MatrixNatives.nSetSkew(nObject, kx, ky, px, py);
143   }
144 
145   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetSkew(long nObject, float kx, float ky)146   protected static void nSetSkew(long nObject, float kx, float ky) {
147     MatrixNatives.nSetSkew(nObject, kx, ky);
148   }
149 
150   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nSetConcat(long nObject, long nA, long nB)151   protected static void nSetConcat(long nObject, long nA, long nB) {
152     MatrixNatives.nSetConcat(nObject, nA, nB);
153   }
154 
155   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreTranslate(long nObject, float dx, float dy)156   protected static void nPreTranslate(long nObject, float dx, float dy) {
157     MatrixNatives.nPreTranslate(nObject, dx, dy);
158   }
159 
160   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreScale(long nObject, float sx, float sy, float px, float py)161   protected static void nPreScale(long nObject, float sx, float sy, float px, float py) {
162     MatrixNatives.nPreScale(nObject, sx, sy, px, py);
163   }
164 
165   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreScale(long nObject, float sx, float sy)166   protected static void nPreScale(long nObject, float sx, float sy) {
167     MatrixNatives.nPreScale(nObject, sx, sy);
168   }
169 
170   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreRotate(long nObject, float degrees, float px, float py)171   protected static void nPreRotate(long nObject, float degrees, float px, float py) {
172     MatrixNatives.nPreRotate(nObject, degrees, px, py);
173   }
174 
175   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreRotate(long nObject, float degrees)176   protected static void nPreRotate(long nObject, float degrees) {
177     MatrixNatives.nPreRotate(nObject, degrees);
178   }
179 
180   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreSkew(long nObject, float kx, float ky, float px, float py)181   protected static void nPreSkew(long nObject, float kx, float ky, float px, float py) {
182     MatrixNatives.nPreSkew(nObject, kx, ky, px, py);
183   }
184 
185   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreSkew(long nObject, float kx, float ky)186   protected static void nPreSkew(long nObject, float kx, float ky) {
187     MatrixNatives.nPreSkew(nObject, kx, ky);
188   }
189 
190   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPreConcat(long nObject, long nOtherMatrix)191   protected static void nPreConcat(long nObject, long nOtherMatrix) {
192     MatrixNatives.nPreConcat(nObject, nOtherMatrix);
193   }
194 
195   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostTranslate(long nObject, float dx, float dy)196   protected static void nPostTranslate(long nObject, float dx, float dy) {
197     MatrixNatives.nPostTranslate(nObject, dx, dy);
198   }
199 
200   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostScale(long nObject, float sx, float sy, float px, float py)201   protected static void nPostScale(long nObject, float sx, float sy, float px, float py) {
202     MatrixNatives.nPostScale(nObject, sx, sy, px, py);
203   }
204 
205   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostScale(long nObject, float sx, float sy)206   protected static void nPostScale(long nObject, float sx, float sy) {
207     MatrixNatives.nPostScale(nObject, sx, sy);
208   }
209 
210   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostRotate(long nObject, float degrees, float px, float py)211   protected static void nPostRotate(long nObject, float degrees, float px, float py) {
212     MatrixNatives.nPostRotate(nObject, degrees, px, py);
213   }
214 
215   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostRotate(long nObject, float degrees)216   protected static void nPostRotate(long nObject, float degrees) {
217     MatrixNatives.nPostRotate(nObject, degrees);
218   }
219 
220   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostSkew(long nObject, float kx, float ky, float px, float py)221   protected static void nPostSkew(long nObject, float kx, float ky, float px, float py) {
222     MatrixNatives.nPostSkew(nObject, kx, ky, px, py);
223   }
224 
225   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostSkew(long nObject, float kx, float ky)226   protected static void nPostSkew(long nObject, float kx, float ky) {
227     MatrixNatives.nPostSkew(nObject, kx, ky);
228   }
229 
230   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nPostConcat(long nObject, long nOtherMatrix)231   protected static void nPostConcat(long nObject, long nOtherMatrix) {
232     MatrixNatives.nPostConcat(nObject, nOtherMatrix);
233   }
234 
235   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nInvert(long nObject, long nInverse)236   protected static boolean nInvert(long nObject, long nInverse) {
237     return MatrixNatives.nInvert(nObject, nInverse);
238   }
239 
240   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nMapRadius(long nObject, float radius)241   protected static float nMapRadius(long nObject, float radius) {
242     return MatrixNatives.nMapRadius(nObject, radius);
243   }
244 
245   @Implementation(minSdk = O, maxSdk = U.SDK_INT)
nEquals(long nA, long nB)246   protected static boolean nEquals(long nA, long nB) {
247     return MatrixNatives.nEquals(nA, nB);
248   }
249 
250   @Override
getPreOperations()251   public List<String> getPreOperations() {
252     throw new UnsupportedOperationException("Legacy ShadowMatrix APIs are not supported");
253   }
254 
255   @Override
getPostOperations()256   public List<String> getPostOperations() {
257     throw new UnsupportedOperationException("Legacy ShadowMatrix APIs are not supported");
258   }
259 
260   @Override
getSetOperations()261   public Map<String, String> getSetOperations() {
262     throw new UnsupportedOperationException("Legacy ShadowMatrix APIs are not supported");
263   }
264 
265   @Override
getDescription()266   public String getDescription() {
267     throw new UnsupportedOperationException("Legacy ShadowMatrix APIs are not supported");
268   }
269 
270   /** Shadow for {@link Matrix$ExtraNatives} that contains native functions. */
271   @Implements(
272       className = "android.graphics.Matrix$ExtraNatives",
273       isInAndroidSdk = false,
274       callNativeMethodsByDefault = true,
275       shadowPicker = ShadowNativeMatrix.ShadowExtraNatives.Picker.class,
276       minSdk = V.SDK_INT)
277   @SuppressWarnings("robolectric.internal.IgnoreMissingClass")
278   public static class ShadowExtraNatives {
279     /** Shadow picker for {@link Matrix.ExtraNatives}. */
280     public static final class Picker extends GraphicsShadowPicker<Object> {
Picker()281       public Picker() {
282         super(null, ShadowNativeMatrix.ShadowExtraNatives.class);
283       }
284     }
285   }
286 }
287