├── .editorconfig ├── .eslintrc.js ├── .gitattributes ├── .github ├── FUNDING.yml ├── ISSUE_TEMPLATE │ └── bug_report.md ├── PULL_REQUEST_TEMPLATE.md └── workflows │ ├── android-build.yml │ ├── docs-check.yml │ ├── docs.yml │ ├── ios-build.yml │ ├── static-example-app-checks.yml │ └── static-root-checks.yml ├── .gitignore ├── .husky └── pre-commit ├── .npmignore ├── .prettierrc.js ├── LICENSE ├── README.md ├── RNAdMob.podspec ├── android ├── build.gradle └── src │ └── main │ ├── AndroidManifest.xml │ └── java │ └── com │ └── rnadmob │ └── admob │ ├── ActivityAwareJavaModule.java │ ├── RNAdMobAdHolder.java │ ├── RNAdMobCommon.java │ ├── RNAdMobEventModule.java │ ├── RNAdMobModule.java │ ├── RNAdMobPackage.java │ ├── RNAdMobPromiseHolder.java │ └── ads │ ├── banner │ ├── RNAdMobBannerView.java │ └── RNAdMobBannerViewManager.java │ └── fullscreen │ ├── RNAdMobAppOpenAdModule.java │ ├── RNAdMobFullScreenAdModule.java │ ├── RNAdMobInterstitialAdModule.java │ ├── RNAdMobRewardedAdModule.java │ └── RNAdMobRewardedInterstitialAdModule.java ├── babel.config.js ├── docs ├── .gitignore ├── README.md ├── babel.config.js ├── docs │ ├── Example App.mdx │ ├── Installation.mdx │ ├── api │ │ ├── _category_.json │ │ ├── classes │ │ │ ├── AdError.mdx │ │ │ ├── AppOpenAd.mdx │ │ │ ├── FullScreenAd.mdx │ │ │ ├── InterstitialAd.mdx │ │ │ ├── RewardedAd.mdx │ │ │ ├── RewardedInterstitialAd.mdx │ │ │ └── _category_.json │ │ ├── components │ │ │ ├── AppOpenAdProvider.mdx │ │ │ ├── BannerAd.mdx │ │ │ ├── GAMBannerAd.mdx │ │ │ └── _category_.json │ │ ├── hooks │ │ │ ├── _category_.json │ │ │ ├── useAppOpenAd.mdx │ │ │ ├── useFullScreenAd.mdx │ │ │ ├── useInterstitialAd.mdx │ │ │ ├── useRewardedAd.mdx │ │ │ └── useRewardedInterstitialAd.mdx │ │ ├── misc │ │ │ ├── _category_.json │ │ │ ├── getInitializationStatus.mdx │ │ │ ├── isTestDevice.mdx │ │ │ └── setRequestConfiguration.mdx │ │ └── types │ │ │ ├── FullScreenAdOptions.mdx │ │ │ ├── RequestOptions.mdx │ │ │ └── _category_.json │ └── usage │ │ ├── _category_.json │ │ ├── appopen.mdx │ │ ├── banner.mdx │ │ ├── fullscreen-class.mdx │ │ ├── fullscreen-fundamentals.mdx │ │ ├── fullscreen-hook.mdx │ │ ├── npa.mdx │ │ └── remove-ads.mdx ├── docusaurus.config.js ├── package.json ├── sidebars.js ├── src │ ├── css │ │ └── custom.css │ └── pages │ │ └── styles.module.css ├── static │ ├── .nojekyll │ ├── img │ │ ├── favicon.ico │ │ ├── logo.svg │ │ └── logo_admob.png │ └── index.html └── yarn.lock ├── example ├── android │ ├── app │ │ ├── build.gradle │ │ ├── debug.keystore │ │ ├── proguard-rules.pro │ │ └── src │ │ │ ├── debug │ │ │ ├── AndroidManifest.xml │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── rnadmob │ │ │ │ └── ReactNativeFlipper.java │ │ │ └── main │ │ │ ├── AndroidManifest.xml │ │ │ ├── java │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── rnadmob │ │ │ │ ├── MainActivity.java │ │ │ │ └── MainApplication.java │ │ │ └── res │ │ │ ├── drawable │ │ │ └── bootsplash.xml │ │ │ ├── mipmap-hdpi │ │ │ ├── bootsplash_logo.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-mdpi │ │ │ ├── bootsplash_logo.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xhdpi │ │ │ ├── bootsplash_logo.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxhdpi │ │ │ ├── bootsplash_logo.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ ├── mipmap-xxxhdpi │ │ │ ├── bootsplash_logo.png │ │ │ ├── ic_launcher.png │ │ │ └── ic_launcher_round.png │ │ │ └── values │ │ │ ├── colors.xml │ │ │ ├── strings.xml │ │ │ └── styles.xml │ ├── build.gradle │ ├── gradle.properties │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── gradlew │ ├── gradlew.bat │ └── settings.gradle ├── app.json ├── assets │ └── logo_admob.png ├── babel.config.js ├── index.js ├── ios │ ├── AdmobExample.xcodeproj │ │ ├── project.pbxproj │ │ └── xcshareddata │ │ │ └── xcschemes │ │ │ └── AdmobExample.xcscheme │ ├── AdmobExample.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ ├── AdmobExample │ │ ├── AppDelegate.h │ │ ├── AppDelegate.m │ │ ├── BootSplash.storyboard │ │ ├── Images.xcassets │ │ │ ├── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ │ ├── BootSplashLogo.imageset │ │ │ │ ├── Contents.json │ │ │ │ ├── bootsplash_logo.png │ │ │ │ ├── bootsplash_logo@2x.png │ │ │ │ └── bootsplash_logo@3x.png │ │ │ └── Contents.json │ │ ├── Info.plist │ │ ├── LaunchScreen.storyboard │ │ └── main.m │ ├── Podfile │ └── Podfile.lock ├── metro.config.js ├── package.json ├── src │ ├── App.tsx │ ├── Navigator.tsx │ ├── PaidProvider.tsx │ ├── components │ │ ├── CountDownModal.tsx │ │ └── ExampleGroup.tsx │ ├── examples │ │ ├── AppOpenAdExample.tsx │ │ ├── BannerAdExample.tsx │ │ └── FullScreenAdExamples │ │ │ ├── ClassApiExample.tsx │ │ │ └── HookApiExample.tsx │ └── screens │ │ ├── ExamplesScreen.tsx │ │ └── SecondScreen.tsx ├── tsconfig.json └── yarn.lock ├── ios ├── RNAdMob.xcodeproj │ ├── project.pbxproj │ └── xcshareddata │ │ └── xcschemes │ │ └── RNAdMob.xcscheme └── RNAdMob │ ├── Ads │ ├── Banner │ │ ├── RNAdMobBannerView.h │ │ ├── RNAdMobBannerView.m │ │ └── RNAdMobBannerViewManager.m │ └── FullScreen │ │ ├── RNAdMobAppOpen.swift │ │ ├── RNAdMobFullScreenAd.swift │ │ ├── RNAdMobFullScreenAdBridge.m │ │ ├── RNAdMobInterstitial.swift │ │ ├── RNAdMobRewarded.swift │ │ └── RNAdMobRewardedInterstitial.swift │ ├── RNAdMob.m │ ├── RNAdMobAdHolder.swift │ ├── RNAdMobCommon.h │ ├── RNAdMobCommon.m │ ├── RNAdMobEvent.h │ ├── RNAdMobEvent.m │ └── RNAdMobPromiseHolder.swift ├── package.json ├── src ├── AdError.ts ├── AdMob.ts ├── ads │ ├── AppOpenAdContext.ts │ ├── AppOpenAdProvider.tsx │ ├── banner │ │ ├── BannerAd.tsx │ │ ├── BaseAd.tsx │ │ ├── GAMBannerAd.tsx │ │ └── index.ts │ ├── fullscreen │ │ ├── AppOpenAd.ts │ │ ├── FullScreenAd.ts │ │ ├── InterstitialAd.ts │ │ ├── RewardedAd.ts │ │ ├── RewardedInterstitialAd.ts │ │ └── index.ts │ └── index.ts ├── constants │ ├── BannerAdSize.ts │ ├── TestIds.ts │ └── index.ts ├── hooks │ ├── index.ts │ ├── useAppOpenAd.ts │ ├── useFullScreenAd.ts │ ├── useInterstitialAd.ts │ ├── useRewardedAd.ts │ └── useRewardedInterstitialAd.ts ├── index.ts └── types.ts ├── tsconfig.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*.{js,jsx,ts,tsx,json}] 8 | 9 | indent_style = space 10 | indent_size = 2 11 | 12 | end_of_line = lf 13 | charset = utf-8 14 | trim_trailing_whitespace = true 15 | insert_final_newline = true 16 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@react-native-community'], 3 | plugins: ['simple-import-sort', 'unused-imports'], 4 | rules: { 5 | 'simple-import-sort/imports': [ 6 | 'error', 7 | { 8 | groups: [ 9 | // Packages. `react` related packages come first. 10 | ['^react', '^@?\\w'], 11 | // Side effect imports. 12 | ['^\\u0000'], 13 | // Internal packages. 14 | ['^()(/.*|$)'], 15 | // Parent imports. Put `..` last. 16 | ['^\\.\\.(?!/?$)', '^\\.\\./?$'], 17 | // Other relative imports. Put same-folder imports and `.` last. 18 | ['^\\./(?=.*/)(?!/?$)', '^\\.(?!/?$)', '^\\./?$'], 19 | ], 20 | }, 21 | ], 22 | 'unused-imports/no-unused-imports': 'error', 23 | 'react-native/no-inline-styles': 0, 24 | 'react-native/sort-styles': [ 25 | 'error', 26 | 'asc', 27 | { ignoreClassNames: true, ignoreStyleProperties: false }, 28 | ], 29 | 'no-shadow': 'off', 30 | '@typescript-eslint/no-shadow': ['error'], 31 | }, 32 | parserOptions: { 33 | project: ['./tsconfig.json', './example/tsconfig.json'], 34 | }, 35 | }; 36 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | # specific for windows script files 3 | *.bat text eol=crlf -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | ko_fi: wjaykim 2 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: "🐞 Bug report" 3 | about: Report an issue with Reanimated 4 | title: '' 5 | labels: "🐞 Bug" 6 | assignees: '' 7 | --- 8 | 9 | ## Description 10 | 11 | 14 | 15 | ### Expected behavior 16 | 17 | ### Actual behavior & steps to reproduce 18 | 19 | ## Snack or minimal code example 20 | 21 | 25 | 26 | ## Package versions 27 | 28 | 33 | 34 | - React Native: 35 | - React Native AdMob: 36 | - Google Mobile Ads SDK(if specified): 37 | - Xcode: 38 | - Java & Gradle: 39 | 40 | ## Affected platforms 41 | 42 | - [ ] Android 43 | - [ ] iOS 44 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Description 2 | 3 | 10 | 11 | ## Changes 12 | 13 | 23 | 24 | 37 | 38 | ## Test code and steps to reproduce 39 | 40 | 44 | 45 | ## Checklist 46 | 47 | - [ ] Included code example that can be used to test this change 48 | - [ ] Updated TS types 49 | - [ ] Updated documentation 50 | - [ ] Ensured that CI passes 51 | -------------------------------------------------------------------------------- /.github/workflows/android-build.yml: -------------------------------------------------------------------------------- 1 | name: Test Android build 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | paths: 7 | - 'android/**' 8 | push: 9 | branches: 10 | - master 11 | jobs: 12 | build: 13 | runs-on: ubuntu-latest 14 | env: 15 | WORKING_DIRECTORY: example 16 | concurrency: 17 | group: android-${{ github.ref }} 18 | cancel-in-progress: true 19 | steps: 20 | - name: checkout 21 | uses: actions/checkout@v2 22 | - name: Accept licenses 23 | run: /bin/bash -c "yes | $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager --licenses > /dev/null" 24 | - name: Use Node.js 14 25 | uses: actions/setup-node@v2 26 | with: 27 | node-version: 14 28 | cache: 'yarn' 29 | - name: Install library node dependencies 30 | run: yarn 31 | - name: Install example app node dependencies 32 | working-directory: ${{ env.WORKING_DIRECTORY }} 33 | run: yarn 34 | - name: Build app 35 | working-directory: ${{ env.WORKING_DIRECTORY }}/android 36 | run: ./gradlew assembleDebug --console=plain -------------------------------------------------------------------------------- /.github/workflows/docs-check.yml: -------------------------------------------------------------------------------- 1 | name: Test docs build 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | paths: 7 | - 'docs/**' 8 | jobs: 9 | build: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 🛎️ 13 | uses: actions/checkout@v2.3.1 14 | - name: Use Node.js 14 15 | uses: actions/setup-node@v2 16 | with: 17 | node-version: 14 18 | cache: 'yarn' 19 | - name: Install and Build 🔧 20 | working-directory: docs 21 | run: | 22 | yarn 23 | yarn build -------------------------------------------------------------------------------- /.github/workflows/docs.yml: -------------------------------------------------------------------------------- 1 | name: Build and Deploy Documentation 2 | on: 3 | push: 4 | branches: 5 | - master 6 | paths: 7 | - 'docs/**' 8 | jobs: 9 | build-and-deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 🛎️ 13 | uses: actions/checkout@v2.3.1 14 | - name: Install and Build 🔧 15 | run: | 16 | cd docs 17 | yarn 18 | yarn build 19 | - name: Deploy 🚀 20 | uses: JamesIves/github-pages-deploy-action@4.1.5 21 | with: 22 | branch: gh-pages 23 | folder: docs/build -------------------------------------------------------------------------------- /.github/workflows/ios-build.yml: -------------------------------------------------------------------------------- 1 | name: Test iOS build 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | paths: 7 | - 'ios/**' 8 | push: 9 | branches: 10 | - master 11 | jobs: 12 | build: 13 | # runs-on: macos-latest // issue: https://github.com/actions/virtual-environments/issues/4060 14 | runs-on: macos-11 15 | env: 16 | WORKING_DIRECTORY: example 17 | concurrency: 18 | group: ios-${{ github.ref }} 19 | cancel-in-progress: true 20 | steps: 21 | - name: checkout 22 | uses: actions/checkout@v2 23 | - name: Use Node.js 14 24 | uses: actions/setup-node@v2 25 | with: 26 | node-version: 14 27 | cache: 'yarn' 28 | - name: Install library node dependencies 29 | run: yarn 30 | - name: Install example app node dependencies 31 | working-directory: ${{ env.WORKING_DIRECTORY }} 32 | run: yarn 33 | - name: Install pods 34 | working-directory: ${{ env.WORKING_DIRECTORY }}/ios 35 | run: pod install 36 | - name: Build app 37 | working-directory: ${{ env.WORKING_DIRECTORY }} 38 | run: yarn ios -------------------------------------------------------------------------------- /.github/workflows/static-example-app-checks.yml: -------------------------------------------------------------------------------- 1 | name: Test Example App TypeScript and Lint 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | paths: 7 | - 'example/**' 8 | push: 9 | branches: 10 | - master 11 | jobs: 12 | check: 13 | runs-on: ubuntu-latest 14 | env: 15 | WORKING_DIRECTORY: example 16 | concurrency: 17 | group: static-example-${{ github.ref }} 18 | cancel-in-progress: true 19 | steps: 20 | - name: checkout 21 | uses: actions/checkout@v2 22 | - name: Use Node.js 14 23 | uses: actions/setup-node@v2 24 | with: 25 | node-version: 14 26 | cache: 'yarn' 27 | - name: Install root node dependencies 28 | run: yarn 29 | - name: Install example app node dependencies 30 | working-directory: ${{ env.WORKING_DIRECTORY }} 31 | run: yarn 32 | - name: Check types 33 | working-directory: ${{ env.WORKING_DIRECTORY }} 34 | run: yarn tsc --noEmit 35 | - name: Lint 36 | working-directory: ${{ env.WORKING_DIRECTORY }} 37 | run: yarn lint:js -------------------------------------------------------------------------------- /.github/workflows/static-root-checks.yml: -------------------------------------------------------------------------------- 1 | name: Test TypeScript and Lint 2 | on: 3 | pull_request: 4 | branches: 5 | - master 6 | paths: 7 | - 'src/**' 8 | - '*' 9 | push: 10 | branches: 11 | - master 12 | jobs: 13 | check: 14 | runs-on: ubuntu-latest 15 | concurrency: 16 | group: static-root-${{ github.ref }} 17 | cancel-in-progress: true 18 | steps: 19 | - name: checkout 20 | uses: actions/checkout@v2 21 | - name: Use Node.js 14 22 | uses: actions/setup-node@v2 23 | with: 24 | node-version: 14 25 | cache: 'yarn' 26 | - name: Install node dependencies 27 | run: yarn 28 | - name: Check types 29 | run: yarn tsc --noEmit 30 | - name: Lint 31 | run: yarn lint:js -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # XDE 6 | .expo/ 7 | 8 | # VSCode 9 | .vscode/ 10 | jsconfig.json 11 | 12 | # Xcode 13 | # 14 | build/ 15 | *.pbxuser 16 | !default.pbxuser 17 | *.mode1v3 18 | !default.mode1v3 19 | *.mode2v3 20 | !default.mode2v3 21 | *.perspectivev3 22 | !default.perspectivev3 23 | xcuserdata 24 | *.xccheckout 25 | *.moved-aside 26 | DerivedData 27 | *.hmap 28 | *.ipa 29 | *.xcuserstate 30 | project.xcworkspace 31 | 32 | # Android/IJ 33 | # 34 | .idea 35 | .gradle 36 | local.properties 37 | android.iml 38 | 39 | # Cocoapods 40 | # 41 | example/ios/Pods 42 | 43 | # node.js 44 | # 45 | node_modules/ 46 | npm-debug.log 47 | yarn-debug.log 48 | yarn-error.log 49 | 50 | # BUCK 51 | buck-out/ 52 | \.buckd/ 53 | android/app/libs 54 | android/keystores/debug.keystore 55 | 56 | # Expo 57 | .expo/* 58 | 59 | # generated by bob 60 | lib/ 61 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn lint-staged 5 | yarn type:check -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | example/ -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | "quoteProps": "consistent", 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "trailingComma": "es5", 6 | "useTabs": false 7 | }; 8 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Jay Kim 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This library is deprecated. Use [react-native-google-mobile-ads][0] instead. 2 | 3 | Please migrate to the [new library][0] if you were using this library as this library is no longer maintained. Now more stronger features are available in the [new library][0]. 4 | 5 |

6 | cover with mockup 7 |

8 | React Native AdMob 9 |

10 |

11 |

12 | 13 | npm version 14 | 15 | 16 | weekly downloads 17 | 18 | 19 | npm bundle size 20 | 21 | 22 | license 23 | 24 |
25 |

26 | 27 | > Admob for React Native with powerful hooks and components 28 | 29 | ## 📦 Installation 30 | 31 | See [Installation Guide](https://react-native-admob.github.io/admob/docs/installation) 32 | 33 | ## 📃 Documentation 34 | 35 | Head over [Documentation Page](https://react-native-admob.github.io/admob/docs/usage/banner) 36 | 37 | ## License 38 | 39 | MIT 40 | 41 | [0]: https://github.com/invertase/react-native-google-mobile-ads 42 | -------------------------------------------------------------------------------- /RNAdMob.podspec: -------------------------------------------------------------------------------- 1 | require "json" 2 | 3 | package = JSON.parse(File.read(File.join(__dir__, "package.json"))) 4 | 5 | Pod::Spec.new do |s| 6 | s.name = "RNAdMob" 7 | s.version = package["version"] 8 | s.summary = package["description"] 9 | s.homepage = package["homepage"] 10 | s.license = package["license"] 11 | s.authors = package["author"] 12 | 13 | s.platforms = { :ios => "10.0" } 14 | s.source = { :git => "https://github.com/react-native-admob/admob.git", :tag => "#{s.version}" } 15 | 16 | s.source_files = "ios/**/*.{h,m,mm,swift}" 17 | 18 | s.dependency "React-Core" 19 | s.dependency 'Google-Mobile-Ads-SDK', '~> 8.0' 20 | 21 | if defined?($RNAdMobAsStaticFramework) 22 | Pod::UI.puts "#{s.name}: Using overridden static_framework value of '#{$RNAdMobAsStaticFramework}'" 23 | s.static_framework = $RNAdMobAsStaticFramework 24 | else 25 | s.static_framework = false 26 | end 27 | end 28 | -------------------------------------------------------------------------------- /android/build.gradle: -------------------------------------------------------------------------------- 1 | buildscript { 2 | if (project == rootProject) { 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | 8 | dependencies { 9 | classpath 'com.android.tools.build:gradle:7.0.4' 10 | } 11 | } 12 | } 13 | 14 | apply plugin: 'com.android.library' 15 | 16 | def safeExtGet(prop, fallback) { 17 | rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback 18 | } 19 | 20 | android { 21 | compileSdkVersion safeExtGet('compileSdkVersion', 31) 22 | buildToolsVersion safeExtGet('buildToolsVersion', '30.0.2') 23 | defaultConfig { 24 | minSdkVersion safeExtGet('minSdkVersion', 21) 25 | targetSdkVersion safeExtGet('targetSdkVersion', 31) 26 | } 27 | 28 | buildTypes { 29 | release { 30 | minifyEnabled false 31 | } 32 | } 33 | lintOptions { 34 | disable 'GradleCompatible' 35 | } 36 | compileOptions { 37 | sourceCompatibility JavaVersion.VERSION_1_8 38 | targetCompatibility JavaVersion.VERSION_1_8 39 | } 40 | } 41 | 42 | repositories { 43 | maven { 44 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 45 | url("$rootDir/../node_modules/react-native/android") 46 | } 47 | maven { 48 | // Android JSC is installed from npm 49 | url "$rootDir/../node_modules/jsc-android/dist" 50 | } 51 | mavenCentral { 52 | // We don't want to fetch react-native from Maven Central as there are 53 | // older versions over there. 54 | content { 55 | excludeGroup "com.facebook.react" 56 | } 57 | } 58 | google() 59 | } 60 | 61 | dependencies { 62 | //noinspection GradleDynamicVersion 63 | implementation "com.facebook.react:react-native:+" // From node_modules 64 | implementation 'com.google.android.gms:play-services-ads:[20.0, 21.0[' 65 | 66 | def lifecycle_version = "2.4.0" 67 | implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" 68 | implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version" 69 | implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" 70 | } 71 | -------------------------------------------------------------------------------- /android/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/ActivityAwareJavaModule.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob; 2 | 3 | import android.app.Activity; 4 | import android.app.Application; 5 | import android.os.Bundle; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.annotation.Nullable; 9 | 10 | import com.facebook.react.bridge.LifecycleEventListener; 11 | import com.facebook.react.bridge.ReactApplicationContext; 12 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 13 | 14 | public abstract class ActivityAwareJavaModule extends ReactContextBaseJavaModule implements Application.ActivityLifecycleCallbacks, LifecycleEventListener { 15 | 16 | @Nullable 17 | private Application application; 18 | 19 | @Nullable 20 | protected Activity currentActivity; 21 | 22 | public ActivityAwareJavaModule(ReactApplicationContext reactContext) { 23 | super(reactContext); 24 | reactContext.addLifecycleEventListener(this); 25 | } 26 | 27 | @Override 28 | public void onActivityCreated(Activity activity, Bundle savedInstanceState) {} 29 | 30 | @Override 31 | public void onActivityStarted(@NonNull Activity activity) { 32 | currentActivity = activity; 33 | } 34 | 35 | @Override 36 | public void onActivityResumed(@NonNull Activity activity) { 37 | currentActivity = activity; 38 | } 39 | 40 | @Override 41 | public void onActivityStopped(Activity activity) {} 42 | 43 | @Override 44 | public void onActivityPaused(Activity activity) {} 45 | 46 | @Override 47 | public void onActivitySaveInstanceState(Activity activity, Bundle bundle) {} 48 | 49 | @Override 50 | public void onActivityDestroyed(@NonNull Activity activity) { 51 | if (activity.equals(currentActivity)) { 52 | currentActivity = null; 53 | } 54 | } 55 | 56 | @Override 57 | public void onHostResume() { 58 | if (application == null) { 59 | currentActivity = getCurrentActivity(); 60 | if (currentActivity != null) { 61 | application = currentActivity.getApplication(); 62 | application.registerActivityLifecycleCallbacks(this); 63 | } 64 | } 65 | } 66 | 67 | @Override 68 | public void onHostPause() {} 69 | 70 | @Override 71 | public void onHostDestroy() { 72 | if (application != null) { 73 | application.unregisterActivityLifecycleCallbacks(this); 74 | application = null; 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/RNAdMobAdHolder.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob; 2 | 3 | import android.util.SparseArray; 4 | 5 | public class RNAdMobAdHolder { 6 | SparseArray adArray = new SparseArray<>(); 7 | 8 | public void add(int requestId, T ad) { 9 | adArray.put(requestId, ad); 10 | } 11 | 12 | public T get(int requestId) { 13 | return adArray.get(requestId); 14 | } 15 | 16 | public void remove(int requestId) { 17 | adArray.delete(requestId); 18 | } 19 | 20 | public void clear() { 21 | adArray.clear(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/RNAdMobEventModule.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob; 2 | 3 | import androidx.annotation.NonNull; 4 | import androidx.annotation.Nullable; 5 | 6 | import com.facebook.react.bridge.Arguments; 7 | import com.facebook.react.bridge.ReactApplicationContext; 8 | import com.facebook.react.bridge.ReactContext; 9 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 10 | import com.facebook.react.bridge.WritableMap; 11 | import com.facebook.react.modules.core.DeviceEventManagerModule; 12 | 13 | public class RNAdMobEventModule extends ReactContextBaseJavaModule { 14 | public static final String AD_FAILED_TO_PRESENT = "adFailedToPresent"; 15 | public static final String AD_PRESENTED = "adPresented"; 16 | public static final String AD_DISMISSED = "adDismissed"; 17 | public static final String AD_LOADED = "adLoaded"; 18 | public static final String AD_FAILED_TO_LOAD = "adFailedToLoad"; 19 | public static final String REWARDED = "rewarded"; 20 | 21 | private static ReactContext mContext; 22 | 23 | @NonNull 24 | @Override 25 | public String getName() { 26 | return "RNAdMobEvent"; 27 | } 28 | 29 | public RNAdMobEventModule(ReactApplicationContext reactContext) { 30 | super(reactContext); 31 | mContext = reactContext; 32 | } 33 | 34 | public static void sendEvent(String eventName, String type, int requestId, @Nullable WritableMap data) { 35 | WritableMap body = Arguments.createMap(); 36 | body.putString("type", type); 37 | body.putInt("requestId", requestId); 38 | body.putMap("data", data); 39 | mContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class).emit(eventName, body); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/RNAdMobModule.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.facebook.react.bridge.Arguments; 6 | import com.facebook.react.bridge.Promise; 7 | import com.facebook.react.bridge.ReactApplicationContext; 8 | import com.facebook.react.bridge.ReactContextBaseJavaModule; 9 | import com.facebook.react.bridge.ReactMethod; 10 | import com.facebook.react.bridge.ReadableMap; 11 | import com.facebook.react.bridge.WritableArray; 12 | import com.facebook.react.bridge.WritableMap; 13 | import com.google.android.gms.ads.AdRequest; 14 | import com.google.android.gms.ads.MobileAds; 15 | import com.google.android.gms.ads.RequestConfiguration; 16 | import com.google.android.gms.ads.initialization.AdapterStatus; 17 | import com.google.android.gms.ads.initialization.InitializationStatus; 18 | 19 | import java.util.ArrayList; 20 | import java.util.Map; 21 | import java.util.Objects; 22 | 23 | public class RNAdMobModule extends ReactContextBaseJavaModule { 24 | 25 | public RNAdMobModule(ReactApplicationContext context) { 26 | super(context); 27 | MobileAds.initialize(context); 28 | } 29 | 30 | @NonNull 31 | @Override 32 | public String getName() { 33 | return "RNAdMob"; 34 | } 35 | 36 | @ReactMethod 37 | public void getInitializationStatus(Promise promise) { 38 | InitializationStatus status = MobileAds.getInitializationStatus(); 39 | 40 | if (status == null) { 41 | promise.reject("E_MOBILE_ADS_NOT_INITIALIZED", "MobileAds SDK is not initialized yet."); 42 | return; 43 | } 44 | 45 | WritableArray array = Arguments.createArray(); 46 | for (Map.Entry entry : status.getAdapterStatusMap().entrySet()) { 47 | AdapterStatus adapterStatus = entry.getValue(); 48 | 49 | WritableMap info = Arguments.createMap(); 50 | info.putString("name", entry.getKey()); 51 | info.putBoolean("state", adapterStatus.getInitializationState().equals(AdapterStatus.State.READY)); 52 | info.putString("description", adapterStatus.getDescription()); 53 | array.pushMap(info); 54 | } 55 | promise.resolve(array); 56 | } 57 | 58 | @ReactMethod 59 | public void setRequestConfiguration(ReadableMap config) { 60 | RequestConfiguration.Builder configuration = new RequestConfiguration.Builder(); 61 | 62 | if (config.hasKey("maxAdContentRating")) { 63 | String maxAdContentRating = config.getString("maxAdContentRating"); 64 | if (maxAdContentRating != null) { 65 | configuration.setMaxAdContentRating(maxAdContentRating); 66 | } 67 | } 68 | 69 | if (config.hasKey("tagForChildDirectedTreatment")) { 70 | boolean tagForChildDirectedTreatment = config.getBoolean("tagForChildDirectedTreatment"); 71 | configuration.setTagForChildDirectedTreatment(tagForChildDirectedTreatment ? 1 : 0); 72 | } 73 | if (config.hasKey("tagForUnderAgeOfConsent")) { 74 | boolean tagForUnderAgeOfConsent = config.getBoolean("tagForUnderAgeOfConsent"); 75 | configuration.setTagForUnderAgeOfConsent(tagForUnderAgeOfConsent ? 1 : 0); 76 | } 77 | if (config.hasKey("testDeviceIds")) { 78 | ArrayList devices = new ArrayList<>(); 79 | ArrayList propDevices = Objects.requireNonNull(config.getArray("testDeviceIds")) 80 | .toArrayList(); 81 | for (Object device : propDevices) { 82 | String id = (String) device; 83 | devices.add(id); 84 | } 85 | devices.add(AdRequest.DEVICE_ID_EMULATOR); 86 | configuration.setTestDeviceIds(devices); 87 | } 88 | 89 | MobileAds.setRequestConfiguration(configuration.build()); 90 | } 91 | 92 | @ReactMethod 93 | public void isTestDevice(Promise promise) { 94 | AdRequest builder = new AdRequest.Builder().build(); 95 | promise.resolve(builder.isTestDevice(getReactApplicationContext())); 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/RNAdMobPackage.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.facebook.react.ReactPackage; 6 | import com.facebook.react.bridge.NativeModule; 7 | import com.facebook.react.bridge.ReactApplicationContext; 8 | import com.facebook.react.uimanager.ViewManager; 9 | import com.rnadmob.admob.ads.fullscreen.RNAdMobAppOpenAdModule; 10 | import com.rnadmob.admob.ads.banner.RNAdMobBannerViewManager; 11 | import com.rnadmob.admob.ads.fullscreen.RNAdMobInterstitialAdModule; 12 | import com.rnadmob.admob.ads.fullscreen.RNAdMobRewardedAdModule; 13 | import com.rnadmob.admob.ads.fullscreen.RNAdMobRewardedInterstitialAdModule; 14 | 15 | import java.util.Arrays; 16 | import java.util.List; 17 | 18 | public class RNAdMobPackage implements ReactPackage { 19 | @NonNull 20 | @Override 21 | public List createNativeModules(@NonNull ReactApplicationContext reactContext) { 22 | return Arrays.asList( 23 | new RNAdMobModule(reactContext), 24 | new RNAdMobInterstitialAdModule(reactContext), 25 | new RNAdMobRewardedAdModule(reactContext), 26 | new RNAdMobRewardedInterstitialAdModule(reactContext), 27 | new RNAdMobAppOpenAdModule(reactContext), 28 | new RNAdMobEventModule(reactContext) 29 | ); 30 | } 31 | 32 | @NonNull 33 | @Override 34 | public List createViewManagers(@NonNull ReactApplicationContext reactContext) { 35 | return Arrays.asList(new RNAdMobBannerViewManager()); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/RNAdMobPromiseHolder.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob; 2 | 3 | import static com.rnadmob.admob.RNAdMobEventModule.AD_FAILED_TO_PRESENT; 4 | 5 | import android.util.SparseArray; 6 | 7 | import com.facebook.react.bridge.Promise; 8 | import com.facebook.react.bridge.WritableMap; 9 | import com.google.android.gms.ads.AdError; 10 | 11 | import java.util.Locale; 12 | 13 | public class RNAdMobPromiseHolder { 14 | SparseArray promiseArray = new SparseArray<>(); 15 | 16 | public void add(int requestId, Promise promise) { 17 | promiseArray.put(requestId, promise); 18 | } 19 | 20 | public void clear() { 21 | promiseArray.clear(); 22 | } 23 | 24 | public void resolve(int requestId) { 25 | Promise promise = promiseArray.get(requestId); 26 | if (promise != null) { 27 | promise.resolve(null); 28 | promiseArray.delete(requestId); 29 | } 30 | } 31 | 32 | public void reject(int requestId, WritableMap error) { 33 | Promise promise = promiseArray.get(requestId); 34 | if (promise != null) { 35 | promise.reject(AD_FAILED_TO_PRESENT, "Error occurred while presenting ad.", error); 36 | promiseArray.delete(requestId); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/ads/banner/RNAdMobBannerViewManager.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob.ads.banner; 2 | 3 | import androidx.annotation.Nullable; 4 | 5 | import com.facebook.react.bridge.ReadableArray; 6 | import com.facebook.react.bridge.ReadableMap; 7 | import com.facebook.react.common.MapBuilder; 8 | import com.facebook.react.uimanager.SimpleViewManager; 9 | import com.facebook.react.uimanager.ThemedReactContext; 10 | import com.facebook.react.uimanager.annotations.ReactProp; 11 | 12 | import java.util.Map; 13 | 14 | import javax.annotation.Nonnull; 15 | 16 | public class RNAdMobBannerViewManager extends SimpleViewManager { 17 | public static final String REACT_CLASS = "RNAdMobBannerView"; 18 | public static final String EVENT_AD_LOADED = "onAdLoaded"; 19 | public static final String EVENT_AD_FAILED_TO_LOAD = "onAdFailedToLoad"; 20 | public static final String EVENT_AD_OPENED = "onAdOpened"; 21 | public static final String EVENT_AD_CLOSED = "onAdClosed"; 22 | public static final String EVENT_SIZE_CHANGE = "onSizeChange"; 23 | public static final String EVENT_APP_EVENT = "onAppEvent"; 24 | 25 | private static final String COMMAND_REQUEST_AD = "requestAd"; 26 | 27 | @Nonnull 28 | @Override 29 | public String getName() { 30 | return REACT_CLASS; 31 | } 32 | 33 | @Nonnull 34 | @Override 35 | public RNAdMobBannerView createViewInstance(@Nonnull ThemedReactContext themedReactContext) { 36 | return new RNAdMobBannerView(themedReactContext); 37 | } 38 | 39 | @Override 40 | @Nullable 41 | public Map getExportedCustomDirectEventTypeConstants() { 42 | MapBuilder.Builder builder = MapBuilder.builder(); 43 | String[] events = { 44 | EVENT_SIZE_CHANGE, 45 | EVENT_AD_LOADED, 46 | EVENT_AD_FAILED_TO_LOAD, 47 | EVENT_AD_OPENED, 48 | EVENT_AD_CLOSED 49 | }; 50 | for (String event : events) { 51 | builder.put(event, MapBuilder.of("registrationName", event)); 52 | } 53 | return builder.build(); 54 | } 55 | 56 | @ReactProp(name = "unitId") 57 | public void setUnitId(RNAdMobBannerView view, String unitId) { 58 | view.setUnitId(unitId); 59 | } 60 | 61 | @ReactProp(name = "size") 62 | public void setSize(RNAdMobBannerView view, String size) { 63 | view.setSize(size); 64 | } 65 | 66 | @ReactProp(name = "sizes") 67 | public void setSizes(RNAdMobBannerView view, ReadableArray adSizeStrings) { 68 | view.setSizes(adSizeStrings); 69 | } 70 | 71 | @ReactProp(name = "requestOptions") 72 | public void setRequestOptions(RNAdMobBannerView view, ReadableMap requestOptions) { 73 | view.setRequestOptions(requestOptions); 74 | } 75 | 76 | @Override 77 | public void receiveCommand(@Nonnull RNAdMobBannerView bannerView, String commandId, @Nullable ReadableArray args) { 78 | if (commandId.equals(COMMAND_REQUEST_AD)) { 79 | bannerView.requestAd(); 80 | } 81 | } 82 | } 83 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobInterstitialAdModule.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob.ads.fullscreen; 2 | 3 | import androidx.annotation.NonNull; 4 | 5 | import com.facebook.react.bridge.Promise; 6 | import com.facebook.react.bridge.ReactApplicationContext; 7 | import com.facebook.react.bridge.ReactMethod; 8 | import com.facebook.react.bridge.ReadableMap; 9 | import com.google.android.gms.ads.AdLoadCallback; 10 | import com.google.android.gms.ads.FullScreenContentCallback; 11 | import com.google.android.gms.ads.LoadAdError; 12 | import com.google.android.gms.ads.admanager.AdManagerAdRequest; 13 | import com.google.android.gms.ads.interstitial.InterstitialAd; 14 | import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback; 15 | 16 | public class RNAdMobInterstitialAdModule extends RNAdMobFullScreenAdModule { 17 | 18 | public static final String AD_TYPE = "Interstitial"; 19 | 20 | public RNAdMobInterstitialAdModule(ReactApplicationContext reactContext) { 21 | super(reactContext); 22 | } 23 | 24 | @Override 25 | protected String getAdType() { 26 | return AD_TYPE; 27 | } 28 | 29 | @Override 30 | @ReactMethod 31 | public void requestAd(int requestId, String unitId, ReadableMap options, final Promise promise) { 32 | super.requestAd(requestId, unitId, options, promise); 33 | } 34 | 35 | @Override 36 | @ReactMethod 37 | protected void presentAd(int requestId, final Promise promise) { 38 | super.presentAd(requestId, promise); 39 | } 40 | 41 | @Override 42 | @ReactMethod 43 | protected void destroyAd(int requestId) { 44 | super.destroyAd(requestId); 45 | } 46 | 47 | @Override 48 | protected void load(String unitId, AdManagerAdRequest adRequest, AdLoadCallback adLoadCallback, FullScreenContentCallback fullScreenContentCallback) { 49 | InterstitialAd.load(getReactApplicationContext(), unitId, adRequest, 50 | new InterstitialAdLoadCallback() { 51 | @Override 52 | public void onAdLoaded(@NonNull InterstitialAd ad) { 53 | ad.setFullScreenContentCallback(fullScreenContentCallback); 54 | adLoadCallback.onAdLoaded(ad); 55 | } 56 | 57 | @Override 58 | public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { 59 | adLoadCallback.onAdFailedToLoad(loadAdError); 60 | } 61 | }); 62 | } 63 | 64 | @Override 65 | protected void show(InterstitialAd ad, int requestId) { 66 | ad.show(currentActivity); 67 | } 68 | 69 | } 70 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedAdModule.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob.ads.fullscreen; 2 | 3 | import static com.rnadmob.admob.RNAdMobEventModule.REWARDED; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import com.facebook.react.bridge.Arguments; 8 | import com.facebook.react.bridge.Promise; 9 | import com.facebook.react.bridge.ReactApplicationContext; 10 | import com.facebook.react.bridge.ReactMethod; 11 | import com.facebook.react.bridge.ReadableMap; 12 | import com.facebook.react.bridge.WritableMap; 13 | import com.google.android.gms.ads.AdLoadCallback; 14 | import com.google.android.gms.ads.FullScreenContentCallback; 15 | import com.google.android.gms.ads.LoadAdError; 16 | import com.google.android.gms.ads.admanager.AdManagerAdRequest; 17 | import com.google.android.gms.ads.rewarded.RewardedAd; 18 | import com.google.android.gms.ads.rewarded.RewardedAdLoadCallback; 19 | 20 | public class RNAdMobRewardedAdModule extends RNAdMobFullScreenAdModule { 21 | 22 | public static final String AD_TYPE = "Rewarded"; 23 | 24 | public RNAdMobRewardedAdModule(ReactApplicationContext reactContext) { 25 | super(reactContext); 26 | } 27 | 28 | @Override 29 | protected String getAdType() { 30 | return AD_TYPE; 31 | } 32 | 33 | @Override 34 | @ReactMethod 35 | public void requestAd(int requestId, String unitId, ReadableMap options, final Promise promise) { 36 | super.requestAd(requestId, unitId, options, promise); 37 | } 38 | 39 | @Override 40 | @ReactMethod 41 | protected void presentAd(int requestId, final Promise promise) { 42 | super.presentAd(requestId, promise); 43 | } 44 | 45 | @Override 46 | @ReactMethod 47 | protected void destroyAd(int requestId) { 48 | super.destroyAd(requestId); 49 | } 50 | 51 | @Override 52 | protected void load(String unitId, AdManagerAdRequest adRequest, AdLoadCallback adLoadCallback, FullScreenContentCallback fullScreenContentCallback) { 53 | RewardedAd.load(getReactApplicationContext(), unitId, adRequest, 54 | new RewardedAdLoadCallback() { 55 | @Override 56 | public void onAdLoaded(@NonNull RewardedAd ad) { 57 | ad.setFullScreenContentCallback(fullScreenContentCallback); 58 | adLoadCallback.onAdLoaded(ad); 59 | } 60 | 61 | @Override 62 | public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { 63 | adLoadCallback.onAdFailedToLoad(loadAdError); 64 | } 65 | }); 66 | } 67 | 68 | @Override 69 | protected void show(RewardedAd ad, int requestId) { 70 | ad.show(currentActivity, rewardItem -> { 71 | WritableMap reward = Arguments.createMap(); 72 | reward.putInt("amount", rewardItem.getAmount()); 73 | reward.putString("type", rewardItem.getType()); 74 | sendEvent(REWARDED, requestId, reward); 75 | }); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /android/src/main/java/com/rnadmob/admob/ads/fullscreen/RNAdMobRewardedInterstitialAdModule.java: -------------------------------------------------------------------------------- 1 | package com.rnadmob.admob.ads.fullscreen; 2 | 3 | import static com.rnadmob.admob.RNAdMobEventModule.REWARDED; 4 | 5 | import androidx.annotation.NonNull; 6 | 7 | import com.facebook.react.bridge.Arguments; 8 | import com.facebook.react.bridge.Promise; 9 | import com.facebook.react.bridge.ReactApplicationContext; 10 | import com.facebook.react.bridge.ReactMethod; 11 | import com.facebook.react.bridge.ReadableMap; 12 | import com.facebook.react.bridge.WritableMap; 13 | import com.google.android.gms.ads.AdLoadCallback; 14 | import com.google.android.gms.ads.FullScreenContentCallback; 15 | import com.google.android.gms.ads.LoadAdError; 16 | import com.google.android.gms.ads.admanager.AdManagerAdRequest; 17 | import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAd; 18 | import com.google.android.gms.ads.rewardedinterstitial.RewardedInterstitialAdLoadCallback; 19 | 20 | public class RNAdMobRewardedInterstitialAdModule extends RNAdMobFullScreenAdModule { 21 | 22 | public static final String AD_TYPE = "RewardedInterstitial"; 23 | 24 | public RNAdMobRewardedInterstitialAdModule(ReactApplicationContext reactContext) { 25 | super(reactContext); 26 | } 27 | 28 | @Override 29 | protected String getAdType() { 30 | return AD_TYPE; 31 | } 32 | 33 | @Override 34 | @ReactMethod 35 | public void requestAd(int requestId, String unitId, ReadableMap options, final Promise promise) { 36 | super.requestAd(requestId, unitId, options, promise); 37 | } 38 | 39 | @Override 40 | @ReactMethod 41 | protected void presentAd(int requestId, final Promise promise) { 42 | super.presentAd(requestId, promise); 43 | } 44 | 45 | @Override 46 | @ReactMethod 47 | protected void destroyAd(int requestId) { 48 | super.destroyAd(requestId); 49 | } 50 | 51 | @Override 52 | protected void load(String unitId, AdManagerAdRequest adRequest, AdLoadCallback adLoadCallback, FullScreenContentCallback fullScreenContentCallback) { 53 | RewardedInterstitialAd.load(getReactApplicationContext(), unitId, adRequest, 54 | new RewardedInterstitialAdLoadCallback() { 55 | @Override 56 | public void onAdLoaded(@NonNull RewardedInterstitialAd ad) { 57 | ad.setFullScreenContentCallback(fullScreenContentCallback); 58 | adLoadCallback.onAdLoaded(ad); 59 | } 60 | 61 | @Override 62 | public void onAdFailedToLoad(@NonNull LoadAdError loadAdError) { 63 | adLoadCallback.onAdFailedToLoad(loadAdError); 64 | } 65 | }); 66 | } 67 | 68 | @Override 69 | protected void show(RewardedInterstitialAd ad, int requestId) { 70 | ad.show(currentActivity, rewardItem -> { 71 | WritableMap reward = Arguments.createMap(); 72 | reward.putInt("amount", rewardItem.getAmount()); 73 | reward.putString("type", rewardItem.getType()); 74 | sendEvent(REWARDED, requestId, reward); 75 | }); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/.gitignore: -------------------------------------------------------------------------------- 1 | # Dependencies 2 | /node_modules 3 | 4 | # Production 5 | /build 6 | 7 | # Generated files 8 | .docusaurus 9 | .cache-loader 10 | 11 | # Misc 12 | .DS_Store 13 | .env.local 14 | .env.development.local 15 | .env.test.local 16 | .env.production.local 17 | 18 | npm-debug.log* 19 | yarn-debug.log* 20 | yarn-error.log* 21 | -------------------------------------------------------------------------------- /docs/README.md: -------------------------------------------------------------------------------- 1 | # Website 2 | 3 | This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. 4 | 5 | ## Installation 6 | 7 | ```console 8 | yarn install 9 | ``` 10 | 11 | ## Local Development 12 | 13 | ```console 14 | yarn start 15 | ``` 16 | 17 | This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. 18 | 19 | ## Build 20 | 21 | ```console 22 | yarn build 23 | ``` 24 | 25 | This command generates static content into the `build` directory and can be served using any static contents hosting service. 26 | 27 | ## Deployment 28 | 29 | ```console 30 | GIT_USER= USE_SSH=true yarn deploy 31 | ``` 32 | 33 | If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. 34 | -------------------------------------------------------------------------------- /docs/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require.resolve('@docusaurus/core/lib/babel/preset')], 3 | }; 4 | -------------------------------------------------------------------------------- /docs/docs/Example App.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 3 3 | --- 4 | 5 | import Tabs from '@theme/Tabs'; 6 | import TabItem from '@theme/TabItem'; 7 | 8 | Usage examples for most common use cases have been provided in the example project. You can clone and run the example app to play around with the examples. 9 | 10 | ```bash 11 | git clone https://github.com/react-native-admob/admob.git 12 | ``` 13 | 14 | Then to run the example app inside project folder run: 15 | 16 | ```bash npm2yarn 17 | npm install 18 | cd example 19 | npm install 20 | npm run android 21 | ``` 22 | -------------------------------------------------------------------------------- /docs/docs/Installation.mdx: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar_position: 1 3 | --- 4 | 5 | If you are using `react-native >= 0.60` you just need to do a simple: 6 | 7 | ```bash npm2yarn 8 | npm install @react-native-admob/admob --save 9 | ``` 10 | 11 | ## Android Setup 12 | 13 | Add your AdMob App ID to `AndroidManifest.xml`, as described in the [Google Mobile Ads SDK documentation](https://developers.google.com/admob/android/quick-start#configure_your_app). 14 | 15 | ## iOS Setup 16 | 17 | From the command line run (inside the ios folder): 18 | 19 | ```bash 20 | pod install 21 | ``` 22 | 23 | Then, update your Info.plist as described in the [Google Mobile Ads SDK documentation](https://developers.google.com/admob/ios/quick-start#update_your_infoplist). 24 | 25 | ### Allow iOS Static Frameworks 26 | 27 | If you are using Static Frameworks on iOS, you need to manually enable this for the project. To enable Static Framework support, add the following global to the top of your /ios/Podfile file: 28 | 29 | ```ruby 30 | $RNAdMobAsStaticFramework = true 31 | ``` 32 | 33 | ## Requesting IDFA on iOS 14 34 | 35 | On iOS 14 onwards, you need to request IDFA access through App Tracking Transparency Dialog to show targeted ads to the user. For that you can use [react-native-tracking-transparency](https://github.com/mrousavy/react-native-tracking-transparency). 36 | -------------------------------------------------------------------------------- /docs/docs/api/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "API Reference", 3 | "position": 4, 4 | "collapsed": false 5 | } 6 | -------------------------------------------------------------------------------- /docs/docs/api/classes/AdError.mdx: -------------------------------------------------------------------------------- 1 | Error class containing the details of the error. 2 | 3 | Refer to [common error message descriptions](https://support.google.com/admob/answer/9905175) to find cause of the error. 4 | 5 | ## Properties 6 | 7 | ### `code` 8 | 9 | The error code provided by Google Mobile Ads SDK. 10 | 11 | Possible codes and descriptions: 12 | 13 | - [Android](https://developers.google.com/android/reference/com/google/android/gms/ads/AdRequest#constant-summary) 14 | - [iOS](https://developers.google.com/admob/ios/api/reference/Enums/GADErrorCode) 15 | 16 | ### `message` 17 | 18 | The error description message. 19 | -------------------------------------------------------------------------------- /docs/docs/api/classes/AppOpenAd.mdx: -------------------------------------------------------------------------------- 1 | Creates [App Open Ad](https://developers.google.com/admob/android/app-open-ads) and register event listeners to various events. 2 | 3 | Unlike other `FullScreenAd`s, only one `AppOpenAd` instance can exist in an application. Doing so, `AppOpenAd` supports static methods as well as instance methods. Calling these static methods acts same as calling instance methods for shared ad instance. 4 | 5 | :::tip 6 | 7 | If you are going to use App Open Ad inside _functional component_, consider using [`useAppOpenAd`](/docs/api/hooks/useAppOpenAd). 8 | 9 | ::: 10 | 11 | ## Useage Example 12 | 13 | TODO 14 | 15 | ## Methods 16 | 17 | ### createAd() 18 | 19 | ```js 20 | static createAd(unitId: string, options?: AppOpenAdOptions): AppOpenAd 21 | ``` 22 | 23 | Creates an shared ad instance. If you create ad more than once, ad created before is destroyed. Ad is loaded automatically after created and after dismissed. 24 | 25 | **Parameters** 26 | 27 | `unitId` : App Open Ad [unitId](https://support.google.com/admob/answer/7356431). 28 | 29 | `options` (Optional) : `AppOpenAdOptions` object 30 | 31 | Properties : 32 | 33 | - `showOnColdStart` : Whether to show ad on app [coldstart](https://developers.google.com/admob/android/app-open-ads#coldstart). Defaults to `false`. 34 | 35 | - `showOnAppForeground` : Whether to show ad on app becomes foreground. Defaults to `true`. 36 | 37 | - `loadOnDismissed` : Whether App Open Ad to load new ad on dismissed. Defaults to `true`. 38 | 39 | - `requestOptions` : [RequestOptions](/docs/api/types/RequestOptions) used to load the ad. 40 | 41 | **Returns** 42 | 43 | `AppOpenAd` instance. 44 | 45 | ### getAd() 46 | 47 | ```js 48 | static getAd(): AppOpenAd 49 | ``` 50 | 51 | Returns created AppOpenAd shared instance. 52 | 53 | **Returns** 54 | 55 | `AppOpenAd` shared instance. 56 | 57 | ### load() 58 | 59 | ```js 60 | static load(requestOptions?: RequestOptions): Promise 61 | ``` 62 | 63 | Loads new App Open Ad. 64 | 65 | Generally you don't need to call this function because ad is loaded automatically on ad created and ad dismissed. 66 | 67 | **Parameters** 68 | 69 | `requestOptions` (Optional) : [RequestOptions](/docs/api/types/RequestOptions) used to load the ad. 70 | 71 | **Returns** 72 | 73 | `Promise` that waits for ad load. When error is occured while loading ad, the Promise will reject with `AdError` object. 74 | 75 | ### show() 76 | 77 | ```js 78 | static show(): Promise 79 | ``` 80 | 81 | Shows loaded App Open Ad. 82 | 83 | Ad must be loaded before calling this function. 84 | 85 | You don't need to call this function if you set `showOnAppForeground` option to true. 86 | 87 | **Returns** 88 | 89 | `Promise` that waits for ad present. When error is occurred while presenting ad, the Promise will reject with `AdError` object. 90 | 91 | ### addEventListener() 92 | 93 | ```js 94 | static addEventListener(event: string, handler: (event?: any) => any): void 95 | ``` 96 | 97 | Adds an event handler for an ad event. 98 | 99 | **Parameters** 100 | 101 | `event` : Event name. Supported events: 102 | 103 | | Event Name | Description | 104 | | ----------------- | -------------------------------------------------------------------------------------------------------- | 105 | | adLoaded | Fires when the ad has finished loading. | 106 | | adFailedToLoad | Fires when the ad has failed to load. The argument to the event handler is `AdError` object. | 107 | | adPresented | Fires when the ad is presented to user. | 108 | | adFailedToPresent | Fires when an error occurred while presenting ad. The argument to the event handler is `AdError` object. | 109 | | adDismissed | Fires when the ad is dismissed. | 110 | 111 | `handler` : An event handler. 112 | 113 | ### removeAllListeners() 114 | 115 | ```js 116 | static removeAllListeners(): void 117 | ``` 118 | 119 | Removes all registered event handlers for this ad. 120 | 121 | ### setRequestOptions() 122 | 123 | ```js 124 | static setRequestOptions(requestOptions?: RequestOptions): void 125 | ``` 126 | 127 | Sets RequestOptions for this Ad instance. 128 | 129 | **Parameters** 130 | 131 | `requestOptions` : [RequestOptions](/docs/api/types/RequestOptions) used to load the ad. 132 | -------------------------------------------------------------------------------- /docs/docs/api/classes/FullScreenAd.mdx: -------------------------------------------------------------------------------- 1 | import CodeBlock from '@theme/CodeBlock'; 2 | 3 | ## Methods 4 | 5 | :::info 6 | 7 | Methods listed below except [`createAd()`](#createad) must be called from instance created by [`createAd()`](#createad) static method. 8 | 9 | ::: 10 | 11 | ### createAd() 12 | 13 | 14 | static createAd(unitId: string, options?: FullScreenAdOptions):{' '} 15 | {props.type || 'FullScreen'}Ad 16 | 17 | 18 | Creates an ad instance. 19 | 20 | **Parameters** 21 | 22 | `unitId` : Ad [unitId](https://support.google.com/admob/answer/7356431). 23 | 24 | `options` (Optional) : Options for this ad. 25 | 26 | Properties: 27 | 28 | | Name | Type | Default | Description | 29 | | :-------------- | :---------------------------------------- | :------ | :--------------------------------------------------------- | 30 | | loadOnMounted | boolean | `true` | Whether your ad to load automatically on mounted. | 31 | | showOnLoaded | boolean | `false` | Whether your ad to show automatically on loaded. | 32 | | loadOnDismissed | boolean | `false` | Whether your ad to load new ad automatically on dismissed. | 33 | | requestOptions | [RequestOptions](../types/RequestOptions) | `{}` | Optional RequestOptions used to load the ad. | 34 | 35 | **Returns** 36 | 37 | {props.type || 'FullScreen'}Ad instance 38 | 39 | ### load() 40 | 41 | ```ts 42 | load(requestOptions?: RequestOptions): Promise 43 | ``` 44 | 45 | Loads new Ad. 46 | 47 | **Parameters** 48 | 49 | `requestOptions` (Optional) : [RequestOptions](../types/RequestOptions) used to load the ad. 50 | 51 | **Returns** 52 | 53 | `Promise` that waits for ad load. When error is occured while loading ad, the Promise will reject with `AdError` object. 54 | 55 | ### show() 56 | 57 | ```ts 58 | show(): Promise 59 | ``` 60 | 61 | Shows loaded Ad. 62 | 63 | Ad must be loaded before calling this function. 64 | 65 | **Returns** 66 | 67 | `Promise` that waits for ad present. When error is occurred while presenting ad, the Promise will reject with `AdError` object. 68 | 69 | ### addEventListener() 70 | 71 | ```ts 72 | addEventListener(event: string, handler: (event?: any) => any): void 73 | ``` 74 | 75 | Adds an event handler for an ad event. 76 | 77 | **Parameters** 78 | 79 | `event` : Event name. Supported events: 80 | 81 | | Event Name | Description | 82 | | ----------------- | -------------------------------------------------------------------------------------------------------- | 83 | | adLoaded | Fires when the ad has finished loading. | 84 | | adFailedToLoad | Fires when the ad has failed to load. The argument to the event handler is `AdError` object. | 85 | | adPresented | Fires when the ad is presented to user. | 86 | | adFailedToPresent | Fires when an error occurred while presenting ad. The argument to the event handler is `AdError` object. | 87 | | adDismissed | Fires when the ad is dismissed. | 88 | | rewarded | Fires when user earned reward. The argument to the event handler is `Reward` object. | 89 | 90 | `handler` : An event handler. 91 | 92 | ### removeAllListeners() 93 | 94 | ```ts 95 | removeAllListeners(): void 96 | ``` 97 | 98 | Removes all registered event handlers for this ad. 99 | 100 | ### setRequestOptions() 101 | 102 | ```ts 103 | setRequestOptions(requestOptions?: RequestOptions): void 104 | ``` 105 | 106 | Sets RequestOptions for this Ad instance. 107 | 108 | **Parameters** 109 | 110 | `requestOptions` : [RequestOptions](../types/RequestOptions) used to load the ad. 111 | -------------------------------------------------------------------------------- /docs/docs/api/classes/InterstitialAd.mdx: -------------------------------------------------------------------------------- 1 | import FullScreenAd from './FullScreenAd.mdx'; 2 | 3 | Creates [Interstitial Ad](https://developers.google.com/admob/android/interstitial) and register event listeners to various events. 4 | 5 | :::tip 6 | 7 | If you are going to use Interstitial Ad inside _functional component_, consider using [`useInterstitialAd`](/docs/api/hooks/useInterstitialAd). 8 | 9 | ::: 10 | 11 | ## Usage Example 12 | 13 | TODO 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/docs/api/classes/RewardedAd.mdx: -------------------------------------------------------------------------------- 1 | import FullScreenAd from './FullScreenAd.mdx'; 2 | 3 | Creates [Rewarded Ad](https://developers.google.com/admob/android/rewarded) and register event listeners to various events. 4 | 5 | :::tip 6 | 7 | If you are going to use Rewarded Ad inside _functional component_, consider using [`useRewardedAd`](/docs/api/hooks/useRewardedAd). 8 | 9 | ::: 10 | 11 | ## Useage Example 12 | 13 | TODO 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/docs/api/classes/RewardedInterstitialAd.mdx: -------------------------------------------------------------------------------- 1 | import FullScreenAd from './FullScreenAd.mdx'; 2 | 3 | Creates [Rewarded Interstitial Ad](https://developers.google.com/admob/android/rewarded-interstitial) and register event listeners to various events. 4 | 5 | :::tip 6 | 7 | If you are going to use Rewarded Interstitial Ad inside _functional component_, consider using [`useRewardedInterstitialAd`](/docs/api/hooks/useRewardedInterstitialAd). 8 | 9 | ::: 10 | 11 | ## Useage Example 12 | 13 | TODO 14 | 15 | 16 | -------------------------------------------------------------------------------- /docs/docs/api/classes/_category_.json: -------------------------------------------------------------------------------- 1 | { 2 | "label": "Classes", 3 | "position": 1, 4 | "collapsed": false 5 | } 6 | -------------------------------------------------------------------------------- /docs/docs/api/components/AppOpenAdProvider.mdx: -------------------------------------------------------------------------------- 1 | The `AppOpenAdProvider` provides context related to AppOpenAd to be used for the `useAppOpenAd` hook. 2 | 3 | You should wrap your app components with `AppOpenAdProvider` to use `useAppOpenAd` hook in your app. 4 | 5 | ```jsx 6 | import { AppOpenAdProvider, TestIds } from '@react-native-admob/admob'; 7 | 8 | export default function App() { 9 | return ( 10 | 14 | {/* ... */} 15 | 16 | ); 17 | } 18 | ``` 19 | 20 | For detailed usage, see [useAppOpenAd](/docs/api/hooks/useAppOpenAd#usage-example). 21 | 22 | ## Props 23 | 24 | ### `unitId` 25 | 26 | Your App Open Ad's [ad Unit ID](https://support.google.com/admob/answer/7356431) 27 | 28 | | Type | 29 | | :----- | 30 | | string | 31 | 32 | ### `options` 33 | 34 | Options for your App Open Ad. Available values are listed below: 35 | 36 | | Type | 37 | | :----- | 38 | | object | 39 | 40 | Properties: 41 | 42 | | Name | Type | Default | Description | 43 | | :------------------ | :----------------------------------------------- | :------ | :--------------------------------------------------------------------------------------------------------- | 44 | | showOnColdStart | boolean | `false` | Whether to show ad on app [coldstart](https://developers.google.com/admob/android/app-open-ads#coldstart). | 45 | | showOnAppForeground | boolean | `true` | Whether to show ad on app becomes foreground. | 46 | | loadOnDismissed | boolean | `true` | Whether to load new ad when ad is dismissed. | 47 | | requestOptions | [RequestOptions](/docs/api/types/RequestOptions) | {} | Optional RequestOptions used to load the ad. | 48 | -------------------------------------------------------------------------------- /docs/docs/api/components/BannerAd.mdx: -------------------------------------------------------------------------------- 1 | Renders a [Banner Ad](https://developers.google.com/admob/android/banner). 2 | 3 | ```jsx 4 | import { BannerAd } from '@react-native-admob/admob'; 5 | 6 | export default function App() { 7 | const bannerRef = useRef(null); 8 | return ( 9 | 10 | console.error(error)} 14 | ref={bannerRef} 15 | /> 16 |