From da90daa37a714037038ca19d849dced4a57eb681 Mon Sep 17 00:00:00 2001 From: Dmitry Gladkov Date: Fri, 6 May 2016 17:01:04 +0300 Subject: [PATCH] Upgrade example project to latest react-native version --- Examples/AnimatedGradient/.buckconfig | 6 + Examples/AnimatedGradient/.flowconfig | 63 ++- Examples/AnimatedGradient/.gitignore | 42 +- .../contents.xcworkspacedata | 7 - .../xcshareddata/AnimatedGradient.xccheckout | 41 -- .../AnimatedGradient.xcscmblueprint | 30 -- .../UserInterfaceState.xcuserstate | Bin 13985 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 13600 -> 0 bytes .../xcschemes/xcschememanagement.plist | 22 -- .../xcschemes/xcschememanagement.plist | 22 -- Examples/AnimatedGradient/android/app/BUCK | 66 ++++ .../AnimatedGradient/android/app/build.gradle | 67 +++- .../android/app/proguard-rules.pro | 7 +- .../AnimatedGradient/android/app/react.gradle | 87 ----- .../android/app/src/main/AndroidManifest.xml | 9 +- .../com/animatedgradient/MainActivity.java | 90 ++--- .../AnimatedGradient/android/build.gradle | 5 +- .../AnimatedGradient/android/keystores/BUCK | 8 + .../AnimatedGradient/android/settings.gradle | 3 +- Examples/AnimatedGradient/iOS/main.jsbundle | 5 - Examples/AnimatedGradient/incrementColor.js | 13 - Examples/AnimatedGradient/index.android.js | 65 +--- Examples/AnimatedGradient/index.ios.js | 65 +--- .../project.pbxproj | 366 +++++++++++++----- .../xcschemes/AnimatedGradient.xcscheme | 24 ++ .../AnimatedGradient}/AppDelegate.h | 0 .../AnimatedGradient}/AppDelegate.m | 41 +- .../Base.lproj/LaunchScreen.xib | 4 +- .../AppIcon.appiconset/Contents.json | 0 .../{iOS => ios/AnimatedGradient}/Info.plist | 13 +- .../{iOS => ios/AnimatedGradient}/main.m | 0 .../AnimatedGradientTests.m | 70 ++++ .../ios/AnimatedGradientTests/Info.plist | 24 ++ .../project.pbxproj | 32 +- Examples/AnimatedGradient/package.json | 9 +- Examples/AnimatedGradient/src/index.js | 63 +++ 36 files changed, 791 insertions(+), 578 deletions(-) create mode 100644 Examples/AnimatedGradient/.buckconfig delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xccheckout delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xcscmblueprint delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcuserdata/brent.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcuserdata/brentvatne.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brent.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brentvatne.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Examples/AnimatedGradient/android/app/BUCK delete mode 100644 Examples/AnimatedGradient/android/app/react.gradle create mode 100644 Examples/AnimatedGradient/android/keystores/BUCK delete mode 100644 Examples/AnimatedGradient/iOS/main.jsbundle delete mode 100644 Examples/AnimatedGradient/incrementColor.js rename Examples/AnimatedGradient/{ => ios}/AnimatedGradient.xcodeproj/project.pbxproj (63%) rename Examples/AnimatedGradient/{ => ios}/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme (75%) rename Examples/AnimatedGradient/{iOS => ios/AnimatedGradient}/AppDelegate.h (100%) rename Examples/AnimatedGradient/{iOS => ios/AnimatedGradient}/AppDelegate.m (54%) rename Examples/AnimatedGradient/{iOS => ios/AnimatedGradient}/Base.lproj/LaunchScreen.xib (94%) rename Examples/AnimatedGradient/{iOS => ios/AnimatedGradient}/Images.xcassets/AppIcon.appiconset/Contents.json (100%) rename Examples/AnimatedGradient/{iOS => ios/AnimatedGradient}/Info.plist (82%) rename Examples/AnimatedGradient/{iOS => ios/AnimatedGradient}/main.m (100%) create mode 100644 Examples/AnimatedGradient/ios/AnimatedGradientTests/AnimatedGradientTests.m create mode 100644 Examples/AnimatedGradient/ios/AnimatedGradientTests/Info.plist create mode 100644 Examples/AnimatedGradient/src/index.js diff --git a/Examples/AnimatedGradient/.buckconfig b/Examples/AnimatedGradient/.buckconfig new file mode 100644 index 0000000..934256c --- /dev/null +++ b/Examples/AnimatedGradient/.buckconfig @@ -0,0 +1,6 @@ + +[android] + target = Google Inc.:Google APIs:23 + +[maven_repositories] + central = https://repo1.maven.org/maven2 diff --git a/Examples/AnimatedGradient/.flowconfig b/Examples/AnimatedGradient/.flowconfig index 8eadd33..f56848d 100644 --- a/Examples/AnimatedGradient/.flowconfig +++ b/Examples/AnimatedGradient/.flowconfig @@ -14,17 +14,21 @@ # Ignore react and fbjs where there are overlaps, but don't ignore # anything that react-native relies on -.*/node_modules/fbjs-haste/.*/__tests__/.* -.*/node_modules/fbjs-haste/__forks__/Map.js -.*/node_modules/fbjs-haste/__forks__/Promise.js -.*/node_modules/fbjs-haste/__forks__/fetch.js -.*/node_modules/fbjs-haste/core/ExecutionEnvironment.js -.*/node_modules/fbjs-haste/core/isEmpty.js -.*/node_modules/fbjs-haste/crypto/crc32.js -.*/node_modules/fbjs-haste/stubs/ErrorUtils.js -.*/node_modules/react-haste/React.js -.*/node_modules/react-haste/renderers/dom/ReactDOM.js -.*/node_modules/react-haste/renderers/shared/event/eventPlugins/ResponderEventPlugin.js +.*/node_modules/fbjs/lib/Map.js +.*/node_modules/fbjs/lib/fetch.js +.*/node_modules/fbjs/lib/ExecutionEnvironment.js +.*/node_modules/fbjs/lib/ErrorUtils.js + +# Flow has a built-in definition for the 'react' module which we prefer to use +# over the currently-untyped source +.*/node_modules/react/react.js +.*/node_modules/react/lib/React.js +.*/node_modules/react/lib/ReactDOM.js + +.*/__mocks__/.* +.*/__tests__/.* + +.*/commoner/test/source/widget/share.js # Ignore commoner tests .*/node_modules/commoner/test/.* @@ -38,26 +42,55 @@ # Ignore Website .*/website/.* +# Ignore generators +.*/local-cli/generator.* + +# Ignore BUCK generated folders +.*\.buckd/ + +.*/node_modules/is-my-json-valid/test/.*\.json +.*/node_modules/iconv-lite/encodings/tables/.*\.json +.*/node_modules/y18n/test/.*\.json +.*/node_modules/spdx-license-ids/spdx-license-ids.json +.*/node_modules/spdx-exceptions/index.json +.*/node_modules/resolve/test/subdirs/node_modules/a/b/c/x.json +.*/node_modules/resolve/lib/core.json +.*/node_modules/jsonparse/samplejson/.*\.json +.*/node_modules/json5/test/.*\.json +.*/node_modules/ua-parser-js/test/.*\.json +.*/node_modules/builtin-modules/builtin-modules.json +.*/node_modules/binary-extensions/binary-extensions.json +.*/node_modules/url-regex/tlds.json +.*/node_modules/joi/.*\.json +.*/node_modules/isemail/.*\.json +.*/node_modules/tr46/.*\.json + + [include] [libs] node_modules/react-native/Libraries/react-native/react-native-interface.js +node_modules/react-native/flow +flow/ [options] module.system=haste +esproposal.class_static_fields=enable +esproposal.class_instance_fields=enable + munge_underscores=true module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' -module.name_mapper='^[./a-zA-Z0-9$_-]+\.png$' -> 'RelativeImageStub' +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\)$' -> 'RelativeImageStub' suppress_type=$FlowIssue suppress_type=$FlowFixMe suppress_type=$FixMe -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(1[0-8]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(1[0-8]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-3]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-3]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy [version] -0.18.1 +0.23.0 diff --git a/Examples/AnimatedGradient/.gitignore b/Examples/AnimatedGradient/.gitignore index 07e4fe7..e2694b1 100644 --- a/Examples/AnimatedGradient/.gitignore +++ b/Examples/AnimatedGradient/.gitignore @@ -1 +1,41 @@ -node_modules/**/* +# OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +project.xcworkspace + +# Android/IJ +# +.idea +.gradle +local.properties + +# node.js +# +node_modules/ +npm-debug.log +*.jsbundle + +# BUCK +buck-out/ +\.buckd/ +android/app/libs +android/keystores/debug.keystore diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index d39c9b0..0000000 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xccheckout b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xccheckout deleted file mode 100644 index b0cec9c..0000000 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xccheckout +++ /dev/null @@ -1,41 +0,0 @@ - - - - - IDESourceControlProjectFavoriteDictionaryKey - - IDESourceControlProjectIdentifier - 439833FD-A58F-4243-8AD6-E877313B0F6A - IDESourceControlProjectName - AnimatedGradient - IDESourceControlProjectOriginsDictionary - - C854EADF02A501C352F1C31CE594A07F661B2A78 - github.com:brentvatne/react-native-linear-gradient.git - - IDESourceControlProjectPath - Examples/AnimatedGradient/AnimatedGradient.xcodeproj - IDESourceControlProjectRelativeInstallPathDictionary - - C854EADF02A501C352F1C31CE594A07F661B2A78 - ../../../.. - - IDESourceControlProjectURL - github.com:brentvatne/react-native-linear-gradient.git - IDESourceControlProjectVersion - 111 - IDESourceControlProjectWCCIdentifier - C854EADF02A501C352F1C31CE594A07F661B2A78 - IDESourceControlProjectWCConfigurations - - - IDESourceControlRepositoryExtensionIdentifierKey - public.vcs.git - IDESourceControlWCCIdentifierKey - C854EADF02A501C352F1C31CE594A07F661B2A78 - IDESourceControlWCCName - react-native-linear-gradient - - - - diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xcscmblueprint b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xcscmblueprint deleted file mode 100644 index 29931f9..0000000 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcshareddata/AnimatedGradient.xcscmblueprint +++ /dev/null @@ -1,30 +0,0 @@ -{ - "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "C854EADF02A501C352F1C31CE594A07F661B2A78", - "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { - - }, - "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { - "16CE14A2D81CCE323D476004724594AEF6B38C0A" : 0, - "C854EADF02A501C352F1C31CE594A07F661B2A78" : 0 - }, - "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "439833FD-A58F-4243-8AD6-E877313B0F6A", - "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { - "16CE14A2D81CCE323D476004724594AEF6B38C0A" : "", - "C854EADF02A501C352F1C31CE594A07F661B2A78" : "react-native-linear-gradient" - }, - "DVTSourceControlWorkspaceBlueprintNameKey" : "AnimatedGradient", - "DVTSourceControlWorkspaceBlueprintVersion" : 204, - "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "Examples\/AnimatedGradient\/AnimatedGradient.xcodeproj", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:exponentjs\/react-native.git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "16CE14A2D81CCE323D476004724594AEF6B38C0A" - }, - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "github.com:brentvatne\/react-native-linear-gradient.git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "C854EADF02A501C352F1C31CE594A07F661B2A78" - } - ] -} \ No newline at end of file diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcuserdata/brent.xcuserdatad/UserInterfaceState.xcuserstate b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcuserdata/brent.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index ffc02fe1216a9dc63d190191c8901b41078fe21f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13985 zcmc(F33!vm*8ePTmn3bIG-;cqZMLROY14)7h(K4Ul!A0&r=)EtkB z+JSbWr_gTn9NLTap_kD?^fr12y^G#M@1qaUr|2_u7JZF=KtH0N&~F%Fj3aO~R$w(Y zU?U!YGjJZx$Aj^ecnBVf8*n2YhsWaycp{#JC*vu2DsIJgJQKI$*?10~i@WiBd@H^U z-;P(|JMe0JCtics;>~yq-ijZ<58{XLcDxfmhyQ_}#|Q8$_!NE{zk}b!@8S3H2l!+B z3H}s+fxpJz;vew82_l#f5=Ej(43QEUk&`&0CdtG|OvFmE$Uss|O30OD2q_~~NuaT4Feex0cjGQ5#le6So@&oxd`HjXb z^eOrbeV*>6hv=*HFnx`_Nl(zX=zH`u{fM5U-_Y~)TlyXSp8k{mK!2gX(%(24C+A{0 z1*hcVxOgssQ*mle!)duhE{RLyEL=J_fE&mS=C0(1a6`FaTq#$^)o`P@T5dEqft$!p z;wE#`xi)SF*UoivjPr5}xkcQK+){2iw}QKcyS*W$qpQ9B7!n~dlAtIgMX}>*>#}Cr zyWJDv(=X+XDJ|_bx4Q>LqZmdQ?LjgmXB>Ns2t~X&2)F#TI?0hmabX$4o_g>c$AD%x1t23LTaQz zT9k;ASQrau5iF94n3zenA|28r1FS%eQjnQNv1lfRwL~y2D`x3adFqaiR_B~5mu;54 zNoIhC(XLjz%ibECwcgfT?(FcmobBzP#!a#z{g)Kd*_26q@YyP9M=7+%`q0kpXE zlA2^{o}h0V^-gDdv&~iQZgjXE&F!!wRbQX2xh$kBZr;3{Onv_RO#M9IH+(HB%9}s` zsP9a3(7=sI4Sb3@itfVQ>{Pi3pa<8--eY~9W-Pm@dr`>mVdoKtI? z?P#+>&m?GoQ>w8w+uNIDR-PRJc?vna29KlN;pr}Q*===zf==efN zRM_2)wvG@AlX)@~_U5j(HvTLFs}m-3*xkGY0*xw1yM2t!Gh+%o3LE07$dIT>rYY@k z%(8jxt;1cmRtJbh*4!3ntG(0Zye7csCS*gY8__hDyb(1s9nT+mMPq$%8`U2BEVpp3 z(~+YGwV@eI&r+EsKwu{7K(Rfj9nE3}X6!*u)X7XNg_)-Snf|gUgJ*t6qik&*4o_FB zeT-??4bu?+Pmq&2Xzt|Nx(Wx#tFy!A0>PMriUZSJhvr{2%>tMvjhRiuocex57NHxb z*4B;c^4LIxee%_d7V#1$%&`RB)Fe{`2lP$WiqcWw14{>sM#2HvnlBqAuF9`t7F7)&Uc7<@j&!9aZME>)y zvwM2cGw4}V+)!Hw4}u*3!#|w2KQAE124)f3U+UL>!1q0H8i&xED0K^Z6&*&ep(Ai6 zZ?IBU#>!a*oJQpqkY6)84!>`qldKB(JqmtDvoSo^c_S3$8?Q_CF1z1Y2>TBhra$w6 z$NHe`gwQCnPj|ZP!8Zhwi7>pbd{mvs=IL?=`}}9zB$M*p{?p-K2<+`c^bv~Ph)%QN z8_~yX1aDvYp^dh7km6F`asxxppf7l=_?%U5L|?M2`0dFqMwr0ZbLd-?+JnA9=h;YB z(}T{#mm2s1U{o^pf zTz~)$V^;?W;7BYEu9%-cJ@7^hmIYuB%UK;u_lW>jB1bQd!|^zQ)w4!6J_vJIgOft= zXDHTz0czm!r*oJOe*&aUI5lKs1-39X8^@2lX>Z8LOq|_+B+dbv6L^{e*av~0$MXR7 z0$dDy#f7+tO=6RKz|y6FWz+I3()zSTf6|5>~oG#c~-2v)vcY6QK2c+!^Zm%ArIDeM~B_!vbOn6OLpa4+pJDd`0R^CBD(`{ zvT2sHwTtf!AsCc}>~Z$yI%msFyC-{Wd42HVPxcBA!&dJfL{&#>|n33gX~S84D*}`*jd3& z$Abn4wsaJ~cF?JgR-3DpH?jO+p$n9|Q3%e2=en+D*ra`8zZYc+c%#BT-PYCa@y#HR z*ZZ5s@UOc)!0xeNlEM+lxD}6L+#%tb;jwu?x8AVV%Ii zCwMtc51Ed~9(x^lPaSQ(uR-$)+79+1bgUnXE^Z%gch0hVT-|~~UI)G;p2x0bF@Z(h zfR}*dju&8ty?7yBgm1))nTxrZhjp>pYz~{d72kxH;$`?|_*sE(VcqOHwuxm^19j7nfrHO`iR5L+)XygzX;$vg`ECHXNf`)r4^ z%Uy4Cwb}h1dpRE)2Ke(Zel!T>+n6^1<&T56il4wwvW0AMAB;bRcZWdkGk6bM#BSu7 zX6R#3Q0Mrw?mIWrFncJ}@5TH2Q$tR?ADq%9Jk-w*h5Cc|4e%iFA^a*nj9+k0vD?`yb_ZL{YqbA_{&X4@4tGnt6Ff9t7~Lc7 z-2=07nq;XnFLQWxEqoL@#_8zrz*vy=+`O`!qN?Je+|t70oT`GdoSf34g0hm*zOM4i zcU4}#tMKA3L6bj3PjAGh*{$pfh)Zf59W(W14&KYxk8^lt=!1r!k&i2Lf|mU=d`9p9 z0;l~Y{wlQL9R4P>;XC}j&>+nFBaa|Iu{A8_IQ|*`f`3I4{2Trq|A8+|aQiR_baR5o z0X+180h`q7PZWS|vb)$iww7&dl3h0)Fk?`5_J7MlUTiY^>|VC1^x1eW>HD2cehv^y zA|Ny&90?=gY(2Z1-P21ViHL~Vz3e`AKTB^Ew6#&tm_X2x_a_1Br>F^+5t>Ulcs{O@ zSl}vAunj?6Ch;U8z;+1wiH2wcAyNQ`E(VBRl1P$J@qZcy@ft*q7rz|fhK}fkX#q$t zvxyTVg_x0qq>?mZA?aiQ$sn1qvx`Yi?bCEVp7xEH1?I4?nU7l_0Gc~`df?r@KK3x% z!X9Ot*+WgTY~M=w&@jX@R5*EZS-~7aFzOR{n$7bxhiwI(l01?RD=t7)q-bK_91XtN z*#lsGAH3wz@SGn+K*RW8pwF1WL;$nCm&e!~t{yU&XZv4{Q7pJ1{5$5;m|yT8WEd$0 zZFqzU;W{ZNkYl^l(e#i?p8Tb{d@&jsPDX%@x|lnC%MG=?J*1i^_qWGif-z09BH=^? z3Gv&-x~|Snr^}Nis7v5PvqHukBctFPYDp;>ga6?3l+9ocC&8!7-tO~>8DfvKwZgvY zNIk@v031D}j!!s1fJqwpLmkJSWHBKjY*8V=TtP{0Foq$M$TXC?iA*L_$W+qAcCx3~ zF81^$Vk6C@g|xEW?0NPAdy%D&udz?}Wtb+6b+pa!eVZt_dp=)P2*U$esG!ps(3hE{ zlb@!Y%px7c$(~_**t6_8K6y|@+z?9?gKYi7A5Szwn8y1;kP)=c@r4g#ZF7Xc5HLKn z*YC~MwK(}yfIg(t_d0MIa$GGgM<<_hgDhOg5Fd5kArrVZ4-M=GEjJJb7M?6%dpDvg zSRWWgIb=QE&USwc%x_$V16y1|mIfRGvW)HXI|O6}I0WPtvXZ^TUJg10nSriXLKz0xNoyU(q)5 z7<-i+>08kgWM{}cPmx{hFnf)eCxFHXvT7Q(Xj;gO&ywdu-q}lDV6U?`c(;ZR<^!<= zAAOjHP2TH!_c(c(93ZcNj2;B>ew7@C%!|wE^a!%VhZ(he>?2EPvv)YU{5~3=Y_`w! z2tBG!7o-oCC^z$M9BXwrDN!D?@XIJ2?S z#z&izT6nr09wCvWZ}r>Y%R#~yPrM$lE@Ye~+DF$9Q0QRp5q@4JSX6 zpPFQ8a411D5RwND<$e$O7ms~^censUKa*dYWTw9{Ll60tr~Y?_26XFp8V1o9`GZ`b zh+;}8r5yW!eaKF;kJ!iT6ZYv=ltLqDBo$FHmCz`FlFz(Y=fy@Z&hg^0UWmd$f0bn* ziZeTTZ`AF(py0FA04n~#Sdb`RROYU7x&Tt$lZAVXx|SJs{!WVKh z$#QCJZcn+BPecI0zVKIgtqj1s)%PM~>%qzZCV_$kkYBh40ccVQnYmEAz^}p21sYG) zd=h2_RY6F3riW^%mVNHUN`7alLEF!#g+pm%)%jwua?q;)DIGNeDXOOi_67T@hni># z`l_3gOC1CUQUFofd412+y^YQfnQf6`yuFp(+PCqfAWO`3!F+@ffuw1-$iYZR=Ah_ z3(^YzhP1+h&D2h((>6MTI@r(bcQ1xCi`a`5{F=){d?P`&{qa29so6dCwqPvZKa1BC z@(>7UL$VY7vjY874uSP{&}(@$anerq3;VT)xTzc5l;8M8B?^o3fdxdi!J7l$%@yQ5 zh3>%m{0ixS6o{>x_Z#X;gSXMNo6ZZ^X?i{TBOn0_z)n*}z3hS)qoARtH`1H>8(kdC zB?K0|g5KJHKwo+wFkm%Z&r9SXx`wW$>+q{=sTUJ3re4gkWt-{U^d5RIy$>Jt;xI3c z@Zv}>7C~|VHm%AlFD|U8%FoL!t*9DUUXquSlV4O;oXbb={;q<{cMZI_OOU9|=;`A=wozyXv33qhtMEU-o?x6(_Sp;uS9$3vos3> zPoup!ikxzj6xMo# zU+e2$9NVW@N9nP@t5_%L+aN;plo!Wsr0;m)A|V9HKje|qi{qPQo&RO%bd0XcF752B z0LL8evh7*30!;mwehv`;{e*r>Kci>7SmniPFV=Xmb`$-Aeu>QVtQRMGaS|)`;$)w& zjS>93fT64pBuk(a!}((tp9l5BddxxuV12w|PBlB`@POlh6%Y4t76dQtbF(vq_Lg3^LgYiVI_t~I|bC*N9D zQdw-R$j{9!t1KO=K6WfC3E2A^l~~*&l$Wp*NX>w zab7QH;!-$ZbiNl~?Zv)J>Kr(|PzTNL%t4Z_u4@(_Z3qWjXK&-nd3bN_Pp^#b^k1Uz z*Epfn>K&eTA;#n~kYh8K$yvE9E}H|_w7`o8d+{(YuJFQjQlP$p%j3Xn=;iXc05q`$oEbLHIdOKoZdSIwWtm0mo=cOIr;0zq`OzQLD144mf} zuKrT*H*k&II4>^s;xaETXX&P4GJ(L@L4UQHDI8p5{h7thTnpFg#g$%M<;BB++R$%9 z_IH$XAPIL3H3HTUP}^FN_3_#pybpl&ll$4Mr2R*Ez1U!>rS*+QFZKXCBT>!%~IK z%cEs{jT$I;7QlPEy{;QB5N9=1^Tf)W?X5>s(=6$is<-k_*kc*cS8SDO6=!AVz#7KQ zaCq#nGv8Y3_=35z93-Pm4CDsp1s2&eZ~#0P6o!`R6!4A3C4embIMXWdtY^@GOSVJU zRa*z%8iZs1YSuTe98%Ax9~g!@Ryma9nV@!cAS!}7u#r%?ItevHY0W$16~(aSBQrK1EQifH4loa=5!U;1q22Rhw4h8e9wa z!3|JhIt}VeUAPNh2X&>Zpo(-ieipwVaG7A?6AI5l{^5OIJi-@dbF;XPDZxq;{ywo6 znw+Q@_{={AROMQ3F5LV8ez-XgSIEug=J-(LDlZ-hK;p$UUOZ|GS4>*CdEE7+g|q;u zuot|z){DnL!tVthT8w{<0YcW~KMaC30r>Nogiu5b0V#e^ou`{G{`(Ijc^|+x@+h|$ zv~US`6EE}pHHt47lFjeF&x=P3oLa`+EHK61!!6@84)S_utF2pa^XPMP2Ic1KOGnAR z@;P7JO61sxqCu;KnjCHwUyyMNHPBOVb^8@KRm^e;(c$jm);IV90H5@zkr8U23(z1m z6l!e0BY)6vsI65&Rjm#vrBVx2)@DL2?KMz4yM!*KH`5h#CB2QVqN|~Lb~D`y^|KGt zN5QLooIXikq-UV=wUL|4t>zx%4sdU9$G8*RN$xavmivMGEewZ=!xF+W!?MD1!Ul%r zhZTkuhYboF95y6uSXe{YxUdOflftHiHHF#2TEgsMZDEeEnPE4Etqto9I~H~(JTBZA zUJzapJ~q5Qydm5bz94*I_>JK=g)a+V9)5rL1L2Q`KNkLY_>au= zqv6NHKMwyf{HO2>5s?vb5t@j!h|Gwrh@6Omh@yy+h$|v0B1T0_j%bN!k60M7EMiT> zy%G0EY>eoQcqrnLh;0$uBc6yj8gV946d50x9+?qojm(bBjm(QIh%AaMiM%4RHgZhl z*vR_G#>nxJ6C)=_PK}%v*&I1Paz*5Z$Q_aUBHxWXFOrD#B7>+{R4OVHRftB3CW>sL zHc_YOT9I3Hy=cB@foQ2{nP|CawdhXKTG1xa#Y@FEi&u#66F)58Cf+W7QoK{VOMFOtQv9Cy1Mz9` zXX4MrUy9F)e-!^Dp^|V(q(mZ#mPjRuk|as8L@z0lR7i$PswFj&TFDs66v;G6v&1fG zlQ<-^CEb#Fk{cvUvQV;IvP!aAvPQB_vR<-P@`z-cWV>XiWS3;OWRK(}$(xe5B&Q_r zNIsN&B>6=0ndBSEuTdz9L~&7~D6k4q(kNq8c2s^;VN`L{l~F^ZN~6l7Y*CA%jnUcB zWziMURna4&uZpgTu8kfOJvO>Nx-HrfJu`Y%v@`nJXm@m1^qlDK=y}mAqqj!yj6NKF zGWuMMEG8u;J7#dq(3sMgikPaH5iy-H^J7@d!kEP|H^nTASs8P8Oi#?Fm@P36#5@-B zc+8VAJ7admd=m4kR3S~2>ZAs#Ntz=aDlL_kODmng z^crcqv|GAZx2ly8wgCVy7`f_$HR zzx6Sp4f)&hGxC4Rf0X}A{Q{tSVL$J0kYl*cGu` zV_%GYKlV)Qm$7GK&nd(TxguGiQ|J{&MYbYGk*mm43{#XU$`lofs}*Avb&3YXRE15^ zqOdDwE12SD#Tvyr#d^g(iu;sWWr{LaS*#qS9IPCotW*wHRx3v;M=9%-lax0o*C`)X z?ojSh?pE$mzM?#+Jfu9VJfZwi`CD9K+`zb@al_(Dy7SH+Kx?}&HDuZq7r{(<<1;vb3M7QZY0 zwfLj)U&McxkeFads7Yu_xGP~x!nTBG5}r-?N5bBOg9)!E98Y*Z;dH{s37;nXs)|&} zRSH#{DnX@I8C5B&RFy?FK$WQ~Pz_aGrD|3=RdZF>sjgSupkk_Js^zL%RJW>bSKXm{ zTy;eCom#9`sFmt?wMm_-wx~1IR&}#8soT{Z>Q1#wy+D1V zdWm|e`WE%A>f67&Io0S(B|P)>LY)($r{bHFcT>%{a{j%}k9)vsklU zvqST`=1t8p%?Zs(&9|DLwMZMK&DLI_y;3_=TdFPBj@M4qPS#GCq+P6Cr`@RCrroZ6Lc2rzn)Y?=o7!XA6WR~7A89|)ey05`t|yI^&9lP`px>Y2DKs8kYTVIvJLr$LPN1(kYR#ho?(Guh2d7i z?S|EcHHLMDjfO3T2MiAz9yL5;c;4`WVV~g@!y&_A!x6)~hSP?R4WAmmG@Lb@Gn_a4 zW{fb3j8R6ZG1jOw>WoIC*=R9l7_G)^<5fnxkr|g6R~m0O-eJ7cxYfABxYPKQ@oD3J zw{_XnNgr)O5mh%Ji=3ebZN_uT9^WzDsFMxi;mx zl=&$vWl_qKlv`6)rQDgaHf4RvJt@0VK1li6tTZQ?)66;ME6u~q<>o4LwRxm@g1Oz? zZNAxji}^P59p*LWyUh2P?>G0DpEN&Ze%kzu`8o4m^FH&-=2y&z%*V|in*W_DO-)HH zNxeGtn$!iUds7dj9!Wiw`dRANspnI_PyI3Vx6})1BrPm0B5hDwLt01LoV0~$i_?~- zEl*pSc6-_#X&chErahGQXxjF)U1`sxJ(spO?ZvdS7PY0)Qfq0j%&>G>uD2|(EVL}P ztgzf_S!KD?vevS}(qnnRveWXc<$24Cmi?B)me(yuEhj7|EvGG?Sbj>U>EiV0bXmG0 zU6Y=au1`0mo71z>3(|+AS7kh$u`Od)#{P`M8OJhCXPnFUHshZeKV|%!@mt1)%&1Ih zraV)bnUJZ@)Mh4SmSwhO-k!N9^QFwgnI|$&Wqy?TMdmpxwo+@9Rce)671l(n$!fNy bSqE4%twXHk)@r}kON3AE?hvOJSx5d4AF42j diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcuserdata/brentvatne.xcuserdatad/UserInterfaceState.xcuserstate b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.xcworkspace/xcuserdata/brentvatne.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index dc2398c1aa13ad21584abc7697165f046980f954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13600 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 H&nWmGb!zNQ diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brent.xcuserdatad/xcschemes/xcschememanagement.plist b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brent.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index c69a54d..0000000 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brent.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - AnimatedGradient.xcscheme_^#shared#^_ - - orderHint - 0 - - - SuppressBuildableAutocreation - - 13B07F861A680F5B00A75B9A - - primary - - - - - diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brentvatne.xcuserdatad/xcschemes/xcschememanagement.plist b/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brentvatne.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index c69a54d..0000000 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcuserdata/brentvatne.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,22 +0,0 @@ - - - - - SchemeUserState - - AnimatedGradient.xcscheme_^#shared#^_ - - orderHint - 0 - - - SuppressBuildableAutocreation - - 13B07F861A680F5B00A75B9A - - primary - - - - - diff --git a/Examples/AnimatedGradient/android/app/BUCK b/Examples/AnimatedGradient/android/app/BUCK new file mode 100644 index 0000000..f833a08 --- /dev/null +++ b/Examples/AnimatedGradient/android/app/BUCK @@ -0,0 +1,66 @@ +import re + +# To learn about Buck see [Docs](https://buckbuild.com/). +# To run your application with Buck: +# - install Buck +# - `npm start` - to start the packager +# - `cd android` +# - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US` +# - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck +# - `buck install -r android/app` - compile, install and run application +# + +lib_deps = [] +for jarfile in glob(['libs/*.jar']): + name = 'jars__' + re.sub(r'^.*/([^/]+)\.jar$', r'\1', jarfile) + lib_deps.append(':' + name) + prebuilt_jar( + name = name, + binary_jar = jarfile, + ) + +for aarfile in glob(['libs/*.aar']): + name = 'aars__' + re.sub(r'^.*/([^/]+)\.aar$', r'\1', aarfile) + lib_deps.append(':' + name) + android_prebuilt_aar( + name = name, + aar = aarfile, + ) + +android_library( + name = 'all-libs', + exported_deps = lib_deps +) + +android_library( + name = 'app-code', + srcs = glob([ + 'src/main/java/**/*.java', + ]), + deps = [ + ':all-libs', + ':build_config', + ':res', + ], +) + +android_build_config( + name = 'build_config', + package = 'com.animatedgradient', +) + +android_resource( + name = 'res', + res = 'src/main/res', + package = 'com.animatedgradient', +) + +android_binary( + name = 'app', + package_type = 'debug', + manifest = 'src/main/AndroidManifest.xml', + keystore = '//android/keystores:debug', + deps = [ + ':app-code', + ], +) diff --git a/Examples/AnimatedGradient/android/app/build.gradle b/Examples/AnimatedGradient/android/app/build.gradle index 0ca9bf4..cda4905 100644 --- a/Examples/AnimatedGradient/android/app/build.gradle +++ b/Examples/AnimatedGradient/android/app/build.gradle @@ -1,12 +1,15 @@ apply plugin: "com.android.application" +import com.android.build.OutputFile + /** - * The react.gradle file registers two tasks: bundleDebugJsAndAssets and bundleReleaseJsAndAssets. + * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets + * and bundleReleaseJsAndAssets). * These basically call `react-native bundle` with the correct arguments during the Android build * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the * bundle directly from the development server. Below you can see all the possible configurations * and their defaults. If you decide to add a configuration block, make sure to add it before the - * `apply from: "react.gradle"` line. + * `apply from: "../../node_modules/react-native/react.gradle"` line. * * project.ext.react = [ * // the name of the generated asset file containing your JS bundle @@ -21,6 +24,15 @@ apply plugin: "com.android.application" * // whether to bundle JS and assets in release mode * bundleInRelease: true, * + * // whether to bundle JS and assets in another build variant (if configured). + * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants + * // The configuration property can be in the following formats + * // 'bundleIn${productFlavor}${buildType}' + * // 'bundleIn${buildType}' + * // bundleInFreeDebug: true, + * // bundleInPaidRelease: true, + * // bundleInBeta: true, + * * // the root of your project, i.e. where "package.json" lives * root: "../../", * @@ -47,7 +59,22 @@ apply plugin: "com.android.application" * ] */ -apply from: "react.gradle" +apply from: "../../node_modules/react-native/react.gradle" + +/** + * Set this to true to create two separate APKs instead of one: + * - An APK that only works on ARM devices + * - An APK that only works on x86 devices + * The advantage is the size of the APK is reduced by about 4MB. + * Upload all the APKs to the Play Store and people will download + * the correct one based on the CPU architecture of their device. + */ +def enableSeparateBuildPerCPUArchitecture = false + +/** + * Run Proguard to shrink the Java bytecode in release builds. + */ +def enableProguardInReleaseBuilds = false android { compileSdkVersion 23 @@ -63,17 +90,45 @@ android { abiFilters "armeabi-v7a", "x86" } } + splits { + abi { + reset() + enable enableSeparateBuildPerCPUArchitecture + universalApk false // If true, also generate a universal APK + include "armeabi-v7a", "x86" + } + } buildTypes { release { - minifyEnabled false // Set this to true to enable Proguard + minifyEnabled enableProguardInReleaseBuilds proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" } } + // applicationVariants are e.g. debug, release + applicationVariants.all { variant -> + variant.outputs.each { output -> + // For each separate APK per architecture, set a unique version code as described here: + // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits + def versionCodes = ["armeabi-v7a":1, "x86":2] + def abi = output.getFilter(OutputFile.ABI) + if (abi != null) { // null for the universal-debug, universal-release variants + output.versionCodeOverride = + versionCodes.get(abi) * 1048576 + defaultConfig.versionCode + } + } + } } dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) compile "com.android.support:appcompat-v7:23.0.1" - compile "com.facebook.react:react-native:0.16.+" - compile project(':react-native-linear-gradient') + compile "com.facebook.react:react-native:+" // From node_modules + compile(project(':react-native-linear-gradient')) +} + +// Run this once to be able to run the application with BUCK +// puts all compile dependencies into folder libs for BUCK to use +task copyDownloadableDepsToLibs(type: Copy) { + from configurations.compile + into 'libs' } diff --git a/Examples/AnimatedGradient/android/app/proguard-rules.pro b/Examples/AnimatedGradient/android/app/proguard-rules.pro index ffa8c9f..347a13c 100644 --- a/Examples/AnimatedGradient/android/app/proguard-rules.pro +++ b/Examples/AnimatedGradient/android/app/proguard-rules.pro @@ -40,9 +40,12 @@ -keep class * extends com.facebook.react.bridge.JavaScriptModule { *; } -keep class * extends com.facebook.react.bridge.NativeModule { *; } +-keepclassmembers,includedescriptorclasses class * { native ; } -keepclassmembers class * { @com.facebook.react.uimanager.UIProp ; } --keepclassmembers class * { @com.facebook.react.uimanager.ReactProp ; } --keepclassmembers class * { @com.facebook.react.uimanager.ReactPropGroup ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactProp ; } +-keepclassmembers class * { @com.facebook.react.uimanager.annotations.ReactPropGroup ; } + +-dontwarn com.facebook.react.** # okhttp diff --git a/Examples/AnimatedGradient/android/app/react.gradle b/Examples/AnimatedGradient/android/app/react.gradle deleted file mode 100644 index 1e08b00..0000000 --- a/Examples/AnimatedGradient/android/app/react.gradle +++ /dev/null @@ -1,87 +0,0 @@ -import org.apache.tools.ant.taskdefs.condition.Os - -def config = project.hasProperty("react") ? project.react : []; - -def bundleAssetName = config.bundleAssetName ?: "index.android.bundle" -def entryFile = config.entryFile ?: "index.android.js" - -// because elvis operator -def elvisFile(thing) { - return thing ? file(thing) : null; -} - -def reactRoot = elvisFile(config.root) ?: file("../../") -def jsBundleDirDebug = elvisFile(config.jsBundleDirDebug) ?: - file("$buildDir/intermediates/assets/debug") -def jsBundleDirRelease = elvisFile(config.jsBundleDirRelease) ?: - file("$buildDir/intermediates/assets/release") -def resourcesDirDebug = elvisFile(config.resourcesDirDebug) ?: - file("$buildDir/intermediates/res/merged/debug") -def resourcesDirRelease = elvisFile(config.resourcesDirRelease) ?: - file("$buildDir/intermediates/res/merged/release") -def inputExcludes = config.inputExcludes ?: ["android/**", "ios/**"] - -def jsBundleFileDebug = file("$jsBundleDirDebug/$bundleAssetName") -def jsBundleFileRelease = file("$jsBundleDirRelease/$bundleAssetName") - -task bundleDebugJsAndAssets(type: Exec) { - // create dirs if they are not there (e.g. the "clean" task just ran) - doFirst { - jsBundleDirDebug.mkdirs() - resourcesDirDebug.mkdirs() - } - - // set up inputs and outputs so gradle can cache the result - inputs.files fileTree(dir: reactRoot, excludes: inputExcludes) - outputs.dir jsBundleDirDebug - outputs.dir resourcesDirDebug - - // set up the call to the react-native cli - workingDir reactRoot - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine "cmd", "/c", "react-native", "bundle", "--platform", "android", "--dev", "true", "--entry-file", - entryFile, "--bundle-output", jsBundleFileDebug, "--assets-dest", resourcesDirDebug - } else { - commandLine "react-native", "bundle", "--platform", "android", "--dev", "true", "--entry-file", - entryFile, "--bundle-output", jsBundleFileDebug, "--assets-dest", resourcesDirDebug - } - - enabled config.bundleInDebug ?: false -} - -task bundleReleaseJsAndAssets(type: Exec) { - // create dirs if they are not there (e.g. the "clean" task just ran) - doFirst { - jsBundleDirRelease.mkdirs() - resourcesDirRelease.mkdirs() - } - - // set up inputs and outputs so gradle can cache the result - inputs.files fileTree(dir: reactRoot, excludes: inputExcludes) - outputs.dir jsBundleDirRelease - outputs.dir resourcesDirRelease - - // set up the call to the react-native cli - workingDir reactRoot - if (Os.isFamily(Os.FAMILY_WINDOWS)) { - commandLine "cmd","/c", "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file", - entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease - } else { - commandLine "react-native", "bundle", "--platform", "android", "--dev", "false", "--entry-file", - entryFile, "--bundle-output", jsBundleFileRelease, "--assets-dest", resourcesDirRelease - } - - enabled config.bundleInRelease ?: true -} - -gradle.projectsEvaluated { - // hook bundleDebugJsAndAssets into the android build process - bundleDebugJsAndAssets.dependsOn mergeDebugResources - bundleDebugJsAndAssets.dependsOn mergeDebugAssets - processDebugResources.dependsOn bundleDebugJsAndAssets - - // hook bundleReleaseJsAndAssets into the android build process - bundleReleaseJsAndAssets.dependsOn mergeReleaseResources - bundleReleaseJsAndAssets.dependsOn mergeReleaseAssets - processReleaseResources.dependsOn bundleReleaseJsAndAssets -} diff --git a/Examples/AnimatedGradient/android/app/src/main/AndroidManifest.xml b/Examples/AnimatedGradient/android/app/src/main/AndroidManifest.xml index 645a381..27fae07 100644 --- a/Examples/AnimatedGradient/android/app/src/main/AndroidManifest.xml +++ b/Examples/AnimatedGradient/android/app/src/main/AndroidManifest.xml @@ -1,7 +1,14 @@ + package="com.animatedgradient" + android:versionCode="1" + android:versionName="1.0"> + + + getPackages() { + return Arrays.asList( + new MainReactPackage(), + new LinearGradientPackage() + ); } } diff --git a/Examples/AnimatedGradient/android/build.gradle b/Examples/AnimatedGradient/android/build.gradle index bdb0fcc..403a007 100644 --- a/Examples/AnimatedGradient/android/build.gradle +++ b/Examples/AnimatedGradient/android/build.gradle @@ -16,8 +16,9 @@ allprojects { repositories { mavenLocal() jcenter() - jcenter { - url "http://dl.bintray.com/mkonicek/maven" + maven { + // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm + url "$projectDir/../../node_modules/react-native/android" } } } diff --git a/Examples/AnimatedGradient/android/keystores/BUCK b/Examples/AnimatedGradient/android/keystores/BUCK new file mode 100644 index 0000000..15da20e --- /dev/null +++ b/Examples/AnimatedGradient/android/keystores/BUCK @@ -0,0 +1,8 @@ +keystore( + name = 'debug', + store = 'debug.keystore', + properties = 'debug.keystore.properties', + visibility = [ + 'PUBLIC', + ], +) diff --git a/Examples/AnimatedGradient/android/settings.gradle b/Examples/AnimatedGradient/android/settings.gradle index bb0ddd2..0b75b05 100644 --- a/Examples/AnimatedGradient/android/settings.gradle +++ b/Examples/AnimatedGradient/android/settings.gradle @@ -1,6 +1,5 @@ rootProject.name = 'AnimatedGradient' include ':app' - -include ':app', ':react-native-linear-gradient' +include ':react-native-linear-gradient' project(':react-native-linear-gradient').projectDir = new File(rootProject.projectDir, '../node_modules/react-native-linear-gradient/android') diff --git a/Examples/AnimatedGradient/iOS/main.jsbundle b/Examples/AnimatedGradient/iOS/main.jsbundle deleted file mode 100644 index 4f50ea3..0000000 --- a/Examples/AnimatedGradient/iOS/main.jsbundle +++ /dev/null @@ -1,5 +0,0 @@ -// Offline JS -// To re-generate the offline bundle, run this from root of your project -// $ curl 'http://localhost:8081/index.ios.bundle?dev=false&minify=true' -o iOS/main.jsbundle - -throw new Error('Offline JS file is empty. See iOS/main.jsbundle for instructions'); diff --git a/Examples/AnimatedGradient/incrementColor.js b/Examples/AnimatedGradient/incrementColor.js deleted file mode 100644 index 75b7f60..0000000 --- a/Examples/AnimatedGradient/incrementColor.js +++ /dev/null @@ -1,13 +0,0 @@ -module.exports = function(color, step){ - var colorToInt = parseInt(color.substr(1), 16), // Convert HEX color to integer - nstep = parseInt(step); // Convert step to integer - if(!isNaN(colorToInt) && !isNaN(nstep)){ // Make sure that color has been converted to integer - colorToInt += nstep; // Increment integer with step - var ncolor = colorToInt.toString(16); // Convert back integer to HEX - ncolor = '#' + (new Array(7-ncolor.length).join(0)) + ncolor; // Left pad "0" to make HEX look like a color - if(/^#[0-9a-f]{6}$/i.test(ncolor)){ // Make sure that HEX is a valid color - return ncolor; - } - } - return color; -}; diff --git a/Examples/AnimatedGradient/index.android.js b/Examples/AnimatedGradient/index.android.js index d7254cd..0c062e5 100644 --- a/Examples/AnimatedGradient/index.android.js +++ b/Examples/AnimatedGradient/index.android.js @@ -1,63 +1,4 @@ -'use strict'; -var React = require('react'); -var ReactNative = require('react-native'); -var { - AppRegistry, - StyleSheet, - Text, - View, -} = ReactNative; +import { AppRegistry } from 'react-native'; +import App from './src'; -var TimerMixin = require('react-timer-mixin'); -var LinearGradient = require('react-native-linear-gradient'); -var incrementColor = require('./incrementColor'); - -var AnimatedGradient = React.createClass({ - mixins: [TimerMixin], - - getInitialState: function() { - return { - count: 0, - colorTop: '#000000', - colorBottom: '#cccccc', - } - }, - - componentDidMount: function() { - this.setInterval(() => { - this.setState({ - count: this.state.count + 1, - colorTop: incrementColor(this.state.colorTop, 1), - colorBottom: incrementColor(this.state.colorBottom, -1), - }); - }, 20); - }, - - render: function() { - return ( - - - - {this.state.colorTop} - {this.state.colorBottom} - - ); - } -}); - -var styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: '#F5FCFF', - }, - gradient: { - width: 200, - height: 200, - }, -}); - -AppRegistry.registerComponent('AnimatedGradient', () => AnimatedGradient); +AppRegistry.registerComponent('AnimatedGradient', () => App); diff --git a/Examples/AnimatedGradient/index.ios.js b/Examples/AnimatedGradient/index.ios.js index d7254cd..0c062e5 100644 --- a/Examples/AnimatedGradient/index.ios.js +++ b/Examples/AnimatedGradient/index.ios.js @@ -1,63 +1,4 @@ -'use strict'; -var React = require('react'); -var ReactNative = require('react-native'); -var { - AppRegistry, - StyleSheet, - Text, - View, -} = ReactNative; +import { AppRegistry } from 'react-native'; +import App from './src'; -var TimerMixin = require('react-timer-mixin'); -var LinearGradient = require('react-native-linear-gradient'); -var incrementColor = require('./incrementColor'); - -var AnimatedGradient = React.createClass({ - mixins: [TimerMixin], - - getInitialState: function() { - return { - count: 0, - colorTop: '#000000', - colorBottom: '#cccccc', - } - }, - - componentDidMount: function() { - this.setInterval(() => { - this.setState({ - count: this.state.count + 1, - colorTop: incrementColor(this.state.colorTop, 1), - colorBottom: incrementColor(this.state.colorBottom, -1), - }); - }, 20); - }, - - render: function() { - return ( - - - - {this.state.colorTop} - {this.state.colorBottom} - - ); - } -}); - -var styles = StyleSheet.create({ - container: { - flex: 1, - justifyContent: 'center', - alignItems: 'center', - backgroundColor: '#F5FCFF', - }, - gradient: { - width: 200, - height: 200, - }, -}); - -AppRegistry.registerComponent('AnimatedGradient', () => AnimatedGradient); +AppRegistry.registerComponent('AnimatedGradient', () => App); diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.pbxproj b/Examples/AnimatedGradient/ios/AnimatedGradient.xcodeproj/project.pbxproj similarity index 63% rename from Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.pbxproj rename to Examples/AnimatedGradient/ios/AnimatedGradient.xcodeproj/project.pbxproj index 49a2a23..a8aa0f0 100644 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/project.pbxproj +++ b/Examples/AnimatedGradient/ios/AnimatedGradient.xcodeproj/project.pbxproj @@ -7,21 +7,22 @@ objects = { /* Begin PBXBuildFile section */ - 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */ = {isa = PBXBuildFile; fileRef = 008F07F21AC5B25A0029DE68 /* main.jsbundle */; }; 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E61ABCBA2D00DB3ED1 /* libRCTAdSupport.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302B41ABCB8E700DB3ED1 /* libRCTAdSupport.a */; }; 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; + 00E356F31AD99517003FC87E /* AnimatedGradientTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* AnimatedGradientTests.m */; }; + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - 84B328261C16040D00DE4E08 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 84B328251C1603EE00DE4E08 /* libRCTWebSocket.a */; }; - BB6109EF1AD326EA00563A76 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BB6109EE1AD326E400563A76 /* libBVLinearGradient.a */; }; + EFA9F1911CDCD7720027F044 /* libBVLinearGradient.a in Frameworks */ = {isa = PBXBuildFile; fileRef = EFA9F1861CDCD7610027F044 /* libBVLinearGradient.a */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -32,13 +33,6 @@ remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = RCTActionSheet; }; - 00C302B31ABCB8E700DB3ED1 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 00C302AF1ABCB8E700DB3ED1 /* RCTAdSupport.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; - remoteInfo = RCTAdSupport; - }; 00C302B91ABCB90400DB3ED1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; @@ -67,6 +61,27 @@ remoteGlobalIDString = 832C81801AAF6DEF007FA2F7; remoteInfo = RCTVibration; }; + 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 13B07F861A680F5B00A75B9A; + remoteInfo = AnimatedGradient; + }; + 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTSettings; + }; + 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 3C86DF461ADF2C930047B81A; + remoteInfo = RCTWebSocket; + }; 146834031AC3E56700842450 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 146833FF1AC3E56700842450 /* React.xcodeproj */; @@ -74,6 +89,13 @@ remoteGlobalIDString = 83CBBA2E1A601D0E00E9B192; remoteInfo = React; }; + 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + proxyType = 2; + remoteGlobalIDString = 134814201AA4EA6300B7C361; + remoteInfo = RCTLinking; + }; 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; @@ -81,16 +103,9 @@ remoteGlobalIDString = 58B5119B1A9E6C1200147676; remoteInfo = RCTText; }; - 84B328241C1603EE00DE4E08 /* PBXContainerItemProxy */ = { + EFA9F1851CDCD7610027F044 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; - containerPortal = 84B328201C1603ED00DE4E08 /* RCTWebSocket.xcodeproj */; - proxyType = 2; - remoteGlobalIDString = 3C86DF461ADF2C930047B81A; - remoteInfo = RCTWebSocket; - }; - BB6109ED1AD326E400563A76 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BB6109E91AD326E400563A76 /* BVLinearGradient.xcodeproj */; + containerPortal = EFA9F1811CDCD7610027F044 /* BVLinearGradient.xcodeproj */; proxyType = 2; remoteGlobalIDString = 134814201AA4EA6300B7C361; remoteInfo = BVLinearGradient; @@ -98,41 +113,53 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = main.jsbundle; path = iOS/main.jsbundle; sourceTree = ""; }; - 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; - 00C302AF1ABCB8E700DB3ED1 /* RCTAdSupport.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAdSupport.xcodeproj; path = "node_modules/react-native/Libraries/AdSupport/RCTAdSupport.xcodeproj"; sourceTree = ""; }; - 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; - 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; - 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; - 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 008F07F21AC5B25A0029DE68 /* main.jsbundle */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = main.jsbundle; sourceTree = ""; }; + 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTActionSheet.xcodeproj; path = "../node_modules/react-native/Libraries/ActionSheetIOS/RCTActionSheet.xcodeproj"; sourceTree = ""; }; + 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTGeolocation.xcodeproj; path = "../node_modules/react-native/Libraries/Geolocation/RCTGeolocation.xcodeproj"; sourceTree = ""; }; + 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTImage.xcodeproj; path = "../node_modules/react-native/Libraries/Image/RCTImage.xcodeproj"; sourceTree = ""; }; + 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTNetwork.xcodeproj; path = "../node_modules/react-native/Libraries/Network/RCTNetwork.xcodeproj"; sourceTree = ""; }; + 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVibration.xcodeproj; path = "../node_modules/react-native/Libraries/Vibration/RCTVibration.xcodeproj"; sourceTree = ""; }; + 00E356EE1AD99517003FC87E /* AnimatedGradientTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = AnimatedGradientTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 00E356F21AD99517003FC87E /* AnimatedGradientTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AnimatedGradientTests.m; sourceTree = ""; }; + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTSettings.xcodeproj; path = "../node_modules/react-native/Libraries/Settings/RCTSettings.xcodeproj"; sourceTree = ""; }; + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "../node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; 13B07F961A680F5B00A75B9A /* AnimatedGradient.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AnimatedGradient.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = iOS/AppDelegate.h; sourceTree = ""; }; - 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = iOS/AppDelegate.m; sourceTree = ""; }; + 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = AnimatedGradient/AppDelegate.h; sourceTree = ""; }; + 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = AnimatedGradient/AppDelegate.m; sourceTree = ""; }; 13B07FB21A68108700A75B9A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; - 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = iOS/Images.xcassets; sourceTree = ""; }; - 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = iOS/Info.plist; sourceTree = ""; }; - 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = iOS/main.m; sourceTree = ""; }; - 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; - 84B328201C1603ED00DE4E08 /* RCTWebSocket.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTWebSocket.xcodeproj; path = "node_modules/react-native/Libraries/WebSocket/RCTWebSocket.xcodeproj"; sourceTree = ""; }; - BB6109E91AD326E400563A76 /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = BVLinearGradient.xcodeproj; path = "node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = ""; }; + 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = AnimatedGradient/Images.xcassets; sourceTree = ""; }; + 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = AnimatedGradient/Info.plist; sourceTree = ""; }; + 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = AnimatedGradient/main.m; sourceTree = ""; }; + 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; + EFA9F1811CDCD7610027F044 /* BVLinearGradient.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = BVLinearGradient.xcodeproj; path = "../node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 00E356EB1AD99517003FC87E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 84B328261C16040D00DE4E08 /* libRCTWebSocket.a in Frameworks */, + EFA9F1911CDCD7720027F044 /* libBVLinearGradient.a in Frameworks */, 146834051AC3E58100842450 /* libReact.a in Frameworks */, 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 00C302E61ABCBA2D00DB3ED1 /* libRCTAdSupport.a in Frameworks */, 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, + 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - BB6109EF1AD326EA00563A76 /* libBVLinearGradient.a in Frameworks */, + 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, + 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -147,14 +174,6 @@ name = Products; sourceTree = ""; }; - 00C302B01ABCB8E700DB3ED1 /* Products */ = { - isa = PBXGroup; - children = ( - 00C302B41ABCB8E700DB3ED1 /* libRCTAdSupport.a */, - ); - name = Products; - sourceTree = ""; - }; 00C302B61ABCB90400DB3ED1 /* Products */ = { isa = PBXGroup; children = ( @@ -187,6 +206,39 @@ name = Products; sourceTree = ""; }; + 00E356EF1AD99517003FC87E /* AnimatedGradientTests */ = { + isa = PBXGroup; + children = ( + 00E356F21AD99517003FC87E /* AnimatedGradientTests.m */, + 00E356F01AD99517003FC87E /* Supporting Files */, + ); + path = AnimatedGradientTests; + sourceTree = ""; + }; + 00E356F01AD99517003FC87E /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 00E356F11AD99517003FC87E /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 139105B71AF99BAD00B5F7CC /* Products */ = { + isa = PBXGroup; + children = ( + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */, + ); + name = Products; + sourceTree = ""; + }; + 139FDEE71B06529A00C62182 /* Products */ = { + isa = PBXGroup; + children = ( + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */, + ); + name = Products; + sourceTree = ""; + }; 13B07FAE1A68108700A75B9A /* AnimatedGradient */ = { isa = PBXGroup; children = ( @@ -209,19 +261,28 @@ name = Products; sourceTree = ""; }; + 78C398B11ACF4ADC00677621 /* Products */ = { + isa = PBXGroup; + children = ( + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */, + ); + name = Products; + sourceTree = ""; + }; 832341AE1AAA6A7D00B99B32 /* Libraries */ = { isa = PBXGroup; children = ( - 84B328201C1603ED00DE4E08 /* RCTWebSocket.xcodeproj */, - BB6109E91AD326E400563A76 /* BVLinearGradient.xcodeproj */, + EFA9F1811CDCD7610027F044 /* BVLinearGradient.xcodeproj */, 146833FF1AC3E56700842450 /* React.xcodeproj */, - 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */, - 00C302AF1ABCB8E700DB3ED1 /* RCTAdSupport.xcodeproj */, 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */, 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */, + 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */, 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */, + 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */, + 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */, 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */, + 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */, ); name = Libraries; sourceTree = ""; @@ -239,6 +300,7 @@ children = ( 13B07FAE1A68108700A75B9A /* AnimatedGradient */, 832341AE1AAA6A7D00B99B32 /* Libraries */, + 00E356EF1AD99517003FC87E /* AnimatedGradientTests */, 83CBBA001A601CBA00E9B192 /* Products */, ); indentWidth = 2; @@ -249,22 +311,15 @@ isa = PBXGroup; children = ( 13B07F961A680F5B00A75B9A /* AnimatedGradient.app */, + 00E356EE1AD99517003FC87E /* AnimatedGradientTests.xctest */, ); name = Products; sourceTree = ""; }; - 84B328211C1603ED00DE4E08 /* Products */ = { + EFA9F1821CDCD7610027F044 /* Products */ = { isa = PBXGroup; children = ( - 84B328251C1603EE00DE4E08 /* libRCTWebSocket.a */, - ); - name = Products; - sourceTree = ""; - }; - BB6109EA1AD326E400563A76 /* Products */ = { - isa = PBXGroup; - children = ( - BB6109EE1AD326E400563A76 /* libBVLinearGradient.a */, + EFA9F1861CDCD7610027F044 /* libBVLinearGradient.a */, ); name = Products; sourceTree = ""; @@ -272,6 +327,24 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 00E356ED1AD99517003FC87E /* AnimatedGradientTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AnimatedGradientTests" */; + buildPhases = ( + 00E356EA1AD99517003FC87E /* Sources */, + 00E356EB1AD99517003FC87E /* Frameworks */, + 00E356EC1AD99517003FC87E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 00E356F51AD99517003FC87E /* PBXTargetDependency */, + ); + name = AnimatedGradientTests; + productName = AnimatedGradientTests; + productReference = 00E356EE1AD99517003FC87E /* AnimatedGradientTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; 13B07F861A680F5B00A75B9A /* AnimatedGradient */ = { isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AnimatedGradient" */; @@ -279,6 +352,7 @@ 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, ); buildRules = ( ); @@ -297,6 +371,12 @@ attributes = { LastUpgradeCheck = 0610; ORGANIZATIONNAME = Facebook; + TargetAttributes = { + 00E356ED1AD99517003FC87E = { + CreatedOnToolsVersion = 6.2; + TestTargetID = 13B07F861A680F5B00A75B9A; + }; + }; }; buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "AnimatedGradient" */; compatibilityVersion = "Xcode 3.2"; @@ -311,17 +391,13 @@ projectDirPath = ""; projectReferences = ( { - ProductGroup = BB6109EA1AD326E400563A76 /* Products */; - ProjectRef = BB6109E91AD326E400563A76 /* BVLinearGradient.xcodeproj */; + ProductGroup = EFA9F1821CDCD7610027F044 /* Products */; + ProjectRef = EFA9F1811CDCD7610027F044 /* BVLinearGradient.xcodeproj */; }, { ProductGroup = 00C302A81ABCB8CE00DB3ED1 /* Products */; ProjectRef = 00C302A71ABCB8CE00DB3ED1 /* RCTActionSheet.xcodeproj */; }, - { - ProductGroup = 00C302B01ABCB8E700DB3ED1 /* Products */; - ProjectRef = 00C302AF1ABCB8E700DB3ED1 /* RCTAdSupport.xcodeproj */; - }, { ProductGroup = 00C302B61ABCB90400DB3ED1 /* Products */; ProjectRef = 00C302B51ABCB90400DB3ED1 /* RCTGeolocation.xcodeproj */; @@ -330,10 +406,18 @@ ProductGroup = 00C302BC1ABCB91800DB3ED1 /* Products */; ProjectRef = 00C302BB1ABCB91800DB3ED1 /* RCTImage.xcodeproj */; }, + { + ProductGroup = 78C398B11ACF4ADC00677621 /* Products */; + ProjectRef = 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */; + }, { ProductGroup = 00C302D41ABCB9D200DB3ED1 /* Products */; ProjectRef = 00C302D31ABCB9D200DB3ED1 /* RCTNetwork.xcodeproj */; }, + { + ProductGroup = 139105B71AF99BAD00B5F7CC /* Products */; + ProjectRef = 139105B61AF99BAD00B5F7CC /* RCTSettings.xcodeproj */; + }, { ProductGroup = 832341B11AAA6A8300B99B32 /* Products */; ProjectRef = 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */; @@ -343,8 +427,8 @@ ProjectRef = 00C302DF1ABCB9EE00DB3ED1 /* RCTVibration.xcodeproj */; }, { - ProductGroup = 84B328211C1603ED00DE4E08 /* Products */; - ProjectRef = 84B328201C1603ED00DE4E08 /* RCTWebSocket.xcodeproj */; + ProductGroup = 139FDEE71B06529A00C62182 /* Products */; + ProjectRef = 139FDEE61B06529A00C62182 /* RCTWebSocket.xcodeproj */; }, { ProductGroup = 146834001AC3E56700842450 /* Products */; @@ -354,6 +438,7 @@ projectRoot = ""; targets = ( 13B07F861A680F5B00A75B9A /* AnimatedGradient */, + 00E356ED1AD99517003FC87E /* AnimatedGradientTests */, ); }; /* End PBXProject section */ @@ -366,13 +451,6 @@ remoteRef = 00C302AB1ABCB8CE00DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 00C302B41ABCB8E700DB3ED1 /* libRCTAdSupport.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTAdSupport.a; - remoteRef = 00C302B31ABCB8E700DB3ED1 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -401,6 +479,20 @@ remoteRef = 00C302E31ABCB9EE00DB3ED1 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTSettings.a; + remoteRef = 139105C01AF99BAD00B5F7CC /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; + 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTWebSocket.a; + remoteRef = 139FDEF31B06529B00C62182 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 146834041AC3E56700842450 /* libReact.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -408,6 +500,13 @@ remoteRef = 146834031AC3E56700842450 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; + 78C398B91ACF4ADC00677621 /* libRCTLinking.a */ = { + isa = PBXReferenceProxy; + fileType = archive.ar; + path = libRCTLinking.a; + remoteRef = 78C398B81ACF4ADC00677621 /* PBXContainerItemProxy */; + sourceTree = BUILT_PRODUCTS_DIR; + }; 832341B51AAA6A8300B99B32 /* libRCTText.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; @@ -415,28 +514,27 @@ remoteRef = 832341B41AAA6A8300B99B32 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; - 84B328251C1603EE00DE4E08 /* libRCTWebSocket.a */ = { - isa = PBXReferenceProxy; - fileType = archive.ar; - path = libRCTWebSocket.a; - remoteRef = 84B328241C1603EE00DE4E08 /* PBXContainerItemProxy */; - sourceTree = BUILT_PRODUCTS_DIR; - }; - BB6109EE1AD326E400563A76 /* libBVLinearGradient.a */ = { + EFA9F1861CDCD7610027F044 /* libBVLinearGradient.a */ = { isa = PBXReferenceProxy; fileType = archive.ar; path = libBVLinearGradient.a; - remoteRef = BB6109ED1AD326E400563A76 /* PBXContainerItemProxy */; + remoteRef = EFA9F1851CDCD7610027F044 /* PBXContainerItemProxy */; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXReferenceProxy section */ /* Begin PBXResourcesBuildPhase section */ + 00E356EC1AD99517003FC87E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 13B07F8E1A680F5B00A75B9A /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 008F07F31AC5B25A0029DE68 /* main.jsbundle in Resources */, 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */, 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */, ); @@ -444,7 +542,32 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Bundle React Native code and images"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "export NODE_BINARY=node\n../node_modules/react-native/packager/react-native-xcode.sh"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ + 00E356EA1AD99517003FC87E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 00E356F31AD99517003FC87E /* AnimatedGradientTests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 13B07F871A680F5B00A75B9A /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -456,6 +579,14 @@ }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + 00E356F51AD99517003FC87E /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 13B07F861A680F5B00A75B9A /* AnimatedGradient */; + targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 13B07FB11A68108700A75B9A /* LaunchScreen.xib */ = { isa = PBXVariantGroup; @@ -463,22 +594,60 @@ 13B07FB21A68108700A75B9A /* Base */, ); name = LaunchScreen.xib; - path = iOS; + path = AnimatedGradient; sourceTree = ""; }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 00E356F61AD99517003FC87E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = AnimatedGradientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AnimatedGradient.app/AnimatedGradient"; + }; + name = Debug; + }; + 00E356F71AD99517003FC87E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = AnimatedGradientTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/AnimatedGradient.app/AnimatedGradient"; + }; + name = Release; + }; 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEAD_CODE_STRIPPING = NO; HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native/React/**", ); - INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; + INFOPLIST_FILE = AnimatedGradient/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = AnimatedGradient; @@ -492,9 +661,9 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native/React/**", ); - INFOPLIST_FILE = "$(SRCROOT)/iOS/Info.plist"; + INFOPLIST_FILE = AnimatedGradient/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = "-ObjC"; PRODUCT_NAME = AnimatedGradient; @@ -538,7 +707,7 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native/React/**", ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = YES; @@ -578,7 +747,7 @@ HEADER_SEARCH_PATHS = ( "$(inherited)", /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, - "$(SRCROOT)/node_modules/react-native/React/**", + "$(SRCROOT)/../node_modules/react-native/React/**", ); IPHONEOS_DEPLOYMENT_TARGET = 7.0; MTL_ENABLE_DEBUG_INFO = NO; @@ -590,6 +759,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "AnimatedGradientTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 00E356F61AD99517003FC87E /* Debug */, + 00E356F71AD99517003FC87E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "AnimatedGradient" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme b/Examples/AnimatedGradient/ios/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme similarity index 75% rename from Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme rename to Examples/AnimatedGradient/ios/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme index 23df058..fbb809d 100644 --- a/Examples/AnimatedGradient/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme +++ b/Examples/AnimatedGradient/ios/AnimatedGradient.xcodeproj/xcshareddata/xcschemes/AnimatedGradient.xcscheme @@ -20,6 +20,20 @@ ReferencedContainer = "container:AnimatedGradient.xcodeproj"> + + + + + + + + - + - + diff --git a/Examples/AnimatedGradient/iOS/Images.xcassets/AppIcon.appiconset/Contents.json b/Examples/AnimatedGradient/ios/AnimatedGradient/Images.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Examples/AnimatedGradient/iOS/Images.xcassets/AppIcon.appiconset/Contents.json rename to Examples/AnimatedGradient/ios/AnimatedGradient/Images.xcassets/AppIcon.appiconset/Contents.json diff --git a/Examples/AnimatedGradient/iOS/Info.plist b/Examples/AnimatedGradient/ios/AnimatedGradient/Info.plist similarity index 82% rename from Examples/AnimatedGradient/iOS/Info.plist rename to Examples/AnimatedGradient/ios/AnimatedGradient/Info.plist index dcc5a33..91963b2 100644 --- a/Examples/AnimatedGradient/iOS/Info.plist +++ b/Examples/AnimatedGradient/ios/AnimatedGradient/Info.plist @@ -22,11 +22,6 @@ 1 LSRequiresIPhoneOS - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - UILaunchStoryboardName LaunchScreen UIRequiredDeviceCapabilities @@ -41,5 +36,13 @@ UIViewControllerBasedStatusBarAppearance + NSLocationWhenInUseUsageDescription + + NSAppTransportSecurity + + + NSAllowsArbitraryLoads + + diff --git a/Examples/AnimatedGradient/iOS/main.m b/Examples/AnimatedGradient/ios/AnimatedGradient/main.m similarity index 100% rename from Examples/AnimatedGradient/iOS/main.m rename to Examples/AnimatedGradient/ios/AnimatedGradient/main.m diff --git a/Examples/AnimatedGradient/ios/AnimatedGradientTests/AnimatedGradientTests.m b/Examples/AnimatedGradient/ios/AnimatedGradientTests/AnimatedGradientTests.m new file mode 100644 index 0000000..2596d33 --- /dev/null +++ b/Examples/AnimatedGradient/ios/AnimatedGradientTests/AnimatedGradientTests.m @@ -0,0 +1,70 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +#import +#import + +#import "RCTLog.h" +#import "RCTRootView.h" + +#define TIMEOUT_SECONDS 600 +#define TEXT_TO_LOOK_FOR @"Welcome to React Native!" + +@interface AnimatedGradientTests : XCTestCase + +@end + +@implementation AnimatedGradientTests + +- (BOOL)findSubviewInView:(UIView *)view matching:(BOOL(^)(UIView *view))test +{ + if (test(view)) { + return YES; + } + for (UIView *subview in [view subviews]) { + if ([self findSubviewInView:subview matching:test]) { + return YES; + } + } + return NO; +} + +- (void)testRendersWelcomeScreen +{ + UIViewController *vc = [[[[UIApplication sharedApplication] delegate] window] rootViewController]; + NSDate *date = [NSDate dateWithTimeIntervalSinceNow:TIMEOUT_SECONDS]; + BOOL foundElement = NO; + + __block NSString *redboxError = nil; + RCTSetLogFunction(^(RCTLogLevel level, RCTLogSource source, NSString *fileName, NSNumber *lineNumber, NSString *message) { + if (level >= RCTLogLevelError) { + redboxError = message; + } + }); + + while ([date timeIntervalSinceNow] > 0 && !foundElement && !redboxError) { + [[NSRunLoop mainRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + [[NSRunLoop mainRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; + + foundElement = [self findSubviewInView:vc.view matching:^BOOL(UIView *view) { + if ([view.accessibilityLabel isEqualToString:TEXT_TO_LOOK_FOR]) { + return YES; + } + return NO; + }]; + } + + RCTSetLogFunction(RCTDefaultLogFunction); + + XCTAssertNil(redboxError, @"RedBox error: %@", redboxError); + XCTAssertTrue(foundElement, @"Couldn't find element with text '%@' in %d seconds", TEXT_TO_LOOK_FOR, TIMEOUT_SECONDS); +} + + +@end diff --git a/Examples/AnimatedGradient/ios/AnimatedGradientTests/Info.plist b/Examples/AnimatedGradient/ios/AnimatedGradientTests/Info.plist new file mode 100644 index 0000000..886825c --- /dev/null +++ b/Examples/AnimatedGradient/ios/AnimatedGradientTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Examples/AnimatedGradient/node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj/project.pbxproj b/Examples/AnimatedGradient/node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj/project.pbxproj index 89f34dc..4cf1a5a 100644 --- a/Examples/AnimatedGradient/node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj/project.pbxproj +++ b/Examples/AnimatedGradient/node_modules/react-native-linear-gradient/BVLinearGradient.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - BBD49E3F1AC8DEF000610F8E /* BVLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */; }; - BBD49E401AC8DEF000610F8E /* BVLinearGradientManager.m in Sources */ = {isa = PBXBuildFile; fileRef = BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */; }; + EF6045F01C4E5D290001F552 /* BVLinearGradient.m in Sources */ = {isa = PBXBuildFile; fileRef = EF6045ED1C4E5D290001F552 /* BVLinearGradient.m */; }; + EF6045F11C4E5D290001F552 /* BVLinearGradientManager.m in Sources */ = {isa = PBXBuildFile; fileRef = EF6045EF1C4E5D290001F552 /* BVLinearGradientManager.m */; }; /* End PBXBuildFile section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -25,10 +25,10 @@ /* Begin PBXFileReference section */ 134814201AA4EA6300B7C361 /* libBVLinearGradient.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libBVLinearGradient.a; sourceTree = BUILT_PRODUCTS_DIR; }; - BBD49E391AC8DEF000610F8E /* BVLinearGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradient.h; sourceTree = ""; }; - BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradient.m; sourceTree = ""; }; - BBD49E3B1AC8DEF000610F8E /* BVLinearGradientManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradientManager.h; sourceTree = ""; }; - BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradientManager.m; sourceTree = ""; }; + EF6045EC1C4E5D290001F552 /* BVLinearGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradient.h; sourceTree = ""; }; + EF6045ED1C4E5D290001F552 /* BVLinearGradient.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradient.m; sourceTree = ""; }; + EF6045EE1C4E5D290001F552 /* BVLinearGradientManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BVLinearGradientManager.h; sourceTree = ""; }; + EF6045EF1C4E5D290001F552 /* BVLinearGradientManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BVLinearGradientManager.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -53,14 +53,22 @@ 58B511D21A9E6C8500147676 = { isa = PBXGroup; children = ( - BBD49E391AC8DEF000610F8E /* BVLinearGradient.h */, - BBD49E3A1AC8DEF000610F8E /* BVLinearGradient.m */, - BBD49E3B1AC8DEF000610F8E /* BVLinearGradientManager.h */, - BBD49E3C1AC8DEF000610F8E /* BVLinearGradientManager.m */, + EF6045EB1C4E5D290001F552 /* BVLinearGradient */, 134814211AA4EA7D00B7C361 /* Products */, ); sourceTree = ""; }; + EF6045EB1C4E5D290001F552 /* BVLinearGradient */ = { + isa = PBXGroup; + children = ( + EF6045EC1C4E5D290001F552 /* BVLinearGradient.h */, + EF6045ED1C4E5D290001F552 /* BVLinearGradient.m */, + EF6045EE1C4E5D290001F552 /* BVLinearGradientManager.h */, + EF6045EF1C4E5D290001F552 /* BVLinearGradientManager.m */, + ); + path = BVLinearGradient; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -117,8 +125,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - BBD49E3F1AC8DEF000610F8E /* BVLinearGradient.m in Sources */, - BBD49E401AC8DEF000610F8E /* BVLinearGradientManager.m in Sources */, + EF6045F11C4E5D290001F552 /* BVLinearGradientManager.m in Sources */, + EF6045F01C4E5D290001F552 /* BVLinearGradient.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Examples/AnimatedGradient/package.json b/Examples/AnimatedGradient/package.json index f7d0d2e..36fc425 100644 --- a/Examples/AnimatedGradient/package.json +++ b/Examples/AnimatedGradient/package.json @@ -3,11 +3,12 @@ "version": "0.0.1", "private": true, "scripts": { - "start": "node_modules/react-native/packager/packager.sh" + "start": "node node_modules/react-native/local-cli/cli.js start" }, "dependencies": { - "react-native": "0.16.0", - "react-native-linear-gradient": "../../", - "react-timer-mixin": "^0.13.3" + "react": "0.14.8", + "react-native": "0.25.1", + "react-native-linear-gradient": "file:../../", + "react-timer-mixin": "0.13.3" } } diff --git a/Examples/AnimatedGradient/src/index.js b/Examples/AnimatedGradient/src/index.js new file mode 100644 index 0000000..0080ad3 --- /dev/null +++ b/Examples/AnimatedGradient/src/index.js @@ -0,0 +1,63 @@ +import React from 'react'; +import { + StyleSheet, + Text, + View, +} from 'react-native'; +import TimerMixin from 'react-timer-mixin'; +import LinearGradient from 'react-native-linear-gradient'; + +function incrementColor(color, step) { + const intColor = parseInt(color.substr(1), 16); + const newIntColor = (intColor + step).toString(16); + return `#${'0'.repeat(6 - newIntColor.length)}${newIntColor}`; +}; + +const AnimatedGradient = React.createClass({ + mixins: [TimerMixin], + + getInitialState() { + return { + count: 0, + colorTop: '#000000', + colorBottom: '#cccccc', + } + }, + + componentDidMount() { + this.setInterval(() => { + this.setState({ + count: this.state.count + 1, + colorTop: incrementColor(this.state.colorTop, 1), + colorBottom: incrementColor(this.state.colorBottom, -1), + }); + }, 20); + }, + + render() { + return ( + + + {this.state.colorTop} + {this.state.colorBottom} + + ); + } +}); + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + backgroundColor: '#F5FCFF', + }, + gradient: { + width: 200, + height: 200, + }, +}); + +export default AnimatedGradient;