├── .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 |
--------------------------------------------------------------------------------