├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── android ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── fr │ └── bamlab │ └── rnimageresizer │ ├── ImageResizer.java │ ├── ImageResizerModule.java │ └── ImageResizerPackage.java ├── examples └── ColorPicker │ ├── .babelrc │ ├── .buckconfig │ ├── .flowconfig │ ├── .gitattributes │ ├── .gitignore │ ├── .npmrc │ ├── .watchmanconfig │ ├── __tests__ │ ├── index.android.js │ └── index.ios.js │ ├── android │ ├── app │ │ ├── BUCK │ │ ├── build.gradle │ │ ├── proguard-rules.pro │ │ └── src │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── colorpicker │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── res │ │ │ ├── mipmap-hdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-mdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xhdpi │ │ │ └── ic_launcher.png │ │ │ ├── mipmap-xxhdpi │ │ │ └── ic_launcher.png │ │ │ └── values │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ ├── keystores │ │ ├── BUCK │ │ └── debug.keystore.properties │ └── settings.gradle │ ├── index.android.js │ ├── index.ios.js │ ├── ios │ ├── ColorPicker.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── ColorPicker.xcscheme │ ├── ColorPicker │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── Base.lproj │ │ │ └── LaunchScreen.xib │ │ ├── Images.xcassets │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── Info.plist │ │ └── main.m │ └── ColorPickerTests │ │ ├── ColorPickerTests.m │ │ └── Info.plist │ ├── package.json │ └── yarn.lock ├── index.js ├── ios ├── RNPixelColor.xcodeproj │ └── project.pbxproj ├── RNPixelColor │ ├── RNPixelColor.h │ └── RNPixelColor.m └── UIImage+ColorAtPixel │ ├── UIImage+ColorAtPixel.h │ └── UIImage+ColorAtPixel.m ├── package.json └── react-native-pixel-color.podspec /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | workbench 3 | *.log 4 | # Xcode 5 | .DS_Store 6 | build/ 7 | *.pbxuser 8 | !default.pbxuser 9 | *.mode1v3 10 | !default.mode1v3 11 | *.mode2v3 12 | !default.mode2v3 13 | *.perspectivev3 14 | !default.perspectivev3 15 | *.xcworkspace 16 | !default.xcworkspace 17 | xcuserdata 18 | profile 19 | *.moved-aside 20 | DerivedData 21 | .idea/ 22 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | example 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2018 Chris LeBlanc 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # React Native Pixel Color 2 | 3 | Returns the pixel color from a graphic at a given coordinate. 4 | 5 | ## Setup 6 | 7 | Install the package: 8 | 9 | React-Native 0.29.2+ 10 | 11 | ``` 12 | npm install --save react-native-pixel-color 13 | react-native link react-native-pixel-color 14 | ``` 15 | 16 | React-Native < 0.29.2 17 | ``` 18 | npm install rnpm -g 19 | rnpm install react-native-pixel-color 20 | ``` 21 | 22 | ### Android 23 | 24 | Note: on latest versions of React Native, you may have an error during the Gradle build on Android (`com.android.dex.DexException: Multiple dex files define Landroid/support/v7/appcompat/R$anim`). Run `cd android && ./gradlew clean` to fix this. 25 | 26 | ## Usage example 27 | 28 | ```javascript 29 | import PixelColor from 'react-native-pixel-color'; 30 | 31 | PixelColor.getHex(imageUriOrData, { x, y }).then((color) => { 32 | // #000000 33 | }).catch((err) => { 34 | // Oops, something went wrong. Check that the filename is correct and 35 | // inspect err to get more details. 36 | }); 37 | ``` 38 | 39 | ### Sample app 40 | 41 | Examples are found in the [the `examples` folder](https://github.com/bamlab/react-native-pixel-color/tree/master/examples). 42 | 43 | ## API 44 | 45 | ### `promise getHex(path, options)` 46 | 47 | The promise resolves with a string containing the uri of the new file. 48 | 49 | Option | Description 50 | ------ | ----------- 51 | path | Path of image file, or a base64 encoded image string prefixed with 'data:image/imagetype' where `imagetype` is jpeg or png. 52 | options | { x: int, y: int } 53 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.library' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.1" 6 | 7 | defaultConfig { 8 | minSdkVersion 16 9 | targetSdkVersion 23 10 | versionCode 1 11 | versionName "1.0" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | } 17 | } 18 | } 19 | 20 | dependencies { 21 | compile 'com.facebook.react:react-native:+' 22 | } 23 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | -------------------------------------------------------------------------------- /android/src/main/java/fr/bamlab/rnimageresizer/ImageResizer.java: -------------------------------------------------------------------------------- 1 | package fr.bamlab.rnimageresizer; 2 | 3 | import android.content.Context; 4 | import android.content.ContentResolver; 5 | import android.database.Cursor; 6 | import android.graphics.Bitmap; 7 | import android.graphics.BitmapFactory; 8 | import android.graphics.BitmapRegionDecoder; 9 | import android.graphics.Matrix; 10 | import android.media.ExifInterface; 11 | import android.net.Uri; 12 | import android.provider.MediaStore; 13 | import android.support.annotation.NonNull; 14 | import android.support.annotation.Nullable; 15 | import android.util.Base64; 16 | import android.util.Pair; 17 | 18 | import java.io.Closeable; 19 | import java.io.ByteArrayOutputStream; 20 | import java.io.File; 21 | import java.io.FileOutputStream; 22 | import java.io.FileNotFoundException; 23 | import java.io.InputStream; 24 | import java.io.IOException; 25 | import java.util.Date; 26 | 27 | /** 28 | * Provide methods to resize and rotate an image file. 29 | */ 30 | class ImageResizer { 31 | 32 | private final static String BASE64_PREFIX = "data:image/"; 33 | 34 | /** 35 | * Resize the specified bitmap, keeping its aspect ratio. 36 | */ 37 | private static Bitmap resizeImage(Bitmap image, int maxWidth, int maxHeight) { 38 | Bitmap newImage = null; 39 | if (image == null) { 40 | return null; // Can't load the image from the given path. 41 | } 42 | 43 | if (maxHeight > 0 && maxWidth > 0) { 44 | float width = image.getWidth(); 45 | float height = image.getHeight(); 46 | 47 | float ratio = Math.min((float)maxWidth / width, (float)maxHeight / height); 48 | 49 | int finalWidth = (int) (width * ratio); 50 | int finalHeight = (int) (height * ratio); 51 | newImage = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true); 52 | } 53 | 54 | return newImage; 55 | } 56 | 57 | /** 58 | * Rotate the specified bitmap with the given angle, in degrees. 59 | */ 60 | public static Bitmap rotateImage(Bitmap source, float angle) 61 | { 62 | Bitmap retVal; 63 | 64 | Matrix matrix = new Matrix(); 65 | matrix.postRotate(angle); 66 | retVal = Bitmap.createBitmap(source, 0, 0, source.getWidth(), source.getHeight(), matrix, true); 67 | return retVal; 68 | } 69 | 70 | /** 71 | * Save the given bitmap in a directory. Extension is automatically generated using the bitmap format. 72 | */ 73 | private static String saveImage(Bitmap bitmap, File saveDirectory, String fileName, 74 | Bitmap.CompressFormat compressFormat, int quality) 75 | throws IOException { 76 | if (bitmap == null) { 77 | throw new IOException("The bitmap couldn't be resized"); 78 | } 79 | 80 | File newFile = new File(saveDirectory, fileName + "." + compressFormat.name()); 81 | if(!newFile.createNewFile()) { 82 | throw new IOException("The file already exists"); 83 | } 84 | 85 | ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 86 | bitmap.compress(compressFormat, quality, outputStream); 87 | byte[] bitmapData = outputStream.toByteArray(); 88 | 89 | outputStream.flush(); 90 | outputStream.close(); 91 | 92 | FileOutputStream fos = new FileOutputStream(newFile); 93 | fos.write(bitmapData); 94 | fos.flush(); 95 | fos.close(); 96 | 97 | return newFile.getAbsolutePath(); 98 | } 99 | 100 | /** 101 | * Get {@link File} object for the given Android URI.
102 | * Use content resolver to get real path if direct path doesn't return valid file. 103 | */ 104 | private static File getFileFromUri(Context context, Uri uri) { 105 | 106 | // first try by direct path 107 | File file = new File(uri.getPath()); 108 | if (file.exists()) { 109 | return file; 110 | } 111 | 112 | // try reading real path from content resolver (gallery images) 113 | Cursor cursor = null; 114 | try { 115 | String[] proj = {MediaStore.Images.Media.DATA}; 116 | cursor = context.getContentResolver().query(uri, proj, null, null, null); 117 | int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); 118 | cursor.moveToFirst(); 119 | String realPath = cursor.getString(column_index); 120 | file = new File(realPath); 121 | } catch (Exception ignored) { 122 | } finally { 123 | if (cursor != null) { 124 | cursor.close(); 125 | } 126 | } 127 | 128 | return file; 129 | } 130 | 131 | 132 | /** 133 | * Get orientation by reading Image metadata 134 | */ 135 | public static int getOrientation(Context context, Uri uri) { 136 | try { 137 | File file = getFileFromUri(context, uri); 138 | if (file.exists()) { 139 | ExifInterface ei = new ExifInterface(file.getAbsolutePath()); 140 | return getOrientation(ei); 141 | } 142 | } catch (Exception ignored) { } 143 | 144 | return 0; 145 | } 146 | 147 | /** 148 | * Convert metadata to degrees 149 | */ 150 | public static int getOrientation(ExifInterface exif) { 151 | int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); 152 | switch (orientation) { 153 | case ExifInterface.ORIENTATION_ROTATE_90: 154 | return 90; 155 | case ExifInterface.ORIENTATION_ROTATE_180: 156 | return 180; 157 | case ExifInterface.ORIENTATION_ROTATE_270: 158 | return 270; 159 | default: 160 | return 0; 161 | } 162 | } 163 | 164 | /** 165 | * Compute the inSampleSize value to use to load a bitmap. 166 | * Adapted from https://developer.android.com/training/displaying-bitmaps/load-bitmap.html 167 | */ 168 | private static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) { 169 | final int height = options.outHeight; 170 | final int width = options.outWidth; 171 | 172 | int inSampleSize = 1; 173 | 174 | if (height > reqHeight || width > reqWidth) { 175 | final int halfHeight = height / 2; 176 | final int halfWidth = width / 2; 177 | 178 | // Calculate the largest inSampleSize value that is a power of 2 and keeps both 179 | // height and width larger than the requested height and width. 180 | while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { 181 | inSampleSize *= 2; 182 | } 183 | } 184 | 185 | return inSampleSize; 186 | } 187 | 188 | /** 189 | * Load a bitmap either from a real file or using the {@link ContentResolver} of the current 190 | * {@link Context} (to read gallery images for example). 191 | */ 192 | private static Bitmap loadBitmap(Context context, String imagePath, BitmapFactory.Options options) throws IOException { 193 | Bitmap sourceImage = null; 194 | if (!imagePath.startsWith("content://") && !imagePath.startsWith("file://")) { 195 | sourceImage = BitmapFactory.decodeFile(imagePath, options); 196 | } else { 197 | ContentResolver cr = context.getContentResolver(); 198 | InputStream input = cr.openInputStream(Uri.parse(imagePath)); 199 | if (input != null) { 200 | sourceImage = BitmapFactory.decodeStream(input, null, options); 201 | input.close(); 202 | } 203 | } 204 | return sourceImage; 205 | } 206 | 207 | /** 208 | * Loads the bitmap resource from the file specified in imagePath. 209 | */ 210 | private static Bitmap loadBitmapFromFile(Context context, String imagePath, int newWidth, 211 | int newHeight) throws IOException { 212 | // Decode the image bounds to find the size of the source image. 213 | BitmapFactory.Options options = new BitmapFactory.Options(); 214 | options.inJustDecodeBounds = true; 215 | loadBitmap(context, imagePath, options); 216 | 217 | // Set a sample size according to the image size to lower memory usage. 218 | options.inSampleSize = calculateInSampleSize(options, newWidth, newHeight); 219 | options.inJustDecodeBounds = false; 220 | System.out.println(options.inSampleSize); 221 | return loadBitmap(context, imagePath, options); 222 | 223 | } 224 | 225 | /** 226 | * Loads the bitmap resource from a base64 encoded jpg or png. 227 | * Format is as such: 228 | * png: 'data:image/png;base64,iVBORw0KGgoAA...' 229 | * jpg: 'data:image/jpeg;base64,/9j/4AAQSkZJ...' 230 | */ 231 | private static Bitmap loadBitmapFromBase64(String imagePath) { 232 | Bitmap sourceImage = null; 233 | 234 | // base64 image. Convert to a bitmap. 235 | final int prefixLen = BASE64_PREFIX.length(); 236 | final boolean isJpeg = (imagePath.indexOf("jpeg") == prefixLen); 237 | final boolean isPng = (!isJpeg) && (imagePath.indexOf("png") == prefixLen); 238 | int commaLocation = -1; 239 | if (isJpeg || isPng){ 240 | commaLocation = imagePath.indexOf(','); 241 | } 242 | if (commaLocation > 0) { 243 | final String encodedImage = imagePath.substring(commaLocation+1); 244 | final byte[] decodedString = Base64.decode(encodedImage, Base64.DEFAULT); 245 | sourceImage = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 246 | } 247 | 248 | return sourceImage; 249 | } 250 | 251 | /** 252 | * Create a resized version of the given image. 253 | */ 254 | public static String createResizedImage(Context context, String imagePath, int newWidth, 255 | int newHeight, Bitmap.CompressFormat compressFormat, 256 | int quality, int rotation, String outputPath) throws IOException { 257 | Bitmap sourceImage = null; 258 | 259 | // If the BASE64_PREFIX is absent, load bitmap from a file. Otherwise, load from base64. 260 | if (imagePath.indexOf(BASE64_PREFIX) < 0) { 261 | sourceImage = ImageResizer.loadBitmapFromFile(context, imagePath, newWidth, newHeight); 262 | } 263 | else { 264 | sourceImage = ImageResizer.loadBitmapFromBase64(imagePath); 265 | } 266 | 267 | if (sourceImage == null){ 268 | return ""; 269 | } 270 | 271 | // Scale it first so there are fewer pixels to transform in the rotation 272 | Bitmap scaledImage = ImageResizer.resizeImage(sourceImage, newWidth, newHeight); 273 | if (sourceImage != scaledImage) { 274 | sourceImage.recycle(); 275 | } 276 | 277 | // Rotate if necessary 278 | Bitmap rotatedImage = scaledImage; 279 | int orientation = getOrientation(context, Uri.parse(imagePath)); 280 | rotation = orientation + rotation; 281 | rotatedImage = ImageResizer.rotateImage(scaledImage, rotation); 282 | 283 | if (scaledImage != rotatedImage) { 284 | scaledImage.recycle(); 285 | } 286 | 287 | // Save the resulting image 288 | File path = context.getCacheDir(); 289 | if (outputPath != null) { 290 | path = new File(outputPath); 291 | } 292 | 293 | String resizedImagePath = ImageResizer.saveImage(rotatedImage, path, 294 | Long.toString(new Date().getTime()), compressFormat, quality); 295 | 296 | // Clean up remaining image 297 | rotatedImage.recycle(); 298 | 299 | return resizedImagePath; 300 | } 301 | } 302 | -------------------------------------------------------------------------------- /android/src/main/java/fr/bamlab/rnimageresizer/ImageResizerModule.java: -------------------------------------------------------------------------------- 1 | package fr.bamlab.rnimageresizer; 2 | 3 | import android.content.Context; 4 | import android.graphics.Bitmap; 5 | 6 | import com.facebook.react.bridge.Callback; 7 | import com.facebook.react.bridge.ReactApplicationContext; 8 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 9 | import com.facebook.react.bridge.ReactMethod; 10 | 11 | import java.io.IOException; 12 | 13 | /** 14 | * Created by almouro on 19/11/15. 15 | */ 16 | class ImageResizerModule extends ReactContextBaseJavaModule { 17 | private Context context; 18 | 19 | public ImageResizerModule(ReactApplicationContext reactContext) { 20 | super(reactContext); 21 | this.context = reactContext; 22 | } 23 | 24 | /** 25 | * @return the name of this module. This will be the name used to {@code require()} this module 26 | * from javascript. 27 | */ 28 | @Override 29 | public String getName() { 30 | return "ImageResizerAndroid"; 31 | } 32 | 33 | @ReactMethod 34 | public void createResizedImage(String imagePath, int newWidth, int newHeight, String compressFormat, 35 | int quality, int rotation, String outputPath, final Callback successCb, final Callback failureCb) { 36 | try { 37 | createResizedImageWithExceptions(imagePath, newWidth, newHeight, compressFormat, quality, 38 | rotation, outputPath, successCb, failureCb); 39 | } catch (IOException e) { 40 | failureCb.invoke(e.getMessage()); 41 | } 42 | } 43 | 44 | private void createResizedImageWithExceptions(String imagePath, int newWidth, int newHeight, 45 | String compressFormatString, int quality, int rotation, String outputPath, 46 | final Callback successCb, final Callback failureCb) throws IOException { 47 | Bitmap.CompressFormat compressFormat = Bitmap.CompressFormat.valueOf(compressFormatString); 48 | if (imagePath.indexOf("data:image/") < 0) { 49 | imagePath = imagePath.replace("file:", ""); 50 | } 51 | 52 | String resizedImagePath = ImageResizer.createResizedImage(this.context, imagePath, newWidth, 53 | newHeight, compressFormat, quality, rotation, outputPath); 54 | 55 | successCb.invoke("file:" + resizedImagePath); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /android/src/main/java/fr/bamlab/rnimageresizer/ImageResizerPackage.java: -------------------------------------------------------------------------------- 1 | package fr.bamlab.rnimageresizer; 2 | 3 | import com.facebook.react.ReactPackage; 4 | import com.facebook.react.bridge.JavaScriptModule; 5 | import com.facebook.react.bridge.NativeModule; 6 | import com.facebook.react.bridge.ReactApplicationContext; 7 | import com.facebook.react.uimanager.ViewManager; 8 | 9 | import java.util.ArrayList; 10 | import java.util.Collections; 11 | import java.util.List; 12 | 13 | /** 14 | * Created by almouro on 19/11/15. 15 | */ 16 | public class ImageResizerPackage implements ReactPackage { 17 | /** 18 | * @param reactContext react application context that can be used to create modules 19 | * @return list of native modules to register with the newly created catalyst instance 20 | */ 21 | @Override 22 | public List createNativeModules(ReactApplicationContext reactContext) { 23 | List modules = new ArrayList<>(); 24 | modules.add(new ImageResizerModule(reactContext)); 25 | 26 | return modules; 27 | } 28 | 29 | /** 30 | * @return list of JS modules to register with the newly created catalyst instance. 31 | *

