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