Config.java revision bf73dde49765ed8f3556ef0b2ce63a0cb44703fb
1cfb3d242306311ce27ec51bf511764377c173a7cKiran Ryali + Christian Williamspackage org.robolectric.annotation; 2dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao 39cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrishimport android.app.Application; 4b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar 5f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport org.jetbrains.annotations.NotNull; 6f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 7f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Annotation; 8f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Documented; 9f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.ElementType; 10f6e6129091939d868f32182a3dbba7ca0188e515ChrisHennickAtGoogleimport java.lang.annotation.Inherited; 11f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Retention; 12f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.RetentionPolicy; 13f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.lang.annotation.Target; 14f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williamsimport java.util.Arrays; 15c77f5791f081893a18f9db753bb5022269a7c5a6Simon Arlottimport java.util.HashSet; 1623a26cc3e5b33c0503a99847292ac99817f5af43Christian Williamsimport java.util.Properties; 17c77f5791f081893a18f9db753bb5022269a7c5a6Simon Arlottimport java.util.Set; 18f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 19dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao/** 20c7482da584ddaa03f91afa7b785ed17fa084aa47Erich Douglass * Configuration settings that can be used on a per-class or per-test basis. 21dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao */ 22f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams@Documented 23f6e6129091939d868f32182a3dbba7ca0188e515ChrisHennickAtGoogle@Inherited 24f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams@Retention(RetentionPolicy.RUNTIME) 25f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams@Target({ElementType.TYPE, ElementType.METHOD}) 267be4d2ba0e45483ad70cbd994955ae1b70afafdcKiran Ryali + Christian Williamspublic @interface Config { 27b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar /** 28b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar * TODO(vnayar): Create named constants for default values instead of magic numbers. 29b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar * Array named contants must be avoided in order to dodge a JDK 1.7 bug. 3084ec27668a169c2c23f5872da93eb532e7e4ae94Christian Williams * error: annotation Config is missing value for the attribute <clinit> 3184ec27668a169c2c23f5872da93eb532e7e4ae94Christian Williams * See <a href="https://bugs.openjdk.java.net/browse/JDK-8013485">JDK-8013485</a>. 32b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar */ 330bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass String NONE = "--none"; 34b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String DEFAULT_MANIFEST = "--default"; 35b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String DEFAULT_PACKAGE_NAME = ""; 36b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String DEFAULT_ABI_SPLIT = ""; 37b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String DEFAULT_QUALIFIERS = ""; 380bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass String DEFAULT_RES_FOLDER = "res"; 390bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass String DEFAULT_ASSET_FOLDER = "assets"; 40ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny String DEFAULT_BUILD_FOLDER = "build"; 4129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 4229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams /** 43bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish * The Android SDK level to emulate. This value will also be set as Build.VERSION.SDK_INT. 4429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams */ 45b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar int[] sdk() default {}; // DEFAULT_SDK 4629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 4729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams /** 48bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish * The minimum Android SDK level to emulate when running tests on multiple API versions. 49bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish */ 50bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish int minSdk() default -1; 51bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish 52bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish /** 53bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish * The minimum Android SDK level to emulate when running tests on multiple API versions. 54bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish */ 55bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish int maxSdk() default -1; 56bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish 57bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish /** 5829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * The Android manifest file to load; Robolectric will look relative to the current directory. 5929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * Resources and assets will be loaded relative to the manifest. 6029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * 6129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * If not specified, Robolectric defaults to {@code AndroidManifest.xml}. 6229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * 6329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * If your project has no manifest or resources, use {@link Config#NONE}. 6483bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 6583bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return The Android manifest file to load. 6629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams */ 67b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String manifest() default DEFAULT_MANIFEST; 6829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 6929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams /** 700bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass * Reference to the BuildConfig class created by the Gradle build system. 710bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass * 720bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass * @return Reference to BuildConfig class. 730bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass */ 74b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar Class<?> constants() default Void.class; // DEFAULT_CONSTANTS 750bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass 760bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass /** 779cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish * The {@link android.app.Application} class to use in the test, this takes precedence over any application 789cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish * specified in the AndroidManifest.xml. 7983bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 8083bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return The {@link android.app.Application} class to use in the test. 819cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish */ 82b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar Class<? extends Application> application() default Application.class; // DEFAULT_APPLICATION 839cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish 849cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish /** 85bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * Java package name where the "R.class" file is located. This only needs to be specified if you define 86bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * an {@code applicationId} associated with {@code productFlavors} or specify {@code applicationIdSuffix} 87bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * in your build.gradle. 88bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * 89bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * <p>If not specified, Robolectric defaults to the {@code applicationId}.</p> 90bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * 91bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * @return The java package name for R.class. 92bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass */ 93b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String packageName() default DEFAULT_PACKAGE_NAME; 94bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass 95bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass /** 963c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai * The ABI split to use when locating resources and AndroidManifest.xml 973c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai * 983c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai * <p>You do not typically have to set this, unless you are utilizing the ABI split feature</p> 993c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai * 1003c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai * @return The ABI split to test with 1013c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai */ 102b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String abiSplit() default DEFAULT_ABI_SPLIT; 1033c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai 1043c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai /** 10529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * Qualifiers for the resource resolution, such as "fr-normal-port-hdpi". 10629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * 10783bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return Qualifiers used for resource resolution. 10829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams */ 109b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String qualifiers() default DEFAULT_QUALIFIERS; 11029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 11129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams /** 1126b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass * The directory from which to load resources. This should be relative to the directory containing AndroidManifest.xml. 11383bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 114bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * <p>If not specified, Robolectric defaults to {@code res}.</p> 11583bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 11683bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return Android resource directory. 1175277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John */ 1186b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass String resourceDir() default DEFAULT_RES_FOLDER; 1196b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass 1206b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass /** 1216b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass * The directory from which to load assets. This should be relative to the directory containing AndroidManifest.xml. 12283bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 123bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass * <p>If not specified, Robolectric defaults to {@code assets}.</p> 12483bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 12583bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return Android asset directory. 1266b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass */ 1276b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass String assetDir() default DEFAULT_ASSET_FOLDER; 1285277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John 1295277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John /** 130ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny * The directory where application files are created during the application build process. 131ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny * 132ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny * <p>If not specified, Robolectric defaults to {@code build}.</p> 133ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny * 134ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny * @return Android build directory. 135ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny */ 136ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny String buildDir() default DEFAULT_BUILD_FOLDER; 137ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny 138ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny /** 13929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams * A list of shadow classes to enable, in addition to those that are already present. 14083bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 14183bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return A list of additional shadow classes to enable. 14229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams */ 143b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar Class<?>[] shadows() default {}; // DEFAULT_SHADOWS 144b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar 145d6cef1bcc644c7152d0716b8d33eb25054894836David Sun /** 146d6cef1bcc644c7152d0716b8d33eb25054894836David Sun * A list of instrumented packages, in addition to those that are already instrumented. 147b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar * 148d6cef1bcc644c7152d0716b8d33eb25054894836David Sun * @return A list of additional instrumented packages. 149d6cef1bcc644c7152d0716b8d33eb25054894836David Sun */ 150b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String[] instrumentedPackages() default {}; // DEFAULT_INSTRUMENTED_PACKAGES 15129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 152ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson /** 153ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson * A list of folders containing Android Libraries on which this project depends. 15483bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * 15583bcaf5aa4b64a2223cfada134ef02e5c8ff660aErich Douglass * @return A list of Android Libraries. 156ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson */ 157b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar String[] libraries() default {}; // DEFAULT_LIBRARIES; 158ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson 1590bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass class Implementation implements Config { 16081a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish private final int[] sdk; 161bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish private final int minSdk; 162bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish private final int maxSdk; 16329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams private final String manifest; 16429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams private final String qualifiers; 1655277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John private final String resourceDir; 1666b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass private final String assetDir; 167ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny private final String buildDir; 168bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass private final String packageName; 1693c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai private final String abiSplit; 1700bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass private final Class<?> constants; 17129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams private final Class<?>[] shadows; 172d6cef1bcc644c7152d0716b8d33eb25054894836David Sun private final String[] instrumentedPackages; 1739cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish private final Class<? extends Application> application; 174ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson private final String[] libraries; 17529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams 1760bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass public static Config fromProperties(Properties properties) { 1770bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass if (properties == null || properties.size() == 0) return null; 17829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams return new Implementation( 17981a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish parseIntArrayProperty(properties.getProperty("sdk", "")), 180bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish Integer.parseInt(properties.getProperty("minSdk"), -1), 181bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish Integer.parseInt(properties.getProperty("maxSdk"), -1), 182b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("manifest", DEFAULT_MANIFEST), 183b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("qualifiers", DEFAULT_QUALIFIERS), 184b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("packageName", DEFAULT_PACKAGE_NAME), 185b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("abiSplit", DEFAULT_ABI_SPLIT), 186b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("resourceDir", DEFAULT_RES_FOLDER), 187b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("assetDir", DEFAULT_ASSET_FOLDER), 188b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar properties.getProperty("buildDir", DEFAULT_BUILD_FOLDER), 1890bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass parseClasses(properties.getProperty("shadows", "")), 190d6cef1bcc644c7152d0716b8d33eb25054894836David Sun parseStringArrayProperty(properties.getProperty("instrumentedPackages", "")), 1910bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass parseApplication(properties.getProperty("application", "android.app.Application")), 19281a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish parseStringArrayProperty(properties.getProperty("libraries", "")), 1930bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass parseClass(properties.getProperty("constants", "")) 19429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams ); 19529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 19623a26cc3e5b33c0503a99847292ac99817f5af43Christian Williams 1970bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass private static Class<?> parseClass(String className) { 1980bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass if (className.isEmpty()) return null; 1990bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass try { 2000bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass return Implementation.class.getClassLoader().loadClass(className); 2010bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass } catch (ClassNotFoundException e) { 2020bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass throw new RuntimeException("Could not load class: " + className); 2030bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass } 2040bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass } 2050bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass 2060bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass private static Class<?>[] parseClasses(String input) { 2070bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass if (input.isEmpty()) return new Class[0]; 2080bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass final String[] classNames = input.split("[, ]+"); 2090bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass final Class[] classes = new Class[classNames.length]; 21029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams for (int i = 0; i < classNames.length; i++) { 2110bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass classes[i] = parseClass(classNames[i]); 21229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 21329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams return classes; 21429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 21523a26cc3e5b33c0503a99847292ac99817f5af43Christian Williams 2160bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass @SuppressWarnings("unchecked") 2179cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish private static <T extends Application> Class<T> parseApplication(String className) { 2180bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass return (Class<T>) parseClass(className); 2199cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish } 2209cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish 22181a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish private static String[] parseStringArrayProperty(String property) { 22281a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish if (property.isEmpty()) return new String[0]; 22381a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish return property.split("[, ]+"); 224ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson } 225ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson 22681a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish private static int[] parseIntArrayProperty(String property) { 22781a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish String[] parts = parseStringArrayProperty(property); 22881a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish int[] result = new int[parts.length]; 22981a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish for (int i = 0; i < parts.length; i++) { 23081a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish result[i] = Integer.parseInt(parts[i]); 23181a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish } 23281a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish 23381a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish return result; 23481a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish } 23581a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish 236bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish public Implementation(int[] sdk, int minSdk, int maxSdk, String manifest, String qualifiers, String packageName, String abiSplit, String resourceDir, String assetDir, String buildDir, Class<?>[] shadows, String[] instrumentedPackages, Class<? extends Application> application, String[] libraries, Class<?> constants) { 2378c45d4a57fa380436885166f8e89b3e20d20290cErich Douglass this.sdk = sdk; 238bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.minSdk = minSdk; 239bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.maxSdk = maxSdk; 24029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams this.manifest = manifest; 24129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams this.qualifiers = qualifiers; 242bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass this.packageName = packageName; 2433c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai this.abiSplit = abiSplit; 2445277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John this.resourceDir = resourceDir; 2456b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass this.assetDir = assetDir; 246ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny this.buildDir = buildDir; 24729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams this.shadows = shadows; 248d6cef1bcc644c7152d0716b8d33eb25054894836David Sun this.instrumentedPackages = instrumentedPackages; 2499cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish this.application = application; 250ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson this.libraries = libraries; 2510bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass this.constants = constants; 25229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 253f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 25428950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom public Implementation(Config other) { 2558c45d4a57fa380436885166f8e89b3e20d20290cErich Douglass this.sdk = other.sdk(); 256bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.minSdk = other.minSdk(); 257bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.maxSdk = other.maxSdk(); 25828950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.manifest = other.manifest(); 25928950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.qualifiers = other.qualifiers(); 260bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass this.packageName = other.packageName(); 2613c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai this.abiSplit = other.abiSplit(); 26228950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.resourceDir = other.resourceDir(); 26328950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.assetDir = other.assetDir(); 264ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny this.buildDir = other.buildDir(); 26528950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.constants = other.constants(); 26628950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.shadows = other.shadows(); 267d6cef1bcc644c7152d0716b8d33eb25054894836David Sun this.instrumentedPackages = other.instrumentedPackages(); 26828950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.application = other.application(); 26928950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom this.libraries = other.libraries(); 27028950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom } 27128950f540f7c7bf50fbfb8d9bc8cbf7c2d14e1faAlexander Blom 27229a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams public Implementation(Config baseConfig, Config overlayConfig) { 27381a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish this.sdk = pickSdk(baseConfig.sdk(), overlayConfig.sdk(), new int[0]); 274bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.minSdk = pick(baseConfig.minSdk(), overlayConfig.minSdk(), -1); 275bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.maxSdk = pick(baseConfig.maxSdk(), overlayConfig.maxSdk(), -1); 276b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar this.manifest = pick(baseConfig.manifest(), overlayConfig.manifest(), DEFAULT_MANIFEST); 27729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams this.qualifiers = pick(baseConfig.qualifiers(), overlayConfig.qualifiers(), ""); 278bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass this.packageName = pick(baseConfig.packageName(), overlayConfig.packageName(), ""); 2793c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai this.abiSplit = pick(baseConfig.abiSplit(), overlayConfig.abiSplit(), ""); 2806b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass this.resourceDir = pick(baseConfig.resourceDir(), overlayConfig.resourceDir(), Config.DEFAULT_RES_FOLDER); 2816b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass this.assetDir = pick(baseConfig.assetDir(), overlayConfig.assetDir(), Config.DEFAULT_ASSET_FOLDER); 282ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny this.buildDir = pick(baseConfig.buildDir(), overlayConfig.buildDir(), Config.DEFAULT_BUILD_FOLDER); 283b3c13990ef697c1f25635529ff485760cb5cf644Jen Mendez this.constants = pick(baseConfig.constants(), overlayConfig.constants(), Void.class); 284ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson 2850bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass Set<Class<?>> shadows = new HashSet<>(); 28629a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams shadows.addAll(Arrays.asList(baseConfig.shadows())); 28729a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams shadows.addAll(Arrays.asList(overlayConfig.shadows())); 28829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams this.shadows = shadows.toArray(new Class[shadows.size()]); 289ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson 290d6cef1bcc644c7152d0716b8d33eb25054894836David Sun Set<String> instrumentedPackages = new HashSet<>(); 291d6cef1bcc644c7152d0716b8d33eb25054894836David Sun instrumentedPackages.addAll(Arrays.asList(baseConfig.instrumentedPackages())); 292d6cef1bcc644c7152d0716b8d33eb25054894836David Sun instrumentedPackages.addAll(Arrays.asList(overlayConfig.instrumentedPackages())); 293d6cef1bcc644c7152d0716b8d33eb25054894836David Sun this.instrumentedPackages = instrumentedPackages.toArray(new String[instrumentedPackages.size()]); 294b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar 2953af772e6f01a3da6c2eff85c100a30cc2ea33909Ibraheem Zaman this.application = pick(baseConfig.application(), overlayConfig.application(), Application.class); 296ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson 2970bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass Set<String> libraries = new HashSet<>(); 298ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson libraries.addAll(Arrays.asList(baseConfig.libraries())); 299ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson libraries.addAll(Arrays.asList(overlayConfig.libraries())); 300ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson this.libraries = libraries.toArray(new String[libraries.size()]); 30129a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 302f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 30329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams private <T> T pick(T baseValue, T overlayValue, T nullValue) { 3040bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass return overlayValue != null ? (overlayValue.equals(nullValue) ? baseValue : overlayValue) : null; 30529a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 306f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 30781a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish private int[] pickSdk(int[] baseValue, int[] overlayValue, int[] nullValue) { 30881a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish return Arrays.equals(overlayValue, nullValue) ? baseValue : overlayValue; 30981a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish } 31081a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish 3116b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @Override 31281a928816f4cf068ff3fe636df2a25db269c73c8Jonathan Gerrish public int[] sdk() { 3138c45d4a57fa380436885166f8e89b3e20d20290cErich Douglass return sdk; 31429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 315f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 3166b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @Override 317bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish public int minSdk() { 318bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish return minSdk; 319bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish } 320bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish 321bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish @Override 322bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish public int maxSdk() { 323bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish return maxSdk; 324bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish } 325bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish 326bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish @Override 3276b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass public String manifest() { 32829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams return manifest; 32929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 33048f95f3e0955035946f7c416dec56219a9b19886Christian Williams 3319cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish @Override 3320bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass public Class<?> constants() { 3330bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass return constants; 3340bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass } 3350bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass 3360bbbacc2633146b2725cce97c24dc121ffa0e89bErich Douglass @Override 3379cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish public Class<? extends Application> application() { 3389cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish return application; 3399cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish } 3409cc9bde8928b83e5de9cd1c521e157e1a584b2fdJonathan Gerrish 3416b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @Override 3426b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass public String qualifiers() { 34329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams return qualifiers; 34429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 345f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 3465277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John @Override 347bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass public String packageName() { 348bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass return packageName; 349bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass } 350bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass 351bbdc3ce45195e6896254a2c7aa24370f2c55d57cErich Douglass @Override 3523c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai public String abiSplit() { 3533c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai return abiSplit; 3543c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai } 3553c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai 3563c6572b8953e3d636cdf4d8d26583873b2dd1f25Hilal Alsibai @Override 3575277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John public String resourceDir() { 3585277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John return resourceDir; 3595277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John } 3605277f871bca2be31c657ace35ae305285b2e0c55Ryan Spore and Trevor John 3616b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @Override 3626b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass public String assetDir() { 3636b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass return assetDir; 3646b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass } 3656b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass 3666b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @Override 367ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny public String buildDir() { 368ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny return buildDir; 369ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny } 370ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny 371ed249b15fa2ff94708d5f079f94284356a96c2a4Sean Kenny @Override 3726b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass public Class<?>[] shadows() { 37329a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams return shadows; 37429a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 375f6df8a55ac378dee35324bc865fb4d741dcb4824Christian Williams 3766b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @Override 377d6cef1bcc644c7152d0716b8d33eb25054894836David Sun public String[] instrumentedPackages() { 378d6cef1bcc644c7152d0716b8d33eb25054894836David Sun return instrumentedPackages; 379d6cef1bcc644c7152d0716b8d33eb25054894836David Sun } 380b4c08d70a2f549cf344c81bb20c824d3cc31c298Vijay Nayar 381d6cef1bcc644c7152d0716b8d33eb25054894836David Sun @Override 3826b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass public String[] libraries() { 383ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson return libraries; 384ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson } 385ed898f2b5b7312af4779636638d081aa6ebd9e13Andrew Richardson 3866b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass @NotNull @Override 3876b00d4156e2e6bb2d262458a2650a109ddc76c76Erich Douglass public Class<? extends Annotation> annotationType() { 38829a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams return Config.class; 38929a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 39029a8359eaef1ee9f40c967d3c4b5c1117c8c2a43Christian Williams } 39155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 39255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams class Builder { 39355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private int[] sdk = new int[0]; 394bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish private int minSdk = -1; 395bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish private int maxSdk = -1; 39655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String manifest = Config.DEFAULT_MANIFEST; 39755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String qualifiers = Config.DEFAULT_QUALIFIERS; 39855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String packageName = Config.DEFAULT_PACKAGE_NAME; 39955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String abiSplit = Config.DEFAULT_ABI_SPLIT; 40055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String resourceDir = Config.DEFAULT_RES_FOLDER; 40155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String assetDir = Config.DEFAULT_ASSET_FOLDER; 40255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String buildDir = Config.DEFAULT_BUILD_FOLDER; 40355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private Class<?>[] shadows = new Class[0]; 40455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String[] instrumentedPackages = new String[0]; 40555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private Class<? extends Application> application = Application.class; // todo: make a private default dummy 40655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private String[] libraries = new String[0]; 40755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams private Class<?> constants = Void.class; 40855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 40955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setSdk(int[] sdk) { 41055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.sdk = sdk; 41155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 41255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 41355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 414bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish public Builder setMinSdk(int minSdk) { 415bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.minSdk = minSdk; 416bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish return this; 417bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish } 418bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish 419bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish public Builder setMaxSdk(int maxSdk) { 420bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish this.maxSdk = maxSdk; 421bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish return this; 422bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish } 423bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish 42455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setManifest(String manifest) { 42555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.manifest = manifest; 42655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 42755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 42855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 42955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setQualifiers(String qualifiers) { 43055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.qualifiers = qualifiers; 43155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 43255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 43355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 43455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setPackageName(String packageName) { 43555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.packageName = packageName; 43655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 43755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 43855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 43955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setAbiSplit(String abiSplit) { 44055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.abiSplit = abiSplit; 44155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 44255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 44355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 44455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setResourceDir(String resourceDir) { 44555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.resourceDir = resourceDir; 44655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 44755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 44855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 44955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setAssetDir(String assetDir) { 45055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.assetDir = assetDir; 45155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 45255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 45355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 45455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setBuildDir(String buildDir) { 45555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.buildDir = buildDir; 45655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 45755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 45855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 45955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setShadows(Class<?>[] shadows) { 46055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.shadows = shadows; 46155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 46255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 46355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 46455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setInstrumentedPackages(String[] instrumentedPackages) { 46555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.instrumentedPackages = instrumentedPackages; 46655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 46755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 46855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 46955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setApplication(Class<? extends Application> application) { 47055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.application = application; 47155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 47255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 47355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 47455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setLibraries(String[] libraries) { 47555b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.libraries = libraries; 47655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 47755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 47855b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 47955b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Builder setConstants(Class<?> constants) { 48055b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams this.constants = constants; 48155b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams return this; 48255b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 48355b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams 48455b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams public Implementation build() { 485bf73dde49765ed8f3556ef0b2ce63a0cb44703fbJonathan Gerrish return new Implementation(sdk, minSdk, maxSdk, manifest, qualifiers, packageName, abiSplit, resourceDir, assetDir, buildDir, shadows, instrumentedPackages, application, libraries, constants); 48655b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 48755b52578fdaca7097ea4b28b3daebac84094dab4Christian Williams } 488dd40f718cf785a56e63c0685feeb73d266c13e3fWenhui Yao} 489