diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..680fd53d5 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,16 @@ +# editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false + +[*.js] +indent_size = 2 diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 000000000..6f493fc85 --- /dev/null +++ b/.eslintignore @@ -0,0 +1,2 @@ +**/*.js +!/*.js diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 000000000..733f821ec --- /dev/null +++ b/.eslintrc @@ -0,0 +1,17 @@ +{ + "env": { + "es6": true + }, + "extends": ["eslint:recommended", "plugin:react/recommended"], + "parser": "babel-eslint", + "parserOptions": { + "ecmaVersion": 6 + }, + "plugins": [ + "react" + ], + "rules": { + "comma-dangle": ["error", "always-multiline"], + "react/jsx-handler-names": "error" + } +} diff --git a/Example/.babelrc b/Example/.babelrc new file mode 100644 index 000000000..a9ce1369e --- /dev/null +++ b/Example/.babelrc @@ -0,0 +1,3 @@ +{ + "presets": ["react-native"] +} diff --git a/Example/.flowconfig b/Example/.flowconfig index e28e2f5bd..1dd3eff69 100644 --- a/Example/.flowconfig +++ b/Example/.flowconfig @@ -1,13 +1,18 @@ [ignore] +; We fork some components by platform +.*/*[.]android.js -# We fork some components by platform. -.*/*.android.js +; Ignore "BUCK" generated dirs +/\.buckd/ -# Ignore templates with `@flow` in header -.*/local-cli/generator.* +; Ignore unexpected extra "@providesModule" +.*/node_modules/.*/node_modules/fbjs/.* -# Ignore malformed json -.*/node_modules/y18n/test/.*\.json +; Ignore duplicate module providers +; For RN Apps installed via npm, "Libraries" folder is inside +; "node_modules/react-native" but in the source repo it is in the root +.*/Libraries/react-native/React.js +.*/Libraries/react-native/ReactNative.js [include] @@ -17,25 +22,24 @@ node_modules/react-native/flow flow/ [options] -module.system=haste - -esproposal.class_static_fields=enable -esproposal.class_instance_fields=enable +emoji=true -experimental.strict_type_args=true +module.system=haste munge_underscores=true -module.name_mapper='^image![a-zA-Z0-9$_-]+$' -> 'GlobalImageStub' 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' suppress_type=$FlowIssue suppress_type=$FlowFixMe suppress_type=$FixMe -suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(2[0-7]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) -suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(2[0-7]\\|1[0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ +suppress_comment=\\(.\\|\n\\)*\\$FlowFixMe\\($\\|[^(]\\|(\\(>=0\\.\\(4[0-7]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\) +suppress_comment=\\(.\\|\n\\)*\\$FlowIssue\\((\\(>=0\\.\\(4[0-7]\\|[1-3][0-9]\\|[0-9]\\).[0-9]\\)? *\\(site=[a-z,_]*react_native[a-z,_]*\\)?)\\)?:? #[0-9]+ suppress_comment=\\(.\\|\n\\)*\\$FlowFixedInNextDeploy +suppress_comment=\\(.\\|\n\\)*\\$FlowExpectedError + +unsafe.enable_getters_and_setters=true [version] -^0.27.0 +^0.47.0 diff --git a/Example/.gitattributes b/Example/.gitattributes new file mode 100644 index 000000000..d42ff1835 --- /dev/null +++ b/Example/.gitattributes @@ -0,0 +1 @@ +*.pbxproj -text diff --git a/Example/.gitignore b/Example/.gitignore index e0117914c..ca38b8bc1 100644 --- a/Example/.gitignore +++ b/Example/.gitignore @@ -23,20 +23,32 @@ DerivedData project.xcworkspace ios/GoogleMobileAds.framework/ -# Android/IJ +# Android/IntelliJ # -*.iml +build/ .idea .gradle local.properties +*.iml # node.js # node_modules/ npm-debug.log +yarn-error.log # BUCK buck-out/ \.buckd/ -android/app/libs -android/keystores/debug.keystore +*.keystore + +# fastlane +# +# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the +# screenshots whenever they are needed. +# For more information about the recommended setup visit: +# https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md + +fastlane/report.xml +fastlane/Preview.html +fastlane/screenshots diff --git a/Example/android/app/build.gradle b/Example/android/app/build.gradle index ec538efe9..3ba80e21d 100644 --- a/Example/android/app/build.gradle +++ b/Example/android/app/build.gradle @@ -33,6 +33,13 @@ import com.android.build.OutputFile * // bundleInPaidRelease: true, * // bundleInBeta: true, * + * // whether to disable dev mode in custom build variants (by default only disabled in release) + * // for example: to disable dev mode in the staging build type (if configured) + * devDisabledInStaging: true, + * // The configuration property can be in the following formats + * // 'devDisabledIn${productFlavor}${buildType}' + * // 'devDisabledIn${buildType}' + * * // the root of your project, i.e. where "package.json" lives * root: "../../", * @@ -58,7 +65,7 @@ import com.android.build.OutputFile * inputExcludes: ["android/**", "ios/**"], * * // override which node gets called and with what additional arguments - * nodeExecutableAndArgs: ["node"] + * nodeExecutableAndArgs: ["node"], * * // supply additional arguments to the packager * extraPackagerArgs: [] @@ -135,6 +142,6 @@ dependencies { // 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' + from configurations.compile + into 'libs' } diff --git a/Example/android/app/proguard-rules.pro b/Example/android/app/proguard-rules.pro index 48361a901..6e8516c8d 100644 --- a/Example/android/app/proguard-rules.pro +++ b/Example/android/app/proguard-rules.pro @@ -50,6 +50,10 @@ -dontwarn com.facebook.react.** +# TextLayoutBuilder uses a non-public Android constructor within StaticLayout. +# See libs/proxy/src/main/java/com/facebook/fbui/textlayoutbuilder/proxy for details. +-dontwarn android.text.StaticLayout + # okhttp -keepattributes Signature diff --git a/Example/android/app/src/main/AndroidManifest.xml b/Example/android/app/src/main/AndroidManifest.xml index 677f07596..8275835d5 100644 --- a/Example/android/app/src/main/AndroidManifest.xml +++ b/Example/android/app/src/main/AndroidManifest.xml @@ -19,7 +19,8 @@ + android:configChanges="keyboard|keyboardHidden|orientation|screenSize" + android:windowSoftInputMode="adjustResize"> diff --git a/Example/android/app/src/main/java/com/example/MainApplication.java b/Example/android/app/src/main/java/com/example/MainApplication.java index 30b2acbe2..19c7b5793 100644 --- a/Example/android/app/src/main/java/com/example/MainApplication.java +++ b/Example/android/app/src/main/java/com/example/MainApplication.java @@ -1,14 +1,13 @@ package com.example; import android.app.Application; -import android.util.Log; import com.facebook.react.ReactApplication; import com.sbugert.rnadmob.RNAdMobPackage; -import com.facebook.react.ReactInstanceManager; import com.facebook.react.ReactNativeHost; import com.facebook.react.ReactPackage; import com.facebook.react.shell.MainReactPackage; +import com.facebook.soloader.SoLoader; import java.util.Arrays; import java.util.List; @@ -17,7 +16,7 @@ public class MainApplication extends Application implements ReactApplication { private final ReactNativeHost mReactNativeHost = new ReactNativeHost(this) { @Override - protected boolean getUseDeveloperSupport() { + public boolean getUseDeveloperSupport() { return BuildConfig.DEBUG; } @@ -25,13 +24,19 @@ protected boolean getUseDeveloperSupport() { protected List getPackages() { return Arrays.asList( new MainReactPackage(), - new RNAdMobPackage() + new RNAdMobPackage() ); } }; @Override public ReactNativeHost getReactNativeHost() { - return mReactNativeHost; + return mReactNativeHost; + } + + @Override + public void onCreate() { + super.onCreate(); + SoLoader.init(this, /* native exopackage */ false); } } diff --git a/Example/android/app/src/main/res/values/strings.xml b/Example/android/app/src/main/res/values/strings.xml index 603e17737..0057fcb99 100644 --- a/Example/android/app/src/main/res/values/strings.xml +++ b/Example/android/app/src/main/res/values/strings.xml @@ -1,5 +1,3 @@ - - Example diff --git a/Example/android/build.gradle b/Example/android/build.gradle index fcba4c587..eed9972b5 100644 --- a/Example/android/build.gradle +++ b/Example/android/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.3.1' + classpath 'com.android.tools.build:gradle:2.2.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/Example/android/gradle/wrapper/gradle-wrapper.properties b/Example/android/gradle/wrapper/gradle-wrapper.properties index b9fbfaba0..dbdc05d27 100644 --- a/Example/android/gradle/wrapper/gradle-wrapper.properties +++ b/Example/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip diff --git a/Example/android/keystores/BUCK b/Example/android/keystores/BUCK index 15da20e6b..88e4c31b2 100644 --- a/Example/android/keystores/BUCK +++ b/Example/android/keystores/BUCK @@ -1,8 +1,8 @@ keystore( - name = 'debug', - store = 'debug.keystore', - properties = 'debug.keystore.properties', - visibility = [ - 'PUBLIC', - ], + name = "debug", + properties = "debug.keystore.properties", + store = "debug.keystore", + visibility = [ + "PUBLIC", + ], ) diff --git a/Example/app.json b/Example/app.json new file mode 100644 index 000000000..e933d0696 --- /dev/null +++ b/Example/app.json @@ -0,0 +1,4 @@ +{ + "name": "Example", + "displayName": "Example" +} \ No newline at end of file diff --git a/Example/index.android.js b/Example/index.android.js index cee6359a3..c9f19a2e2 100644 --- a/Example/index.android.js +++ b/Example/index.android.js @@ -1,78 +1 @@ -import React, { Component } from 'react'; -import { - AppRegistry, - StyleSheet, - Text, - View, - Platform, - TouchableHighlight, -} from 'react-native'; -import { AdMobRewarded } from 'react-native-admob'; - -export default class Example extends Component { - - componentDidMount() { - AdMobRewarded.setTestDeviceID('EMULATOR'); - AdMobRewarded.setAdUnitID('ca-app-pub-3940256099942544/1033173712'); - - AdMobRewarded.addEventListener('rewardedVideoDidRewardUser', - (type, amount) => console.log('rewardedVideoDidRewardUser', type, amount) - ); - AdMobRewarded.addEventListener('rewardedVideoDidLoad', - () => console.log('rewardedVideoDidLoad') - ); - AdMobRewarded.addEventListener('rewardedVideoDidFailToLoad', - (error) => console.log('rewardedVideoDidFailToLoad', error) - ); - AdMobRewarded.addEventListener('rewardedVideoDidOpen', - () => console.log('rewardedVideoDidOpen') - ); - AdMobRewarded.addEventListener('rewardedVideoDidClose', - () => { - console.log('rewardedVideoDidClose'); - AdMobRewarded.requestAd((error) => error && console.log(error)); - } - ); - AdMobRewarded.addEventListener('rewardedVideoWillLeaveApplication', - () => console.log('rewardedVideoWillLeaveApplication') - ); - - AdMobRewarded.requestAd((error) => error && console.log(error)); - } - - componentWillUnmount() { - AdMobRewarded.removeAllListeners(); - } - - showRewarded() { - AdMobRewarded.showAd((error) => error && console.log(error)); - } - - render() { - return ( - - - - - Show Rewarded Video and preload next - - - - - ); - } -} - -const styles = StyleSheet.create({ - container: { - marginTop: (Platform.OS === 'ios') ? 30 : 10, - flex: 1, - alignItems: 'center', - }, - button: { - color: '#333333', - marginBottom: 15, - }, -}); - -AppRegistry.registerComponent('Example', () => Example); +require('./index.js'); diff --git a/Example/index.ios.js b/Example/index.ios.js index cee6359a3..c9f19a2e2 100644 --- a/Example/index.ios.js +++ b/Example/index.ios.js @@ -1,78 +1 @@ -import React, { Component } from 'react'; -import { - AppRegistry, - StyleSheet, - Text, - View, - Platform, - TouchableHighlight, -} from 'react-native'; -import { AdMobRewarded } from 'react-native-admob'; - -export default class Example extends Component { - - componentDidMount() { - AdMobRewarded.setTestDeviceID('EMULATOR'); - AdMobRewarded.setAdUnitID('ca-app-pub-3940256099942544/1033173712'); - - AdMobRewarded.addEventListener('rewardedVideoDidRewardUser', - (type, amount) => console.log('rewardedVideoDidRewardUser', type, amount) - ); - AdMobRewarded.addEventListener('rewardedVideoDidLoad', - () => console.log('rewardedVideoDidLoad') - ); - AdMobRewarded.addEventListener('rewardedVideoDidFailToLoad', - (error) => console.log('rewardedVideoDidFailToLoad', error) - ); - AdMobRewarded.addEventListener('rewardedVideoDidOpen', - () => console.log('rewardedVideoDidOpen') - ); - AdMobRewarded.addEventListener('rewardedVideoDidClose', - () => { - console.log('rewardedVideoDidClose'); - AdMobRewarded.requestAd((error) => error && console.log(error)); - } - ); - AdMobRewarded.addEventListener('rewardedVideoWillLeaveApplication', - () => console.log('rewardedVideoWillLeaveApplication') - ); - - AdMobRewarded.requestAd((error) => error && console.log(error)); - } - - componentWillUnmount() { - AdMobRewarded.removeAllListeners(); - } - - showRewarded() { - AdMobRewarded.showAd((error) => error && console.log(error)); - } - - render() { - return ( - - - - - Show Rewarded Video and preload next - - - - - ); - } -} - -const styles = StyleSheet.create({ - container: { - marginTop: (Platform.OS === 'ios') ? 30 : 10, - flex: 1, - alignItems: 'center', - }, - button: { - color: '#333333', - marginBottom: 15, - }, -}); - -AppRegistry.registerComponent('Example', () => Example); +require('./index.js'); diff --git a/Example/index.js b/Example/index.js new file mode 100644 index 000000000..dc7405eb8 --- /dev/null +++ b/Example/index.js @@ -0,0 +1,215 @@ +import React, { Component } from 'react'; +import { + AppRegistry, + StyleSheet, + Text, + View, + Platform, + TouchableHighlight, + Button, + ScrollView, +} from 'react-native'; + +import { + AdMobBanner, + AdMobRewarded, + AdMobInterstitial, + PublisherBanner, +} from 'react-native-admob'; + +const BannerExample = ({ style, title, children, ...props }) => ( + + {title} + + {children} + + +); + +const bannerWidths = [200, 250, 320]; + +export default class Example extends Component { + + constructor() { + super(); + this.state = { + fluidSizeIndex: 0, + }; + } + + componentDidMount() { + AdMobRewarded.setTestDevices([AdMobRewarded.simulatorId]); + AdMobRewarded.setAdUnitID('ca-app-pub-3940256099942544/1033173712'); + + AdMobRewarded.addEventListener('rewarded', + (reward) => console.log('AdMobRewarded => rewarded', reward) + ); + AdMobRewarded.addEventListener('adLoaded', + () => console.log('AdMobRewarded => adLoaded') + ); + AdMobRewarded.addEventListener('adFailedToLoad', + (error) => console.warn(error) + ); + AdMobRewarded.addEventListener('adOpened', + () => console.log('AdMobRewarded => adOpened') + ); + AdMobRewarded.addEventListener('videoStarted', + () => console.log('AdMobRewarded => videoStarted') + ); + AdMobRewarded.addEventListener('adClosed', + () => { + console.log('AdMobRewarded => adClosed'); + AdMobRewarded.requestAd().catch(error => console.warn(error)); + } + ); + AdMobRewarded.addEventListener('adLeftApplication', + () => console.log('AdMobRewarded => adLeftApplication') + ); + + AdMobRewarded.requestAd().catch(error => console.warn(error)); + + AdMobInterstitial.setTestDevices([AdMobInterstitial.simulatorId]); + AdMobInterstitial.setAdUnitID('ca-app-pub-3940256099942544/4411468910'); + + AdMobInterstitial.addEventListener('adLoaded', + () => console.log('AdMobInterstitial adLoaded') + ); + AdMobInterstitial.addEventListener('adFailedToLoad', + (error) => console.warn(error) + ); + AdMobInterstitial.addEventListener('adOpened', + () => console.log('AdMobInterstitial => adOpened') + ); + AdMobInterstitial.addEventListener('adClosed', + () => { + console.log('AdMobInterstitial => adClosed'); + AdMobInterstitial.requestAd().catch(error => console.warn(error)); + } + ); + AdMobInterstitial.addEventListener('adLeftApplication', + () => console.log('AdMobInterstitial => adLeftApplication') + ); + + AdMobInterstitial.requestAd().catch(error => console.warn(error)); + } + + componentWillUnmount() { + AdMobRewarded.removeAllListeners(); + AdMobInterstitial.removeAllListeners(); + } + + showRewarded() { + AdMobRewarded.showAd().catch(error => console.warn(error)); + } + + showInterstitial() { + AdMobInterstitial.showAd().catch(error => console.warn(error)); + } + + render() { + return ( + + + + (this._basicExample = el)} + /> +