32 | * IMPORTANT: Note that only modules that needs to be accessible from the native code should be 33 | * listed here. Also listing a native module here doesn't imply that the JS implementation of it 34 | * will be automatically included in the JS bundle. 35 | */ 36 | // Deprecated @Override for react-native >= 0.47 37 | public List> createJSModules() { 38 | return Collections.emptyList(); 39 | } 40 | 41 | /** 42 | * @param reactContext 43 | * @return a list of view managers that should be registered with {@link UIManagerModule} 44 | */ 45 | @Override 46 | public List createViewManagers(ReactApplicationContext reactContext) { 47 | return Collections.emptyList(); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /examples/ColorPicker/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["react-native"] 3 | } -------------------------------------------------------------------------------- /examples/ColorPicker/.buckconfig: -------------------------------------------------------------------------------- 1 | 2 | [android] 3 | target = Google Inc.:Google APIs:23 4 | 5 | [maven_repositories] 6 | central = https://repo1.maven.org/maven2 7 | -------------------------------------------------------------------------------- /examples/ColorPicker/.flowconfig: -------------------------------------------------------------------------------- 1 | [ignore] 2 | ; We fork some components by platform 3 | .*/*[.]android.js 4 | 5 | ; Ignore "BUCK" generated dirs 6 | /\.buckd/ 7 | 8 | ; Ignore unexpected extra "@providesModule" 9 | .*/node_modules/.*/node_modules/fbjs/.* 10 | 11 | ; Ignore duplicate module providers 12 | ; For RN Apps installed via npm, "Libraries" folder is inside 13 | ; "node_modules/react-native" but in the source repo it is in the root 14 | .*/Libraries/react-native/React.js 15 | .*/Libraries/react-native/ReactNative.js 16 | 17 | [include] 18 | 19 | [libs] 20 | node_modules/react-native/Libraries/react-native/react-native-interface.js 21 | node_modules/react-native/flow 22 | flow/ 23 | 24 | [options] 25 | module.system=haste 26 | 27 | experimental.strict_type_args=true 28 | 29 | munge_underscores=true 30 | 31 | module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' 32 | module.name_mapper='^[./a-zA-Z0-9$_-]+\.\(bmp\|gif\|jpg\|jpeg\|png\|psd\|svg\|webp\|m4v\|mov\|mp4\|mpeg\|mpg\|webm\|aac\|aiff\|caf\|m4a\|mp3\|wav\|html\|pdf\)$' -> 'RelativeImageStub' 33 | 34 | suppress_type=$FlowIssue 35 | suppress_type=$FlowFixMe 36 | suppress_type=$FixMe 37 | 38 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(3[0-5]\\|[1-2][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) 39 | suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(3[0-5]\\|1[0-9]\\|[1-2][0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ 40 | suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy 41 | 42 | unsafe.enable_getters_and_setters=true 43 | 44 | [version] 45 | ^0.35.0 46 | -------------------------------------------------------------------------------- /examples/ColorPicker/.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | -------------------------------------------------------------------------------- /examples/ColorPicker/.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # Xcode 6 | # 7 | build/ 8 | *.pbxuser 9 | !default.pbxuser 10 | *.mode1v3 11 | !default.mode1v3 12 | *.mode2v3 13 | !default.mode2v3 14 | *.perspectivev3 15 | !default.perspectivev3 16 | xcuserdata 17 | *.xccheckout 18 | *.moved-aside 19 | DerivedData 20 | *.hmap 21 | *.ipa 22 | *.xcuserstate 23 | project.xcworkspace 24 | 25 | # Android/IntelliJ 26 | # 27 | build/ 28 | .idea 29 | .gradle 30 | local.properties 31 | *.iml 32 | 33 | # node.js 34 | # 35 | node_modules/ 36 | npm-debug.log 37 | 38 | # BUCK 39 | buck-out/ 40 | \.buckd/ 41 | android/app/libs 42 | *.keystore 43 | package-lock.json 44 | -------------------------------------------------------------------------------- /examples/ColorPicker/.npmrc: -------------------------------------------------------------------------------- 1 | package-lock=false 2 | -------------------------------------------------------------------------------- /examples/ColorPicker/.watchmanconfig: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /examples/ColorPicker/__tests__/index.android.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.android.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /examples/ColorPicker/__tests__/index.ios.js: -------------------------------------------------------------------------------- 1 | import 'react-native'; 2 | import React from 'react'; 3 | import Index from '../index.ios.js'; 4 | 5 | // Note: test renderer must be required after react-native. 6 | import renderer from 'react-test-renderer'; 7 | 8 | it('renders correctly', () => { 9 | const tree = renderer.create( 10 | 11 | ); 12 | }); 13 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/BUCK: -------------------------------------------------------------------------------- 1 | import re 2 | 3 | # To learn about Buck see [Docs](https://buckbuild.com/). 4 | # To run your application with Buck: 5 | # - install Buck 6 | # - `npm start` - to start the packager 7 | # - `cd android` 8 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"` 9 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck 10 | # - `buck install -r android/app` - compile, install and run application 11 | # 12 | 13 | lib_deps = [] 14 | for jarfile in glob(['libs/*.jar']): 15 | name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile) 16 | lib_deps.append(':' + name) 17 | prebuilt_jar( 18 | name = name, 19 | binary_jar = jarfile, 20 | ) 21 | 22 | for aarfile in glob(['libs/*.aar']): 23 | name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile) 24 | lib_deps.append(':' + name) 25 | android_prebuilt_aar( 26 | name = name, 27 | aar = aarfile, 28 | ) 29 | 30 | android_library( 31 | name = 'all-libs', 32 | exported_deps = lib_deps 33 | ) 34 | 35 | android_library( 36 | name = 'app-code', 37 | srcs = glob([ 38 | 'src/main/java/**/*.java', 39 | ]), 40 | deps = [ 41 | ':all-libs', 42 | ':build_config', 43 | ':res', 44 | ], 45 | ) 46 | 47 | android_build_config( 48 | name = 'build_config', 49 | package = 'com.colorpicker', 50 | ) 51 | 52 | android_resource( 53 | name = 'res', 54 | res = 'src/main/res', 55 | package = 'com.colorpicker', 56 | ) 57 | 58 | android_binary( 59 | name = 'app', 60 | package_type = 'debug', 61 | manifest = 'src/main/AndroidManifest.xml', 62 | keystore = '//android/keystores:debug', 63 | deps = [ 64 | ':app-code', 65 | ], 66 | ) 67 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation 19 | * entryFile: "index.android.js", 20 | * 21 | * // whether to bundle JS and assets in debug mode 22 | * bundleInDebug: false, 23 | * 24 | * // whether to bundle JS and assets in release mode 25 | * bundleInRelease: true, 26 | * 27 | * // whether to bundle JS and assets in another build variant (if configured). 28 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 29 | * // The configuration property can be in the following formats 30 | * // 'bundleIn${productFlavor}${buildType}' 31 | * // 'bundleIn${buildType}' 32 | * // bundleInFreeDebug: true, 33 | * // bundleInPaidRelease: true, 34 | * // bundleInBeta: true, 35 | * 36 | * // the root of your project, i.e. where "package.json" lives 37 | * root: "../../", 38 | * 39 | * // where to put the JS bundle asset in debug mode 40 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 41 | * 42 | * // where to put the JS bundle asset in release mode 43 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 44 | * 45 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 46 | * // require('./image.png')), in debug mode 47 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 48 | * 49 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 50 | * // require('./image.png')), in release mode 51 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 52 | * 53 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 54 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 55 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 56 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 57 | * // for example, you might want to remove it from here. 58 | * inputExcludes: ["android/**", "ios/**"], 59 | * 60 | * // override which node gets called and with what additional arguments 61 | * nodeExecutableAndArgs: ["node"] 62 | * 63 | * // supply additional arguments to the packager 64 | * extraPackagerArgs: [] 65 | * ] 66 | */ 67 | 68 | apply from: "../../node_modules/react-native/react.gradle" 69 | 70 | /** 71 | * Set this to true to create two separate APKs instead of one: 72 | * - An APK that only works on ARM devices 73 | * - An APK that only works on x86 devices 74 | * The advantage is the size of the APK is reduced by about 4MB. 75 | * Upload all the APKs to the Play Store and people will download 76 | * the correct one based on the CPU architecture of their device. 77 | */ 78 | def enableSeparateBuildPerCPUArchitecture = false 79 | 80 | /** 81 | * Run Proguard to shrink the Java bytecode in release builds. 82 | */ 83 | def enableProguardInReleaseBuilds = false 84 | 85 | android { 86 | compileSdkVersion 23 87 | buildToolsVersion "23.0.1" 88 | 89 | defaultConfig { 90 | applicationId "com.colorpicker" 91 | minSdkVersion 16 92 | targetSdkVersion 22 93 | versionCode 1 94 | versionName "1.0" 95 | ndk { 96 | abiFilters "armeabi-v7a", "x86" 97 | } 98 | } 99 | splits { 100 | abi { 101 | reset() 102 | enable enableSeparateBuildPerCPUArchitecture 103 | universalApk false // If true, also generate a universal APK 104 | include "armeabi-v7a", "x86" 105 | } 106 | } 107 | buildTypes { 108 | release { 109 | minifyEnabled enableProguardInReleaseBuilds 110 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 111 | } 112 | } 113 | // applicationVariants are e.g. debug, release 114 | applicationVariants.all { variant -> 115 | variant.outputs.each { output -> 116 | // For each separate APK per architecture, set a unique version code as described here: 117 | // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits 118 | def versionCodes = ["armeabi-v7a":1, "x86":2] 119 | def abi = output.getFilter(OutputFile.ABI) 120 | if (abi != null) { // null for the universal-debug, universal-release variants 121 | output.versionCodeOverride = 122 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 123 | } 124 | } 125 | } 126 | } 127 | 128 | dependencies { 129 | compile project(':react-native-pixel-color') 130 | compile fileTree(dir: "libs", include: ["*.jar"]) 131 | compile "com.android.support:appcompat-v7:23.0.1" 132 | compile "com.facebook.react:react-native:+" // From node_modules 133 | } 134 | 135 | // Run this once to be able to run the application with BUCK 136 | // puts all compile dependencies into folder libs for BUCK to use 137 | task copyDownloadableDepsToLibs(type: Copy) { 138 | from configurations.compile 139 | into 'libs' 140 | } 141 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | 19 | # Disabling obfuscation is useful if you collect stack traces from production crashes 20 | # (unless you are using a system that supports de-obfuscate the stack traces). 21 | -dontobfuscate 22 | 23 | # React Native 24 | 25 | # Keep our interfaces so they can be used by other ProGuard rules. 26 | # See http://sourceforge.net/p/proguard/bugs/466/ 27 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.DoNotStrip 28 | -keep,allowobfuscation @interface com.facebook.proguard.annotations.KeepGettersAndSetters 29 | -keep,allowobfuscation @interface com.facebook.common.internal.DoNotStrip 30 | 31 | # Do not strip any method/class that is annotated with @DoNotStrip 32 | -keep @com.facebook.proguard.annotations.DoNotStrip class * 33 | -keep @com.facebook.common.internal.DoNotStrip class * 34 | -keepclassmembers class * { 35 | @com.facebook.proguard.annotations.DoNotStrip *; 36 | @com.facebook.common.internal.DoNotStrip *; 37 | } 38 | 39 | -keepclassmembers @com.facebook.proguard.annotations.KeepGettersAndSetters class * { 40 | void set*(***); 41 | *** get*(); 42 | } 43 | 44 | -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } 45 | -keep class * extends com.facebook.react.bridge.NativeModule { *; } 46 | -keepclassmembers,includedescriptorclasses class * { native ; } 47 | -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } 48 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } 49 | -keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } 50 | 51 | -dontwarn com.facebook.react.** 52 | 53 | # okhttp 54 | 55 | -keepattributes Signature 56 | -keepattributes *Annotation* 57 | -keep class okhttp3.** { *; } 58 | -keep interface okhttp3.** { *; } 59 | -dontwarn okhttp3.** 60 | 61 | # okio 62 | 63 | -keep class sun.misc.Unsafe { *; } 64 | -dontwarn java.nio.file.* 65 | -dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement 66 | -dontwarn okio.** 67 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 5 | 6 | 7 | 8 | 9 | 12 | 13 | 19 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/java/com/colorpicker/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.colorpicker; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. 9 | * This is used to schedule rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "ColorPicker"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/java/com/colorpicker/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.colorpicker; 2 | 3 | import android.app.Application; 4 | import android.util.Log; 5 | 6 | import com.facebook.react.ReactApplication; 7 | import fr.bamlab.rnimageresizer.ImageResizerPackage; 8 | import com.facebook.react.ReactInstanceManager; 9 | import com.facebook.react.ReactNativeHost; 10 | import com.facebook.react.ReactPackage; 11 | import com.facebook.react.shell.MainReactPackage; 12 | import com.facebook.soloader.SoLoader; 13 | 14 | import java.util.Arrays; 15 | import java.util.List; 16 | 17 | public class MainApplication extends Application implements ReactApplication { 18 | 19 | private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { 20 | @Override 21 | protected boolean getUseDeveloperSupport() { 22 | return BuildConfig.DEBUG; 23 | } 24 | 25 | @Override 26 | protected List getPackages() { 27 | return Arrays.asList( 28 | new MainReactPackage(), 29 | new ImageResizerPackage() 30 | ); 31 | } 32 | }; 33 | 34 | @Override 35 | public ReactNativeHost getReactNativeHost() { 36 | return mReactNativeHost; 37 | } 38 | 39 | @Override 40 | public void onCreate() { 41 | super.onCreate(); 42 | SoLoader.init(this, /* native exopackage */ false); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spacesuitdiver/react-native-pixel-color/d3752a7098ca186c4b8928c8d0d55dde4f3796b7/examples/ColorPicker/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spacesuitdiver/react-native-pixel-color/d3752a7098ca186c4b8928c8d0d55dde4f3796b7/examples/ColorPicker/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spacesuitdiver/react-native-pixel-color/d3752a7098ca186c4b8928c8d0d55dde4f3796b7/examples/ColorPicker/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spacesuitdiver/react-native-pixel-color/d3752a7098ca186c4b8928c8d0d55dde4f3796b7/examples/ColorPicker/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ColorPicker 3 | 4 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | repositories { 5 | jcenter() 6 | } 7 | dependencies { 8 | classpath 'com.android.tools.build:gradle:1.3.1' 9 | 10 | // NOTE: Do not place your application dependencies here; they belong 11 | // in the individual module build.gradle files 12 | } 13 | } 14 | 15 | allprojects { 16 | repositories { 17 | mavenLocal() 18 | jcenter() 19 | maven { 20 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 21 | url "$rootDir/../node_modules/react-native/android" 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | android.useDeprecatedNdk=true 21 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/spacesuitdiver/react-native-pixel-color/d3752a7098ca186c4b8928c8d0d55dde4f3796b7/examples/ColorPicker/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /examples/ColorPicker/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | zipStoreBase=GRADLE_USER_HOME 4 | zipStorePath=wrapper/dists 5 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip 6 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | ############################################################################## 4 | ## 5 | ## Gradle start up script for UN*X 6 | ## 7 | ############################################################################## 8 | 9 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 10 | DEFAULT_JVM_OPTS="" 11 | 12 | APP_NAME="Gradle" 13 | APP_BASE_NAME=`basename "$0"` 14 | 15 | # Use the maximum available, or set MAX_FD != -1 to use that value. 16 | MAX_FD="maximum" 17 | 18 | warn ( ) { 19 | echo "$*" 20 | } 21 | 22 | die ( ) { 23 | echo 24 | echo "$*" 25 | echo 26 | exit 1 27 | } 28 | 29 | # OS specific support (must be 'true' or 'false'). 30 | cygwin=false 31 | msys=false 32 | darwin=false 33 | case "`uname`" in 34 | CYGWIN* ) 35 | cygwin=true 36 | ;; 37 | Darwin* ) 38 | darwin=true 39 | ;; 40 | MINGW* ) 41 | msys=true 42 | ;; 43 | esac 44 | 45 | # For Cygwin, ensure paths are in UNIX format before anything is touched. 46 | if $cygwin ; then 47 | [ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 48 | fi 49 | 50 | # Attempt to set APP_HOME 51 | # Resolve links: $0 may be a link 52 | PRG="$0" 53 | # Need this for relative symlinks. 54 | while [ -h "$PRG" ] ; do 55 | ls=`ls -ld "$PRG"` 56 | link=`expr "$ls" : '.*-> \(.*\)$'` 57 | if expr "$link" : '/.*' > /dev/null; then 58 | PRG="$link" 59 | else 60 | PRG=`dirname "$PRG"`"/$link" 61 | fi 62 | done 63 | SAVED="`pwd`" 64 | cd "`dirname \"$PRG\"`/" >&- 65 | APP_HOME="`pwd -P`" 66 | cd "$SAVED" >&- 67 | 68 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 69 | 70 | # Determine the Java command to use to start the JVM. 71 | if [ -n "$JAVA_HOME" ] ; then 72 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 73 | # IBM's JDK on AIX uses strange locations for the executables 74 | JAVACMD="$JAVA_HOME/jre/sh/java" 75 | else 76 | JAVACMD="$JAVA_HOME/bin/java" 77 | fi 78 | if [ ! -x "$JAVACMD" ] ; then 79 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 80 | 81 | Please set the JAVA_HOME variable in your environment to match the 82 | location of your Java installation." 83 | fi 84 | else 85 | JAVACMD="java" 86 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 87 | 88 | Please set the JAVA_HOME variable in your environment to match the 89 | location of your Java installation." 90 | fi 91 | 92 | # Increase the maximum file descriptors if we can. 93 | if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then 94 | MAX_FD_LIMIT=`ulimit -H -n` 95 | if [ $? -eq 0 ] ; then 96 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 97 | MAX_FD="$MAX_FD_LIMIT" 98 | fi 99 | ulimit -n $MAX_FD 100 | if [ $? -ne 0 ] ; then 101 | warn "Could not set maximum file descriptor limit: $MAX_FD" 102 | fi 103 | else 104 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 105 | fi 106 | fi 107 | 108 | # For Darwin, add options to specify how the application appears in the dock 109 | if $darwin; then 110 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 111 | fi 112 | 113 | # For Cygwin, switch paths to Windows format before running java 114 | if $cygwin ; then 115 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 116 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 117 | 118 | # We build the pattern for arguments to be converted via cygpath 119 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 120 | SEP="" 121 | for dir in $ROOTDIRSRAW ; do 122 | ROOTDIRS="$ROOTDIRS$SEP$dir" 123 | SEP="|" 124 | done 125 | OURCYGPATTERN="(^($ROOTDIRS))" 126 | # Add a user-defined pattern to the cygpath arguments 127 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 128 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 129 | fi 130 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 131 | i=0 132 | for arg in "$@" ; do 133 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 134 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 135 | 136 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 137 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 138 | else 139 | eval `echo args$i`="\"$arg\"" 140 | fi 141 | i=$((i+1)) 142 | done 143 | case $i in 144 | (0) set -- ;; 145 | (1) set -- "$args0" ;; 146 | (2) set -- "$args0" "$args1" ;; 147 | (3) set -- "$args0" "$args1" "$args2" ;; 148 | (4) set -- "$args0" "$args1" "$args2" "$args3" ;; 149 | (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 150 | (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 151 | (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 152 | (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 153 | (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 154 | esac 155 | fi 156 | 157 | # Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules 158 | function splitJvmOpts() { 159 | JVM_OPTS=("$@") 160 | } 161 | eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS 162 | JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" 163 | 164 | exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" 165 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/keystores/BUCK: -------------------------------------------------------------------------------- 1 | keystore( 2 | name = 'debug', 3 | store = 'debug.keystore', 4 | properties = 'debug.keystore.properties', 5 | visibility = [ 6 | 'PUBLIC', 7 | ], 8 | ) 9 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/keystores/debug.keystore.properties: -------------------------------------------------------------------------------- 1 | key.store=debug.keystore 2 | key.alias=androiddebugkey 3 | key.store.password=android 4 | key.alias.password=android 5 | -------------------------------------------------------------------------------- /examples/ColorPicker/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ColorPicker' 2 | include ':react-native-pixel-color' 3 | project(':react-native-pixel-color').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-pixel-color/android') 4 | 5 | include ':app' 6 | -------------------------------------------------------------------------------- /examples/ColorPicker/index.android.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample React Native App 3 | * https://github.com/facebook/react-native 4 | * @flow 5 | */ 6 | 7 | import React, { Component } from 'react'; 8 | import { 9 | AppRegistry, 10 | StyleSheet, 11 | Text, 12 | View 13 | } from 'react-native'; 14 | 15 | export default class ColorPicker extends Component { 16 | render() { 17 | return ( 18 | 19 | 20 | Welcome to React Native! 21 | 22 | 23 | To get started, edit index.android.js 24 | 25 | 26 | Double tap R on your keyboard to reload,{'\n'} 27 | Shake or press menu button for dev menu 28 | 29 | 30 | ); 31 | } 32 | } 33 | 34 | const styles = StyleSheet.create({ 35 | container: { 36 | flex: 1, 37 | justifyContent: 'center', 38 | alignItems: 'center', 39 | backgroundColor: '#F5FCFF', 40 | }, 41 | welcome: { 42 | fontSize: 20, 43 | textAlign: 'center', 44 | margin: 10, 45 | }, 46 | instructions: { 47 | textAlign: 'center', 48 | color: '#333333', 49 | marginBottom: 5, 50 | }, 51 | }); 52 | 53 | AppRegistry.registerComponent('ColorPicker', () => ColorPicker); 54 | -------------------------------------------------------------------------------- /examples/ColorPicker/index.ios.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Sample React Native App 3 | * https://github.com/facebook/react-native 4 | * @flow 5 | */ 6 | 7 | import React, { Component } from 'react'; 8 | import { 9 | AppRegistry, 10 | StyleSheet, 11 | Text, 12 | View, 13 | Image, 14 | Animated, 15 | PanResponder 16 | } from 'react-native'; 17 | 18 | import PixelColor from 'react-native-pixel-color'; 19 | const base64ColorWheel = 'data:image/png;base64,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'; 20 | 21 | export default class ColorPicker extends Component { 22 | 23 | state = { 24 | pixelColor: 'transparent', 25 | width: 1, 26 | height: 1 27 | } 28 | 29 | animations = { 30 | handlePosition: new Animated.ValueXY({ x: 0, y: 0 }) 31 | } 32 | 33 | panResponders = { 34 | handle: PanResponder.create({ 35 | onMoveShouldSetResponderCapture: () => true, 36 | onMoveShouldSetPanResponderCapture: () => true, 37 | onPanResponderGrant: (e, gestureState) => { 38 | this.animations.handlePosition.setOffset({ x: this.lastHandlePosition.x, y: this.lastHandlePosition.y }); 39 | this.animations.handlePosition.setValue({ x: 0, y: 0 }); 40 | }, 41 | onPanResponderMove: (e, gestureState) => { 42 | const { width, height } = this.state; 43 | 44 | PixelColor.getHex(base64ColorWheel, { x: e.nativeEvent.pageX, y: e.nativeEvent.pageY, width, height }) 45 | .then(pixelColor => this.setState({ pixelColor })) 46 | .catch(console.error); 47 | 48 | return this.animations.handlePosition.setValue({ x: gestureState.dx, y: gestureState.dy }); 49 | }, 50 | onPanResponderRelease: (e, { vx, vy }) => this.animations.handlePosition.flattenOffset() 51 | }) 52 | } 53 | 54 | lastHandlePosition = { 55 | x: 0, 56 | y: 0 57 | } 58 | 59 | componentWillMount() { 60 | this.animations.handlePosition.x.addListener(({ value }) => this.lastHandlePosition.x = value); 61 | this.animations.handlePosition.y.addListener(({ value }) => this.lastHandlePosition.y = value); 62 | } 63 | 64 | onLayout({ nativeEvent }) { 65 | this.setState({ width: nativeEvent.layout.width, height: nativeEvent.layout.height }); 66 | } 67 | 68 | render() { 69 | const { pixelColor } = this.state; 70 | 71 | return ( 72 | 73 | 78 | 82 | 83 | 84 | ); 85 | } 86 | } 87 | 88 | const styles = StyleSheet.create({ 89 | container: { 90 | flex: 1 91 | }, 92 | handle: { 93 | borderRadius: 40, 94 | borderWidth: 4, 95 | borderColor: 'black', 96 | height: 40, 97 | width: 40 98 | } 99 | }); 100 | 101 | AppRegistry.registerComponent('ColorPicker', () => ColorPicker); 102 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; 11 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 12 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 13 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 14 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; 15 | 00E356F31AD99517003FC87E /* ColorPickerTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* ColorPickerTests.m */; }; 16 | 0FFA8C198C8F46BFAB5C9E93 /* libRNPixelColor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = F5F07849242B45FBB6460EEF /* libRNPixelColor.a */; }; 17 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; 18 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; 19 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 20 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 21 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 22 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 23 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 24 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 25 | 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 26 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; 27 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; 28 | /* End PBXBuildFile section */ 29 | 30 | /* Begin PBXContainerItemProxy section */ 31 | 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */ = { 32 | isa = PBXContainerItemProxy; 33 | containerPortal = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 34 | proxyType = 2; 35 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 36 | remoteInfo = RCTActionSheet; 37 | }; 38 | 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { 39 | isa = PBXContainerItemProxy; 40 | containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 41 | proxyType = 2; 42 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 43 | remoteInfo = RCTGeolocation; 44 | }; 45 | 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */ = { 46 | isa = PBXContainerItemProxy; 47 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 48 | proxyType = 2; 49 | remoteGlobalIDString = 58B5115D1A9E6B3D00147676; 50 | remoteInfo = RCTImage; 51 | }; 52 | 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */ = { 53 | isa = PBXContainerItemProxy; 54 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 55 | proxyType = 2; 56 | remoteGlobalIDString = 58B511DB1A9E6C8500147676; 57 | remoteInfo = RCTNetwork; 58 | }; 59 | 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */ = { 60 | isa = PBXContainerItemProxy; 61 | containerPortal = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 62 | proxyType = 2; 63 | remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; 64 | remoteInfo = RCTVibration; 65 | }; 66 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { 67 | isa = PBXContainerItemProxy; 68 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 69 | proxyType = 1; 70 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 71 | remoteInfo = ColorPicker; 72 | }; 73 | 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { 74 | isa = PBXContainerItemProxy; 75 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 76 | proxyType = 2; 77 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 78 | remoteInfo = RCTSettings; 79 | }; 80 | 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { 81 | isa = PBXContainerItemProxy; 82 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 83 | proxyType = 2; 84 | remoteGlobalIDString = 3C86DF461ADF2C930047B81A; 85 | remoteInfo = RCTWebSocket; 86 | }; 87 | 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { 88 | isa = PBXContainerItemProxy; 89 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 90 | proxyType = 2; 91 | remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; 92 | remoteInfo = React; 93 | }; 94 | 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 95 | isa = PBXContainerItemProxy; 96 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 97 | proxyType = 2; 98 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 99 | remoteInfo = RCTAnimation; 100 | }; 101 | 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */ = { 102 | isa = PBXContainerItemProxy; 103 | containerPortal = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 104 | proxyType = 2; 105 | remoteGlobalIDString = 2D2A28201D9B03D100D4039D; 106 | remoteInfo = "RCTAnimation-tvOS"; 107 | }; 108 | 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { 109 | isa = PBXContainerItemProxy; 110 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 111 | proxyType = 2; 112 | remoteGlobalIDString = 134814201AA4EA6300B7C361; 113 | remoteInfo = RCTLinking; 114 | }; 115 | 806279821E11B53100924BF6 /* PBXContainerItemProxy */ = { 116 | isa = PBXContainerItemProxy; 117 | containerPortal = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 118 | proxyType = 2; 119 | remoteGlobalIDString = 2D2A283A1D9B042B00D4039D; 120 | remoteInfo = "RCTImage-tvOS"; 121 | }; 122 | 806279861E11B53100924BF6 /* PBXContainerItemProxy */ = { 123 | isa = PBXContainerItemProxy; 124 | containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 125 | proxyType = 2; 126 | remoteGlobalIDString = 2D2A28471D9B043800D4039D; 127 | remoteInfo = "RCTLinking-tvOS"; 128 | }; 129 | 8062798A1E11B53100924BF6 /* PBXContainerItemProxy */ = { 130 | isa = PBXContainerItemProxy; 131 | containerPortal = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 132 | proxyType = 2; 133 | remoteGlobalIDString = 2D2A28541D9B044C00D4039D; 134 | remoteInfo = "RCTNetwork-tvOS"; 135 | }; 136 | 8062798E1E11B53100924BF6 /* PBXContainerItemProxy */ = { 137 | isa = PBXContainerItemProxy; 138 | containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 139 | proxyType = 2; 140 | remoteGlobalIDString = 2D2A28611D9B046600D4039D; 141 | remoteInfo = "RCTSettings-tvOS"; 142 | }; 143 | 806279921E11B53100924BF6 /* PBXContainerItemProxy */ = { 144 | isa = PBXContainerItemProxy; 145 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 146 | proxyType = 2; 147 | remoteGlobalIDString = 2D2A287B1D9B048500D4039D; 148 | remoteInfo = "RCTText-tvOS"; 149 | }; 150 | 806279971E11B53100924BF6 /* PBXContainerItemProxy */ = { 151 | isa = PBXContainerItemProxy; 152 | containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 153 | proxyType = 2; 154 | remoteGlobalIDString = 2D2A28881D9B049200D4039D; 155 | remoteInfo = "RCTWebSocket-tvOS"; 156 | }; 157 | 8062799B1E11B53100924BF6 /* PBXContainerItemProxy */ = { 158 | isa = PBXContainerItemProxy; 159 | containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; 160 | proxyType = 2; 161 | remoteGlobalIDString = 2D2A28131D9B038B00D4039D; 162 | remoteInfo = "React-tvOS"; 163 | }; 164 | 806279E81E131B2500924BF6 /* PBXContainerItemProxy */ = { 165 | isa = PBXContainerItemProxy; 166 | containerPortal = 74431F55491F41CFA59A5931 /* RNPixelColor.xcodeproj */; 167 | proxyType = 2; 168 | remoteGlobalIDString = 5D72D2E81C16249000E22EC1; 169 | remoteInfo = RNPixelColor; 170 | }; 171 | 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { 172 | isa = PBXContainerItemProxy; 173 | containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 174 | proxyType = 2; 175 | remoteGlobalIDString = 58B5119B1A9E6C1200147676; 176 | remoteInfo = RCTText; 177 | }; 178 | /* End PBXContainerItemProxy section */ 179 | 180 | /* Begin PBXFileReference section */ 181 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; 182 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; 183 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; 184 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; 185 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; 186 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; 187 | 00E356EE1AD99517003FC87E /* ColorPickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = ColorPickerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 188 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 189 | 00E356F21AD99517003FC87E /* ColorPickerTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ColorPickerTests.m; sourceTree = ""; }; 190 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; 191 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 192 | 13B07F961A680F5B00A75B9A /* ColorPicker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ColorPicker.app; sourceTree = BUILT_PRODUCTS_DIR; }; 193 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = ColorPicker/AppDelegate.h; sourceTree = ""; }; 194 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = ColorPicker/AppDelegate.m; sourceTree = ""; }; 195 | 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 196 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = ColorPicker/Images.xcassets; sourceTree = ""; }; 197 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = ColorPicker/Info.plist; sourceTree = ""; }; 198 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = ColorPicker/main.m; sourceTree = ""; }; 199 | 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; 200 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 201 | 74431F55491F41CFA59A5931 /* RNPixelColor.xcodeproj */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = "wrapper.pb-project"; name = RNPixelColor.xcodeproj; path = "../node_modules/react-native-pixel-color/ios/RNPixelColor.xcodeproj"; sourceTree = ""; }; 202 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 203 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 204 | F5F07849242B45FBB6460EEF /* libRNPixelColor.a */ = {isa = PBXFileReference; explicitFileType = undefined; fileEncoding = 9; includeInIndex = 0; lastKnownFileType = archive.ar; path = libRNPixelColor.a; sourceTree = ""; }; 205 | /* End PBXFileReference section */ 206 | 207 | /* Begin PBXFrameworksBuildPhase section */ 208 | 00E356EB1AD99517003FC87E /* Frameworks */ = { 209 | isa = PBXFrameworksBuildPhase; 210 | buildActionMask = 2147483647; 211 | files = ( 212 | 140ED2AC1D01E1AD002B40FF /* libReact.a in Frameworks */, 213 | ); 214 | runOnlyForDeploymentPostprocessing = 0; 215 | }; 216 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 217 | isa = PBXFrameworksBuildPhase; 218 | buildActionMask = 2147483647; 219 | files = ( 220 | 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, 221 | 146834051AC3E58100842450 /* libReact.a in Frameworks */, 222 | 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, 223 | 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 224 | 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, 225 | 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 226 | 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, 227 | 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 228 | 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, 229 | 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, 230 | 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, 231 | 0FFA8C198C8F46BFAB5C9E93 /* libRNPixelColor.a in Frameworks */, 232 | ); 233 | runOnlyForDeploymentPostprocessing = 0; 234 | }; 235 | /* End PBXFrameworksBuildPhase section */ 236 | 237 | /* Begin PBXGroup section */ 238 | 00C302A81ABCB8CE00DB3ED1 /* Products */ = { 239 | isa = PBXGroup; 240 | children = ( 241 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */, 242 | ); 243 | name = Products; 244 | sourceTree = ""; 245 | }; 246 | 00C302B61ABCB90400DB3ED1 /* Products */ = { 247 | isa = PBXGroup; 248 | children = ( 249 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */, 250 | ); 251 | name = Products; 252 | sourceTree = ""; 253 | }; 254 | 00C302BC1ABCB91800DB3ED1 /* Products */ = { 255 | isa = PBXGroup; 256 | children = ( 257 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */, 258 | 806279831E11B53100924BF6 /* libRCTImage-tvOS.a */, 259 | ); 260 | name = Products; 261 | sourceTree = ""; 262 | }; 263 | 00C302D41ABCB9D200DB3ED1 /* Products */ = { 264 | isa = PBXGroup; 265 | children = ( 266 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */, 267 | 8062798B1E11B53100924BF6 /* libRCTNetwork-tvOS.a */, 268 | ); 269 | name = Products; 270 | sourceTree = ""; 271 | }; 272 | 00C302E01ABCB9EE00DB3ED1 /* Products */ = { 273 | isa = PBXGroup; 274 | children = ( 275 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */, 276 | ); 277 | name = Products; 278 | sourceTree = ""; 279 | }; 280 | 00E356EF1AD99517003FC87E /* ColorPickerTests */ = { 281 | isa = PBXGroup; 282 | children = ( 283 | 00E356F21AD99517003FC87E /* ColorPickerTests.m */, 284 | 00E356F01AD99517003FC87E /* Supporting Files */, 285 | ); 286 | path = ColorPickerTests; 287 | sourceTree = ""; 288 | }; 289 | 00E356F01AD99517003FC87E /* Supporting Files */ = { 290 | isa = PBXGroup; 291 | children = ( 292 | 00E356F11AD99517003FC87E /* Info.plist */, 293 | ); 294 | name = "Supporting Files"; 295 | sourceTree = ""; 296 | }; 297 | 139105B71AF99BAD00B5F7CC /* Products */ = { 298 | isa = PBXGroup; 299 | children = ( 300 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, 301 | 8062798F1E11B53100924BF6 /* libRCTSettings-tvOS.a */, 302 | ); 303 | name = Products; 304 | sourceTree = ""; 305 | }; 306 | 139FDEE71B06529A00C62182 /* Products */ = { 307 | isa = PBXGroup; 308 | children = ( 309 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, 310 | 806279981E11B53100924BF6 /* libRCTWebSocket-tvOS.a */, 311 | ); 312 | name = Products; 313 | sourceTree = ""; 314 | }; 315 | 13B07FAE1A68108700A75B9A /* ColorPicker */ = { 316 | isa = PBXGroup; 317 | children = ( 318 | 008F07F21AC5B25A0029DE68 /* main.jsbundle */, 319 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */, 320 | 13B07FB01A68108700A75B9A /* AppDelegate.m */, 321 | 13B07FB51A68108700A75B9A /* Images.xcassets */, 322 | 13B07FB61A68108700A75B9A /* Info.plist */, 323 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */, 324 | 13B07FB71A68108700A75B9A /* main.m */, 325 | ); 326 | name = ColorPicker; 327 | sourceTree = ""; 328 | }; 329 | 146834001AC3E56700842450 /* Products */ = { 330 | isa = PBXGroup; 331 | children = ( 332 | 146834041AC3E56700842450 /* libReact.a */, 333 | 8062799C1E11B53100924BF6 /* libReact-tvOS.a */, 334 | ); 335 | name = Products; 336 | sourceTree = ""; 337 | }; 338 | 5E91572E1DD0AC6500FF2AA8 /* Products */ = { 339 | isa = PBXGroup; 340 | children = ( 341 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */, 342 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */, 343 | ); 344 | name = Products; 345 | sourceTree = ""; 346 | }; 347 | 78C398B11ACF4ADC00677621 /* Products */ = { 348 | isa = PBXGroup; 349 | children = ( 350 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, 351 | 806279871E11B53100924BF6 /* libRCTLinking-tvOS.a */, 352 | ); 353 | name = Products; 354 | sourceTree = ""; 355 | }; 356 | 801EB44620599F6200A74905 /* Recovered References */ = { 357 | isa = PBXGroup; 358 | children = ( 359 | F5F07849242B45FBB6460EEF /* libRNPixelColor.a */, 360 | ); 361 | name = "Recovered References"; 362 | sourceTree = ""; 363 | }; 364 | 806279D21E131B2500924BF6 /* Products */ = { 365 | isa = PBXGroup; 366 | children = ( 367 | 806279E91E131B2500924BF6 /* libRNPixelColor.a */, 368 | ); 369 | name = Products; 370 | sourceTree = ""; 371 | }; 372 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 373 | isa = PBXGroup; 374 | children = ( 375 | 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */, 376 | 146833FF1AC3E56700842450 /* React.xcodeproj */, 377 | 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, 378 | 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 379 | 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, 380 | 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 381 | 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, 382 | 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, 383 | 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 384 | 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, 385 | 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, 386 | 74431F55491F41CFA59A5931 /* RNPixelColor.xcodeproj */, 387 | ); 388 | name = Libraries; 389 | sourceTree = ""; 390 | }; 391 | 832341B11AAA6A8300B99B32 /* Products */ = { 392 | isa = PBXGroup; 393 | children = ( 394 | 832341B51AAA6A8300B99B32 /* libRCTText.a */, 395 | 806279931E11B53100924BF6 /* libRCTText-tvOS.a */, 396 | ); 397 | name = Products; 398 | sourceTree = ""; 399 | }; 400 | 83CBB9F61A601CBA00E9B192 = { 401 | isa = PBXGroup; 402 | children = ( 403 | 13B07FAE1A68108700A75B9A /* ColorPicker */, 404 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 405 | 00E356EF1AD99517003FC87E /* ColorPickerTests */, 406 | 83CBBA001A601CBA00E9B192 /* Products */, 407 | 801EB44620599F6200A74905 /* Recovered References */, 408 | ); 409 | indentWidth = 2; 410 | sourceTree = ""; 411 | tabWidth = 2; 412 | }; 413 | 83CBBA001A601CBA00E9B192 /* Products */ = { 414 | isa = PBXGroup; 415 | children = ( 416 | 13B07F961A680F5B00A75B9A /* ColorPicker.app */, 417 | 00E356EE1AD99517003FC87E /* ColorPickerTests.xctest */, 418 | ); 419 | name = Products; 420 | sourceTree = ""; 421 | }; 422 | /* End PBXGroup section */ 423 | 424 | /* Begin PBXNativeTarget section */ 425 | 00E356ED1AD99517003FC87E /* ColorPickerTests */ = { 426 | isa = PBXNativeTarget; 427 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ColorPickerTests" */; 428 | buildPhases = ( 429 | 00E356EA1AD99517003FC87E /* Sources */, 430 | 00E356EB1AD99517003FC87E /* Frameworks */, 431 | 00E356EC1AD99517003FC87E /* Resources */, 432 | ); 433 | buildRules = ( 434 | ); 435 | dependencies = ( 436 | 00E356F51AD99517003FC87E /* PBXTargetDependency */, 437 | ); 438 | name = ColorPickerTests; 439 | productName = ColorPickerTests; 440 | productReference = 00E356EE1AD99517003FC87E /* ColorPickerTests.xctest */; 441 | productType = "com.apple.product-type.bundle.unit-test"; 442 | }; 443 | 13B07F861A680F5B00A75B9A /* ColorPicker */ = { 444 | isa = PBXNativeTarget; 445 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ColorPicker" */; 446 | buildPhases = ( 447 | 13B07F871A680F5B00A75B9A /* Sources */, 448 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 449 | 13B07F8E1A680F5B00A75B9A /* Resources */, 450 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 451 | ); 452 | buildRules = ( 453 | ); 454 | dependencies = ( 455 | ); 456 | name = ColorPicker; 457 | productName = "Hello World"; 458 | productReference = 13B07F961A680F5B00A75B9A /* ColorPicker.app */; 459 | productType = "com.apple.product-type.application"; 460 | }; 461 | /* End PBXNativeTarget section */ 462 | 463 | /* Begin PBXProject section */ 464 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 465 | isa = PBXProject; 466 | attributes = { 467 | LastUpgradeCheck = 610; 468 | ORGANIZATIONNAME = Facebook; 469 | TargetAttributes = { 470 | 00E356ED1AD99517003FC87E = { 471 | CreatedOnToolsVersion = 6.2; 472 | DevelopmentTeam = MY6LRJ58JJ; 473 | TestTargetID = 13B07F861A680F5B00A75B9A; 474 | }; 475 | 13B07F861A680F5B00A75B9A = { 476 | DevelopmentTeam = MY6LRJ58JJ; 477 | }; 478 | }; 479 | }; 480 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ColorPicker" */; 481 | compatibilityVersion = "Xcode 3.2"; 482 | developmentRegion = English; 483 | hasScannedForEncodings = 0; 484 | knownRegions = ( 485 | en, 486 | Base, 487 | ); 488 | mainGroup = 83CBB9F61A601CBA00E9B192; 489 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 490 | projectDirPath = ""; 491 | projectReferences = ( 492 | { 493 | ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; 494 | ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; 495 | }, 496 | { 497 | ProductGroup = 5E91572E1DD0AC6500FF2AA8 /* Products */; 498 | ProjectRef = 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */; 499 | }, 500 | { 501 | ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; 502 | ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; 503 | }, 504 | { 505 | ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; 506 | ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; 507 | }, 508 | { 509 | ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; 510 | ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; 511 | }, 512 | { 513 | ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; 514 | ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; 515 | }, 516 | { 517 | ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; 518 | ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; 519 | }, 520 | { 521 | ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; 522 | ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; 523 | }, 524 | { 525 | ProductGroup = 00C302E01ABCB9EE00DB3ED1 /* Products */; 526 | ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; 527 | }, 528 | { 529 | ProductGroup = 139FDEE71B06529A00C62182 /* Products */; 530 | ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; 531 | }, 532 | { 533 | ProductGroup = 146834001AC3E56700842450 /* Products */; 534 | ProjectRef = 146833FF1AC3E56700842450 /* React.xcodeproj */; 535 | }, 536 | { 537 | ProductGroup = 806279D21E131B2500924BF6 /* Products */; 538 | ProjectRef = 74431F55491F41CFA59A5931 /* RNPixelColor.xcodeproj */; 539 | }, 540 | ); 541 | projectRoot = ""; 542 | targets = ( 543 | 13B07F861A680F5B00A75B9A /* ColorPicker */, 544 | 00E356ED1AD99517003FC87E /* ColorPickerTests */, 545 | ); 546 | }; 547 | /* End PBXProject section */ 548 | 549 | /* Begin PBXReferenceProxy section */ 550 | 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */ = { 551 | isa = PBXReferenceProxy; 552 | fileType = archive.ar; 553 | path = libRCTActionSheet.a; 554 | remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; 555 | sourceTree = BUILT_PRODUCTS_DIR; 556 | }; 557 | 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { 558 | isa = PBXReferenceProxy; 559 | fileType = archive.ar; 560 | path = libRCTGeolocation.a; 561 | remoteRef = 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */; 562 | sourceTree = BUILT_PRODUCTS_DIR; 563 | }; 564 | 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */ = { 565 | isa = PBXReferenceProxy; 566 | fileType = archive.ar; 567 | path = libRCTImage.a; 568 | remoteRef = 00C302BF1ABCB91800DB3ED1 /* PBXContainerItemProxy */; 569 | sourceTree = BUILT_PRODUCTS_DIR; 570 | }; 571 | 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */ = { 572 | isa = PBXReferenceProxy; 573 | fileType = archive.ar; 574 | path = libRCTNetwork.a; 575 | remoteRef = 00C302DB1ABCB9D200DB3ED1 /* PBXContainerItemProxy */; 576 | sourceTree = BUILT_PRODUCTS_DIR; 577 | }; 578 | 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */ = { 579 | isa = PBXReferenceProxy; 580 | fileType = archive.ar; 581 | path = libRCTVibration.a; 582 | remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; 583 | sourceTree = BUILT_PRODUCTS_DIR; 584 | }; 585 | 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { 586 | isa = PBXReferenceProxy; 587 | fileType = archive.ar; 588 | path = libRCTSettings.a; 589 | remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; 590 | sourceTree = BUILT_PRODUCTS_DIR; 591 | }; 592 | 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { 593 | isa = PBXReferenceProxy; 594 | fileType = archive.ar; 595 | path = libRCTWebSocket.a; 596 | remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; 597 | sourceTree = BUILT_PRODUCTS_DIR; 598 | }; 599 | 146834041AC3E56700842450 /* libReact.a */ = { 600 | isa = PBXReferenceProxy; 601 | fileType = archive.ar; 602 | path = libReact.a; 603 | remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; 604 | sourceTree = BUILT_PRODUCTS_DIR; 605 | }; 606 | 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */ = { 607 | isa = PBXReferenceProxy; 608 | fileType = archive.ar; 609 | path = libRCTAnimation.a; 610 | remoteRef = 5E9157321DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 611 | sourceTree = BUILT_PRODUCTS_DIR; 612 | }; 613 | 5E9157351DD0AC6500FF2AA8 /* libRCTAnimation-tvOS.a */ = { 614 | isa = PBXReferenceProxy; 615 | fileType = archive.ar; 616 | path = "libRCTAnimation-tvOS.a"; 617 | remoteRef = 5E9157341DD0AC6500FF2AA8 /* PBXContainerItemProxy */; 618 | sourceTree = BUILT_PRODUCTS_DIR; 619 | }; 620 | 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { 621 | isa = PBXReferenceProxy; 622 | fileType = archive.ar; 623 | path = libRCTLinking.a; 624 | remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; 625 | sourceTree = BUILT_PRODUCTS_DIR; 626 | }; 627 | 806279831E11B53100924BF6 /* libRCTImage-tvOS.a */ = { 628 | isa = PBXReferenceProxy; 629 | fileType = archive.ar; 630 | path = "libRCTImage-tvOS.a"; 631 | remoteRef = 806279821E11B53100924BF6 /* PBXContainerItemProxy */; 632 | sourceTree = BUILT_PRODUCTS_DIR; 633 | }; 634 | 806279871E11B53100924BF6 /* libRCTLinking-tvOS.a */ = { 635 | isa = PBXReferenceProxy; 636 | fileType = archive.ar; 637 | path = "libRCTLinking-tvOS.a"; 638 | remoteRef = 806279861E11B53100924BF6 /* PBXContainerItemProxy */; 639 | sourceTree = BUILT_PRODUCTS_DIR; 640 | }; 641 | 8062798B1E11B53100924BF6 /* libRCTNetwork-tvOS.a */ = { 642 | isa = PBXReferenceProxy; 643 | fileType = archive.ar; 644 | path = "libRCTNetwork-tvOS.a"; 645 | remoteRef = 8062798A1E11B53100924BF6 /* PBXContainerItemProxy */; 646 | sourceTree = BUILT_PRODUCTS_DIR; 647 | }; 648 | 8062798F1E11B53100924BF6 /* libRCTSettings-tvOS.a */ = { 649 | isa = PBXReferenceProxy; 650 | fileType = archive.ar; 651 | path = "libRCTSettings-tvOS.a"; 652 | remoteRef = 8062798E1E11B53100924BF6 /* PBXContainerItemProxy */; 653 | sourceTree = BUILT_PRODUCTS_DIR; 654 | }; 655 | 806279931E11B53100924BF6 /* libRCTText-tvOS.a */ = { 656 | isa = PBXReferenceProxy; 657 | fileType = archive.ar; 658 | path = "libRCTText-tvOS.a"; 659 | remoteRef = 806279921E11B53100924BF6 /* PBXContainerItemProxy */; 660 | sourceTree = BUILT_PRODUCTS_DIR; 661 | }; 662 | 806279981E11B53100924BF6 /* libRCTWebSocket-tvOS.a */ = { 663 | isa = PBXReferenceProxy; 664 | fileType = archive.ar; 665 | path = "libRCTWebSocket-tvOS.a"; 666 | remoteRef = 806279971E11B53100924BF6 /* PBXContainerItemProxy */; 667 | sourceTree = BUILT_PRODUCTS_DIR; 668 | }; 669 | 8062799C1E11B53100924BF6 /* libReact-tvOS.a */ = { 670 | isa = PBXReferenceProxy; 671 | fileType = archive.ar; 672 | path = "libReact-tvOS.a"; 673 | remoteRef = 8062799B1E11B53100924BF6 /* PBXContainerItemProxy */; 674 | sourceTree = BUILT_PRODUCTS_DIR; 675 | }; 676 | 806279E91E131B2500924BF6 /* libRNPixelColor.a */ = { 677 | isa = PBXReferenceProxy; 678 | fileType = archive.ar; 679 | path = libRNPixelColor.a; 680 | remoteRef = 806279E81E131B2500924BF6 /* PBXContainerItemProxy */; 681 | sourceTree = BUILT_PRODUCTS_DIR; 682 | }; 683 | 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { 684 | isa = PBXReferenceProxy; 685 | fileType = archive.ar; 686 | path = libRCTText.a; 687 | remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; 688 | sourceTree = BUILT_PRODUCTS_DIR; 689 | }; 690 | /* End PBXReferenceProxy section */ 691 | 692 | /* Begin PBXResourcesBuildPhase section */ 693 | 00E356EC1AD99517003FC87E /* Resources */ = { 694 | isa = PBXResourcesBuildPhase; 695 | buildActionMask = 2147483647; 696 | files = ( 697 | ); 698 | runOnlyForDeploymentPostprocessing = 0; 699 | }; 700 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 701 | isa = PBXResourcesBuildPhase; 702 | buildActionMask = 2147483647; 703 | files = ( 704 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 705 | 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, 706 | ); 707 | runOnlyForDeploymentPostprocessing = 0; 708 | }; 709 | /* End PBXResourcesBuildPhase section */ 710 | 711 | /* Begin PBXShellScriptBuildPhase section */ 712 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 713 | isa = PBXShellScriptBuildPhase; 714 | buildActionMask = 2147483647; 715 | files = ( 716 | ); 717 | inputPaths = ( 718 | ); 719 | name = "Bundle React Native code and images"; 720 | outputPaths = ( 721 | ); 722 | runOnlyForDeploymentPostprocessing = 0; 723 | shellPath = /bin/sh; 724 | shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; 725 | }; 726 | /* End PBXShellScriptBuildPhase section */ 727 | 728 | /* Begin PBXSourcesBuildPhase section */ 729 | 00E356EA1AD99517003FC87E /* Sources */ = { 730 | isa = PBXSourcesBuildPhase; 731 | buildActionMask = 2147483647; 732 | files = ( 733 | 00E356F31AD99517003FC87E /* ColorPickerTests.m in Sources */, 734 | ); 735 | runOnlyForDeploymentPostprocessing = 0; 736 | }; 737 | 13B07F871A680F5B00A75B9A /* Sources */ = { 738 | isa = PBXSourcesBuildPhase; 739 | buildActionMask = 2147483647; 740 | files = ( 741 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */, 742 | 13B07FC11A68108700A75B9A /* main.m in Sources */, 743 | ); 744 | runOnlyForDeploymentPostprocessing = 0; 745 | }; 746 | /* End PBXSourcesBuildPhase section */ 747 | 748 | /* Begin PBXTargetDependency section */ 749 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { 750 | isa = PBXTargetDependency; 751 | target = 13B07F861A680F5B00A75B9A /* ColorPicker */; 752 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; 753 | }; 754 | /* End PBXTargetDependency section */ 755 | 756 | /* Begin PBXVariantGroup section */ 757 | 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { 758 | isa = PBXVariantGroup; 759 | children = ( 760 | 13B07FB21A68108700A75B9A /* Base */, 761 | ); 762 | name = LaunchScreen.xib; 763 | path = ColorPicker; 764 | sourceTree = ""; 765 | }; 766 | /* End PBXVariantGroup section */ 767 | 768 | /* Begin XCBuildConfiguration section */ 769 | 00E356F61AD99517003FC87E /* Debug */ = { 770 | isa = XCBuildConfiguration; 771 | buildSettings = { 772 | BUNDLE_LOADER = "$(TEST_HOST)"; 773 | DEVELOPMENT_TEAM = MY6LRJ58JJ; 774 | GCC_PREPROCESSOR_DEFINITIONS = ( 775 | "DEBUG=1", 776 | "$(inherited)", 777 | ); 778 | INFOPLIST_FILE = ColorPickerTests/Info.plist; 779 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 780 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 781 | LIBRARY_SEARCH_PATHS = ( 782 | "$(inherited)", 783 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 784 | ); 785 | PRODUCT_NAME = "$(TARGET_NAME)"; 786 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ColorPicker.app/ColorPicker"; 787 | }; 788 | name = Debug; 789 | }; 790 | 00E356F71AD99517003FC87E /* Release */ = { 791 | isa = XCBuildConfiguration; 792 | buildSettings = { 793 | BUNDLE_LOADER = "$(TEST_HOST)"; 794 | COPY_PHASE_STRIP = NO; 795 | DEVELOPMENT_TEAM = MY6LRJ58JJ; 796 | INFOPLIST_FILE = ColorPickerTests/Info.plist; 797 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 798 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 799 | LIBRARY_SEARCH_PATHS = ( 800 | "$(inherited)", 801 | "\"$(SRCROOT)/$(TARGET_NAME)\"", 802 | ); 803 | PRODUCT_NAME = "$(TARGET_NAME)"; 804 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ColorPicker.app/ColorPicker"; 805 | }; 806 | name = Release; 807 | }; 808 | 13B07F941A680F5B00A75B9A /* Debug */ = { 809 | isa = XCBuildConfiguration; 810 | buildSettings = { 811 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 812 | CURRENT_PROJECT_VERSION = 1; 813 | DEAD_CODE_STRIPPING = NO; 814 | DEVELOPMENT_TEAM = MY6LRJ58JJ; 815 | INFOPLIST_FILE = ColorPicker/Info.plist; 816 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 817 | OTHER_LDFLAGS = ( 818 | "$(inherited)", 819 | "-ObjC", 820 | "-lc++", 821 | ); 822 | PRODUCT_NAME = ColorPicker; 823 | VERSIONING_SYSTEM = "apple-generic"; 824 | }; 825 | name = Debug; 826 | }; 827 | 13B07F951A680F5B00A75B9A /* Release */ = { 828 | isa = XCBuildConfiguration; 829 | buildSettings = { 830 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 831 | CURRENT_PROJECT_VERSION = 1; 832 | DEVELOPMENT_TEAM = MY6LRJ58JJ; 833 | INFOPLIST_FILE = ColorPicker/Info.plist; 834 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 835 | OTHER_LDFLAGS = ( 836 | "$(inherited)", 837 | "-ObjC", 838 | "-lc++", 839 | ); 840 | PRODUCT_NAME = ColorPicker; 841 | VERSIONING_SYSTEM = "apple-generic"; 842 | }; 843 | name = Release; 844 | }; 845 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 846 | isa = XCBuildConfiguration; 847 | buildSettings = { 848 | ALWAYS_SEARCH_USER_PATHS = NO; 849 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 850 | CLANG_CXX_LIBRARY = "libc++"; 851 | CLANG_ENABLE_MODULES = YES; 852 | CLANG_ENABLE_OBJC_ARC = YES; 853 | CLANG_WARN_BOOL_CONVERSION = YES; 854 | CLANG_WARN_CONSTANT_CONVERSION = YES; 855 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 856 | CLANG_WARN_EMPTY_BODY = YES; 857 | CLANG_WARN_ENUM_CONVERSION = YES; 858 | CLANG_WARN_INT_CONVERSION = YES; 859 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 860 | CLANG_WARN_UNREACHABLE_CODE = YES; 861 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 862 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 863 | COPY_PHASE_STRIP = NO; 864 | ENABLE_STRICT_OBJC_MSGSEND = YES; 865 | GCC_C_LANGUAGE_STANDARD = gnu99; 866 | GCC_DYNAMIC_NO_PIC = NO; 867 | GCC_OPTIMIZATION_LEVEL = 0; 868 | GCC_PREPROCESSOR_DEFINITIONS = ( 869 | "DEBUG=1", 870 | "$(inherited)", 871 | ); 872 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 873 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 874 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 875 | GCC_WARN_UNDECLARED_SELECTOR = YES; 876 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 877 | GCC_WARN_UNUSED_FUNCTION = YES; 878 | GCC_WARN_UNUSED_VARIABLE = YES; 879 | HEADER_SEARCH_PATHS = ( 880 | "$(inherited)", 881 | "$(SRCROOT)/../node_modules/react-native/React/**", 882 | "$(SRCROOT)/../node_modules/react-native/ReactCommon/**", 883 | "$(SRCROOT)/../node_modules/react-native-pixel-color/ios/PNPixelColor", 884 | "$(SRCROOT)/../node_modules/react-native-pixel-color/ios/**", 885 | ); 886 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 887 | MTL_ENABLE_DEBUG_INFO = YES; 888 | ONLY_ACTIVE_ARCH = YES; 889 | SDKROOT = iphoneos; 890 | }; 891 | name = Debug; 892 | }; 893 | 83CBBA211A601CBA00E9B192 /* Release */ = { 894 | isa = XCBuildConfiguration; 895 | buildSettings = { 896 | ALWAYS_SEARCH_USER_PATHS = NO; 897 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 898 | CLANG_CXX_LIBRARY = "libc++"; 899 | CLANG_ENABLE_MODULES = YES; 900 | CLANG_ENABLE_OBJC_ARC = YES; 901 | CLANG_WARN_BOOL_CONVERSION = YES; 902 | CLANG_WARN_CONSTANT_CONVERSION = YES; 903 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 904 | CLANG_WARN_EMPTY_BODY = YES; 905 | CLANG_WARN_ENUM_CONVERSION = YES; 906 | CLANG_WARN_INT_CONVERSION = YES; 907 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 908 | CLANG_WARN_UNREACHABLE_CODE = YES; 909 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 910 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 911 | COPY_PHASE_STRIP = YES; 912 | ENABLE_NS_ASSERTIONS = NO; 913 | ENABLE_STRICT_OBJC_MSGSEND = YES; 914 | GCC_C_LANGUAGE_STANDARD = gnu99; 915 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 916 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 917 | GCC_WARN_UNDECLARED_SELECTOR = YES; 918 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 919 | GCC_WARN_UNUSED_FUNCTION = YES; 920 | GCC_WARN_UNUSED_VARIABLE = YES; 921 | HEADER_SEARCH_PATHS = ( 922 | "$(inherited)", 923 | "$(SRCROOT)/../node_modules/react-native/React/**", 924 | "$(SRCROOT)/../node_modules/react-native/ReactCommon/**", 925 | "$(SRCROOT)/../node_modules/react-native-pixel-color/ios/PNPixelColor", 926 | "$(SRCROOT)/../node_modules/react-native-pixel-color/ios/**", 927 | ); 928 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 929 | MTL_ENABLE_DEBUG_INFO = NO; 930 | SDKROOT = iphoneos; 931 | VALIDATE_PRODUCT = YES; 932 | }; 933 | name = Release; 934 | }; 935 | /* End XCBuildConfiguration section */ 936 | 937 | /* Begin XCConfigurationList section */ 938 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "ColorPickerTests" */ = { 939 | isa = XCConfigurationList; 940 | buildConfigurations = ( 941 | 00E356F61AD99517003FC87E /* Debug */, 942 | 00E356F71AD99517003FC87E /* Release */, 943 | ); 944 | defaultConfigurationIsVisible = 0; 945 | defaultConfigurationName = Release; 946 | }; 947 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "ColorPicker" */ = { 948 | isa = XCConfigurationList; 949 | buildConfigurations = ( 950 | 13B07F941A680F5B00A75B9A /* Debug */, 951 | 13B07F951A680F5B00A75B9A /* Release */, 952 | ); 953 | defaultConfigurationIsVisible = 0; 954 | defaultConfigurationName = Release; 955 | }; 956 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "ColorPicker" */ = { 957 | isa = XCConfigurationList; 958 | buildConfigurations = ( 959 | 83CBBA201A601CBA00E9B192 /* Debug */, 960 | 83CBBA211A601CBA00E9B192 /* Release */, 961 | ); 962 | defaultConfigurationIsVisible = 0; 963 | defaultConfigurationName = Release; 964 | }; 965 | /* End XCConfigurationList section */ 966 | }; 967 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 968 | } 969 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker.xcodeproj/xcshareddata/xcschemes/ColorPicker.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 75 | 77 | 83 | 84 | 85 | 86 | 87 | 88 | 94 | 96 | 102 | 103 | 104 | 105 | 107 | 108 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | @interface AppDelegate : UIResponder 13 | 14 | @property (nonatomic, strong) UIWindow *window; 15 | 16 | @end 17 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import "AppDelegate.h" 11 | 12 | #import "RCTBundleURLProvider.h" 13 | #import "RCTRootView.h" 14 | 15 | @implementation AppDelegate 16 | 17 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 18 | { 19 | NSURL *jsCodeLocation; 20 | 21 | jsCodeLocation = [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index.ios" fallbackResource:nil]; 22 | 23 | RCTRootView *rootView = [[RCTRootView alloc] initWithBundleURL:jsCodeLocation 24 | moduleName:@"ColorPicker" 25 | initialProperties:nil 26 | launchOptions:launchOptions]; 27 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 28 | 29 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 30 | UIViewController *rootViewController = [UIViewController new]; 31 | rootViewController.view = rootView; 32 | self.window.rootViewController = rootViewController; 33 | [self.window makeKeyAndVisible]; 34 | return YES; 35 | } 36 | 37 | @end 38 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 21 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "29x29", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "40x40", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "40x40", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "60x60", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "60x60", 31 | "scale" : "3x" 32 | } 33 | ], 34 | "info" : { 35 | "version" : 1, 36 | "author" : "xcode" 37 | } 38 | } -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | UIViewControllerBasedStatusBarAppearance 38 | 39 | NSLocationWhenInUseUsageDescription 40 | 41 | NSAppTransportSecurity 42 | 43 | 44 | NSExceptionDomains 45 | 46 | localhost 47 | 48 | NSExceptionAllowsInsecureHTTPLoads 49 | 50 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPicker/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | 12 | #import "AppDelegate.h" 13 | 14 | int main(int argc, char * argv[]) { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPickerTests/ColorPickerTests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) 2015-present, Facebook, Inc. 3 | * All rights reserved. 4 | * 5 | * This source code is licensed under the BSD-style license found in the 6 | * LICENSE file in the root directory of this source tree. An additional grant 7 | * of patent rights can be found in the PATENTS file in the same directory. 8 | */ 9 | 10 | #import 11 | #import 12 | 13 | #import "RCTLog.h" 14 | #import "RCTRootView.h" 15 | 16 | #define TIMEOUT_SECONDS 600 17 | #define TEXT_TO_LOOK_FOR @"Welcome to React Native!" 18 | 19 | @interface ColorPickerTests : XCTestCase 20 | 21 | @end 22 | 23 | @implementation ColorPickerTests 24 | 25 | - (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test 26 | { 27 | if (test(view)) { 28 | return YES; 29 | } 30 | for (UIView *subview in [view subviews]) { 31 | if ([self findSubviewInView:subview matching:test]) { 32 | return YES; 33 | } 34 | } 35 | return NO; 36 | } 37 | 38 | - (void)testRendersWelcomeScreen 39 | { 40 | UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; 41 | NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; 42 | BOOL foundElement = NO; 43 | 44 | __block NSString *redboxError = nil; 45 | RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { 46 | if (level >= RCTLogLevelError) { 47 | redboxError = message; 48 | } 49 | }); 50 | 51 | while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { 52 | [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 53 | [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 54 | 55 | foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { 56 | if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { 57 | return YES; 58 | } 59 | return NO; 60 | }]; 61 | } 62 | 63 | RCTSetLogFunction(RCTDefaultLogFunction); 64 | 65 | XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); 66 | XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); 67 | } 68 | 69 | 70 | @end 71 | -------------------------------------------------------------------------------- /examples/ColorPicker/ios/ColorPickerTests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /examples/ColorPicker/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ColorPicker", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "node node_modules/react-native/local-cli/cli.js start", 7 | "test": "jest" 8 | }, 9 | "dependencies": { 10 | "react": "15.4.1", 11 | "react-native": "0.39.2", 12 | "react-native-pixel-color": "spacesuitdiver/react-native-pixel-color" 13 | }, 14 | "devDependencies": { 15 | "babel-jest": "18.0.0", 16 | "babel-preset-react-native": "1.9.1", 17 | "jest": "18.0.0", 18 | "react-test-renderer": "15.4.1" 19 | }, 20 | "jest": { 21 | "preset": "react-native" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | import { 2 | NativeModules, 3 | } from 'react-native'; 4 | 5 | export const getHex = (path, options) => new Promise((resolve, reject) => { 6 | NativeModules.RNPixelColor.getHex(path, options, (err, color) => { 7 | if (err) return reject(err); 8 | 9 | resolve(color); 10 | }); 11 | }); 12 | 13 | export default { 14 | getHex, 15 | } 16 | -------------------------------------------------------------------------------- /ios/RNPixelColor.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 5D72D2EC1C16249000E22EC1 /* RNPixelColor.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = 5D72D2EB1C16249000E22EC1 /* RNPixelColor.h */; }; 11 | 5D72D2EE1C16249000E22EC1 /* RNPixelColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D72D2ED1C16249000E22EC1 /* RNPixelColor.m */; }; 12 | 806279ED1E1328DA00924BF6 /* UIImage+ColorAtPixel.m in Sources */ = {isa = PBXBuildFile; fileRef = 806279EC1E1328DA00924BF6 /* UIImage+ColorAtPixel.m */; }; 13 | /* End PBXBuildFile section */ 14 | 15 | /* Begin PBXCopyFilesBuildPhase section */ 16 | 5D72D2E61C16249000E22EC1 /* CopyFiles */ = { 17 | isa = PBXCopyFilesBuildPhase; 18 | buildActionMask = 2147483647; 19 | dstPath = "include/$(PRODUCT_NAME)"; 20 | dstSubfolderSpec = 16; 21 | files = ( 22 | 5D72D2EC1C16249000E22EC1 /* RNPixelColor.h in CopyFiles */, 23 | ); 24 | runOnlyForDeploymentPostprocessing = 0; 25 | }; 26 | /* End PBXCopyFilesBuildPhase section */ 27 | 28 | /* Begin PBXFileReference section */ 29 | 5D72D2E81C16249000E22EC1 /* libRNPixelColor.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNPixelColor.a; sourceTree = BUILT_PRODUCTS_DIR; }; 30 | 5D72D2EB1C16249000E22EC1 /* RNPixelColor.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNPixelColor.h; sourceTree = ""; }; 31 | 5D72D2ED1C16249000E22EC1 /* RNPixelColor.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RNPixelColor.m; sourceTree = ""; }; 32 | 806279EB1E1328DA00924BF6 /* UIImage+ColorAtPixel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UIImage+ColorAtPixel.h"; sourceTree = ""; }; 33 | 806279EC1E1328DA00924BF6 /* UIImage+ColorAtPixel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UIImage+ColorAtPixel.m"; sourceTree = ""; }; 34 | /* End PBXFileReference section */ 35 | 36 | /* Begin PBXFrameworksBuildPhase section */ 37 | 5D72D2E51C16249000E22EC1 /* Frameworks */ = { 38 | isa = PBXFrameworksBuildPhase; 39 | buildActionMask = 2147483647; 40 | files = ( 41 | ); 42 | runOnlyForDeploymentPostprocessing = 0; 43 | }; 44 | /* End PBXFrameworksBuildPhase section */ 45 | 46 | /* Begin PBXGroup section */ 47 | 5D72D2DF1C16249000E22EC1 = { 48 | isa = PBXGroup; 49 | children = ( 50 | 806279EA1E1328DA00924BF6 /* UIImage+ColorAtPixel */, 51 | 5D72D2EA1C16249000E22EC1 /* RNPixelColor */, 52 | 5D72D2E91C16249000E22EC1 /* Products */, 53 | ); 54 | sourceTree = ""; 55 | }; 56 | 5D72D2E91C16249000E22EC1 /* Products */ = { 57 | isa = PBXGroup; 58 | children = ( 59 | 5D72D2E81C16249000E22EC1 /* libRNPixelColor.a */, 60 | ); 61 | name = Products; 62 | sourceTree = ""; 63 | }; 64 | 5D72D2EA1C16249000E22EC1 /* RNPixelColor */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 5D72D2EB1C16249000E22EC1 /* RNPixelColor.h */, 68 | 5D72D2ED1C16249000E22EC1 /* RNPixelColor.m */, 69 | ); 70 | path = RNPixelColor; 71 | sourceTree = ""; 72 | }; 73 | 806279EA1E1328DA00924BF6 /* UIImage+ColorAtPixel */ = { 74 | isa = PBXGroup; 75 | children = ( 76 | 806279EB1E1328DA00924BF6 /* UIImage+ColorAtPixel.h */, 77 | 806279EC1E1328DA00924BF6 /* UIImage+ColorAtPixel.m */, 78 | ); 79 | path = "UIImage+ColorAtPixel"; 80 | sourceTree = ""; 81 | }; 82 | /* End PBXGroup section */ 83 | 84 | /* Begin PBXNativeTarget section */ 85 | 5D72D2E71C16249000E22EC1 /* RNPixelColor */ = { 86 | isa = PBXNativeTarget; 87 | buildConfigurationList = 5D72D2F11C16249000E22EC1 /* Build configuration list for PBXNativeTarget "RNPixelColor" */; 88 | buildPhases = ( 89 | 5D72D2E41C16249000E22EC1 /* Sources */, 90 | 5D72D2E51C16249000E22EC1 /* Frameworks */, 91 | 5D72D2E61C16249000E22EC1 /* CopyFiles */, 92 | ); 93 | buildRules = ( 94 | ); 95 | dependencies = ( 96 | ); 97 | name = RNPixelColor; 98 | productName = RCTImageResizer; 99 | productReference = 5D72D2E81C16249000E22EC1 /* libRNPixelColor.a */; 100 | productType = "com.apple.product-type.library.static"; 101 | }; 102 | /* End PBXNativeTarget section */ 103 | 104 | /* Begin PBXProject section */ 105 | 5D72D2E01C16249000E22EC1 /* Project object */ = { 106 | isa = PBXProject; 107 | attributes = { 108 | LastUpgradeCheck = 0710; 109 | ORGANIZATIONNAME = "Atticus White"; 110 | TargetAttributes = { 111 | 5D72D2E71C16249000E22EC1 = { 112 | CreatedOnToolsVersion = 7.1.1; 113 | }; 114 | }; 115 | }; 116 | buildConfigurationList = 5D72D2E31C16249000E22EC1 /* Build configuration list for PBXProject "RNPixelColor" */; 117 | compatibilityVersion = "Xcode 3.2"; 118 | developmentRegion = English; 119 | hasScannedForEncodings = 0; 120 | knownRegions = ( 121 | en, 122 | ); 123 | mainGroup = 5D72D2DF1C16249000E22EC1; 124 | productRefGroup = 5D72D2E91C16249000E22EC1 /* Products */; 125 | projectDirPath = ""; 126 | projectRoot = ""; 127 | targets = ( 128 | 5D72D2E71C16249000E22EC1 /* RNPixelColor */, 129 | ); 130 | }; 131 | /* End PBXProject section */ 132 | 133 | /* Begin PBXSourcesBuildPhase section */ 134 | 5D72D2E41C16249000E22EC1 /* Sources */ = { 135 | isa = PBXSourcesBuildPhase; 136 | buildActionMask = 2147483647; 137 | files = ( 138 | 5D72D2EE1C16249000E22EC1 /* RNPixelColor.m in Sources */, 139 | 806279ED1E1328DA00924BF6 /* UIImage+ColorAtPixel.m in Sources */, 140 | ); 141 | runOnlyForDeploymentPostprocessing = 0; 142 | }; 143 | /* End PBXSourcesBuildPhase section */ 144 | 145 | /* Begin XCBuildConfiguration section */ 146 | 5D72D2EF1C16249000E22EC1 /* Debug */ = { 147 | isa = XCBuildConfiguration; 148 | buildSettings = { 149 | ALWAYS_SEARCH_USER_PATHS = NO; 150 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 151 | CLANG_CXX_LIBRARY = "libc++"; 152 | CLANG_ENABLE_MODULES = YES; 153 | CLANG_ENABLE_OBJC_ARC = YES; 154 | CLANG_WARN_BOOL_CONVERSION = YES; 155 | CLANG_WARN_CONSTANT_CONVERSION = YES; 156 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 157 | CLANG_WARN_EMPTY_BODY = YES; 158 | CLANG_WARN_ENUM_CONVERSION = YES; 159 | CLANG_WARN_INT_CONVERSION = YES; 160 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 161 | CLANG_WARN_UNREACHABLE_CODE = YES; 162 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 163 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 164 | COPY_PHASE_STRIP = NO; 165 | DEBUG_INFORMATION_FORMAT = dwarf; 166 | ENABLE_STRICT_OBJC_MSGSEND = YES; 167 | ENABLE_TESTABILITY = YES; 168 | GCC_C_LANGUAGE_STANDARD = gnu99; 169 | GCC_DYNAMIC_NO_PIC = NO; 170 | GCC_NO_COMMON_BLOCKS = YES; 171 | GCC_OPTIMIZATION_LEVEL = 0; 172 | GCC_PREPROCESSOR_DEFINITIONS = ( 173 | "DEBUG=1", 174 | "$(inherited)", 175 | ); 176 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 177 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 178 | GCC_WARN_UNDECLARED_SELECTOR = YES; 179 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 180 | GCC_WARN_UNUSED_FUNCTION = YES; 181 | GCC_WARN_UNUSED_VARIABLE = YES; 182 | IPHONEOS_DEPLOYMENT_TARGET = 9.1; 183 | MTL_ENABLE_DEBUG_INFO = YES; 184 | ONLY_ACTIVE_ARCH = YES; 185 | SDKROOT = iphoneos; 186 | }; 187 | name = Debug; 188 | }; 189 | 5D72D2F01C16249000E22EC1 /* Release */ = { 190 | isa = XCBuildConfiguration; 191 | buildSettings = { 192 | ALWAYS_SEARCH_USER_PATHS = NO; 193 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 194 | CLANG_CXX_LIBRARY = "libc++"; 195 | CLANG_ENABLE_MODULES = YES; 196 | CLANG_ENABLE_OBJC_ARC = YES; 197 | CLANG_WARN_BOOL_CONVERSION = YES; 198 | CLANG_WARN_CONSTANT_CONVERSION = YES; 199 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 200 | CLANG_WARN_EMPTY_BODY = YES; 201 | CLANG_WARN_ENUM_CONVERSION = YES; 202 | CLANG_WARN_INT_CONVERSION = YES; 203 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 204 | CLANG_WARN_UNREACHABLE_CODE = YES; 205 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 206 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 207 | COPY_PHASE_STRIP = NO; 208 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 209 | ENABLE_NS_ASSERTIONS = NO; 210 | ENABLE_STRICT_OBJC_MSGSEND = YES; 211 | GCC_C_LANGUAGE_STANDARD = gnu99; 212 | GCC_NO_COMMON_BLOCKS = YES; 213 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 214 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 215 | GCC_WARN_UNDECLARED_SELECTOR = YES; 216 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 217 | GCC_WARN_UNUSED_FUNCTION = YES; 218 | GCC_WARN_UNUSED_VARIABLE = YES; 219 | IPHONEOS_DEPLOYMENT_TARGET = 9.1; 220 | MTL_ENABLE_DEBUG_INFO = NO; 221 | SDKROOT = iphoneos; 222 | VALIDATE_PRODUCT = YES; 223 | }; 224 | name = Release; 225 | }; 226 | 5D72D2F21C16249000E22EC1 /* Debug */ = { 227 | isa = XCBuildConfiguration; 228 | buildSettings = { 229 | HEADER_SEARCH_PATHS = ( 230 | "$(inherited)", 231 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 232 | "$(SRCROOT)/../../react-native/React/**", 233 | "$(SRCROOT)/../../react-native/Libraries/**", 234 | ); 235 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 236 | OTHER_LDFLAGS = "-ObjC"; 237 | PRODUCT_NAME = "$(TARGET_NAME)"; 238 | SKIP_INSTALL = YES; 239 | }; 240 | name = Debug; 241 | }; 242 | 5D72D2F31C16249000E22EC1 /* Release */ = { 243 | isa = XCBuildConfiguration; 244 | buildSettings = { 245 | HEADER_SEARCH_PATHS = ( 246 | "$(inherited)", 247 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 248 | "$(SRCROOT)/../../react-native/React/**", 249 | "$(SRCROOT)/../../react-native/Libraries/**", 250 | ); 251 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 252 | OTHER_LDFLAGS = "-ObjC"; 253 | PRODUCT_NAME = "$(TARGET_NAME)"; 254 | SKIP_INSTALL = YES; 255 | }; 256 | name = Release; 257 | }; 258 | /* End XCBuildConfiguration section */ 259 | 260 | /* Begin XCConfigurationList section */ 261 | 5D72D2E31C16249000E22EC1 /* Build configuration list for PBXProject "RNPixelColor" */ = { 262 | isa = XCConfigurationList; 263 | buildConfigurations = ( 264 | 5D72D2EF1C16249000E22EC1 /* Debug */, 265 | 5D72D2F01C16249000E22EC1 /* Release */, 266 | ); 267 | defaultConfigurationIsVisible = 0; 268 | defaultConfigurationName = Release; 269 | }; 270 | 5D72D2F11C16249000E22EC1 /* Build configuration list for PBXNativeTarget "RNPixelColor" */ = { 271 | isa = XCConfigurationList; 272 | buildConfigurations = ( 273 | 5D72D2F21C16249000E22EC1 /* Debug */, 274 | 5D72D2F31C16249000E22EC1 /* Release */, 275 | ); 276 | defaultConfigurationIsVisible = 0; 277 | defaultConfigurationName = Release; 278 | }; 279 | /* End XCConfigurationList section */ 280 | }; 281 | rootObject = 5D72D2E01C16249000E22EC1 /* Project object */; 282 | } 283 | -------------------------------------------------------------------------------- /ios/RNPixelColor/RNPixelColor.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface RNPixelColor : NSObject 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /ios/RNPixelColor/RNPixelColor.m: -------------------------------------------------------------------------------- 1 | #include "RNPixelColor.h" 2 | #import 3 | #import "UIImage+ColorAtPixel.h" 4 | 5 | @implementation RNPixelColor 6 | 7 | @synthesize bridge = _bridge; 8 | 9 | RCT_EXPORT_MODULE(); 10 | 11 | RCT_EXPORT_METHOD(getHex:(NSString *)path 12 | options:(NSDictionary *)options 13 | callback:(RCTResponseSenderBlock)callback) 14 | { 15 | 16 | [[_bridge moduleForName:@"ImageLoader" lazilyLoadIfNecessary:YES] loadImageWithURLRequest:[RCTConvert NSURLRequest:path] callback:^(NSError *error, UIImage *image) { 17 | if (error || image == nil) { // if couldn't load from bridge create a new UIImage 18 | if ([path hasPrefix:@"data:"] || [path hasPrefix:@"file:"]) { 19 | NSURL *imageUrl = [[NSURL alloc] initWithString:path]; 20 | image = [UIImage imageWithData:[NSData dataWithContentsOfURL:imageUrl]]; 21 | } else { 22 | image = [[UIImage alloc] initWithContentsOfFile:path]; 23 | } 24 | 25 | if (image == nil) { 26 | callback(@[@"Could not create image from given path.", @""]); 27 | return; 28 | } 29 | } 30 | 31 | NSInteger x = [RCTConvert NSInteger:options[@"x"]]; 32 | NSInteger y = [RCTConvert NSInteger:options[@"y"]]; 33 | if (options[@"width"] && options[@"height"]) { 34 | NSInteger scaledWidth = [RCTConvert NSInteger:options[@"width"]]; 35 | NSInteger scaledHeight = [RCTConvert NSInteger:options[@"height"]]; 36 | float originalWidth = image.size.width; 37 | float originalHeight = image.size.height; 38 | 39 | x = x * (originalWidth / scaledWidth); 40 | y = y * (originalHeight / scaledHeight); 41 | 42 | } 43 | 44 | CGPoint point = CGPointMake(x, y); 45 | 46 | UIColor *pixelColor = [image colorAtPixel:point]; 47 | callback(@[[NSNull null], hexStringForColor(pixelColor)]); 48 | 49 | }]; 50 | } 51 | 52 | NSString * hexStringForColor( UIColor* color ) { 53 | const CGFloat *components = CGColorGetComponents(color.CGColor); 54 | if(!components){ 55 | return @"#000000"; 56 | } 57 | CGFloat r = components[0]; 58 | CGFloat g = components[1]; 59 | CGFloat b = components[2]; 60 | NSString *hexString=[NSString stringWithFormat:@"#%02X%02X%02X", (int)(r * 255), (int)(g * 255), (int)(b * 255)]; 61 | 62 | return hexString; 63 | } 64 | 65 | @end 66 | -------------------------------------------------------------------------------- /ios/UIImage+ColorAtPixel/UIImage+ColorAtPixel.h: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2009 Ole Begemann 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in 12 | all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | */ 22 | 23 | /* 24 | UIImage+ColorAtPixel.h 25 | 26 | Created by Ole Begemann 27 | October, 2009 28 | */ 29 | 30 | #import 31 | 32 | /* 33 | A category on UIImage that enables you to query the color value of arbitrary 34 | pixels of the image. 35 | */ 36 | @interface UIImage (ColorAtPixel) 37 | 38 | - (UIColor *)colorAtPixel:(CGPoint)point; 39 | 40 | @end 41 | -------------------------------------------------------------------------------- /ios/UIImage+ColorAtPixel/UIImage+ColorAtPixel.m: -------------------------------------------------------------------------------- 1 | /* 2 | Copyright (c) 2009 Ole Begemann 3 | 4 | Permission is hereby granted, free of charge, to any person obtaining a copy 5 | of this software and associated documentation files (the "Software"), to deal 6 | in the Software without restriction, including without limitation the rights 7 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 8 | copies of the Software, and to permit persons to whom the Software is 9 | furnished to do so, subject to the following conditions: 10 | 11 | The above copyright notice and this permission notice shall be included in 12 | all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 20 | THE SOFTWARE. 21 | */ 22 | 23 | /* 24 | UIImage+ColorAtPixel.m 25 | 26 | Created by Ole Begemann 27 | October, 2009 28 | */ 29 | 30 | #import 31 | #import "UIImage+ColorAtPixel.h" 32 | 33 | @implementation UIImage (ColorAtPixel) 34 | 35 | /* 36 | Returns the color of the image pixel at point. Returns nil if point lies outside the image bounds. 37 | If the point coordinates contain decimal parts, they will be truncated. 38 | 39 | To get at the pixel data, this method must draw the image into a bitmap context. 40 | For minimal memory usage and optimum performance, only the specific requested 41 | pixel is drawn. 42 | If you need to query pixel colors for the same image repeatedly (e.g., in a loop), 43 | this approach is probably less efficient than drawing the entire image into memory 44 | once and caching it. 45 | */ 46 | - (UIColor *)colorAtPixel:(CGPoint)point 47 | { 48 | // Cancel if point is outside image coordinates 49 | if (!CGRectContainsPoint(CGRectMake(0.0f, 0.0f, self.size.width, self.size.height), point)) { 50 | return nil; 51 | } 52 | 53 | // Create a 1x1 pixel byte array and bitmap context to draw the pixel into. 54 | // Reference: http://stackoverflow.com/questions/1042830/retrieving-a-pixel-alpha-value-for-a-uiimage 55 | NSInteger pointX = point.x; 56 | NSInteger pointY = point.y; 57 | CGImageRef cgImage = self.CGImage; 58 | NSUInteger width = self.size.width; 59 | NSUInteger height = self.size.height; 60 | CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 61 | int bytesPerPixel = 4; 62 | int bytesPerRow = bytesPerPixel * 1; 63 | NSUInteger bitsPerComponent = 8; 64 | unsigned char pixelData[4] = { 0, 0, 0, 0 }; 65 | CGContextRef context = CGBitmapContextCreate(pixelData, 66 | 1, 67 | 1, 68 | bitsPerComponent, 69 | bytesPerRow, 70 | colorSpace, 71 | kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 72 | CGColorSpaceRelease(colorSpace); 73 | CGContextSetBlendMode(context, kCGBlendModeCopy); 74 | 75 | // Draw the pixel we are interested in onto the bitmap context 76 | CGContextTranslateCTM(context, -pointX, pointY-(CGFloat)height); 77 | CGContextDrawImage(context, CGRectMake(0.0f, 0.0f, (CGFloat)width, (CGFloat)height), cgImage); 78 | CGContextRelease(context); 79 | 80 | // Convert color values [0..255] to floats [0.0..1.0] 81 | CGFloat red = (CGFloat)pixelData[0] / 255.0f; 82 | CGFloat green = (CGFloat)pixelData[1] / 255.0f; 83 | CGFloat blue = (CGFloat)pixelData[2] / 255.0f; 84 | CGFloat alpha = (CGFloat)pixelData[3] / 255.0f; 85 | return [UIColor colorWithRed:red green:green blue:blue alpha:alpha]; 86 | } 87 | 88 | @end 89 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-pixel-color", 3 | "version": "0.0.5", 4 | "description": "Returns the pixel color from a graphic at a given corrdinate.", 5 | "repository": { 6 | "type": "git", 7 | "url": "git+https://github.com/spacesuitdiver/react-native-pixel-color.git" 8 | }, 9 | "keywords": [ 10 | "react-native", 11 | "react", 12 | "android", 13 | "ios", 14 | "images", 15 | "image", 16 | "image-resizer", 17 | "scaling", 18 | "scale", 19 | "resize" 20 | ], 21 | "peerDependencies": { 22 | "react-native": ">=v0.14.2" 23 | }, 24 | "homepage": "https://github.com/spacesuitdiver/react-native-pixel-color.git", 25 | "author": "Chris LeBlanc (http://spacesuitdiver.com)", 26 | "license": "MIT" 27 | } 28 | -------------------------------------------------------------------------------- /react-native-pixel-color.podspec: -------------------------------------------------------------------------------- 1 | require 'json' 2 | 3 | package = JSON.parse(File.read(File.join(__dir__, 'package.json'))) 4 | 5 | Pod::Spec.new do |s| 6 | s.name = package['name'] 7 | s.version = package['version'] 8 | s.summary = package['description'] 9 | s.license = package['license'] 10 | 11 | s.authors = package['author'] 12 | s.homepage = package['homepage'] 13 | s.platforms = { :ios => "9.0", :osx => "10.14" } 14 | 15 | s.source = { :git => "https://github.com/guilhermegarcz/react-native-pixel-color.git", :tag => "v#{s.version}" } 16 | s.source_files = "ios/**/*.{h,m}" 17 | 18 | s.dependency 'React' 19 | end 20 | --------------------------------------------------------------------------------