├── ad-admob
├── consumer-rules.pro
├── .gitignore
├── src
│ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── res
│ │ ├── values
│ │ │ └── strings.xml
│ │ ├── layout
│ │ │ ├── frogo_ads_banner.xml
│ │ │ ├── frogo_rv_container_empty_view.xml
│ │ │ └── frogo_rv_empty_view.xml
│ │ └── drawable
│ │ │ ├── frogo_rv_bg_card_16dp.xml
│ │ │ ├── frogo_rv_bg_card_32dp.xml
│ │ │ ├── frogo_rv_bg_card_4dp.xml
│ │ │ ├── frogo_rv_bg_card_8dp.xml
│ │ │ └── frogo_rv_ic_empty_view.xml
│ │ └── java
│ │ └── com
│ │ └── frogobox
│ │ └── admob
│ │ ├── callback
│ │ ├── FrogoAdmobInterstitialCallback.kt
│ │ ├── FrogoAdmobAppOpenAdCallback.kt
│ │ ├── FrogoAdmobRewardedCallback.kt
│ │ └── FrogoAdmobBannerCallback.kt
│ │ ├── ui
│ │ ├── AdmobBindActivity.kt
│ │ ├── AdmobActivity.kt
│ │ ├── FrogoAdmobBindActivity.kt
│ │ └── FrogoAdmobActivity.kt
│ │ ├── widget
│ │ ├── IFrogoAdmobViewAdapter.kt
│ │ ├── AdmobViewHolder.kt
│ │ └── FrogoAdmobViewHolder.kt
│ │ ├── core
│ │ ├── IFrogoAdConsent.kt
│ │ ├── IFrogoAdmob.kt
│ │ ├── IFrogoAdmobInterstitial.kt
│ │ ├── IFrogoAdmobRewarded.kt
│ │ └── IFrogoAdmobBanner.kt
│ │ └── FrogoAdmobApplication.kt
├── proguard-rules.pro
└── build.gradle.kts
├── ad-core
├── .gitignore
├── consumer-rules.pro
├── src
│ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── frogobox
│ │ └── adcore
│ │ ├── source
│ │ ├── FrogoAdmobApiResponse.kt
│ │ ├── FrogoAdmobDataSource.kt
│ │ ├── FrogoAdmobApiService.kt
│ │ └── FrogoAdmobRepository.kt
│ │ ├── callback
│ │ └── FrogoAdCoreInterstitialCallback.kt
│ │ ├── model
│ │ ├── FrogoUnityId.kt
│ │ ├── FrogoAdmobId.kt
│ │ └── FrogoMonetizeId.kt
│ │ └── util
│ │ ├── FrogoAdFunc.kt
│ │ └── FrogoAdConstant.kt
├── proguard-rules.pro
└── build.gradle.kts
├── ad-general
├── .gitignore
├── consumer-rules.pro
├── src
│ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── frogobox
│ │ └── ad
│ │ ├── ui
│ │ ├── AdBindActivity.kt
│ │ ├── AdActivity.kt
│ │ ├── FrogoAdActivity.kt
│ │ └── FrogoAdBindActivity.kt
│ │ ├── callback
│ │ └── FrogoAdInterstitialCallback.kt
│ │ └── delegate
│ │ └── FrogoAdDelegates.kt
├── proguard-rules.pro
└── build.gradle.kts
├── ad-unityad
├── .gitignore
├── consumer-rules.pro
├── src
│ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── frogobox
│ │ └── unityad
│ │ ├── ui
│ │ ├── UnityAdBindActivity.kt
│ │ ├── UnityAdActivity.kt
│ │ ├── FrogoUnityAdActivity.kt
│ │ └── FrogoUnityAdBindActivity.kt
│ │ ├── callback
│ │ ├── FrogoUnityAdInitializationCallback.kt
│ │ └── FrogoUnityAdInterstitialCallback.kt
│ │ ├── delegate
│ │ ├── UnityAdDelegates.kt
│ │ └── UnityAdDelegatesImpl.kt
│ │ └── core
│ │ └── IFrogoUnityAd.kt
├── proguard-rules.pro
└── build.gradle.kts
├── app
├── .gitignore
├── frogoboxmedia.jks
├── src
│ └── main
│ │ ├── res
│ │ ├── drawable
│ │ │ ├── ic_apps.png
│ │ │ └── ic_toolbar_about_us.xml
│ │ ├── font
│ │ │ └── montserrat_regular.ttf
│ │ ├── mipmap-hdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ │ ├── ic_launcher.png
│ │ │ └── ic_launcher_round.png
│ │ ├── values
│ │ │ ├── attrs.xml
│ │ │ ├── strings.xml
│ │ │ ├── colors.xml
│ │ │ ├── themes.xml
│ │ │ ├── base_colors.xml
│ │ │ └── dimens.xml
│ │ ├── mipmap-anydpi-v26
│ │ │ ├── ic_launcher.xml
│ │ │ └── ic_launcher_round.xml
│ │ ├── layout
│ │ │ ├── activity_banner.xml
│ │ │ ├── fragment_main.xml
│ │ │ ├── activity_recycler_view.xml
│ │ │ ├── acitivity_compose.xml
│ │ │ ├── ads_phone_tab_special_smart_banner.xml
│ │ │ ├── ads_phone_tab_special_adaptive_banner.xml
│ │ │ ├── ads_phone_tab_banner.xml
│ │ │ ├── ads_tablet_full_banner.xml
│ │ │ ├── ads_tablet_leaderboard.xml
│ │ │ ├── ads_phone_tab_large_banner.xml
│ │ │ ├── ads_phone_tab_medium_rectangle.xml
│ │ │ ├── content_item_ad_banner.xml
│ │ │ ├── activity_app_open_ad.xml
│ │ │ ├── content_item_news.xml
│ │ │ ├── activity_main.xml
│ │ │ └── activity_rewarded.xml
│ │ ├── values-night
│ │ │ ├── colors.xml
│ │ │ └── themes.xml
│ │ ├── menu
│ │ │ └── menu_toolbar_main.xml
│ │ └── drawable-v24
│ │ │ └── ic_launcher_foreground.xml
│ │ ├── assets
│ │ ├── unity_id.json
│ │ ├── admob_id.json
│ │ └── monetize_id.json
│ │ ├── java
│ │ └── com
│ │ │ └── frogobox
│ │ │ └── appadmob
│ │ │ ├── mvvm
│ │ │ ├── banner
│ │ │ │ └── BannerActivity.kt
│ │ │ ├── main
│ │ │ │ ├── AboutUsActivity.kt
│ │ │ │ ├── MainFragment.kt
│ │ │ │ ├── MainViewModel.kt
│ │ │ │ ├── MainJavaActivity.java
│ │ │ │ └── MainActivity.kt
│ │ │ ├── news
│ │ │ │ ├── NewsAdapter.kt
│ │ │ │ ├── NewsHolder.kt
│ │ │ │ └── NewsActivity.kt
│ │ │ ├── movie
│ │ │ │ ├── MovieAdapter.kt
│ │ │ │ ├── MovieHolder.kt
│ │ │ │ └── MovieActivity.kt
│ │ │ ├── appopenad
│ │ │ │ └── AppOpenAdActivity.kt
│ │ │ └── rewarded
│ │ │ │ └── RewardedActivity.kt
│ │ │ ├── util
│ │ │ ├── Constant.kt
│ │ │ └── AdHelper.kt
│ │ │ ├── source
│ │ │ ├── AdmobCallback.kt
│ │ │ ├── AdmobDataSource.kt
│ │ │ ├── AdmobLocalDataSource.kt
│ │ │ ├── AdmobRepository.kt
│ │ │ └── AdmobRemoteDataSource.kt
│ │ │ ├── di
│ │ │ ├── ViewModelModule.kt
│ │ │ └── RepositoryModule.kt
│ │ │ ├── SampleAdmobApplication.kt
│ │ │ ├── FrogoKoinApplication.kt
│ │ │ ├── FrogoAdmobKoinApplication.kt
│ │ │ └── base
│ │ │ ├── BaseFragment.kt
│ │ │ └── BaseActivity.kt
│ │ └── AndroidManifest.xml
└── proguard-rules.pro
├── _config.yml
├── docs
└── image
│ ├── ss-ump.jpg
│ ├── mad_score.png
│ ├── ss_banner.png
│ ├── ss_image_1.png
│ ├── ss_image_2.png
│ └── ss_image_3.png
├── gradle
├── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
└── libs.versions.toml
├── jitpack.yml
├── action.yml
├── .gitignore
├── .github
├── FUNDING.yml
└── workflows
│ ├── android-ci.yml
│ ├── android-ci-generated-artifact.yml
│ └── detekt-analysis.yml
├── SECURITY.md
├── settings.gradle.kts
├── gradle.properties
├── gradlew.bat
└── CODE_OF_CONDUCT.md
/ad-admob/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ad-core/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/ad-core/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ad-general/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/ad-unityad/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/ad-admob/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/ad-general/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/ad-unityad/consumer-rules.pro:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | theme: jekyll-theme-cayman
--------------------------------------------------------------------------------
/app/frogoboxmedia.jks:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/frogoboxmedia.jks
--------------------------------------------------------------------------------
/docs/image/ss-ump.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/docs/image/ss-ump.jpg
--------------------------------------------------------------------------------
/docs/image/mad_score.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/docs/image/mad_score.png
--------------------------------------------------------------------------------
/docs/image/ss_banner.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/docs/image/ss_banner.png
--------------------------------------------------------------------------------
/docs/image/ss_image_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/docs/image/ss_image_1.png
--------------------------------------------------------------------------------
/docs/image/ss_image_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/docs/image/ss_image_2.png
--------------------------------------------------------------------------------
/docs/image/ss_image_3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/docs/image/ss_image_3.png
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_apps.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/drawable/ic_apps.png
--------------------------------------------------------------------------------
/jitpack.yml:
--------------------------------------------------------------------------------
1 | jdk:
2 | - openjdk17
3 | before_install:
4 | - sdk install java 17.0.1-open
5 | - sdk use java 17.0.1-open
6 |
--------------------------------------------------------------------------------
/app/src/main/res/font/montserrat_regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/font/montserrat_regular.ttf
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amirisback/frogo-admob/HEAD/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/ad-core/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/ad-general/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/ad-unityad/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/app/src/main/res/values/attrs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Tue Jan 19 18:13:54 ICT 2021
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStorePath=wrapper/dists
5 | zipStoreBase=GRADLE_USER_HOME
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
--------------------------------------------------------------------------------
/app/src/main/assets/unity_id.json:
--------------------------------------------------------------------------------
1 | {
2 | "unityGameID": "",
3 | "unityInterstitialID": [
4 | "",
5 | "",
6 | ""
7 | ],
8 | "unityBannerId": [
9 | "",
10 | "",
11 | ""
12 | ],
13 | "unityRewardedID": [
14 | "",
15 | "",
16 | ""
17 | ]
18 | }
19 |
--------------------------------------------------------------------------------
/ad-admob/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/action.yml:
--------------------------------------------------------------------------------
1 | name: 'FrogoAdmob'
2 | description: 'Admob Helper for your android apps'
3 | author: 'Muhammad Faisal Amir'
4 | branding:
5 | icon: archive
6 | color: green
7 | inputs:
8 | myInput:
9 | description: 'Input to use'
10 | required: false
11 | default: 'world'
12 | runs:
13 | using: 'docker'
14 | image: 'Dockerfile'
15 | args:
16 | - ${{ inputs.myInput }}
17 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/banner/BannerActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.banner
2 |
3 | import com.frogobox.appadmob.base.BaseActivity
4 | import com.frogobox.appadmob.databinding.ActivityBannerBinding
5 |
6 | class BannerActivity : BaseActivity() {
7 |
8 | override fun setupViewBinding(): ActivityBannerBinding {
9 | return ActivityBannerBinding.inflate(layoutInflater)
10 | }
11 |
12 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/drawable/ic_toolbar_about_us.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/fragment_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | /.gradle
3 | .gradle
4 | .idea
5 | /local.properties
6 | /.idea/libraries
7 | /.idea/modules.xml
8 | /.idea/workspace.xml
9 | .DS_Store
10 | build
11 | /build
12 | /captures
13 | .externalNativeBuild
14 |
15 | built application files
16 | *.apk
17 | *.aab
18 |
19 | files for the dex VM
20 | *.dex
21 |
22 | Java class files
23 | *.class
24 |
25 | generated files
26 | bin/
27 | gen/
28 | .externalNativeBuild/
29 |
30 | Local configuration file (sdk path, etc)
31 | local.properties
32 | app/version.properties
33 |
34 | # SonarQube
35 | .sonar/
36 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_recycler_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
11 |
--------------------------------------------------------------------------------
/ad-admob/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | BANNER
5 | LARGE_BANNER
6 | MEDIUM_RECTANGLE
7 | FULL_BANNER
8 | LEADERBOARD
9 | SMART_BANNER
10 |
11 |
12 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/acitivity_compose.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
15 |
18 |
19 |
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/source/FrogoAdmobApiResponse.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.source
2 |
3 | import com.frogobox.coresdk.response.FrogoDataResponse
4 |
5 |
6 | /**
7 | * Created by faisalamir on 02/03/22
8 | * FrogoAdmob
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2022 Frogobox Media Inc.
15 | * All rights reserved
16 | *
17 | */
18 |
19 |
20 | interface FrogoAdmobApiResponse : FrogoDataResponse
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: amirisback
4 | patreon: # Replace with a single Patreon username
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: amirisback
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: https://saweria.co/amirisback
13 |
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/callback/FrogoAdCoreInterstitialCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.callback
2 |
3 | // Created by KoinWorks (M. Faisal Amir) on 20/06/22.
4 |
5 |
6 | interface FrogoAdCoreInterstitialCallback {
7 |
8 | fun onShowAdRequestProgress(tag: String, message: String)
9 |
10 | fun onHideAdRequestProgress(tag: String, message: String)
11 |
12 | fun onAdDismissed(tag: String, message: String)
13 |
14 | fun onAdFailed(tag: String, errorMessage: String)
15 |
16 | fun onAdLoaded(tag: String, message: String)
17 |
18 | fun onAdShowed(tag: String, message: String)
19 |
20 | }
--------------------------------------------------------------------------------
/ad-general/src/main/java/com/frogobox/ad/ui/AdBindActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.ad.ui
2 |
3 | import androidx.viewbinding.ViewBinding
4 |
5 | /**
6 | * Created by Faisal Amir on 07/02/23
7 | * https://github.com/amirisback
8 | */
9 |
10 |
11 | abstract class AdBindActivity : AdActivity() {
12 |
13 | companion object {
14 | val TAG: String = AdBindActivity::class.java.simpleName
15 | }
16 |
17 | protected val binding: VB by lazy { setupViewBinding() }
18 |
19 | abstract fun setupViewBinding(): VB
20 |
21 | override fun setupContentView() {
22 | setContentView(binding.root)
23 | }
24 |
25 | }
--------------------------------------------------------------------------------
/ad-general/src/main/java/com/frogobox/ad/callback/FrogoAdInterstitialCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.ad.callback
2 |
3 | import com.frogobox.unityad.callback.FrogoUnityAdInterstitialCallback
4 |
5 | /**
6 | * Created by faisalamir on 22/03/22
7 | * FrogoAdmob
8 | * -----------------------------------------
9 | * Name : Muhammad Faisal Amir
10 | * E-mail : faisalamircs@gmail.com
11 | * Github : github.com/amirisback
12 | * -----------------------------------------
13 | * Copyright (C) 2022 Frogobox Media Inc.
14 | * All rights reserved
15 | *
16 | */
17 |
18 |
19 | interface FrogoAdInterstitialCallback : FrogoUnityAdInterstitialCallback
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/callback/FrogoAdmobInterstitialCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.callback
2 |
3 | import com.frogobox.adcore.callback.FrogoAdCoreInterstitialCallback
4 |
5 |
6 | /**
7 | * Created by faisalamir on 13/03/22
8 | * FrogoAdmob
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2022 Frogobox Media Inc.
15 | * All rights reserved
16 | *
17 | */
18 |
19 | interface FrogoAdmobInterstitialCallback : FrogoAdCoreInterstitialCallback
--------------------------------------------------------------------------------
/ad-admob/src/main/res/layout/frogo_ads_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
14 |
15 |
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/ui/AdmobBindActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.ui
2 |
3 | import androidx.viewbinding.ViewBinding
4 |
5 | /**
6 | * Created by Faisal Amir on 07/02/23
7 | * https://github.com/amirisback
8 | */
9 |
10 |
11 | abstract class AdmobBindActivity : AdmobActivity() {
12 |
13 | companion object {
14 | val TAG: String = AdmobBindActivity::class.java.simpleName
15 | }
16 |
17 | protected val binding: VB by lazy { setupViewBinding() }
18 |
19 | abstract fun setupViewBinding(): VB
20 |
21 | override fun setupContentView() {
22 | setContentView(binding.root)
23 | }
24 |
25 | }
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/ui/UnityAdBindActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.ui
2 |
3 | import androidx.viewbinding.ViewBinding
4 |
5 | /**
6 | * Created by Faisal Amir on 07/02/23
7 | * https://github.com/amirisback
8 | */
9 |
10 |
11 | abstract class UnityAdBindActivity : UnityAdActivity() {
12 |
13 | companion object {
14 | val TAG: String = UnityAdBindActivity::class.java.simpleName
15 | }
16 |
17 | protected val binding: VB by lazy { setupViewBinding() }
18 |
19 | abstract fun setupViewBinding(): VB
20 |
21 | override fun setupContentView() {
22 | setContentView(binding.root)
23 | }
24 |
25 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/main/AboutUsActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.main
2 |
3 | import android.os.Bundle
4 | import com.frogobox.ad.ui.FrogoAdBindActivity
5 | import com.frogobox.sdk.databinding.ActivityFrogoAboutUsBinding
6 |
7 | class AboutUsActivity : FrogoAdBindActivity() {
8 |
9 | override fun setupViewBinding(): ActivityFrogoAboutUsBinding {
10 | return ActivityFrogoAboutUsBinding.inflate(layoutInflater)
11 | }
12 |
13 | override fun setupViewModel() {
14 | }
15 |
16 |
17 | override fun onCreateExt(savedInstanceState: Bundle?) {
18 | setupDetailActivity("About Us")
19 | }
20 |
21 | }
22 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/main/MainFragment.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.main
2 |
3 | import android.view.LayoutInflater
4 | import android.view.ViewGroup
5 | import androidx.fragment.app.Fragment
6 | import com.frogobox.appadmob.base.BaseFragment
7 | import com.frogobox.appadmob.databinding.FragmentMainBinding
8 |
9 | /**
10 | * A simple [Fragment] subclass.
11 | */
12 | class MainFragment : BaseFragment() {
13 |
14 | override fun setupViewBinding(
15 | inflater: LayoutInflater,
16 | container: ViewGroup?
17 | ): FragmentMainBinding {
18 | return FragmentMainBinding.inflate(inflater, container, false)
19 | }
20 |
21 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/util/Constant.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.util
2 |
3 | /**
4 | * Created by Faisal Amir on 24/10/22
5 | * -----------------------------------------
6 | * E-mail : faisalamircs@gmail.com
7 | * Github : github.com/amirisback
8 | * -----------------------------------------
9 | * Copyright (C) Frogobox ID / amirisback
10 | * All rights reserved
11 | */
12 |
13 |
14 | object Constant {
15 |
16 | const val AD_UNIT_ID = "ca-app-pub-3940256099942544/3419835294"
17 | const val COUNTER_TIME = 5L
18 |
19 | // Preference
20 | const val PREFERENCE_NAME = "PREFERENCE_NAME_APP_OPEN_AD"
21 | const val PREF_AD_UNIT_ID = "PREF_AD_UNIT_ID"
22 |
23 | }
--------------------------------------------------------------------------------
/SECURITY.md:
--------------------------------------------------------------------------------
1 | # Security Policy
2 |
3 | ## Supported Versions
4 |
5 | Use this section to tell people about which versions of your project are
6 | currently being supported with security updates.
7 |
8 | | Version | Supported |
9 | | ------- | ------------------ |
10 | | 5.1.x | :white_check_mark: |
11 | | 5.0.x | :x: |
12 | | 4.0.x | :white_check_mark: |
13 | | < 4.0 | :x: |
14 |
15 | ## Reporting a Vulnerability
16 |
17 | Use this section to tell people how to report a vulnerability.
18 |
19 | Tell them where to go, how often they can expect to get an update on a
20 | reported vulnerability, what to expect if the vulnerability is accepted or
21 | declined, etc.
22 |
--------------------------------------------------------------------------------
/ad-admob/src/main/res/drawable/frogo_rv_bg_card_16dp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ad-admob/src/main/res/drawable/frogo_rv_bg_card_32dp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ad-admob/src/main/res/drawable/frogo_rv_bg_card_4dp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ad-admob/src/main/res/drawable/frogo_rv_bg_card_8dp.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
22 |
23 |
24 |
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/callback/FrogoUnityAdInitializationCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.callback
2 |
3 |
4 | /**
5 | * Created by faisalamir on 22/03/22
6 | * FrogoAdmob
7 | * -----------------------------------------
8 | * Name : Muhammad Faisal Amir
9 | * E-mail : faisalamircs@gmail.com
10 | * Github : github.com/amirisback
11 | * -----------------------------------------
12 | * Copyright (C) 2022 Frogobox Media Inc.
13 | * All rights reserved
14 | *
15 | */
16 |
17 | interface FrogoUnityAdInitializationCallback {
18 |
19 | fun onInitializationComplete(tag: String, message: String)
20 |
21 | fun onInitializationFailed(tag: String, message: String)
22 |
23 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/callback/FrogoAdmobAppOpenAdCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.callback
2 |
3 | import com.frogobox.adcore.callback.FrogoAdCoreInterstitialCallback
4 |
5 | /**
6 | * Created by Faisal Amir on 24/10/22
7 | * -----------------------------------------
8 | * E-mail : faisalamircs@gmail.com
9 | * Github : github.com/amirisback
10 | * -----------------------------------------
11 | * Copyright (C) Frogobox ID / amirisback
12 | * All rights reserved
13 | */
14 |
15 |
16 | /**
17 | * Interface definition for a callback to be invoked when an app open ad is complete (i.e.
18 | * dismissed or fails to show).
19 | */
20 | interface FrogoAdmobAppOpenAdCallback : FrogoAdCoreInterstitialCallback
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | Hello blank fragment
4 |
5 | Frogobox Software Industry
6 | toolbar_about_us
7 | Lorem ipsum dolor sit amet consectetur adipisicing elit. Quisquam veniam similiquevoluptates odit, ipsum laborum architecto distinctio harum, provident fugiat praesentium ex quod doloreslaudantium aliquid quidem placeat incidunt vitae!
8 | Dummy
9 | MainActivity
10 | ComposeActivity
11 |
12 |
13 |
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/callback/FrogoUnityAdInterstitialCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.callback
2 |
3 | import com.frogobox.adcore.callback.FrogoAdCoreInterstitialCallback
4 |
5 |
6 | /**
7 | * Created by faisalamir on 22/03/22
8 | * FrogoAdmob
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2022 Frogobox Media Inc.
15 | * All rights reserved
16 | *
17 | */
18 |
19 |
20 | interface FrogoUnityAdInterstitialCallback : FrogoAdCoreInterstitialCallback {
21 |
22 | fun onClicked(tag: String, message: String)
23 |
24 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/widget/IFrogoAdmobViewAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.widget
2 |
3 | import android.view.ViewGroup
4 |
5 | /**
6 | * Created by Faisal Amir on 31/01/2021
7 | * AdmobSamples Source Code
8 | * -----------------------------------------
9 | * Name : Muhammad Faisal Amir
10 | * E-mail : faisalamircs@gmail.com
11 | * Github : github.com/amirisback
12 | * -----------------------------------------
13 | * Copyright (C) 2021 FrogoBox Inc.
14 | * All rights reserved
15 | *
16 | */
17 |
18 |
19 | interface IFrogoAdmobViewAdapter {
20 |
21 | fun onViewTypeMenuItem(parent: ViewGroup): FrogoAdmobViewHolder
22 |
23 | fun onViewTypeBannerAds(parent: ViewGroup): FrogoAdmobViewHolder
24 |
25 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/source/AdmobCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.source
2 |
3 |
4 | /**
5 | * Created by faisalamir on 19/04/22
6 | * FrogoAdmob
7 | * -----------------------------------------
8 | * Name : Muhammad Faisal Amir
9 | * E-mail : faisalamircs@gmail.com
10 | * Github : github.com/amirisback
11 | * -----------------------------------------
12 | * Copyright (C) 2022 Frogobox Media Inc.
13 | * All rights reserved
14 | *
15 | */
16 |
17 | interface AdmobCallback {
18 |
19 | fun onShowAdRequestProgress()
20 |
21 | fun onHideAdRequestProgress()
22 |
23 | fun onAdDismissed()
24 |
25 | fun onAdFailed(tag: String, errorMessage: String)
26 |
27 | fun onAdLoaded()
28 |
29 | fun onAdShowed()
30 |
31 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/main/MainViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.main
2 |
3 | import android.content.Context
4 | import com.frogobox.appadmob.base.BaseViewModel
5 | import com.frogobox.appadmob.source.AdmobRepository
6 |
7 |
8 | /**
9 | * Created by faisalamir on 19/04/22
10 | * FrogoAdmob
11 | * -----------------------------------------
12 | * Name : Muhammad Faisal Amir
13 | * E-mail : faisalamircs@gmail.com
14 | * Github : github.com/amirisback
15 | * -----------------------------------------
16 | * Copyright (C) 2022 Frogobox Media Inc.
17 | * All rights reserved
18 | *
19 | */
20 |
21 | class MainViewModel(
22 | private val context: Context,
23 | private val repository: AdmobRepository
24 | ) : BaseViewModel(context, repository)
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/callback/FrogoAdmobRewardedCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.callback
2 |
3 | import com.frogobox.adcore.callback.FrogoAdCoreInterstitialCallback
4 | import com.google.android.gms.ads.rewarded.RewardItem
5 |
6 |
7 | /**
8 | * Created by faisalamir on 13/03/22
9 | * FrogoAdmob
10 | * -----------------------------------------
11 | * Name : Muhammad Faisal Amir
12 | * E-mail : faisalamircs@gmail.com
13 | * Github : github.com/amirisback
14 | * -----------------------------------------
15 | * Copyright (C) 2022 Frogobox Media Inc.
16 | * All rights reserved
17 | *
18 | */
19 |
20 | interface FrogoAdmobRewardedCallback : FrogoAdCoreInterstitialCallback {
21 |
22 | fun onUserEarnedReward(tag: String, rewardItem: RewardItem)
23 |
24 | }
--------------------------------------------------------------------------------
/app/src/main/res/values-night/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | @color/purple_200
6 | @color/purple_700
7 | @color/black
8 |
9 |
10 | @color/teal_200
11 | @color/teal_200
12 | @color/black
13 |
14 |
15 | @color/colorTextWhite
16 | @color/colorTextWhite
17 | @color/colorTextWhite
18 |
19 |
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | @color/purple_500
6 | @color/purple_700
7 | @color/white
8 |
9 |
10 | @color/teal_200
11 | @color/teal_700
12 | @color/black
13 |
14 |
15 | @color/colorTextBlack
16 | @color/colorTextGrey
17 | @color/colorTextGrey
18 |
19 |
20 |
--------------------------------------------------------------------------------
/settings.gradle.kts:
--------------------------------------------------------------------------------
1 | pluginManagement {
2 | repositories {
3 | gradlePluginPortal()
4 | google{
5 | content {
6 | includeGroupByRegex("com\\.android.*")
7 | includeGroupByRegex("com\\.google.*")
8 | includeGroupByRegex("androidx.*")
9 | }
10 | }
11 | mavenCentral()
12 | maven("https://jitpack.io")
13 | }
14 | }
15 |
16 | dependencyResolutionManagement {
17 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
18 | repositories {
19 | google()
20 | mavenCentral()
21 | maven("https://jitpack.io")
22 | }
23 | }
24 |
25 | rootProject.name = "FrogoAdmob"
26 | include(
27 | ":app",
28 | ":ad-general",
29 | ":ad-admob",
30 | ":ad-core",
31 | ":ad-unityad"
32 | )
--------------------------------------------------------------------------------
/ad-admob/src/main/res/layout/frogo_rv_container_empty_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
25 |
26 |
27 |
28 |
--------------------------------------------------------------------------------
/ad-core/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/core/IFrogoAdConsent.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.core
2 |
3 | import android.app.Activity
4 | import com.google.android.ump.FormError
5 |
6 | /**
7 | * Created by Amir on 06/18/23
8 | * FrogoAdmob Source Code
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2023 FrogoBox Inc.
15 | * All rights reserved
16 | *
17 | */
18 | interface IFrogoAdConsent {
19 |
20 | fun activity(): Activity
21 |
22 | fun isDebug(): Boolean
23 |
24 | fun isUnderAgeAd(): Boolean
25 |
26 | fun onNotUsingAdConsent()
27 |
28 | fun onConsentSuccess()
29 |
30 | fun onConsentError(formError: FormError)
31 |
32 | }
--------------------------------------------------------------------------------
/ad-general/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/ad-unityad/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
--------------------------------------------------------------------------------
/ad-admob/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.kts.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/widget/AdmobViewHolder.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.widget
2 |
3 | import android.view.View
4 | import com.frogobox.recycler.core.FrogoRecyclerNotifyListener
5 |
6 | /**
7 | * Created by Faisal Amir on 31/01/2021
8 | * AdmobSamples Source Code
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2021 FrogoBox Inc.
15 | * All rights reserved
16 | *
17 | */
18 |
19 |
20 | class AdmobViewHolder(view: View) : FrogoAdmobViewHolder(view) {
21 | override fun initComponent(
22 | data: Any,
23 | position: Int,
24 | notifyListener: FrogoRecyclerNotifyListener
25 | ) {
26 |
27 | }
28 | }
--------------------------------------------------------------------------------
/app/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # You can control the set of applied configuration files using the
3 | # proguardFiles setting in build.gradle.kts.kts.
4 | #
5 | # For more details, see
6 | # http://developer.android.com/guide/developing/tools/proguard.html
7 |
8 | # If your project uses WebView with JS, uncomment the following
9 | # and specify the fully qualified class name to the JavaScript interface
10 | # class:
11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
12 | # public *;
13 | #}
14 |
15 | # Uncomment this to preserve the line number information for
16 | # debugging stack traces.
17 | #-keepattributes SourceFile,LineNumberTable
18 |
19 | # If you keep the line number information, uncomment this to
20 | # hide the original source file name.
21 | #-renamesourcefileattribute SourceFile
22 |
--------------------------------------------------------------------------------
/app/src/main/res/menu/menu_toolbar_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/di/ViewModelModule.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.di
2 |
3 | import com.frogobox.appadmob.mvvm.main.MainViewModel
4 | import org.koin.android.ext.koin.androidApplication
5 | import org.koin.android.ext.koin.androidContext
6 | import org.koin.androidx.viewmodel.dsl.viewModel
7 | import org.koin.dsl.module
8 |
9 |
10 | /**
11 | * Created by faisalamir on 19/04/22
12 | * FrogoAdmob
13 | * -----------------------------------------
14 | * Name : Muhammad Faisal Amir
15 | * E-mail : faisalamircs@gmail.com
16 | * Github : github.com/amirisback
17 | * -----------------------------------------
18 | * Copyright (C) 2022 Frogobox Media Inc.
19 | * All rights reserved
20 | *
21 | */
22 |
23 | val viewModelModule = module {
24 |
25 | viewModel {
26 | MainViewModel(androidContext(), get())
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/util/AdHelper.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.util
2 |
3 | import android.content.Context
4 | import com.frogobox.sdk.delegate.preference.PreferenceDelegatesImpl
5 |
6 | /**
7 | * Created by Faisal Amir on 24/10/22
8 | * -----------------------------------------
9 | * E-mail : faisalamircs@gmail.com
10 | * Github : github.com/amirisback
11 | * -----------------------------------------
12 | * Copyright (C) Frogobox ID / amirisback
13 | * All rights reserved
14 | */
15 |
16 |
17 | object AdHelper {
18 |
19 | fun getAdOpenAppUnitId(context: Context?): String {
20 | return if (context != null) {
21 | PreferenceDelegatesImpl(context, Constant.PREFERENCE_NAME).getPrefString(Constant.PREF_AD_UNIT_ID, Constant.AD_UNIT_ID)
22 | } else {
23 | Constant.AD_UNIT_ID
24 | }
25 | }
26 |
27 | }
--------------------------------------------------------------------------------
/app/src/main/assets/admob_id.json:
--------------------------------------------------------------------------------
1 | {
2 | "testAdmobAppId": "ca-app-pub-3940256099942544~3347511713",
3 | "testAdmobBanner": "ca-app-pub-3940256099942544/6300978111",
4 | "testAdmobInterstitial": "ca-app-pub-3940256099942544/1033173712",
5 | "testAdmobRewarded": "ca-app-pub-3940256099942544/5224354917",
6 | "admobAppId": "ca-app-pub-3940256099942544~3347511713",
7 | "admobBannerID": [
8 | "ca-app-pub-3940256099942544/6300978111",
9 | "ca-app-pub-3940256099942544/6300978111",
10 | "ca-app-pub-3940256099942544/6300978111"
11 | ],
12 | "admobInterstitialID": [
13 | "ca-app-pub-3940256099942544/1033173712",
14 | "ca-app-pub-3940256099942544/1033173712",
15 | "ca-app-pub-3940256099942544/1033173712"
16 | ],
17 | "admobRewardedID": [
18 | "ca-app-pub-3940256099942544/5224354917",
19 | "ca-app-pub-3940256099942544/5224354917",
20 | "ca-app-pub-3940256099942544/5224354917"
21 | ]
22 | }
23 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/source/AdmobDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.source
2 |
3 | import android.content.Context
4 | import com.frogobox.coresdk.response.FrogoDataResponse
5 | import com.frogobox.coresdk.source.ICoreDataSource
6 | import com.google.android.gms.ads.interstitial.InterstitialAd
7 |
8 |
9 | /**
10 | * Created by faisalamir on 19/04/22
11 | * FrogoAdmob
12 | * -----------------------------------------
13 | * Name : Muhammad Faisal Amir
14 | * E-mail : faisalamircs@gmail.com
15 | * Github : github.com/amirisback
16 | * -----------------------------------------
17 | * Copyright (C) 2022 Frogobox Media Inc.
18 | * All rights reserved
19 | *
20 | */
21 |
22 | interface AdmobDataSource : ICoreDataSource {
23 |
24 | fun getInterstitial(context: Context, callback: FrogoDataResponse)
25 |
26 | fun saveInterstitial(interstitialAd: InterstitialAd)
27 |
28 | }
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/ui/UnityAdActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.ui
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import com.frogobox.unityad.delegate.UnityAdDelegates
6 | import com.frogobox.unityad.delegate.UnityAdDelegatesImpl
7 |
8 | /**
9 | * Created by Faisal Amir on 07/02/23
10 | * https://github.com/amirisback
11 | */
12 |
13 |
14 | abstract class UnityAdActivity : AppCompatActivity(),
15 | UnityAdDelegates by UnityAdDelegatesImpl() {
16 |
17 | companion object {
18 | val TAG: String = UnityAdActivity::class.java.simpleName
19 | }
20 |
21 | open fun setupMonetized() {
22 | setupUnityAdDelegates(this)
23 | }
24 |
25 | open fun setupContentView() {}
26 |
27 | override fun onCreate(savedInstanceState: Bundle?) {
28 | super.onCreate(savedInstanceState)
29 | setupContentView()
30 | setupMonetized()
31 | }
32 |
33 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/ui/AdmobActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.ui
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import com.frogobox.admob.delegate.AdmobDelegates
6 | import com.frogobox.admob.delegate.AdmobDelegatesImpl
7 |
8 | /**
9 | * Created by Faisal Amir on 07/02/23
10 | * https://github.com/amirisback
11 | */
12 |
13 |
14 | abstract class AdmobActivity : AppCompatActivity(),
15 | AdmobDelegates by AdmobDelegatesImpl() {
16 |
17 | companion object {
18 | val TAG: String = AdmobActivity::class.java.simpleName
19 | }
20 |
21 | open fun setupMonetized() {
22 | setupAdmobDelegates(this)
23 | setupAdmobApp()
24 | }
25 |
26 | open fun setupContentView() {}
27 |
28 | override fun onCreate(savedInstanceState: Bundle?) {
29 | super.onCreate(savedInstanceState)
30 | setupContentView()
31 | setupMonetized()
32 | }
33 |
34 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_phone_tab_special_smart_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_phone_tab_special_adaptive_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_phone_tab_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_tablet_full_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_tablet_leaderboard.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_phone_tab_large_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/ads_phone_tab_medium_rectangle.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/model/FrogoUnityId.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.model
2 |
3 | import androidx.annotation.Keep
4 | import com.google.gson.annotations.SerializedName
5 |
6 |
7 | /**
8 | * Created by faisalamir on 22/03/22
9 | * FrogoAdmob
10 | * -----------------------------------------
11 | * Name : Muhammad Faisal Amir
12 | * E-mail : faisalamircs@gmail.com
13 | * Github : github.com/amirisback
14 | * -----------------------------------------
15 | * Copyright (C) 2022 Frogobox Media Inc.
16 | * All rights reserved
17 | *
18 | */
19 |
20 | @Keep
21 | data class FrogoUnityId(
22 |
23 | @SerializedName("unityGameID")
24 | var unityGameID: String = "",
25 |
26 | @SerializedName("unityInterstitialID")
27 | var unityInterstitialID: List = listOf("", "", ""),
28 |
29 | @SerializedName("unityBannerId")
30 | var unityBannerId: List = listOf("", "", ""),
31 |
32 | @SerializedName("unityRewardedID")
33 | var unityRewardedID: List = listOf("", "", "")
34 |
35 | )
36 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_item_ad_banner.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/ui/FrogoAdmobBindActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.ui
2 |
3 | import androidx.viewbinding.ViewBinding
4 | import com.frogobox.admob.delegate.AdmobDelegates
5 | import com.frogobox.admob.delegate.AdmobDelegatesImpl
6 | import com.frogobox.sdk.view.FrogoBindActivity
7 |
8 |
9 | /**
10 | * Created by faisalamir on 01/03/22
11 | * FrogoAdmob
12 | * -----------------------------------------
13 | * Name : Muhammad Faisal Amir
14 | * E-mail : faisalamircs@gmail.com
15 | * Github : github.com/amirisback
16 | * -----------------------------------------
17 | * Copyright (C) 2022 Frogobox Media Inc.
18 | * All rights reserved
19 | *
20 | */
21 |
22 |
23 | abstract class FrogoAdmobBindActivity : FrogoBindActivity(),
24 | AdmobDelegates by AdmobDelegatesImpl() {
25 |
26 | companion object {
27 | val TAG: String = FrogoAdmobBindActivity::class.java.simpleName
28 | }
29 |
30 | override fun setupMonetized() {
31 | super.setupMonetized()
32 | setupAdmobDelegates(this)
33 | setupAdmobApp()
34 | }
35 |
36 | }
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/delegate/UnityAdDelegates.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.delegate
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import com.frogobox.unityad.callback.FrogoUnityAdInitializationCallback
5 | import com.frogobox.unityad.callback.FrogoUnityAdInterstitialCallback
6 |
7 | /**
8 | * Created by faisalamir on 22/03/22
9 | * FrogoAdmob
10 | * -----------------------------------------
11 | * Name : Muhammad Faisal Amir
12 | * E-mail : faisalamircs@gmail.com
13 | * Github : github.com/amirisback
14 | * -----------------------------------------
15 | * Copyright (C) 2022 Frogobox Media Inc.
16 | * All rights reserved
17 | *
18 | */
19 |
20 |
21 | interface UnityAdDelegates {
22 |
23 | fun setupUnityAdDelegates(activity: AppCompatActivity)
24 |
25 | fun setupUnityAdApp(
26 | testMode: Boolean,
27 | unityGameId: String,
28 | callback: FrogoUnityAdInitializationCallback? = null
29 | )
30 |
31 | fun showUnityAdInterstitial(
32 | adInterstitialUnitId: String,
33 | callback: FrogoUnityAdInterstitialCallback? = null
34 | )
35 |
36 | }
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/util/FrogoAdFunc.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.util
2 |
3 | import com.frogobox.adcore.util.FrogoAdConstant.ADMOB_MOBILE_ADS_KEY
4 | import com.frogobox.adcore.util.FrogoAdConstant.LINE
5 | import com.frogobox.sdk.ext.showLogDebug
6 |
7 |
8 | /**
9 | * Created by faisalamir on 23/03/22
10 | * FrogoAdmob
11 | * -----------------------------------------
12 | * Name : Muhammad Faisal Amir
13 | * E-mail : faisalamircs@gmail.com
14 | * Github : github.com/amirisback
15 | * -----------------------------------------
16 | * Copyright (C) 2022 Frogobox Media Inc.
17 | * All rights reserved
18 | *
19 | */
20 |
21 |
22 | object FrogoAdFunc {
23 |
24 | val TAG: String = FrogoAdFunc::class.java.simpleName
25 |
26 | fun getInitializedState(name: String, code: Int) {
27 | showLogDebug(LINE)
28 | showLogDebug("$TAG >> Setup MobileAds [Key] : $ADMOB_MOBILE_ADS_KEY")
29 | showLogDebug("$TAG >> Setup MobileAds [Initialization State Name] : $name")
30 | showLogDebug("$TAG >> Setup MobileAds [Initialization State Code] : $code")
31 | showLogDebug(LINE)
32 | }
33 |
34 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/SampleAdmobApplication.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob
2 |
3 | import android.content.Context
4 | import com.frogobox.appadmob.di.repositoryModule
5 | import com.frogobox.appadmob.di.viewModelModule
6 | import com.frogobox.appadmob.util.AdHelper
7 | import org.koin.core.KoinApplication
8 |
9 |
10 | /**
11 | * Created by faisalamir on 19/04/22
12 | * FrogoAdmob
13 | * -----------------------------------------
14 | * Name : Muhammad Faisal Amir
15 | * E-mail : faisalamircs@gmail.com
16 | * Github : github.com/amirisback
17 | * -----------------------------------------
18 | * Copyright (C) 2022 Frogobox Media Inc.
19 | * All rights reserved
20 | *
21 | */
22 |
23 | class SampleAdmobApplication : FrogoAdmobKoinApplication() {
24 |
25 | override fun setupKoinModule(koinApplication: KoinApplication) {
26 | koinApplication.modules(listOf(viewModelModule, repositoryModule))
27 | }
28 |
29 | override fun onCreateExt() {
30 | super.onCreateExt()
31 | }
32 |
33 | override fun getAdOpenAppUnitId(context: Context?): String {
34 | return AdHelper.getAdOpenAppUnitId(context)
35 | }
36 |
37 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/ui/FrogoAdmobActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.ui
2 |
3 | import com.frogobox.admob.delegate.AdmobDelegates
4 | import com.frogobox.admob.delegate.AdmobDelegatesImpl
5 | import com.frogobox.sdk.view.FrogoActivity
6 |
7 | /**
8 | * Created by Faisal Amir
9 | * FrogoBox Inc License
10 | * =========================================
11 | * ImplementationAdmob
12 | * Copyright (C) 31/10/2019.
13 | * All rights reserved
14 | * -----------------------------------------
15 | * Name : Muhammad Faisal Amir
16 | * E-mail : faisalamircs@gmail.com
17 | * Github : github.com/amirisback
18 | * LinkedIn : linkedin.com/in/faisalamircs
19 | * -----------------------------------------
20 | * FrogoBox Software Industries
21 | * com.frogobox.admobhelper
22 | *
23 | */
24 |
25 |
26 | abstract class FrogoAdmobActivity : FrogoActivity(),
27 | AdmobDelegates by AdmobDelegatesImpl() {
28 |
29 | companion object {
30 | val TAG: String = FrogoAdmobActivity::class.java.simpleName
31 | }
32 | override fun setupMonetized() {
33 | super.setupMonetized()
34 | setupAdmobDelegates(this)
35 | setupAdmobApp()
36 | }
37 |
38 | }
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/ui/FrogoUnityAdActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.ui
2 |
3 | import com.frogobox.sdk.view.FrogoActivity
4 | import com.frogobox.unityad.delegate.UnityAdDelegates
5 | import com.frogobox.unityad.delegate.UnityAdDelegatesImpl
6 |
7 | /**
8 | * Created by Faisal Amir
9 | * FrogoBox Inc License
10 | * =========================================
11 | * ImplementationAdmob
12 | * Copyright (C) 31/10/2019.
13 | * All rights reserved
14 | * -----------------------------------------
15 | * Name : Muhammad Faisal Amir
16 | * E-mail : faisalamircs@gmail.com
17 | * Github : github.com/amirisback
18 | * LinkedIn : linkedin.com/in/faisalamircs
19 | * -----------------------------------------
20 | * FrogoBox Software Industries
21 | * com.frogobox.admobhelper
22 | *
23 | */
24 |
25 |
26 | abstract class FrogoUnityAdActivity : FrogoActivity(),
27 | UnityAdDelegates by UnityAdDelegatesImpl() {
28 |
29 | companion object {
30 | val TAG: String = FrogoUnityAdActivity::class.java.simpleName
31 | }
32 |
33 | override fun setupMonetized() {
34 | super.setupMonetized()
35 | setupUnityAdDelegates(this)
36 | }
37 |
38 | }
--------------------------------------------------------------------------------
/app/src/main/assets/monetize_id.json:
--------------------------------------------------------------------------------
1 | {
2 | "testAdmobAppId": "ca-app-pub-3940256099942544~3347511713",
3 | "testAdmobBanner": "ca-app-pub-3940256099942544/6300978111",
4 | "testAdmobInterstitial": "ca-app-pub-3940256099942544/1033173712",
5 | "testAdmobRewarded": "ca-app-pub-3940256099942544/5224354917",
6 | "admobAppId": "ca-app-pub-3940256099942544~3347511713",
7 | "admobBannerID": [
8 | "ca-app-pub-3940256099942544/6300978111",
9 | "ca-app-pub-3940256099942544/6300978111",
10 | "ca-app-pub-3940256099942544/6300978111"
11 | ],
12 | "admobInterstitialID": [
13 | "ca-app-pub-3940256099942544/1033173712",
14 | "ca-app-pub-3940256099942544/1033173712",
15 | "ca-app-pub-3940256099942544/1033173712"
16 | ],
17 | "admobRewardedID": [
18 | "ca-app-pub-3940256099942544/5224354917",
19 | "ca-app-pub-3940256099942544/5224354917",
20 | "ca-app-pub-3940256099942544/5224354917"
21 | ],
22 | "unityGameID": "4416083",
23 | "unityInterstitialID": [
24 | "Interstitial_Android",
25 | "",
26 | "Interstitial_Android"
27 | ],
28 | "unityBannerId": [
29 | "",
30 | "",
31 | ""
32 | ],
33 | "unityRewardedID": [
34 | "",
35 | "",
36 | ""
37 | ]
38 | }
39 |
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/core/IFrogoUnityAd.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.core
2 |
3 | import android.app.Activity
4 | import android.content.Context
5 | import com.frogobox.unityad.callback.FrogoUnityAdInitializationCallback
6 | import com.frogobox.unityad.callback.FrogoUnityAdInterstitialCallback
7 |
8 | /**
9 | * Created by faisalamir on 22/03/22
10 | * FrogoAdmob
11 | * -----------------------------------------
12 | * Name : Muhammad Faisal Amir
13 | * E-mail : faisalamircs@gmail.com
14 | * Github : github.com/amirisback
15 | * -----------------------------------------
16 | * Copyright (C) 2022 Frogobox Media Inc.
17 | * All rights reserved
18 | *
19 | */
20 |
21 |
22 | interface IFrogoUnityAd {
23 |
24 | fun setupUnityAdApp(
25 | context: Context,
26 | testMode: Boolean,
27 | unityGameId: String,
28 | callback: FrogoUnityAdInitializationCallback? = null
29 | )
30 |
31 | // ---------------------------------------------------------------------------------------------
32 |
33 | fun showAdInterstitial(
34 | activity: Activity,
35 | adInterstitialUnitId: String,
36 | callback: FrogoUnityAdInterstitialCallback? = null
37 | )
38 |
39 | }
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/source/FrogoAdmobDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.source
2 |
3 | import android.content.Context
4 | import com.frogobox.adcore.model.FrogoAdmobId
5 | import com.frogobox.adcore.model.FrogoMonetizeId
6 | import com.frogobox.adcore.model.FrogoUnityId
7 |
8 | /**
9 | * Created by faisalamir on 02/03/22
10 | * FrogoAdmob
11 | * -----------------------------------------
12 | * Name : Muhammad Faisal Amir
13 | * E-mail : faisalamircs@gmail.com
14 | * Github : github.com/amirisback
15 | * -----------------------------------------
16 | * Copyright (C) 2022 Frogobox Media Inc.
17 | * All rights reserved
18 | *
19 | */
20 |
21 |
22 | interface FrogoAdmobDataSource {
23 |
24 | // Switch For Using OkHttpClient Interceptor
25 | fun usingClient(context: Context)
26 |
27 | // Callback Get FrogoAdmobId
28 | fun getFrogoAdmobId(jsonFileName: String, callback: FrogoAdmobApiResponse)
29 |
30 | // Callback Get FrogoMonetizeId
31 | fun getFrogoMonetizeId(jsonFileName: String, callback: FrogoAdmobApiResponse)
32 |
33 | // Callback Get FrogoUnityId
34 | fun getFrogoUnityId(jsonFileName: String, callback: FrogoAdmobApiResponse)
35 |
36 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/di/RepositoryModule.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.di
2 |
3 | import com.frogobox.appadmob.source.AdmobLocalDataSource
4 | import com.frogobox.appadmob.source.AdmobRemoteDataSource
5 | import com.frogobox.appadmob.source.AdmobRepository
6 | import com.frogobox.sdk.delegate.preference.PreferenceDelegatesImpl
7 | import com.frogobox.sdk.util.AppExecutors
8 | import org.koin.android.ext.koin.androidContext
9 | import org.koin.dsl.module
10 |
11 |
12 | /**
13 | * Created by faisalamir on 19/04/22
14 | * FrogoAdmob
15 | * -----------------------------------------
16 | * Name : Muhammad Faisal Amir
17 | * E-mail : faisalamircs@gmail.com
18 | * Github : github.com/amirisback
19 | * -----------------------------------------
20 | * Copyright (C) 2022 Frogobox Media Inc.
21 | * All rights reserved
22 | *
23 | */
24 |
25 | val repositoryModule = module {
26 |
27 | single {
28 | PreferenceDelegatesImpl(androidContext(), "com_frogobox_appadmob")
29 | }
30 |
31 | single {
32 | AdmobLocalDataSource(AppExecutors(), get())
33 | }
34 |
35 | single {
36 | AdmobRemoteDataSource()
37 | }
38 |
39 | single {
40 | AdmobRepository(get(), get())
41 | }
42 |
43 | }
--------------------------------------------------------------------------------
/ad-general/src/main/java/com/frogobox/ad/ui/AdActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.ad.ui
2 |
3 | import android.os.Bundle
4 | import androidx.appcompat.app.AppCompatActivity
5 | import com.frogobox.ad.delegate.FrogoAdDelegates
6 | import com.frogobox.ad.delegate.FrogoAdDelegatesImpl
7 | import com.frogobox.admob.delegate.AdmobDelegates
8 | import com.frogobox.admob.delegate.AdmobDelegatesImpl
9 | import com.frogobox.unityad.delegate.UnityAdDelegates
10 | import com.frogobox.unityad.delegate.UnityAdDelegatesImpl
11 |
12 | /**
13 | * Created by Faisal Amir on 07/02/23
14 | * https://github.com/amirisback
15 | */
16 |
17 |
18 | abstract class AdActivity : AppCompatActivity(),
19 | AdmobDelegates by AdmobDelegatesImpl(),
20 | UnityAdDelegates by UnityAdDelegatesImpl(),
21 | FrogoAdDelegates by FrogoAdDelegatesImpl() {
22 |
23 | companion object {
24 | val TAG: String = AdActivity::class.java.simpleName
25 | }
26 |
27 | open fun setupMonetized() {
28 | setupAdmobDelegates(this)
29 | setupAdmobApp()
30 | }
31 |
32 | open fun setupContentView() {}
33 |
34 | override fun onCreate(savedInstanceState: Bundle?) {
35 | super.onCreate(savedInstanceState)
36 | setupContentView()
37 | setupMonetized()
38 | }
39 |
40 | }
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/source/FrogoAdmobApiService.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.source
2 |
3 | import com.frogobox.adcore.model.FrogoAdmobId
4 | import com.frogobox.adcore.model.FrogoMonetizeId
5 | import com.frogobox.adcore.model.FrogoUnityId
6 | import io.reactivex.rxjava3.core.Observable
7 | import retrofit2.http.GET
8 | import retrofit2.http.Path
9 |
10 |
11 | /**
12 | * Created by faisalamir on 02/03/22
13 | * FrogoAdmob
14 | * -----------------------------------------
15 | * Name : Muhammad Faisal Amir
16 | * E-mail : faisalamircs@gmail.com
17 | * Github : github.com/amirisback
18 | * -----------------------------------------
19 | * Copyright (C) 2022 Frogobox Media Inc.
20 | * All rights reserved
21 | *
22 | */
23 |
24 |
25 | interface FrogoAdmobApiService {
26 |
27 | @GET("{json-file-name}")
28 | fun getFrogoAdmobId(
29 | @Path("json-file-name") jsonFileName: String
30 | ): Observable
31 |
32 | @GET("{json-file-name}")
33 | fun getMonetizeId(
34 | @Path("json-file-name") jsonFileName: String
35 | ): Observable
36 |
37 | @GET("{json-file-name}")
38 | fun getUnityId(
39 | @Path("json-file-name") jsonFileName: String
40 | ): Observable
41 |
42 | }
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/ui/FrogoUnityAdBindActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.ui
2 |
3 | import androidx.viewbinding.ViewBinding
4 | import com.frogobox.sdk.view.FrogoBindActivity
5 | import com.frogobox.unityad.delegate.UnityAdDelegates
6 | import com.frogobox.unityad.delegate.UnityAdDelegatesImpl
7 |
8 | /**
9 | * Created by Faisal Amir
10 | * FrogoBox Inc License
11 | * =========================================
12 | * ImplementationAdmob
13 | * Copyright (C) 31/10/2019.
14 | * All rights reserved
15 | * -----------------------------------------
16 | * Name : Muhammad Faisal Amir
17 | * E-mail : faisalamircs@gmail.com
18 | * Github : github.com/amirisback
19 | * LinkedIn : linkedin.com/in/faisalamircs
20 | * -----------------------------------------
21 | * FrogoBox Software Industries
22 | * com.frogobox.admobhelper
23 | *
24 | */
25 |
26 |
27 | abstract class FrogoUnityAdBindActivity : FrogoBindActivity(),
28 | UnityAdDelegates by UnityAdDelegatesImpl() {
29 |
30 | companion object {
31 | val TAG: String = FrogoUnityAdBindActivity::class.java.simpleName
32 | }
33 |
34 | override fun setupMonetized() {
35 | super.setupMonetized()
36 | setupUnityAdDelegates(this)
37 | }
38 |
39 | }
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/util/FrogoAdConstant.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.util
2 |
3 | /**
4 | * Created by Faisal Amir
5 | * =========================================
6 | * FrogoRecyclerViewAdapter
7 | * Copyright (C) 26/04/2020.
8 | * All rights reserved
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * FrogoBox Inc
15 | * com.frogobox.frogoadmobhelper.util
16 | *
17 | */
18 |
19 |
20 | object FrogoAdConstant {
21 |
22 | // Divider Admob
23 | const val RECYCLER_VIEW_ITEMS_PER_AD =
24 | 4 // A banner ad is placed in every 8th position in the RecyclerView.
25 | const val RECYCLER_VIEW_TYPE_MENU_ITEM = 0 // A menu item view type.
26 | const val RECYCLER_VIEW_TYPE_BANNER_AD = 1 // The banner ad view type.
27 |
28 | const val BASE_URL_SERVER = "https://raw.githubusercontent.com/"
29 |
30 | const val GITHUB_ACCOUNT = "https://github.com/amirisback"
31 |
32 | const val LINE =
33 | "------------------------------------------------------------------------------------------------"
34 |
35 | const val ADMOB_MOBILE_ADS_KEY = "com.google.android.gms.ads.MobileAds"
36 |
37 | }
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 | # IDE (e.g. Android Studio) users:
3 | # Gradle settings configured through the IDE *will override*
4 | # any settings specified in this file.
5 | # For more details on how to configure your build environment visit
6 | # http://www.gradle.org/docs/current/userguide/build_environment.html
7 | # Specifies the JVM arguments used for the daemon process.
8 | # The setting is particularly useful for tweaking memory settings.
9 | org.gradle.jvmargs=-Xmx4608m
10 | # When configured, Gradle will run in incubating parallel mode.
11 | # This option should only be used with decoupled projects. More details, visit
12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
13 | # org.gradle.parallel=true
14 | # AndroidX package structure to make it clearer which packages are bundled with the
15 | # Android operating system, and which are packaged with your app's APK
16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
17 | android.useAndroidX=true
18 | # Automatically convert third-party libraries to use AndroidX
19 | android.enableJetifier=true
20 | # Kotlin code style for this project: "official" or "obsolete":
21 | kotlin.code.style=official
22 |
23 | android.nonTransitiveRClass=false
24 | android.nonFinalResIds=false
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/widget/FrogoAdmobViewHolder.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.widget
2 |
3 | import android.view.View
4 | import android.view.ViewGroup
5 | import com.frogobox.recycler.core.FrogoRecyclerViewHolder
6 | import com.google.android.gms.ads.AdView
7 |
8 | /**
9 | * Created by Faisal Amir
10 | * FrogoBox Inc License
11 | * =========================================
12 | * SpeechBooster
13 | * Copyright (C) 10/09/2019.
14 | * All rights reserved
15 | * -----------------------------------------
16 | * Name : Muhammad Faisal Amir
17 | * E-mail : faisalamircs@gmail.com
18 | * Github : github.com/amirisback
19 | * LinkedIn : linkedin.com/in/faisalamircs
20 | * -----------------------------------------
21 | * FrogoBox Software Industries
22 | *
23 | *
24 | */
25 |
26 |
27 | abstract class FrogoAdmobViewHolder(view: View) : FrogoRecyclerViewHolder(view) {
28 |
29 | fun bindItemAdView(data: T) {
30 | val adView = data as AdView
31 | val adCardView = itemView as ViewGroup
32 |
33 | if (adCardView.childCount > 0) {
34 | adCardView.removeAllViews()
35 | }
36 | if (adView.parent != null) {
37 | (adView.parent as ViewGroup).removeView(adView)
38 | }
39 |
40 | adCardView.addView(adView)
41 | }
42 |
43 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/FrogoKoinApplication.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob
2 |
3 | import com.frogobox.sdk.FrogoApplication
4 | import org.koin.android.ext.koin.androidContext
5 | import org.koin.android.ext.koin.androidLogger
6 | import org.koin.core.KoinApplication
7 | import org.koin.core.context.startKoin
8 | import org.koin.core.logger.Level
9 |
10 |
11 | /**
12 | * Created by faisalamir on 26/07/21
13 | * FrogoSDK
14 | * -----------------------------------------
15 | * Name : Muhammad Faisal Amir
16 | * E-mail : faisalamircs@gmail.com
17 | * Github : github.com/amirisback
18 | * -----------------------------------------
19 | * Copyright (C) 2021 FrogoBox Inc.
20 | * All rights reserved
21 | *
22 | */
23 |
24 | abstract class FrogoKoinApplication : FrogoApplication() {
25 |
26 | open fun setupKoinModule(koinApplication: KoinApplication) {}
27 |
28 | override fun onCreateExt() {
29 | super.onCreateExt()
30 | startKoin {
31 | androidContext(this@FrogoKoinApplication)
32 | androidLogger(
33 | if (isDebugMode()) {
34 | Level.DEBUG
35 | } else {
36 | Level.ERROR
37 | }
38 | )
39 | setupKoinModule(this)
40 | }
41 | }
42 |
43 | }
--------------------------------------------------------------------------------
/app/src/main/res/values-night/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
27 |
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/core/IFrogoAdmob.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.core
2 |
3 | import android.content.Context
4 |
5 | /**
6 | * Created by Faisal Amir
7 | * FrogoBox Inc License
8 | * =========================================
9 | * ImplementationAdmob
10 | * Copyright (C) 10/02/2020.
11 | * All rights reserved
12 | * -----------------------------------------
13 | * Name : Muhammad Faisal Amir
14 | * E-mail : faisalamircs@gmail.com
15 | * Github : github.com/amirisback
16 | * LinkedIn : linkedin.com/in/faisalamircs
17 | * -----------------------------------------
18 | * FrogoBox Software Industries
19 | * com.frogobox.admob
20 | *
21 | */
22 |
23 |
24 | interface IFrogoAdmob {
25 |
26 | fun setupAdmobApp(context: Context)
27 |
28 | // ---------------------------------------------------------------------------------------------
29 |
30 | fun loadRecyclerBannerAds(
31 | bannerAdUnitId: String,
32 | context: Context,
33 | recyclerViewDataList: MutableList
34 | )
35 |
36 | fun addBannerAds(
37 | bannerAdUnitId: String,
38 | context: Context,
39 | recyclerViewDataList: MutableList
40 | )
41 |
42 | fun loadBannerAd(recyclerViewDataList: MutableList, index: Int)
43 |
44 | // ---------------------------------------------------------------------------------------------
45 |
46 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/news/NewsAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.news
2 |
3 | import android.view.ViewGroup
4 | import com.frogobox.admob.widget.AdmobViewHolder
5 | import com.frogobox.admob.widget.FrogoAdmobViewAdapter
6 | import com.frogobox.admob.widget.FrogoAdmobViewHolder
7 | import com.frogobox.admob.widget.IFrogoAdmobViewAdapter
8 | import com.frogobox.appadmob.R
9 |
10 | /**
11 | * Created by Faisal Amir
12 | * FrogoBox Inc License
13 | * =========================================
14 | * ImplementationAdmob
15 | * Copyright (C) 27/11/2019.
16 | * All rights reserved
17 | * -----------------------------------------
18 | * Name : Muhammad Faisal Amir
19 | * E-mail : faisalamircs@gmail.com
20 | * Github : github.com/amirisback
21 | * LinkedIn : linkedin.com/in/faisalamircs
22 | * -----------------------------------------
23 | * FrogoBox Software Industries
24 | * com.frogobox.admobhelper.ui.adapter
25 | *
26 | */
27 | class NewsAdapter : FrogoAdmobViewAdapter() {
28 |
29 | init {
30 | viewCallback = object : IFrogoAdmobViewAdapter {
31 | override fun onViewTypeMenuItem(parent: ViewGroup): FrogoAdmobViewHolder {
32 | return NewsHolder(viewLayout(parent))
33 | }
34 |
35 | override fun onViewTypeBannerAds(parent: ViewGroup): FrogoAdmobViewHolder {
36 | return AdmobViewHolder(viewLayout(parent, R.layout.content_item_ad_banner))
37 | }
38 | }
39 | }
40 |
41 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/movie/MovieAdapter.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.movie
2 |
3 | import android.view.ViewGroup
4 | import com.frogobox.admob.widget.AdmobViewHolder
5 | import com.frogobox.admob.widget.FrogoAdmobViewAdapter
6 | import com.frogobox.admob.widget.FrogoAdmobViewHolder
7 | import com.frogobox.admob.widget.IFrogoAdmobViewAdapter
8 | import com.frogobox.appadmob.R
9 |
10 | /**
11 | * Created by Faisal Amir
12 | * FrogoBox Inc License
13 | * =========================================
14 | * ImplementationAdmob
15 | * Copyright (C) 27/11/2019.
16 | * All rights reserved
17 | * -----------------------------------------
18 | * Name : Muhammad Faisal Amir
19 | * E-mail : faisalamircs@gmail.com
20 | * Github : github.com/amirisback
21 | * LinkedIn : linkedin.com/in/faisalamircs
22 | * -----------------------------------------
23 | * FrogoBox Software Industries
24 | * com.frogobox.admobhelper.ui.adapter
25 | *
26 | */
27 | class MovieAdapter : FrogoAdmobViewAdapter() {
28 |
29 | init {
30 | viewCallback = object : IFrogoAdmobViewAdapter {
31 | override fun onViewTypeMenuItem(parent: ViewGroup): FrogoAdmobViewHolder {
32 | return MovieHolder(viewLayout(parent))
33 | }
34 |
35 | override fun onViewTypeBannerAds(parent: ViewGroup): FrogoAdmobViewHolder {
36 | return AdmobViewHolder(viewLayout(parent, R.layout.content_item_ad_banner))
37 | }
38 | }
39 | }
40 |
41 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/news/NewsHolder.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.news
2 |
3 | import android.view.View
4 | import android.widget.ImageView
5 | import android.widget.TextView
6 | import com.bumptech.glide.Glide
7 | import com.frogobox.admob.widget.FrogoAdmobViewHolder
8 | import com.frogobox.appadmob.R
9 | import com.frogobox.coreutil.news.model.Article
10 | import com.frogobox.recycler.core.FrogoRecyclerNotifyListener
11 |
12 | /**
13 | * Created by Faisal Amir on 31/01/2021
14 | * AdmobSamples Source Code
15 | * -----------------------------------------
16 | * Name : Muhammad Faisal Amir
17 | * E-mail : faisalamircs@gmail.com
18 | * Github : github.com/amirisback
19 | * -----------------------------------------
20 | * Copyright (C) 2021 FrogoBox Inc.
21 | * All rights reserved
22 | *
23 | */
24 | class NewsHolder(view: View) : FrogoAdmobViewHolder(view) {
25 |
26 | private val tv_name = view.findViewById(R.id.tv_name)
27 | private val tv_type = view.findViewById(R.id.tv_type)
28 | private val iv_poster = view.findViewById(R.id.iv_poster)
29 |
30 | override fun initComponent(
31 | data: Any,
32 | position: Int,
33 | notifyListener: FrogoRecyclerNotifyListener
34 | ) {
35 | val article = data as Article
36 | Glide.with(itemView.context).load(article.urlToImage).into(iv_poster)
37 | tv_name.text = article.title
38 | tv_type.text = article.description
39 | }
40 |
41 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_app_open_ad.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
11 |
12 |
17 |
18 |
23 |
24 |
29 |
30 |
31 |
32 |
33 |
34 |
39 |
40 |
--------------------------------------------------------------------------------
/ad-general/src/main/java/com/frogobox/ad/delegate/FrogoAdDelegates.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.ad.delegate
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import com.frogobox.ad.callback.FrogoAdInterstitialCallback
5 |
6 | /**
7 | * Created by faisalamir on 22/03/22
8 | * FrogoAdmob
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2022 Frogobox Media Inc.
15 | * All rights reserved
16 | *
17 | */
18 |
19 |
20 | interface FrogoAdDelegates {
21 |
22 | fun setupFrogoAdDelegates(activity: AppCompatActivity)
23 |
24 | fun showAdmobXUnityAdInterstitial(
25 | admobInterstitialId: String,
26 | unityInterstitialId: String,
27 | callback: FrogoAdInterstitialCallback
28 | )
29 |
30 | fun showAdmobXUnityAdInterstitial(
31 | admobInterstitialId: String,
32 | unityInterstitialId: String,
33 | timeout: Int,
34 | callback: FrogoAdInterstitialCallback
35 | )
36 |
37 |
38 | fun showUnityXAdmobAdInterstitial(
39 | admobInterstitialId: String,
40 | unityInterstitialId: String,
41 | callback: FrogoAdInterstitialCallback
42 | )
43 |
44 | fun showUnityXAdmobAdInterstitial(
45 | admobInterstitialId: String,
46 | unityInterstitialId: String,
47 | timeout: Int,
48 | callback: FrogoAdInterstitialCallback
49 | )
50 |
51 | }
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/model/FrogoAdmobId.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.model
2 |
3 | import androidx.annotation.Keep
4 | import com.google.gson.annotations.SerializedName
5 |
6 | /**
7 | * Created by faisalamir on 02/03/22
8 | * FrogoAdmob
9 | * -----------------------------------------
10 | * Name : Muhammad Faisal Amir
11 | * E-mail : faisalamircs@gmail.com
12 | * Github : github.com/amirisback
13 | * -----------------------------------------
14 | * Copyright (C) 2022 Frogobox Media Inc.
15 | * All rights reserved
16 | *
17 | */
18 |
19 | @Keep
20 | data class FrogoAdmobId(
21 |
22 | @SerializedName("testAdmobAppId")
23 | var testAdmobAppId: String = "ca-app-pub-3940256099942544~3347511713",
24 |
25 | @SerializedName("testAdmobBanner")
26 | var testAdmobBanner: String = "ca-app-pub-3940256099942544/6300978111",
27 |
28 | @SerializedName("testAdmobInterstitial")
29 | var testAdmobInterstitial: String = "ca-app-pub-3940256099942544/1033173712",
30 |
31 | @SerializedName("testAdmobRewarded")
32 | var testAdmobRewarded: String = "ca-app-pub-3940256099942544/5224354917",
33 |
34 | @SerializedName("admobAppId")
35 | var admobAppId: String = "",
36 |
37 | @SerializedName("admobBannerID")
38 | var admobBannerID: List = listOf("", "", ""),
39 |
40 | @SerializedName("admobInterstitialID")
41 | var admobInterstitialID: List = listOf("", "", ""),
42 |
43 | @SerializedName("admobRewardedID")
44 | var admobRewardedID: List = listOf("", "", "")
45 |
46 | )
--------------------------------------------------------------------------------
/.github/workflows/android-ci.yml:
--------------------------------------------------------------------------------
1 | name: Android CI
2 |
3 | env:
4 | # The name of the main module repository
5 | main_project_module: app
6 |
7 | # The name of the Play Store
8 | playstore_name: Frogobox ID
9 |
10 | on:
11 | # Triggers the workflow on push or pull request events but only for default and protected branches
12 | push:
13 | branches: [ master ]
14 | pull_request:
15 | branches: [ master ]
16 |
17 | workflow_dispatch:
18 | # The workflow will be dispatched to the default queue
19 |
20 | jobs:
21 | build:
22 |
23 | runs-on: ubuntu-latest
24 |
25 | steps:
26 | - uses: actions/checkout@v3
27 |
28 | # Set Current Date As Env Variable
29 | - name: Set current date as env variable
30 | run: echo "date_today=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
31 |
32 | # Set Repository Name As Env Variable
33 | - name: Set repository name as env variable
34 | run: echo "repository_name=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
35 |
36 | - name: Set Up JDK
37 | uses: actions/setup-java@v3
38 | with:
39 | distribution: 'zulu' # See 'Supported distributions' for available options
40 | java-version: '17'
41 | cache: 'gradle'
42 |
43 | - name: Change wrapper permissions
44 | run: chmod +x ./gradlew
45 |
46 | # Run Tests Build
47 | - name: Run gradle tests
48 | run: ./gradlew test
49 |
50 | # Run Build Project
51 | - name: Build gradle project
52 | run: ./gradlew build
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/movie/MovieHolder.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.movie
2 |
3 | import android.view.View
4 | import android.widget.ImageView
5 | import android.widget.TextView
6 | import com.bumptech.glide.Glide
7 | import com.frogobox.admob.widget.FrogoAdmobViewHolder
8 | import com.frogobox.appadmob.R
9 | import com.frogobox.coreutil.movie.MovieUrl
10 | import com.frogobox.coreutil.movie.model.TrendingMovie
11 | import com.frogobox.recycler.core.FrogoRecyclerNotifyListener
12 |
13 | /**
14 | * Created by Faisal Amir on 31/01/2021
15 | * AdmobSamples Source Code
16 | * -----------------------------------------
17 | * Name : Muhammad Faisal Amir
18 | * E-mail : faisalamircs@gmail.com
19 | * Github : github.com/amirisback
20 | * -----------------------------------------
21 | * Copyright (C) 2021 FrogoBox Inc.
22 | * All rights reserved
23 | *
24 | */
25 | class MovieHolder(view: View) : FrogoAdmobViewHolder(view) {
26 |
27 | private val tv_name = view.findViewById(R.id.tv_name)
28 | private val tv_type = view.findViewById(R.id.tv_type)
29 | private val iv_poster = view.findViewById(R.id.iv_poster)
30 |
31 | override fun initComponent(
32 | data: Any,
33 | position: Int,
34 | notifyListener: FrogoRecyclerNotifyListener
35 | ) {
36 | val movie = data as TrendingMovie
37 | Glide.with(itemView.context).load("${MovieUrl.BASE_URL_IMAGE_ORIGNAL}${movie.poster_path}")
38 | .into(iv_poster)
39 | tv_name.text = movie.title
40 | tv_type.text = movie.overview
41 | }
42 |
43 | }
--------------------------------------------------------------------------------
/ad-general/src/main/java/com/frogobox/ad/ui/FrogoAdActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.ad.ui
2 |
3 | import com.frogobox.ad.delegate.FrogoAdDelegates
4 | import com.frogobox.ad.delegate.FrogoAdDelegatesImpl
5 | import com.frogobox.admob.delegate.AdmobDelegates
6 | import com.frogobox.admob.delegate.AdmobDelegatesImpl
7 | import com.frogobox.sdk.view.FrogoActivity
8 | import com.frogobox.unityad.delegate.UnityAdDelegates
9 | import com.frogobox.unityad.delegate.UnityAdDelegatesImpl
10 |
11 | /**
12 | * Created by Faisal Amir
13 | * FrogoBox Inc License
14 | * =========================================
15 | * ImplementationAdmob
16 | * Copyright (C) 31/10/2019.
17 | * All rights reserved
18 | * -----------------------------------------
19 | * Name : Muhammad Faisal Amir
20 | * E-mail : faisalamircs@gmail.com
21 | * Github : github.com/amirisback
22 | * LinkedIn : linkedin.com/in/faisalamircs
23 | * -----------------------------------------
24 | * FrogoBox Software Industries
25 | * com.frogobox.admobhelper
26 | *
27 | */
28 |
29 |
30 | abstract class FrogoAdActivity : FrogoActivity(),
31 | AdmobDelegates by AdmobDelegatesImpl(),
32 | UnityAdDelegates by UnityAdDelegatesImpl(),
33 | FrogoAdDelegates by FrogoAdDelegatesImpl() {
34 |
35 | companion object {
36 | val TAG: String = FrogoAdActivity::class.java.simpleName
37 | }
38 |
39 | override fun setupDelegates() {
40 | super.setupDelegates()
41 | setupAdmobDelegates(this)
42 | setupUnityAdDelegates(this)
43 | setupFrogoAdDelegates(this)
44 | }
45 |
46 | override fun setupMonetized() {
47 | super.setupMonetized()
48 | setupAdmobApp()
49 | }
50 |
51 | }
52 |
53 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/source/AdmobLocalDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.source
2 |
3 | import android.content.Context
4 | import com.frogobox.coresdk.response.FrogoDataResponse
5 | import com.frogobox.sdk.delegate.preference.PreferenceDelegatesImpl
6 | import com.frogobox.sdk.ext.showLogDebug
7 | import com.frogobox.sdk.ext.toModel
8 | import com.frogobox.sdk.source.FrogoLocalDataSource
9 | import com.frogobox.sdk.util.AppExecutors
10 | import com.google.android.gms.ads.interstitial.InterstitialAd
11 | import com.google.gson.Gson
12 |
13 |
14 | /**
15 | * Created by faisalamir on 19/04/22
16 | * FrogoAdmob
17 | * -----------------------------------------
18 | * Name : Muhammad Faisal Amir
19 | * E-mail : faisalamircs@gmail.com
20 | * Github : github.com/amirisback
21 | * -----------------------------------------
22 | * Copyright (C) 2022 Frogobox Media Inc.
23 | * All rights reserved
24 | *
25 | */
26 |
27 | class AdmobLocalDataSource(
28 | private val appExecutors: AppExecutors,
29 | private val preferences: PreferenceDelegatesImpl
30 | ) : FrogoLocalDataSource(appExecutors, preferences), AdmobDataSource {
31 |
32 | override fun getInterstitial(context: Context, callback: FrogoDataResponse) {
33 | callback.onShowProgress()
34 | val data = getPrefString("PREF_INTERSTITIAL_AD")
35 | callback.onSuccess(Gson().fromJson(data, InterstitialAd::class.java))
36 | callback.onHideProgress()
37 | }
38 |
39 | override fun saveInterstitial(interstitialAd: InterstitialAd) {
40 | showLogDebug(Gson().toJson(interstitialAd))
41 | savePrefString("PREF_INTERSTITIAL_AD", Gson().toJson(interstitialAd))
42 | }
43 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/themes.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
27 |
28 |
32 |
33 |
34 |
35 |
36 |
--------------------------------------------------------------------------------
/ad-admob/src/main/res/layout/frogo_rv_empty_view.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
27 |
28 |
33 |
34 |
44 |
45 |
50 |
51 |
--------------------------------------------------------------------------------
/ad-general/src/main/java/com/frogobox/ad/ui/FrogoAdBindActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.ad.ui
2 |
3 | import androidx.viewbinding.ViewBinding
4 | import com.frogobox.ad.delegate.FrogoAdDelegates
5 | import com.frogobox.ad.delegate.FrogoAdDelegatesImpl
6 | import com.frogobox.admob.delegate.AdmobDelegates
7 | import com.frogobox.admob.delegate.AdmobDelegatesImpl
8 | import com.frogobox.sdk.view.FrogoBindActivity
9 | import com.frogobox.unityad.delegate.UnityAdDelegates
10 | import com.frogobox.unityad.delegate.UnityAdDelegatesImpl
11 |
12 | /**
13 | * Created by Faisal Amir
14 | * FrogoBox Inc License
15 | * =========================================
16 | * ImplementationAdmob
17 | * Copyright (C) 31/10/2019.
18 | * All rights reserved
19 | * -----------------------------------------
20 | * Name : Muhammad Faisal Amir
21 | * E-mail : faisalamircs@gmail.com
22 | * Github : github.com/amirisback
23 | * LinkedIn : linkedin.com/in/faisalamircs
24 | * -----------------------------------------
25 | * FrogoBox Software Industries
26 | * com.frogobox.admobhelper
27 | *
28 | */
29 |
30 |
31 | abstract class FrogoAdBindActivity : FrogoBindActivity(),
32 | AdmobDelegates by AdmobDelegatesImpl(),
33 | UnityAdDelegates by UnityAdDelegatesImpl(),
34 | FrogoAdDelegates by FrogoAdDelegatesImpl() {
35 |
36 | companion object {
37 | val TAG: String = FrogoAdBindActivity::class.java.simpleName
38 | }
39 |
40 | override fun setupDelegates() {
41 | super.setupDelegates()
42 | setupAdmobDelegates(this)
43 | setupUnityAdDelegates(this)
44 | setupFrogoAdDelegates(this)
45 | }
46 |
47 | override fun setupMonetized() {
48 | super.setupMonetized()
49 | setupAdmobApp()
50 | }
51 |
52 | }
53 |
54 |
--------------------------------------------------------------------------------
/app/src/main/res/values/base_colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | #FFBB86FC
5 | #FF6200EE
6 | #FF3700B3
7 | #FF03DAC5
8 | #FF018786
9 | #FF000000
10 | #FFFFFFFF
11 |
12 | #008577
13 | #00574B
14 | #D81B60
15 |
16 |
17 | #FFFFFF
18 | #000000
19 | #FF0000
20 | #757575
21 |
22 |
23 |
24 | @color/colorBaseWhite
25 | #E9E7E7
26 | #95E9E7E7
27 | #A3A3A3
28 | @color/colorBaseRed
29 | #B7000000
30 |
31 |
32 | @color/colorBaseWhite
33 | @color/colorBaseBlack
34 | #009562
35 | #AE000000
36 |
37 | #000
38 | #4285f4
39 |
40 | #F5F5F5
41 | #D8D8D8
42 | @color/colorAccentOld
43 |
44 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/content_item_news.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
31 |
32 |
38 |
39 |
47 |
48 |
54 |
55 |
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/model/FrogoMonetizeId.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.model
2 |
3 | import androidx.annotation.Keep
4 | import com.google.gson.annotations.SerializedName
5 |
6 |
7 | /**
8 | * Created by faisalamir on 22/03/22
9 | * FrogoAdmob
10 | * -----------------------------------------
11 | * Name : Muhammad Faisal Amir
12 | * E-mail : faisalamircs@gmail.com
13 | * Github : github.com/amirisback
14 | * -----------------------------------------
15 | * Copyright (C) 2022 Frogobox Media Inc.
16 | * All rights reserved
17 | *
18 | */
19 | @Keep
20 | data class FrogoMonetizeId(
21 |
22 | @SerializedName("testAdmobAppId")
23 | var testAdmobAppId: String = "ca-app-pub-3940256099942544~3347511713",
24 |
25 | @SerializedName("testAdmobBanner")
26 | var testAdmobBanner: String = "ca-app-pub-3940256099942544/6300978111",
27 |
28 | @SerializedName("testAdmobInterstitial")
29 | var testAdmobInterstitial: String = "ca-app-pub-3940256099942544/1033173712",
30 |
31 | @SerializedName("testAdmobRewarded")
32 | var testAdmobRewarded: String = "ca-app-pub-3940256099942544/5224354917",
33 |
34 | @SerializedName("admobAppId")
35 | var admobAppId: String = "",
36 |
37 | @SerializedName("admobBannerID")
38 | var admobBannerID: List = listOf("", "", ""),
39 |
40 | @SerializedName("admobInterstitialID")
41 | var admobInterstitialID: List = listOf("", "", ""),
42 |
43 | @SerializedName("admobRewardedID")
44 | var admobRewardedID: List = listOf("", "", ""),
45 |
46 | @SerializedName("unityGameID")
47 | var unityGameID: String = "",
48 |
49 | @SerializedName("unityInterstitialID")
50 | var unityInterstitialID: List = listOf("", "", ""),
51 |
52 | @SerializedName("unityBannerId")
53 | var unityBannerId: List = listOf("", "", ""),
54 |
55 | @SerializedName("unityRewardedID")
56 | var unityRewardedID: List = listOf("", "", "")
57 |
58 | )
--------------------------------------------------------------------------------
/app/src/main/res/drawable-v24/ic_launcher_foreground.xml:
--------------------------------------------------------------------------------
1 |
7 |
12 |
13 |
19 |
22 |
25 |
26 |
27 |
28 |
34 |
35 |
--------------------------------------------------------------------------------
/ad-core/src/main/java/com/frogobox/adcore/source/FrogoAdmobRepository.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.adcore.source
2 |
3 | import android.content.Context
4 | import com.frogobox.adcore.model.FrogoAdmobId
5 | import com.frogobox.adcore.model.FrogoMonetizeId
6 | import com.frogobox.adcore.model.FrogoUnityId
7 | import com.frogobox.coresdk.source.FrogoApiClient
8 | import com.frogobox.sdk.ext.doApiRequest
9 | import com.frogobox.sdk.ext.usingChuck
10 |
11 |
12 | /**
13 | * Created by faisalamir on 02/03/22
14 | * FrogoAdmob
15 | * -----------------------------------------
16 | * Name : Muhammad Faisal Amir
17 | * E-mail : faisalamircs@gmail.com
18 | * Github : github.com/amirisback
19 | * -----------------------------------------
20 | * Copyright (C) 2022 Frogobox Media Inc.
21 | * All rights reserved
22 | *
23 | */
24 |
25 |
26 | class FrogoAdmobRepository(
27 | private val isDebug: Boolean,
28 | private val baseUrl: String
29 | ) : FrogoAdmobDataSource {
30 |
31 | companion object {
32 | val TAG = FrogoAdmobRepository::class.java.simpleName
33 | }
34 |
35 | private var frogoAdmobApiService = FrogoApiClient.create(baseUrl, isDebug)
36 |
37 | override fun usingClient(context: Context) {
38 | frogoAdmobApiService = FrogoApiClient.create(baseUrl, isDebug, context.usingChuck())
39 | }
40 |
41 | override fun getFrogoAdmobId(
42 | jsonFileName: String,
43 | callback: FrogoAdmobApiResponse
44 | ) {
45 | frogoAdmobApiService.getFrogoAdmobId(jsonFileName).doApiRequest(callback) {}
46 | }
47 |
48 | override fun getFrogoMonetizeId(
49 | jsonFileName: String,
50 | callback: FrogoAdmobApiResponse
51 | ) {
52 | frogoAdmobApiService.getMonetizeId(jsonFileName).doApiRequest(callback) {}
53 | }
54 |
55 | override fun getFrogoUnityId(
56 | jsonFileName: String,
57 | callback: FrogoAdmobApiResponse
58 | ) {
59 | frogoAdmobApiService.getUnityId(jsonFileName).doApiRequest(callback) {}
60 | }
61 |
62 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/callback/FrogoAdmobBannerCallback.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.callback
2 |
3 |
4 | /**
5 | * Created by faisalamir on 10/03/22
6 | * FrogoAdmob
7 | * -----------------------------------------
8 | * Name : Muhammad Faisal Amir
9 | * E-mail : faisalamircs@gmail.com
10 | * Github : github.com/amirisback
11 | * -----------------------------------------
12 | * Copyright (C) 2022 Frogobox Media Inc.
13 | * All rights reserved
14 | *
15 | */
16 |
17 |
18 | interface FrogoAdmobBannerCallback {
19 | // Code to be executed when an ad finishes loading.
20 | // The onAdLoaded() method is executed when an ad has finished loading.
21 | // If you want to delay adding the AdView to your activity or fragment until you're sure an ad will be loaded,
22 | // for example, you can do so here.
23 | fun onAdLoaded(tag: String, message: String)
24 |
25 | // Code to be executed when an ad request fails.
26 | // The onAdFailedToLoad() method is the only one that includes a parameter.
27 | // The error parameter of type LoadAdError describes what error occurred.
28 | // For more information, refer to the Debugging Ad Load Errors documentation.
29 | fun onAdFailedToLoad(tag: String, errorCode: String, errorMessage: String)
30 |
31 | // Code to be executed when an ad opens an overlay that
32 | // covers the screen.
33 | // This method is invoked when the user taps on an ad.
34 | fun onAdOpened(tag: String, message: String)
35 |
36 | // Code to be executed when the user clicks on an ad.
37 | fun onAdClicked(tag: String, message: String)
38 |
39 | // Code to be executed when the user is about to return
40 | // to the app after tapping on an ad.
41 | // When a user returns to the app after viewing an ad's destination URL, this method is invoked.
42 | // Your app can use it to resume suspended activities or perform any other work necessary to make itself ready for interaction.
43 | // Refer to the AdMob AdListener example for an implementation of the ad listener methods in the Android API Demo app.
44 | fun onAdClosed(tag: String, message: String)
45 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/source/AdmobRepository.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.source
2 |
3 | import android.content.Context
4 | import com.frogobox.coresdk.response.FrogoDataResponse
5 | import com.frogobox.sdk.source.FrogoRepository
6 | import com.google.android.gms.ads.interstitial.InterstitialAd
7 |
8 |
9 | /**
10 | * Created by faisalamir on 19/04/22
11 | * FrogoAdmob
12 | * -----------------------------------------
13 | * Name : Muhammad Faisal Amir
14 | * E-mail : faisalamircs@gmail.com
15 | * Github : github.com/amirisback
16 | * -----------------------------------------
17 | * Copyright (C) 2022 Frogobox Media Inc.
18 | * All rights reserved
19 | *
20 | */
21 |
22 | class AdmobRepository(
23 | private val remoteDataSource: AdmobRemoteDataSource,
24 | private val localDataSource: AdmobLocalDataSource
25 | ) : FrogoRepository(remoteDataSource, localDataSource), AdmobDataSource {
26 |
27 | override fun getInterstitial(context: Context, callback: FrogoDataResponse) {
28 | if (localDataSource.getPrefString("PREF_INTERSTITIAL_AD") == "") {
29 | remoteDataSource.getInterstitial(context, object : FrogoDataResponse {
30 | override fun onFailed(statusCode: Int, errorMessage: String) {
31 | callback.onFailed(statusCode, errorMessage)
32 | }
33 |
34 | override fun onFinish() {
35 | callback.onFinish()
36 | }
37 |
38 | override fun onHideProgress() {
39 | callback.onHideProgress()
40 | }
41 |
42 | override fun onShowProgress() {
43 | callback.onShowProgress()
44 | }
45 |
46 | override fun onSuccess(data: InterstitialAd) {
47 | saveInterstitial(data)
48 | callback.onSuccess(data)
49 | }
50 |
51 | })
52 | } else {
53 | localDataSource.getInterstitial(context, callback)
54 | }
55 | }
56 |
57 | override fun saveInterstitial(interstitialAd: InterstitialAd) {
58 | localDataSource.saveInterstitial(interstitialAd)
59 | }
60 | }
--------------------------------------------------------------------------------
/ad-unityad/src/main/java/com/frogobox/unityad/delegate/UnityAdDelegatesImpl.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.unityad.delegate
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import com.frogobox.unityad.callback.FrogoUnityAdInitializationCallback
5 | import com.frogobox.unityad.callback.FrogoUnityAdInterstitialCallback
6 | import com.frogobox.unityad.core.FrogoUnityAd
7 | import com.unity3d.ads.metadata.MetaData
8 |
9 | /**
10 | * Created by faisalamir on 22/03/22
11 | * FrogoAdmob
12 | * -----------------------------------------
13 | * Name : Muhammad Faisal Amir
14 | * E-mail : faisalamircs@gmail.com
15 | * Github : github.com/amirisback
16 | * -----------------------------------------
17 | * Copyright (C) 2022 Frogobox Media Inc.
18 | * All rights reserved
19 | *
20 | */
21 |
22 |
23 | class UnityAdDelegatesImpl : UnityAdDelegates {
24 |
25 | companion object {
26 | val TAG: String = UnityAdDelegatesImpl::class.java.simpleName
27 | }
28 |
29 | private lateinit var unityAdDelegatesActivity: AppCompatActivity
30 |
31 | override fun setupUnityAdDelegates(activity: AppCompatActivity) {
32 | unityAdDelegatesActivity = activity
33 | val gdprMetaData = MetaData(activity)
34 | gdprMetaData["gdpr.consent"] = true
35 | gdprMetaData.commit()
36 |
37 | val ccpaMetaData = MetaData(activity)
38 | ccpaMetaData["privacy.consent"] = true
39 | ccpaMetaData.commit()
40 | }
41 |
42 | // ---------------------------------------------------------------------------------------------
43 |
44 |
45 | override fun setupUnityAdApp(
46 | testMode: Boolean,
47 | unityGameId: String,
48 | callback: FrogoUnityAdInitializationCallback?
49 | ) {
50 |
51 | FrogoUnityAd.setupUnityAdApp(unityAdDelegatesActivity, testMode, unityGameId, callback)
52 | }
53 |
54 | // ---------------------------------------------------------------------------------------------
55 |
56 | override fun showUnityAdInterstitial(
57 | adInterstitialUnitId: String,
58 | callback: FrogoUnityAdInterstitialCallback?
59 | ) {
60 | FrogoUnityAd.showAdInterstitial(unityAdDelegatesActivity, adInterstitialUnitId, callback)
61 | }
62 |
63 | }
--------------------------------------------------------------------------------
/gradle/libs.versions.toml:
--------------------------------------------------------------------------------
1 | [versions]
2 |
3 | liveCycle = "2.8.5"
4 |
5 | # Ads Version
6 | googleAdmob = "23.3.0" # https://developers.google.com/admob/android/quick-start
7 | unityAd = "4.12.1" # https://developers.google.com/admob/android/mediation/unity#step_3_import_the_unity_ads_sdk_and_adapter
8 | startIo = "4.11.5" # https://support.start.io/hc/en-us/articles/360014774799-Integration-via-Maven
9 |
10 | koin = "3.5.6"
11 |
12 | frogorecylerview = "4.4.2"
13 | frogosdk = "2.2.9"
14 | frogoui = "2.0.5"
15 | frogoConsumeApi = "2.5.5"
16 |
17 | [libraries]
18 | # Android Kit
19 | androidx-lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "liveCycle" }
20 |
21 | ads-google-admob = { group = "com.google.android.gms", name = "play-services-ads", version.ref = "googleAdmob" }
22 | ads-google-admob-lite = { group = "com.google.android.gms", name = "play-services-ads-lite", version.ref = "googleAdmob" }
23 | ads-unityAd = { group = "com.unity3d.ads", name = "unity-ads", version.ref = "unityAd" }
24 | ads-startIo = { group = "com.startapp", name = "inapp-sdk", version.ref = "startIo" }
25 |
26 | # --------------------------------------------------------------------------------------------------
27 | # Test Library
28 |
29 | # --------------------------------------------------------------------------------------------------
30 | # Library
31 | koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" }
32 | koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" }
33 | koin-android-compat = { group = "io.insert-koin", name = "koin-android-compat", version.ref = "koin" }
34 | koin-androidx-workmanager = { group = "io.insert-koin", name = "koin-androidx-workmanager", version.ref = "koin" }
35 |
36 | frogo-sdk = { group = "com.github.frogobox", name = "frogo-sdk", version.ref = "frogosdk" }
37 |
38 | frogo-ui = { group = "com.github.frogobox", name = "frogo-ui", version.ref = "frogoui" }
39 |
40 | frogo-consume-api = { group = "com.github.frogobox", name = "frogo-consume-api", version.ref = "frogoConsumeApi" }
41 | frogo-recyclerview = { group = "com.github.amirisback", name = "frogo-recycler-view", version.ref = "frogorecylerview" }
42 | # --------------------------------------------------------------------------------------------------
43 |
44 | [plugins]
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/core/IFrogoAdmobInterstitial.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.core
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import com.frogobox.admob.callback.FrogoAdmobInterstitialCallback
5 |
6 | /**
7 | * Created by Faisal Amir
8 | * FrogoBox Inc License
9 | * =========================================
10 | * ImplementationAdmob
11 | * Copyright (C) 10/02/2020.
12 | * All rights reserved
13 | * -----------------------------------------
14 | * Name : Muhammad Faisal Amir
15 | * E-mail : faisalamircs@gmail.com
16 | * Github : github.com/amirisback
17 | * LinkedIn : linkedin.com/in/faisalamircs
18 | * -----------------------------------------
19 | * FrogoBox Software Industries
20 | * com.frogobox.admob
21 | *
22 | */
23 |
24 |
25 | interface IFrogoAdmobInterstitial {
26 |
27 | fun showAdInterstitial(
28 | activity: AppCompatActivity,
29 | interstitialAdUnitId: String,
30 | timeoutMilliSecond: Int?,
31 | keyword: List?,
32 | callback: FrogoAdmobInterstitialCallback?
33 | )
34 |
35 | fun showAdInterstitial(
36 | activity: AppCompatActivity,
37 | interstitialAdUnitId: String,
38 | timeoutMilliSecond: Int,
39 | keyword: List
40 | )
41 |
42 | fun showAdInterstitial(
43 | activity: AppCompatActivity,
44 | interstitialAdUnitId: String,
45 | timeoutMilliSecond: Int
46 | )
47 |
48 | fun showAdInterstitial(
49 | activity: AppCompatActivity,
50 | interstitialAdUnitId: String,
51 | keyword: List
52 | )
53 |
54 | fun showAdInterstitial(
55 | activity: AppCompatActivity,
56 | interstitialAdUnitId: String,
57 | )
58 |
59 | fun showAdInterstitial(
60 | activity: AppCompatActivity,
61 | interstitialAdUnitId: String,
62 | timeoutMilliSecond: Int,
63 | callback: FrogoAdmobInterstitialCallback
64 | )
65 |
66 | fun showAdInterstitial(
67 | activity: AppCompatActivity,
68 | interstitialAdUnitId: String,
69 | keyword: List,
70 | callback: FrogoAdmobInterstitialCallback
71 | )
72 |
73 | fun showAdInterstitial(
74 | activity: AppCompatActivity,
75 | interstitialAdUnitId: String,
76 | callback: FrogoAdmobInterstitialCallback
77 | )
78 |
79 | }
--------------------------------------------------------------------------------
/gradlew.bat:
--------------------------------------------------------------------------------
1 | @if "%DEBUG%" == "" @echo off
2 | @rem ##########################################################################
3 | @rem
4 | @rem Gradle startup script for Windows
5 | @rem
6 | @rem ##########################################################################
7 |
8 | @rem Set local scope for the variables with windows NT shell
9 | if "%OS%"=="Windows_NT" setlocal
10 |
11 | set DIRNAME=%~dp0
12 | if "%DIRNAME%" == "" set DIRNAME=.
13 | set APP_BASE_NAME=%~n0
14 | set APP_HOME=%DIRNAME%
15 |
16 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
17 | set DEFAULT_JVM_OPTS=
18 |
19 | @rem Find java.exe
20 | if defined JAVA_HOME goto findJavaFromJavaHome
21 |
22 | set JAVA_EXE=java.exe
23 | %JAVA_EXE% -version >NUL 2>&1
24 | if "%ERRORLEVEL%" == "0" goto init
25 |
26 | echo.
27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
28 | echo.
29 | echo Please set the JAVA_HOME variable in your environment to match the
30 | echo location of your Java installation.
31 |
32 | goto fail
33 |
34 | :findJavaFromJavaHome
35 | set JAVA_HOME=%JAVA_HOME:"=%
36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
37 |
38 | if exist "%JAVA_EXE%" goto init
39 |
40 | echo.
41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
42 | echo.
43 | echo Please set the JAVA_HOME variable in your environment to match the
44 | echo location of your Java installation.
45 |
46 | goto fail
47 |
48 | :init
49 | @rem Get command-line arguments, handling Windows variants
50 |
51 | if not "%OS%" == "Windows_NT" goto win9xME_args
52 |
53 | :win9xME_args
54 | @rem Slurp the command line arguments.
55 | set CMD_LINE_ARGS=
56 | set _SKIP=2
57 |
58 | :win9xME_args_slurp
59 | if "x%~1" == "x" goto execute
60 |
61 | set CMD_LINE_ARGS=%*
62 |
63 | :execute
64 | @rem Setup the command line
65 |
66 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
67 |
68 | @rem Execute Gradle
69 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
70 |
71 | :end
72 | @rem End local scope for the variables with windows NT shell
73 | if "%ERRORLEVEL%"=="0" goto mainEnd
74 |
75 | :fail
76 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
77 | rem the _cmd.exe /c_ return code!
78 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
79 | exit /b 1
80 |
81 | :mainEnd
82 | if "%OS%"=="Windows_NT" endlocal
83 |
84 | :omega
85 |
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/core/IFrogoAdmobRewarded.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.core
2 |
3 | import androidx.appcompat.app.AppCompatActivity
4 | import com.frogobox.admob.callback.FrogoAdmobRewardedCallback
5 |
6 | /**
7 | * Created by Faisal Amir
8 | * FrogoBox Inc License
9 | * =========================================
10 | * ImplementationAdmob
11 | * Copyright (C) 10/02/2020.
12 | * All rights reserved
13 | * -----------------------------------------
14 | * Name : Muhammad Faisal Amir
15 | * E-mail : faisalamircs@gmail.com
16 | * Github : github.com/amirisback
17 | * LinkedIn : linkedin.com/in/faisalamircs
18 | * -----------------------------------------
19 | * FrogoBox Software Industries
20 | * com.frogobox.admob
21 | *
22 | */
23 |
24 |
25 | interface IFrogoAdmobRewarded {
26 |
27 | fun showAdRewarded(
28 | activity: AppCompatActivity,
29 | mAdUnitIdRewarded: String,
30 | timeoutMilliSecond: Int?,
31 | keyword: List?,
32 | callback: FrogoAdmobRewardedCallback
33 | )
34 |
35 | fun showAdRewarded(
36 | activity: AppCompatActivity,
37 | mAdUnitIdRewarded: String,
38 | callback: FrogoAdmobRewardedCallback
39 | )
40 |
41 | fun showAdRewarded(
42 | activity: AppCompatActivity,
43 | mAdUnitIdRewarded: String,
44 | timeoutMilliSecond: Int,
45 | callback: FrogoAdmobRewardedCallback
46 | )
47 |
48 | fun showAdRewarded(
49 | activity: AppCompatActivity,
50 | mAdUnitIdRewarded: String,
51 | keyword: List,
52 | callback: FrogoAdmobRewardedCallback
53 | )
54 |
55 | // ---------------------------------------------------------------------------------------------
56 |
57 | fun showAdRewardedInterstitial(
58 | activity: AppCompatActivity,
59 | mAdUnitIdRewardedInterstitial: String,
60 | timeoutMilliSecond: Int?,
61 | keyword: List?,
62 | callback: FrogoAdmobRewardedCallback
63 | )
64 |
65 | fun showAdRewardedInterstitial(
66 | activity: AppCompatActivity,
67 | mAdUnitIdRewardedInterstitial: String,
68 | callback: FrogoAdmobRewardedCallback
69 | )
70 |
71 | fun showAdRewardedInterstitial(
72 | activity: AppCompatActivity,
73 | mAdUnitIdRewardedInterstitial: String,
74 | timeoutMilliSecond: Int,
75 | callback: FrogoAdmobRewardedCallback
76 | )
77 |
78 | fun showAdRewardedInterstitial(
79 | activity: AppCompatActivity,
80 | mAdUnitIdRewardedInterstitial: String,
81 | keyword: List,
82 | callback: FrogoAdmobRewardedCallback
83 | )
84 |
85 | }
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 16dp
28 | 16dp
29 | 8dp
30 | 176dp
31 | 16dp
32 | 60dp
33 |
34 | 12dp
35 | 64dp
36 | 32dp
37 | 24dp
38 | 16dp
39 | 8dp
40 | 4dp
41 |
42 | 1dp
43 | 0dp
44 |
45 | 50dp
46 | 220dp
47 | 125dp
48 | 60dp
49 | 50dp
50 | 5dip
51 |
52 |
53 | 24sp
54 | 24sp
55 | 20sp
56 | 18sp
57 | 16sp
58 | 12sp
59 | 10sp
60 |
61 | 95dp
62 | 200dp
63 | 90dp
64 | 2dp
65 | 20dp
66 | 100dp
67 |
68 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/main/MainJavaActivity.java:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.main;
2 |
3 | import android.os.Bundle;
4 | import android.view.View;
5 |
6 | import androidx.annotation.NonNull;
7 |
8 | import com.frogobox.admob.callback.FrogoAdmobInterstitialCallback;
9 | import com.frogobox.admob.callback.FrogoAdmobRewardedCallback;
10 | import com.frogobox.appadmob.R;
11 | import com.frogobox.appadmob.base.BaseActivity;
12 | import com.frogobox.appadmob.databinding.ActivityMainBinding;
13 | import com.google.android.gms.ads.AdSize;
14 | import com.google.android.gms.ads.rewarded.RewardItem;
15 |
16 | public class MainJavaActivity extends BaseActivity implements FrogoAdmobInterstitialCallback, FrogoAdmobRewardedCallback {
17 |
18 | @NonNull
19 | @Override
20 | public ActivityMainBinding setupViewBinding() {
21 | return ActivityMainBinding.inflate(getLayoutInflater());
22 | }
23 |
24 | @Override
25 | protected void onCreate(Bundle savedInstanceState) {
26 | super.onCreate(savedInstanceState);
27 | showAdBannerContainer(getString(R.string.admob_banner), AdSize.SMART_BANNER, getBinding().includeAdsView.frogoAdsBanner);
28 | showAdBanner(getBinding().adsXml.adsPhoneTabSpecialSmartBanner);
29 | hideButton();
30 | setupButtonClick();
31 | setupDetailActivity("Java Sample");
32 | }
33 |
34 | private void hideButton() {
35 | getBinding().btnRecyclerView.setVisibility(View.GONE);
36 | getBinding().btnRecyclerView2.setVisibility(View.GONE);
37 | getBinding().btnJavaSampleActivity.setVisibility(View.GONE);
38 | }
39 |
40 | private void setupButtonClick() {
41 | getBinding().btnInterstitial.setOnClickListener(view -> {
42 | showAdInterstitial(getString(R.string.admob_interstitial), this);
43 | });
44 |
45 | getBinding().btnRewarded.setOnClickListener(view -> {
46 | showAdRewarded(getString(R.string.admob_rewarded), this);
47 | });
48 | }
49 |
50 | @Override
51 | public void onShowAdRequestProgress(@NonNull String tag, @NonNull String message) {
52 |
53 | }
54 |
55 | @Override
56 | public void onHideAdRequestProgress(@NonNull String tag, @NonNull String message) {
57 |
58 | }
59 |
60 | @Override
61 | public void onAdDismissed(@NonNull String tag, @NonNull String message) {
62 |
63 | }
64 |
65 | @Override
66 | public void onAdFailed(@NonNull String tag, @NonNull String errorMessage) {
67 |
68 | }
69 |
70 | @Override
71 | public void onAdLoaded(@NonNull String tag, @NonNull String message) {
72 |
73 | }
74 |
75 | @Override
76 | public void onAdShowed(@NonNull String tag, @NonNull String message) {
77 |
78 | }
79 |
80 | @Override
81 | public void onUserEarnedReward(@NonNull String tag, @NonNull RewardItem rewardItem) {
82 |
83 | }
84 | }
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 |
7 |
8 |
19 |
20 |
24 |
28 |
32 |
36 |
40 |
44 |
48 |
52 |
53 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/ad-core/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("org.jetbrains.kotlin.android")
4 | `maven-publish`
5 | }
6 |
7 | android {
8 |
9 | compileSdk = ProjectSetting.PROJECT_COMPILE_SDK
10 | namespace = ProjectSetting.PROJECT_LIB_ID_AD_CORE
11 |
12 | defaultConfig {
13 | minSdk = ProjectSetting.PROJECT_MIN_SDK
14 |
15 | multiDexEnabled = true
16 | vectorDrawables.useSupportLibrary = true
17 |
18 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
19 |
20 | consumerProguardFile("consumer-rules.pro")
21 | }
22 |
23 | buildTypes {
24 | getByName("release") {
25 | isMinifyEnabled = false
26 |
27 | proguardFiles(
28 | getDefaultProguardFile("proguard-android-optimize.txt"),
29 | "proguard-rules.pro"
30 | )
31 | }
32 | }
33 |
34 | buildFeatures {
35 | viewBinding = true
36 | buildConfig = true
37 | }
38 |
39 | compileOptions {
40 | sourceCompatibility = JavaVersion.VERSION_17
41 | targetCompatibility = JavaVersion.VERSION_17
42 | }
43 |
44 | kotlin {
45 | jvmToolchain {
46 | languageVersion.set(JavaLanguageVersion.of("17"))
47 | }
48 | }
49 |
50 | }
51 |
52 | dependencies {
53 | implementation(libs.frogo.sdk)
54 | }
55 |
56 | afterEvaluate {
57 | publishing {
58 | publications {
59 |
60 | repositories {
61 | maven {
62 | name = ProjectSetting.MODULE_NAME_AD_CORE
63 | url = uri(ProjectSetting.URI_PACKAGE_LIB)
64 | credentials {
65 | username = project.findProperty("gpr.user") as String? ?: ""
66 | password = project.findProperty("gpr.key") as String? ?: ""
67 | }
68 | }
69 | }
70 |
71 | // Creates a Maven publication called "release".
72 | register("release", MavenPublication::class) {
73 |
74 | // Applies the component for the release build variant.
75 | // NOTE : Delete this line code if you publish Native Java / Kotlin Library
76 | from(components["release"])
77 |
78 | // Library Package Name (Example : "com.frogobox.androidfirstlib")
79 | // NOTE : Different GroupId For Each Library / Module, So That Each Library Is Not Overwritten
80 | groupId = ProjectSetting.BASE_PROJECT_PACKAGE
81 |
82 | // Library Name / Module Name (Example : "androidfirstlib")
83 | // NOTE : Different ArtifactId For Each Library / Module, So That Each Library Is Not Overwritten
84 | artifactId = ProjectSetting.MODULE_NAME_AD_CORE
85 |
86 | // Version Library Name (Example : "1.0.0")
87 | version = ProjectSetting.PROJECT_VERSION_NAME
88 |
89 | }
90 | }
91 | }
92 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/appopenad/AppOpenAdActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.appopenad
2 |
3 | import android.os.Bundle
4 | import android.util.Log
5 | import com.frogobox.ad.ui.FrogoAdBindActivity
6 | import com.frogobox.admob.callback.FrogoAdmobAppOpenAdCallback
7 | import com.frogobox.appadmob.SampleAdmobApplication
8 | import com.frogobox.appadmob.databinding.ActivityAppOpenAdBinding
9 | import com.frogobox.appadmob.util.AdHelper
10 | import com.frogobox.sdk.ext.gone
11 | import com.frogobox.sdk.ext.showToast
12 | import com.frogobox.sdk.ext.visible
13 |
14 | /**
15 | * Created by Faisal Amir on 24/10/22
16 | * -----------------------------------------
17 | * E-mail : faisalamircs@gmail.com
18 | * Github : github.com/amirisback
19 | * -----------------------------------------
20 | * Copyright (C) Frogobox ID / amirisback
21 | * All rights reserved
22 | */
23 |
24 |
25 | class AppOpenAdActivity : FrogoAdBindActivity(), FrogoAdmobAppOpenAdCallback {
26 |
27 | companion object {
28 | const val TAG = "AppOpenAdActivity"
29 | }
30 |
31 | override fun setupViewBinding(): ActivityAppOpenAdBinding {
32 | return ActivityAppOpenAdBinding.inflate(layoutInflater)
33 | }
34 |
35 | override fun onCreateExt(savedInstanceState: Bundle?) {
36 | super.onCreateExt(savedInstanceState)
37 | setupUI()
38 | }
39 |
40 | private fun setupUI() {
41 | binding.apply {
42 | btnAdmobAppOpenAd.setOnClickListener {
43 | setupAppOpenAd()
44 | }
45 | }
46 | }
47 |
48 | override fun onShowAdRequestProgress(tag: String, message: String) {
49 | binding.ivProgress.visible()
50 | Log.d(TAG, "onShowAdRequestProgress: $tag, $message")
51 | }
52 |
53 | override fun onHideAdRequestProgress(tag: String, message: String) {
54 | binding.ivProgress.gone()
55 | Log.d(TAG, "onHideAdRequestProgress: $tag, $message")
56 | }
57 |
58 | override fun onAdDismissed(tag: String, message: String) {
59 | Log.d(TAG, "onAdDismissed: $tag, $message")
60 | }
61 |
62 | override fun onAdFailed(tag: String, errorMessage: String) {
63 | showToast(errorMessage)
64 | Log.d(TAG, "onAdFailed: $tag, $errorMessage")
65 | }
66 |
67 | override fun onAdLoaded(tag: String, message: String) {
68 |
69 | Log.d(TAG, "onAdLoaded: $tag, $message")
70 | }
71 |
72 | override fun onAdShowed(tag: String, message: String) {
73 | Log.d(TAG, "onAdShowed: $tag, $message")
74 | }
75 |
76 | private fun setupAppOpenAd() {
77 | val application = application as? SampleAdmobApplication
78 |
79 | if (application != null) {
80 | application.showAdIfAvailable(
81 | this,
82 | AdHelper.getAdOpenAppUnitId(this),
83 | this
84 | )
85 | } else {
86 | Log.e(TAG, "Failed to cast application to MyApplication.")
87 | }
88 | }
89 |
90 | }
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_main.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
12 |
13 |
18 |
19 |
25 |
26 |
32 |
33 |
39 |
40 |
46 |
47 |
53 |
54 |
60 |
61 |
62 |
63 |
64 |
65 |
68 |
69 |
75 |
76 |
--------------------------------------------------------------------------------
/ad-unityad/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("org.jetbrains.kotlin.android")
4 | `maven-publish`
5 | }
6 |
7 | android {
8 |
9 | compileSdk = ProjectSetting.PROJECT_COMPILE_SDK
10 | namespace = ProjectSetting.PROJECT_LIB_ID_UNITY_AD
11 |
12 | defaultConfig {
13 | minSdk = ProjectSetting.PROJECT_MIN_SDK
14 |
15 | multiDexEnabled = true
16 | vectorDrawables.useSupportLibrary = true
17 |
18 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
19 |
20 | consumerProguardFile("consumer-rules.pro")
21 | }
22 |
23 | buildTypes {
24 | getByName("release") {
25 | isMinifyEnabled = false
26 |
27 | proguardFiles(
28 | getDefaultProguardFile("proguard-android-optimize.txt"),
29 | "proguard-rules.pro"
30 | )
31 | }
32 | }
33 |
34 | buildFeatures {
35 | viewBinding = true
36 | buildConfig = true
37 | }
38 |
39 | compileOptions {
40 | sourceCompatibility = JavaVersion.VERSION_17
41 | targetCompatibility = JavaVersion.VERSION_17
42 | }
43 |
44 | kotlin {
45 | jvmToolchain {
46 | languageVersion.set(JavaLanguageVersion.of("17"))
47 | }
48 | }
49 |
50 | }
51 |
52 | dependencies {
53 |
54 | api(project(DependencyGradle.MODULE_LIB_FROGO_AD_CORE))
55 |
56 | api(libs.ads.unityAd)
57 |
58 | implementation(libs.frogo.sdk)
59 |
60 | }
61 |
62 | afterEvaluate {
63 | publishing {
64 | publications {
65 |
66 | repositories {
67 | maven {
68 | name = ProjectSetting.MODULE_NAME_UNITY_AD
69 | url = uri(ProjectSetting.URI_PACKAGE_LIB)
70 | credentials {
71 | username = project.findProperty("gpr.user") as String? ?: ""
72 | password = project.findProperty("gpr.key") as String? ?: ""
73 | }
74 | }
75 | }
76 |
77 | // Creates a Maven publication called "release".
78 | register("release", MavenPublication::class) {
79 |
80 | // Applies the component for the release build variant.
81 | // NOTE : Delete this line code if you publish Native Java / Kotlin Library
82 | from(components["release"])
83 |
84 | // Library Package Name (Example : "com.frogobox.androidfirstlib")
85 | // NOTE : Different GroupId For Each Library / Module, So That Each Library Is Not Overwritten
86 | groupId = ProjectSetting.BASE_PROJECT_PACKAGE
87 |
88 | // Library Name / Module Name (Example : "androidfirstlib")
89 | // NOTE : Different ArtifactId For Each Library / Module, So That Each Library Is Not Overwritten
90 | artifactId = ProjectSetting.MODULE_NAME_UNITY_AD
91 |
92 | // Version Library Name (Example : "1.0.0")
93 | version = ProjectSetting.PROJECT_VERSION_NAME
94 |
95 | }
96 | }
97 | }
98 | }
--------------------------------------------------------------------------------
/ad-general/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("org.jetbrains.kotlin.android")
4 | `maven-publish`
5 | }
6 |
7 | android {
8 |
9 | compileSdk = ProjectSetting.PROJECT_COMPILE_SDK
10 | namespace = ProjectSetting.PROJECT_LIB_ID_AD
11 |
12 | defaultConfig {
13 | minSdk = ProjectSetting.PROJECT_MIN_SDK
14 |
15 | multiDexEnabled = true
16 | vectorDrawables.useSupportLibrary = true
17 |
18 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
19 |
20 | consumerProguardFile("consumer-rules.pro")
21 | }
22 |
23 | buildTypes {
24 | getByName("release") {
25 | isMinifyEnabled = false
26 |
27 | proguardFiles(
28 | getDefaultProguardFile("proguard-android-optimize.txt"),
29 | "proguard-rules.pro"
30 | )
31 | }
32 | }
33 |
34 | buildFeatures {
35 | viewBinding = true
36 | buildConfig = true
37 | }
38 |
39 | compileOptions {
40 | sourceCompatibility = JavaVersion.VERSION_17
41 | targetCompatibility = JavaVersion.VERSION_17
42 | }
43 |
44 | kotlin {
45 | jvmToolchain {
46 | languageVersion.set(JavaLanguageVersion.of("17"))
47 | }
48 | }
49 |
50 | }
51 |
52 | dependencies {
53 |
54 | api(project(DependencyGradle.MODULE_LIB_FROGO_AD_CORE))
55 | api(project(DependencyGradle.MODULE_LIB_FROGO_ADMOB))
56 | api(project(DependencyGradle.MODULE_LIB_FROGO_UNITY_AD))
57 |
58 | implementation(libs.frogo.sdk)
59 |
60 | }
61 |
62 | afterEvaluate {
63 | publishing {
64 | publications {
65 |
66 | repositories {
67 | maven {
68 | name = ProjectSetting.MODULE_NAME_AD
69 | url = uri(ProjectSetting.URI_PACKAGE_LIB)
70 | credentials {
71 | username = project.findProperty("gpr.user") as String? ?: ""
72 | password = project.findProperty("gpr.key") as String? ?: ""
73 | }
74 | }
75 | }
76 |
77 | // Creates a Maven publication called "release".
78 | register("release", MavenPublication::class) {
79 |
80 | // Applies the component for the release build variant.
81 | // NOTE : Delete this line code if you publish Native Java / Kotlin Library
82 | from(components["release"])
83 |
84 | // Library Package Name (Example : "com.frogobox.androidfirstlib")
85 | // NOTE : Different GroupId For Each Library / Module, So That Each Library Is Not Overwritten
86 | groupId = ProjectSetting.BASE_PROJECT_PACKAGE
87 |
88 | // Library Name / Module Name (Example : "androidfirstlib")
89 | // NOTE : Different ArtifactId For Each Library / Module, So That Each Library Is Not Overwritten
90 | artifactId = ProjectSetting.MODULE_NAME_AD
91 |
92 | // Version Library Name (Example : "1.0.0")
93 | version = ProjectSetting.PROJECT_VERSION_NAME
94 |
95 | }
96 | }
97 | }
98 | }
--------------------------------------------------------------------------------
/ad-admob/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | id("com.android.library")
3 | id("org.jetbrains.kotlin.android")
4 | `maven-publish`
5 | }
6 |
7 | android {
8 |
9 | compileSdk = ProjectSetting.PROJECT_COMPILE_SDK
10 | namespace = ProjectSetting.PROJECT_LIB_ID_ADMOB
11 |
12 | defaultConfig {
13 | minSdk = ProjectSetting.PROJECT_MIN_SDK
14 |
15 | multiDexEnabled = true
16 | vectorDrawables.useSupportLibrary = true
17 |
18 | testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
19 |
20 | consumerProguardFile("consumer-rules.pro")
21 | }
22 |
23 | buildTypes {
24 | getByName("release") {
25 | isMinifyEnabled = false
26 |
27 | proguardFiles(
28 | getDefaultProguardFile("proguard-android-optimize.txt"),
29 | "proguard-rules.pro"
30 | )
31 | }
32 | }
33 |
34 | buildFeatures {
35 | viewBinding = true
36 | buildConfig = true
37 | }
38 |
39 | compileOptions {
40 | sourceCompatibility = JavaVersion.VERSION_17
41 | targetCompatibility = JavaVersion.VERSION_17
42 | }
43 |
44 | kotlin {
45 | jvmToolchain {
46 | languageVersion.set(JavaLanguageVersion.of("17"))
47 | }
48 | }
49 |
50 | }
51 |
52 | dependencies {
53 |
54 | api(project(DependencyGradle.MODULE_LIB_FROGO_AD_CORE))
55 |
56 | api(libs.ads.google.admob)
57 |
58 | api(libs.androidx.lifecycle.process)
59 | api(libs.frogo.recyclerview)
60 |
61 | implementation(libs.frogo.sdk)
62 |
63 | }
64 |
65 | afterEvaluate {
66 | publishing {
67 | publications {
68 |
69 | repositories {
70 | maven {
71 | name = ProjectSetting.MODULE_NAME_ADMOB
72 | url = uri(ProjectSetting.URI_PACKAGE_LIB)
73 | credentials {
74 | username = project.findProperty("gpr.user") as String? ?: ""
75 | password = project.findProperty("gpr.key") as String? ?: ""
76 | }
77 | }
78 | }
79 |
80 | // Creates a Maven publication called "release".
81 | register("release", MavenPublication::class) {
82 |
83 | // Applies the component for the release build variant.
84 | // NOTE : Delete this line code if you publish Native Java / Kotlin Library
85 | from(components["release"])
86 |
87 | // Library Package Name (Example : "com.frogobox.androidfirstlib")
88 | // NOTE : Different GroupId For Each Library / Module, So That Each Library Is Not Overwritten
89 | groupId = ProjectSetting.BASE_PROJECT_PACKAGE
90 |
91 | // Library Name / Module Name (Example : "androidfirstlib")
92 | // NOTE : Different ArtifactId For Each Library / Module, So That Each Library Is Not Overwritten
93 | artifactId = ProjectSetting.MODULE_NAME_ADMOB
94 |
95 | // Version Library Name (Example : "1.0.0")
96 | version = ProjectSetting.PROJECT_VERSION_NAME
97 |
98 | }
99 | }
100 | }
101 | }
102 |
--------------------------------------------------------------------------------
/CODE_OF_CONDUCT.md:
--------------------------------------------------------------------------------
1 | # Contributor Covenant Code of Conduct
2 |
3 | ## Our Pledge
4 |
5 | In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
6 |
7 | ## Our Standards
8 |
9 | Examples of behavior that contributes to creating a positive environment include:
10 |
11 | * Using welcoming and inclusive language
12 | * Being respectful of differing viewpoints and experiences
13 | * Gracefully accepting constructive criticism
14 | * Focusing on what is best for the community
15 | * Showing empathy towards other community members
16 |
17 | Examples of unacceptable behavior by participants include:
18 |
19 | * The use of sexualized language or imagery and unwelcome sexual attention or advances
20 | * Trolling, insulting/derogatory comments, and personal or political attacks
21 | * Public or private harassment
22 | * Publishing others' private information, such as a physical or electronic address, without explicit permission
23 | * Other conduct which could reasonably be considered inappropriate in a professional setting
24 |
25 | ## Our Responsibilities
26 |
27 | Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
28 |
29 | Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
30 |
31 | ## Scope
32 |
33 | This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
34 |
35 | ## Enforcement
36 |
37 | Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at faisalamircs@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
38 |
39 | Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
40 |
41 | ## Attribution
42 |
43 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
44 |
45 | [homepage]: http://contributor-covenant.org
46 | [version]: http://contributor-covenant.org/version/1/4/
--------------------------------------------------------------------------------
/.github/workflows/android-ci-generated-artifact.yml:
--------------------------------------------------------------------------------
1 | name: Android CI Generated Artifact
2 |
3 | env:
4 | # The name of the main module repository
5 | main_project_module: app
6 |
7 | # The name of the Play Store
8 | playstore_name: Frogobox ID
9 |
10 | on:
11 | # Triggers the workflow on push or pull request events but only for default and protected branches
12 | workflow_dispatch:
13 | # The workflow will be dispatched to the default queue
14 |
15 | jobs:
16 | build:
17 |
18 | runs-on: ubuntu-latest
19 |
20 | steps:
21 | - uses: actions/checkout@v3
22 |
23 | # Set Current Date As Env Variable
24 | - name: Set current date as env variable
25 | run: echo "date_today=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
26 |
27 | # Set Repository Name As Env Variable
28 | - name: Set repository name as env variable
29 | run: echo "repository_name=$(echo '${{ github.repository }}' | awk -F '/' '{print $2}')" >> $GITHUB_ENV
30 |
31 | - name: Set Up JDK
32 | uses: actions/setup-java@v3
33 | with:
34 | distribution: 'zulu' # See 'Supported distributions' for available options
35 | java-version: '17'
36 | cache: 'gradle'
37 |
38 | - name: Change wrapper permissions
39 | run: chmod +x ./gradlew
40 |
41 | # Run Tests Build
42 | - name: Run gradle tests
43 | run: ./gradlew test
44 |
45 | # Run Build Project
46 | - name: Build gradle project
47 | run: ./gradlew build
48 |
49 | # Create APK Debug
50 | - name: Build apk debug project (APK) - ${{ env.main_project_module }} module
51 | run: ./gradlew assembleDebug
52 |
53 | # Create APK Release
54 | - name: Build apk release project (APK) - ${{ env.main_project_module }} module
55 | run: ./gradlew assemble
56 |
57 | # Create Bundle AAB Release
58 | # Noted for main module build [main_project_module]:bundleRelease
59 | - name: Build app bundle release (AAB) - ${{ env.main_project_module }} module
60 | run: ./gradlew ${{ env.main_project_module }}:bundleRelease
61 |
62 | # Upload Artifact Build
63 | # Noted For Output [main_project_module]/build/outputs/apk/debug/
64 | - name: Upload APK Debug - ${{ env.repository_name }}
65 | uses: actions/upload-artifact@v2
66 | with:
67 | name: ${{ env.date_today }} - ${{ env.playstore_name }} - ${{ env.repository_name }} - APK(s) debug generated
68 | path: ${{ env.main_project_module }}/build/outputs/apk/debug/
69 |
70 | # Noted For Output [main_project_module]/build/outputs/apk/release/
71 | - name: Upload APK Release - ${{ env.repository_name }}
72 | uses: actions/upload-artifact@v2
73 | with:
74 | name: ${{ env.date_today }} - ${{ env.playstore_name }} - ${{ env.repository_name }} - APK(s) release generated
75 | path: ${{ env.main_project_module }}/build/outputs/apk/release/
76 |
77 | # Noted For Output [main_project_module]/build/outputs/bundle/release/
78 | - name: Upload AAB (App Bundle) Release - ${{ env.repository_name }}
79 | uses: actions/upload-artifact@v2
80 | with:
81 | name: ${{ env.date_today }} - ${{ env.playstore_name }} - ${{ env.repository_name }} - App bundle(s) AAB release generated
82 | path: ${{ env.main_project_module }}/build/outputs/bundle/release/
83 |
--------------------------------------------------------------------------------
/app/src/main/res/layout/activity_rewarded.xml:
--------------------------------------------------------------------------------
1 |
2 |
7 |
8 |
11 |
12 |
17 |
18 |
23 |
24 |
29 |
30 |
35 |
36 |
41 |
42 |
48 |
49 |
54 |
55 |
60 |
61 |
66 |
67 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
83 |
84 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/source/AdmobRemoteDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.source
2 |
3 | import android.content.Context
4 | import com.frogobox.adcore.util.FrogoAdFunc
5 | import com.frogobox.admob.core.FrogoAdmob
6 | import com.frogobox.appadmob.R
7 | import com.frogobox.coresdk.response.FrogoDataResponse
8 | import com.frogobox.sdk.ext.showLogDebug
9 | import com.frogobox.sdk.ext.showLogError
10 | import com.frogobox.sdk.source.FrogoRemoteDataSource
11 | import com.google.android.gms.ads.AdRequest
12 | import com.google.android.gms.ads.LoadAdError
13 | import com.google.android.gms.ads.interstitial.InterstitialAd
14 | import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
15 | import com.google.gson.Gson
16 |
17 |
18 | /**
19 | * Created by faisalamir on 19/04/22
20 | * FrogoAdmob
21 | * -----------------------------------------
22 | * Name : Muhammad Faisal Amir
23 | * E-mail : faisalamircs@gmail.com
24 | * Github : github.com/amirisback
25 | * -----------------------------------------
26 | * Copyright (C) 2022 Frogobox Media Inc.
27 | * All rights reserved
28 | *
29 | */
30 |
31 | class AdmobRemoteDataSource : FrogoRemoteDataSource(), AdmobDataSource {
32 |
33 | override fun getInterstitial(context: Context, callback: FrogoDataResponse) {
34 | callback.onShowProgress()
35 | InterstitialAd.load(
36 | context,
37 | context.getString(R.string.admob_interstitial),
38 | AdRequest.Builder().build(),
39 | object : InterstitialAdLoadCallback() {
40 | override fun onAdFailedToLoad(adError: LoadAdError) {
41 | FrogoAdFunc.getInitializedState(
42 | FrogoAdmob.initializationName,
43 | FrogoAdmob.initializationCode
44 | )
45 | showLogError("${FrogoAdmob.TAG} [Interstitial] >> Run - IFrogoAdInterstitial [callback] : onAdFailedToLoad()")
46 | showLogError("${FrogoAdmob.TAG} [Interstitial] >> Error - onAdFailedToLoad [code] : ${adError.code}")
47 | showLogError("${FrogoAdmob.TAG} [Interstitial] >> Error - onAdFailedToLoad [domain] : ${adError.domain}")
48 | showLogError("${FrogoAdmob.TAG} [Interstitial] >> Error - onAdFailedToLoad [message] : ${adError.message}")
49 | callback.onHideProgress()
50 | callback.onFailed(adError.code, adError.message)
51 | callback.onFinish()
52 | }
53 |
54 | override fun onAdLoaded(interstitialAd: InterstitialAd) {
55 | showLogDebug("${FrogoAdmob.TAG} [Interstitial] >> Run - IFrogoAdInterstitial [callback] : onAdLoaded()")
56 | showLogDebug("${FrogoAdmob.TAG} [Interstitial] >> Succes - onAdLoaded [message] : Ad was loaded")
57 | showLogDebug("${FrogoAdmob.TAG} [Interstitial] >> Succes - onAdLoaded [unit id] : ${interstitialAd.adUnitId}")
58 | showLogDebug("${FrogoAdmob.TAG} [Interstitial] >> Succes - onAdLoaded [response Info] : ${interstitialAd.responseInfo}")
59 | showLogDebug("${FrogoAdmob.TAG} [Interstitial] >> Suggest : You Can Give Your Reward Here")
60 | callback.onHideProgress()
61 | showLogDebug(Gson().toJson(interstitialAd))
62 | callback.onSuccess(interstitialAd)
63 | callback.onFinish()
64 | }
65 | }
66 | )
67 | }
68 |
69 | override fun saveInterstitial(interstitialAd: InterstitialAd) {
70 | }
71 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/res/drawable/frogo_rv_ic_empty_view.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
12 |
15 |
18 |
21 |
24 |
27 |
30 |
33 |
36 |
37 |
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/core/IFrogoAdmobBanner.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob.core
2 |
3 | import android.content.Context
4 | import android.widget.RelativeLayout
5 | import com.frogobox.admob.callback.FrogoAdmobBannerCallback
6 | import com.google.android.gms.ads.AdSize
7 | import com.google.android.gms.ads.AdView
8 |
9 | /**
10 | * Created by Faisal Amir
11 | * FrogoBox Inc License
12 | * =========================================
13 | * ImplementationAdmob
14 | * Copyright (C) 10/02/2020.
15 | * All rights reserved
16 | * -----------------------------------------
17 | * Name : Muhammad Faisal Amir
18 | * E-mail : faisalamircs@gmail.com
19 | * Github : github.com/amirisback
20 | * LinkedIn : linkedin.com/in/faisalamircs
21 | * -----------------------------------------
22 | * FrogoBox Software Industries
23 | * com.frogobox.admob
24 | *
25 | */
26 |
27 |
28 | interface IFrogoAdmobBanner {
29 |
30 | fun showAdBanner(
31 | mAdView: AdView,
32 | timeoutMilliSecond: Int?,
33 | keyword: List?,
34 | callback: FrogoAdmobBannerCallback?
35 | )
36 |
37 | fun showAdBanner(mAdView: AdView)
38 |
39 | fun showAdBanner(mAdView: AdView, timeoutMilliSecond: Int)
40 |
41 | fun showAdBanner(mAdView: AdView, keyword: List)
42 |
43 | fun showAdBanner(mAdView: AdView, timeoutMilliSecond: Int, keyword: List)
44 |
45 | fun showAdBanner(mAdView: AdView, callback: FrogoAdmobBannerCallback)
46 |
47 | fun showAdBanner(mAdView: AdView, timeoutMilliSecond: Int, callback: FrogoAdmobBannerCallback)
48 |
49 | fun showAdBanner(mAdView: AdView, keyword: List, callback: FrogoAdmobBannerCallback)
50 |
51 | // ---------------------------------------------------------------------------------------------
52 |
53 | fun showAdBannerContainer(
54 | context: Context,
55 | bannerAdUnitId: String,
56 | mAdsSize: AdSize,
57 | container: RelativeLayout,
58 | timeoutMilliSecond: Int?,
59 | keyword: List?,
60 | callback: FrogoAdmobBannerCallback?
61 | )
62 |
63 | fun showAdBannerContainer(
64 | context: Context,
65 | bannerAdUnitId: String,
66 | mAdsSize: AdSize,
67 | container: RelativeLayout,
68 | )
69 |
70 | fun showAdBannerContainer(
71 | context: Context,
72 | bannerAdUnitId: String,
73 | mAdsSize: AdSize,
74 | container: RelativeLayout,
75 | timeoutMilliSecond: Int,
76 | )
77 |
78 | fun showAdBannerContainer(
79 | context: Context,
80 | bannerAdUnitId: String,
81 | mAdsSize: AdSize,
82 | container: RelativeLayout,
83 | keyword: List,
84 | )
85 |
86 | fun showAdBannerContainer(
87 | context: Context,
88 | bannerAdUnitId: String,
89 | mAdsSize: AdSize,
90 | container: RelativeLayout,
91 | timeoutMilliSecond: Int,
92 | keyword: List
93 | )
94 |
95 | fun showAdBannerContainer(
96 | context: Context,
97 | bannerAdUnitId: String,
98 | mAdsSize: AdSize,
99 | container: RelativeLayout,
100 | callback: FrogoAdmobBannerCallback
101 | )
102 |
103 | fun showAdBannerContainer(
104 | context: Context,
105 | bannerAdUnitId: String,
106 | mAdsSize: AdSize,
107 | container: RelativeLayout,
108 | timeoutMilliSecond: Int,
109 | callback: FrogoAdmobBannerCallback
110 | )
111 |
112 | fun showAdBannerContainer(
113 | context: Context,
114 | bannerAdUnitId: String,
115 | mAdsSize: AdSize,
116 | container: RelativeLayout,
117 | keyword: List,
118 | callback: FrogoAdmobBannerCallback
119 | )
120 |
121 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/FrogoAdmobKoinApplication.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob
2 |
3 | import android.app.Activity
4 | import android.app.Application
5 | import android.content.Context
6 | import android.os.Bundle
7 | import android.util.Log
8 | import androidx.lifecycle.Lifecycle
9 | import androidx.lifecycle.LifecycleObserver
10 | import androidx.lifecycle.OnLifecycleEvent
11 | import androidx.lifecycle.ProcessLifecycleOwner
12 | import com.frogobox.admob.callback.FrogoAdmobAppOpenAdCallback
13 | import com.frogobox.admob.core.FrogoAppOpenAdManager
14 | import com.google.android.gms.ads.MobileAds
15 |
16 | /**
17 | * Created by Faisal Amir on 24/10/22
18 | * -----------------------------------------
19 | * E-mail : faisalamircs@gmail.com
20 | * Github : github.com/amirisback
21 | * -----------------------------------------
22 | * Copyright (C) Frogobox ID / amirisback
23 | * All rights reserved
24 | */
25 |
26 |
27 | open class FrogoAdmobKoinApplication : FrogoKoinApplication(),
28 | Application.ActivityLifecycleCallbacks, LifecycleObserver {
29 |
30 | companion object {
31 | const val LOG_TAG = "FrogoAdmobApplication"
32 | }
33 |
34 | private lateinit var appOpenAdManager: FrogoAppOpenAdManager
35 | private var currentActivity: Activity? = null
36 |
37 | override fun onCreate() {
38 | super.onCreate()
39 | registerActivityLifecycleCallbacks(this)
40 |
41 | MobileAds.initialize(this) {}
42 | ProcessLifecycleOwner.get().lifecycle.addObserver(this)
43 | appOpenAdManager = FrogoAppOpenAdManager()
44 | }
45 |
46 | /** ActivityLifecycleCallback methods. */
47 | override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
48 |
49 | override fun onActivityStarted(activity: Activity) {
50 | // An ad activity is started when an ad is showing, which could be AdActivity class from Google
51 | // SDK or another activity class implemented by a third party mediation partner. Updating the
52 | // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
53 | // one that shows the ad.
54 | if (!appOpenAdManager.isShowingAd) {
55 | currentActivity = activity
56 | }
57 | }
58 |
59 | override fun onActivityResumed(activity: Activity) {}
60 |
61 | override fun onActivityPaused(activity: Activity) {}
62 |
63 | override fun onActivityStopped(activity: Activity) {}
64 |
65 | override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
66 |
67 | override fun onActivityDestroyed(activity: Activity) {}
68 |
69 | open fun getAdOpenAppUnitId(context: Context?): String {
70 | return ""
71 | }
72 |
73 | /** LifecycleObserver method that shows the app open ad when the app moves to foreground. */
74 | @OnLifecycleEvent(Lifecycle.Event.ON_START)
75 | fun onMoveToForeground() {
76 | // Show the ad (if available) when the app moves to foreground.
77 | Log.d(LOG_TAG, "onMoveToForeground")
78 | Log.d(LOG_TAG, "AmirIsBack")
79 | currentActivity?.let {
80 | appOpenAdManager.showAdIfAvailable(
81 | it,
82 | getAdOpenAppUnitId(currentActivity)
83 | )
84 | }
85 | }
86 |
87 | /**
88 | * Shows an app open ad.
89 | *
90 | * @param activity the activity that shows the app open ad
91 | * @param callback the listener to be notified when an app open ad is complete
92 | */
93 | fun showAdIfAvailable(
94 | activity: Activity,
95 | appOpenAdUnitId: String,
96 | callback: FrogoAdmobAppOpenAdCallback
97 | ) {
98 | // We wrap the showAdIfAvailable to enforce that other classes only interact with MyApplication
99 | // class.
100 | appOpenAdManager.showAdIfAvailable(activity, appOpenAdUnitId, callback)
101 | }
102 |
103 | }
--------------------------------------------------------------------------------
/ad-admob/src/main/java/com/frogobox/admob/FrogoAdmobApplication.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.admob
2 |
3 | import android.app.Activity
4 | import android.app.Application
5 | import android.content.Context
6 | import android.os.Bundle
7 | import android.util.Log
8 | import androidx.lifecycle.Lifecycle
9 | import androidx.lifecycle.LifecycleObserver
10 | import androidx.lifecycle.OnLifecycleEvent
11 | import androidx.lifecycle.ProcessLifecycleOwner
12 | import com.frogobox.admob.callback.FrogoAdmobAppOpenAdCallback
13 | import com.frogobox.admob.core.FrogoAppOpenAdManager
14 | import com.frogobox.sdk.FrogoApplication
15 | import com.google.android.gms.ads.MobileAds
16 |
17 | /**
18 | * Created by Faisal Amir on 24/10/22
19 | * -----------------------------------------
20 | * E-mail : faisalamircs@gmail.com
21 | * Github : github.com/amirisback
22 | * -----------------------------------------
23 | * Copyright (C) Frogobox ID / amirisback
24 | * All rights reserved
25 | */
26 |
27 |
28 | open class FrogoAdmobApplication : FrogoApplication(),
29 | Application.ActivityLifecycleCallbacks, LifecycleObserver {
30 |
31 | companion object {
32 | const val LOG_TAG = "FrogoAdmobApplication"
33 | }
34 |
35 | private lateinit var appOpenAdManager: FrogoAppOpenAdManager
36 | private var currentActivity: Activity? = null
37 |
38 | override fun onCreate() {
39 | super.onCreate()
40 | registerActivityLifecycleCallbacks(this)
41 |
42 | MobileAds.initialize(this) {}
43 | ProcessLifecycleOwner.get().lifecycle.addObserver(this)
44 | appOpenAdManager = FrogoAppOpenAdManager()
45 | }
46 |
47 | /** ActivityLifecycleCallback methods. */
48 | override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
49 |
50 | override fun onActivityStarted(activity: Activity) {
51 | // An ad activity is started when an ad is showing, which could be AdActivity class from Google
52 | // SDK or another activity class implemented by a third party mediation partner. Updating the
53 | // currentActivity only when an ad is not showing will ensure it is not an ad activity, but the
54 | // one that shows the ad.
55 | if (!appOpenAdManager.isShowingAd) {
56 | currentActivity = activity
57 | }
58 | }
59 |
60 | override fun onActivityResumed(activity: Activity) {}
61 |
62 | override fun onActivityPaused(activity: Activity) {}
63 |
64 | override fun onActivityStopped(activity: Activity) {}
65 |
66 | override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
67 |
68 | override fun onActivityDestroyed(activity: Activity) {}
69 |
70 | open fun getAdOpenAppUnitId(context: Context?): String {
71 | return ""
72 | }
73 |
74 | /** LifecycleObserver method that shows the app open ad when the app moves to foreground. */
75 | @OnLifecycleEvent(Lifecycle.Event.ON_START)
76 | fun onMoveToForeground() {
77 | // Show the ad (if available) when the app moves to foreground.
78 | Log.d(LOG_TAG, "onMoveToForeground")
79 | Log.d(LOG_TAG, "AmirIsBack")
80 | currentActivity?.let {
81 | appOpenAdManager.showAdIfAvailable(
82 | it,
83 | getAdOpenAppUnitId(currentActivity)
84 | )
85 | }
86 | }
87 |
88 | /**
89 | * Shows an app open ad.
90 | *
91 | * @param activity the activity that shows the app open ad
92 | * @param callback the listener to be notified when an app open ad is complete
93 | */
94 | fun showAdIfAvailable(
95 | activity: Activity,
96 | appOpenAdUnitId: String,
97 | callback: FrogoAdmobAppOpenAdCallback
98 | ) {
99 | // We wrap the showAdIfAvailable to enforce that other classes only interact with MyApplication
100 | // class.
101 | appOpenAdManager.showAdIfAvailable(activity, appOpenAdUnitId, callback)
102 | }
103 |
104 | }
105 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/base/BaseFragment.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.base
2 |
3 | import android.content.Intent
4 | import android.os.Bundle
5 | import android.view.LayoutInflater
6 | import android.view.View
7 | import android.view.ViewGroup
8 | import android.widget.Toast
9 | import androidx.fragment.app.Fragment
10 | import androidx.viewbinding.ViewBinding
11 | import com.google.gson.Gson
12 |
13 | /**
14 | * Created by Faisal Amir
15 | * FrogoBox Inc License
16 | * =========================================
17 | * ImplementationAdmob
18 | * Copyright (C) 25/11/2019.
19 | * All rights reserved
20 | * -----------------------------------------
21 | * Name : Muhammad Faisal Amir
22 | * E-mail : faisalamircs@gmail.com
23 | * Github : github.com/amirisback
24 | * LinkedIn : linkedin.com/in/faisalamircs
25 | * -----------------------------------------
26 | * FrogoBox Software Industries
27 | * com.frogobox.admobhelper.activity
28 | *
29 | */
30 | abstract class BaseFragment : Fragment() {
31 |
32 | protected var binding: VB? = null
33 | protected lateinit var mBaseActivity: BaseActivity<*>
34 |
35 | abstract fun setupViewBinding(inflater: LayoutInflater, container: ViewGroup?): VB
36 |
37 | override fun onDestroy() {
38 | super.onDestroy()
39 | binding = null
40 | }
41 |
42 | override fun onCreate(savedInstanceState: Bundle?) {
43 | super.onCreate(savedInstanceState)
44 | mBaseActivity = (activity as BaseActivity<*>)
45 | }
46 |
47 | override fun onCreateView(
48 | inflater: LayoutInflater,
49 | container: ViewGroup?,
50 | savedInstanceState: Bundle?
51 | ): View? {
52 | binding = setupViewBinding(inflater, container)
53 | return binding?.root
54 | }
55 |
56 | protected fun setupChildFragment(frameId: Int, fragment: Fragment) {
57 | childFragmentManager.beginTransaction().apply {
58 | replace(frameId, fragment)
59 | commit()
60 | }
61 | }
62 |
63 | protected fun setupShowAdsInterstitial(interstitialAdUnitId: String) {
64 | mBaseActivity.showAdInterstitial(interstitialAdUnitId)
65 | }
66 |
67 | fun baseNewInstance(argsKey: String, data: Model) {
68 | val argsData = Gson().toJson(data)
69 | val bundleArgs = Bundle().apply {
70 | putString(argsKey, argsData)
71 | }
72 | this.arguments = bundleArgs
73 | }
74 |
75 | protected inline fun baseGetInstance(argsKey: String): Model {
76 | val argsData = this.arguments?.getString(argsKey)
77 | return Gson().fromJson(argsData, Model::class.java)
78 | }
79 |
80 | protected fun checkArgument(argsKey: String): Boolean {
81 | return requireArguments().containsKey(argsKey)
82 | }
83 |
84 | protected fun setupEventEmptyView(view: View, isEmpty: Boolean) {
85 | if (isEmpty) {
86 | view.visibility = View.VISIBLE
87 | } else {
88 | view.visibility = View.GONE
89 | }
90 | }
91 |
92 | protected fun setupEventProgressView(view: View, progress: Boolean) {
93 | if (progress) {
94 | view.visibility = View.VISIBLE
95 | } else {
96 | view.visibility = View.GONE
97 | }
98 | }
99 |
100 | protected fun showToast(message: String) {
101 | Toast.makeText(context, message, Toast.LENGTH_SHORT).show()
102 | }
103 |
104 | protected inline fun frogoStartActivity() {
105 | context?.startActivity(Intent(context, ClassActivity::class.java))
106 | }
107 |
108 | protected inline fun frogoStartActivity(
109 | extraKey: String,
110 | data: Model
111 | ) {
112 | val intent = Intent(context, ClassActivity::class.java)
113 | val extraData = Gson().toJson(data)
114 | intent.putExtra(extraKey, extraData)
115 | this.startActivity(intent)
116 | }
117 |
118 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/main/MainActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.main
2 |
3 | import android.app.Activity
4 | import android.os.Bundle
5 | import android.view.Menu
6 | import android.view.MenuItem
7 | import com.frogobox.admob.core.IFrogoAdConsent
8 | import com.frogobox.appadmob.BuildConfig
9 | import com.frogobox.appadmob.R
10 | import com.frogobox.appadmob.base.BaseActivity
11 | import com.frogobox.appadmob.databinding.ActivityMainBinding
12 | import com.frogobox.appadmob.mvvm.appopenad.AppOpenAdActivity
13 | import com.frogobox.appadmob.mvvm.interstitial.InterstitialActivity
14 | import com.frogobox.appadmob.mvvm.movie.MovieActivity
15 | import com.frogobox.appadmob.mvvm.news.NewsActivity
16 | import com.frogobox.appadmob.mvvm.rewarded.RewardedActivity
17 | import com.frogobox.sdk.ext.showLogDebug
18 | import com.frogobox.sdk.ext.startActivityExt
19 | import com.google.android.gms.ads.AdSize
20 | import com.google.android.ump.FormError
21 |
22 | class MainActivity : BaseActivity() {
23 |
24 | override fun setupViewBinding(): ActivityMainBinding {
25 | return ActivityMainBinding.inflate(layoutInflater)
26 | }
27 |
28 | override fun onCreateExt(savedInstanceState: Bundle?) {
29 | super.onCreateExt(savedInstanceState)
30 |
31 | showAdConsent(object : IFrogoAdConsent {
32 |
33 | override fun activity(): Activity {
34 | return this@MainActivity
35 | }
36 |
37 | override fun isDebug(): Boolean {
38 | return BuildConfig.DEBUG
39 | }
40 |
41 | override fun isUnderAgeAd(): Boolean {
42 | return false
43 | }
44 |
45 | override fun onNotUsingAdConsent() {
46 | requestAdmobApi()
47 | setupButtonClick()
48 | setupBannerAds()
49 | }
50 |
51 | override fun onConsentSuccess() {
52 | requestAdmobApi()
53 | setupButtonClick()
54 | setupBannerAds()
55 | }
56 |
57 | override fun onConsentError(formError: FormError) {
58 | showLogDebug("FrogoAdConsent ${formError.message}")
59 | }
60 |
61 | })
62 |
63 | }
64 |
65 | private fun setupBannerAds() {
66 | showAdBanner(binding.adsXml.adsPhoneTabSpecialSmartBanner)
67 | showAdBannerContainer(
68 | getString(R.string.admob_banner),
69 | AdSize.SMART_BANNER,
70 | binding.includeAdsView.frogoAdsBanner
71 | )
72 | }
73 |
74 | private fun setupButtonClick() {
75 |
76 | binding.apply {
77 |
78 | btnInterstitial.setOnClickListener {
79 | startActivityExt()
80 | }
81 |
82 | btnRewarded.setOnClickListener {
83 | startActivityExt()
84 | }
85 |
86 | btnRecyclerView.setOnClickListener {
87 | startActivityExt()
88 | }
89 |
90 | btnRecyclerView2.setOnClickListener {
91 | startActivityExt()
92 | }
93 |
94 | btnJavaSampleActivity.setOnClickListener {
95 | startActivityExt()
96 | }
97 |
98 | btnAppOpenAd.setOnClickListener {
99 | startActivityExt()
100 | }
101 |
102 | }
103 | }
104 |
105 | override fun onCreateOptionsMenu(menu: Menu): Boolean {
106 | menuInflater.inflate(R.menu.menu_toolbar_main, menu)
107 | return true
108 | }
109 |
110 | override fun onOptionsItemSelected(item: MenuItem): Boolean {
111 | return when (item.itemId) {
112 | R.id.toolbar_menu_about -> {
113 | startActivityExt()
114 | true
115 | }
116 |
117 | else -> super.onOptionsItemSelected(item)
118 | }
119 | }
120 | }
--------------------------------------------------------------------------------
/.github/workflows/detekt-analysis.yml:
--------------------------------------------------------------------------------
1 | # This workflow performs a static analysis of your Kotlin source code using
2 | # Detekt.
3 | #
4 | # Scans are triggered:
5 | # 1. On every push to default and protected branches
6 | # 2. On every Pull Request targeting the default branch
7 | # 3. On a weekly schedule
8 | # 4. Manually, on demand, via the "workflow_dispatch" event
9 | #
10 | # The workflow should work with no modifications, but you might like to use a
11 | # later version of the Detekt CLI by modifing the $DETEKT_RELEASE_TAG
12 | # environment variable.
13 | name: Scan with Detekt
14 |
15 | on:
16 | # Triggers the workflow on push or pull request events but only for default and protected branches
17 | push:
18 | branches: [ master ]
19 | pull_request:
20 | branches: [ master ]
21 | schedule:
22 | - cron: '43 15 * * 5'
23 |
24 | # Allows you to run this workflow manually from the Actions tab
25 | workflow_dispatch:
26 |
27 | env:
28 | # Release tag associated with version of Detekt to be installed
29 | # SARIF support (required for this workflow) was introduced in Detekt v1.15.0
30 | DETEKT_RELEASE_TAG: v1.15.0
31 |
32 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel
33 | jobs:
34 | # This workflow contains a single job called "scan"
35 | scan:
36 | name: Scan
37 | # The type of runner that the job will run on
38 | runs-on: ubuntu-latest
39 |
40 | # Steps represent a sequence of tasks that will be executed as part of the job
41 | steps:
42 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
43 | - uses: actions/checkout@v2
44 |
45 | # Gets the download URL associated with the $DETEKT_RELEASE_TAG
46 | - name: Get Detekt download URL
47 | id: detekt_info
48 | env:
49 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50 | run: |
51 | DETEKT_DOWNLOAD_URL=$( gh api graphql --field tagName=$DETEKT_RELEASE_TAG --raw-field query='
52 | query getReleaseAssetDownloadUrl($tagName: String!) {
53 | repository(name: "detekt", owner: "detekt") {
54 | release(tagName: $tagName) {
55 | releaseAssets(name: "detekt", first: 1) {
56 | nodes {
57 | downloadUrl
58 | }
59 | }
60 | }
61 | }
62 | }
63 | ' | \
64 | jq --raw-output '.data.repository.release.releaseAssets.nodes[0].downloadUrl' )
65 | echo "::set-output name=download_url::$DETEKT_DOWNLOAD_URL"
66 |
67 | # Sets up the detekt cli
68 | - name: Setup Detekt
69 | run: |
70 | dest=$( mktemp -d )
71 | curl --request GET \
72 | --url ${{ steps.detekt_info.outputs.download_url }} \
73 | --silent \
74 | --location \
75 | --output $dest/detekt
76 | chmod a+x $dest/detekt
77 | echo $dest >> $GITHUB_PATH
78 |
79 | # Performs static analysis using Detekt
80 | - name: Run Detekt
81 | continue-on-error: true
82 | run: |
83 | detekt --input ${{ github.workspace }} --report sarif:${{ github.workspace }}/detekt.sarif.json
84 |
85 | # Modifies the SARIF output produced by Detekt so that absolute URIs are relative
86 | # This is so we can easily map results onto their source files
87 | # This can be removed once relative URI support lands in Detekt: https://git.io/JLBbA
88 | - name: Make artifact location URIs relative
89 | continue-on-error: true
90 | run: |
91 | echo "$(
92 | jq \
93 | --arg github_workspace ${{ github.workspace }} \
94 | '. | ( .runs[].results[].locations[].physicalLocation.artifactLocation.uri |= if test($github_workspace) then .[($github_workspace | length | . + 1):] else . end )' \
95 | ${{ github.workspace }}/detekt.sarif.json
96 | )" > ${{ github.workspace }}/detekt.sarif.json
97 |
98 | # Uploads results to GitHub repository using the upload-sarif action
99 | - uses: github/codeql-action/upload-sarif@v1
100 | with:
101 | # Path to SARIF file relative to the root of the repository
102 | sarif_file: ${{ github.workspace }}/detekt.sarif.json
103 | checkout_path: ${{ github.workspace }}
104 |
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/base/BaseActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.base
2 |
3 | import android.content.SharedPreferences
4 | import android.view.Menu
5 | import android.view.MenuItem
6 | import androidx.viewbinding.ViewBinding
7 | import com.frogobox.ad.ui.FrogoAdActivity
8 | import com.frogobox.adcore.model.FrogoAdmobId
9 | import com.frogobox.adcore.source.FrogoAdmobApiResponse
10 | import com.frogobox.adcore.source.FrogoAdmobRepository
11 | import com.frogobox.appadmob.BuildConfig
12 | import com.frogobox.appadmob.R
13 | import com.frogobox.sdk.ext.showLogDebug
14 | import com.google.gson.Gson
15 | import org.koin.android.ext.android.inject
16 |
17 | /**
18 | * Created by Faisal Amir
19 | * FrogoBox Inc License
20 | * =========================================
21 | * ImplementationAdmob
22 | * Copyright (C) 27/11/2019.
23 | * All rights reserved
24 | * -----------------------------------------
25 | * Name : Muhammad Faisal Amir
26 | * E-mail : faisalamircs@gmail.com
27 | * Github : github.com/amirisback
28 | * LinkedIn : linkedin.com/in/faisalamircs
29 | * -----------------------------------------
30 | * FrogoBox Software Industries
31 | * com.frogobox.admobhelper.base
32 | *
33 | */
34 | abstract class BaseActivity : FrogoAdActivity() {
35 |
36 | protected val binding: VB by lazy { setupViewBinding() }
37 |
38 | protected val frogoSharedPreferences: SharedPreferences by inject()
39 |
40 | abstract fun setupViewBinding(): VB
41 |
42 | override fun setupDebugMode(): Boolean {
43 | return BuildConfig.DEBUG
44 | }
45 |
46 | override fun setupMonetized() {
47 | super.setupMonetized()
48 | setupUnityAdApp(BuildConfig.DEBUG, getString(R.string.unity_ad_game_id))
49 | }
50 |
51 | override fun setupContentView() {
52 | super.setupContentView()
53 | setContentView(binding.root)
54 | }
55 |
56 | protected fun requestAdmobApi() {
57 | val baseUrl =
58 | "https://raw.githubusercontent.com/amirisback/frogo-admob/master/app/src/main/assets/"
59 | val frogoAdmobRepository = FrogoAdmobRepository(BuildConfig.DEBUG, baseUrl)
60 | frogoAdmobRepository.usingClient(this)
61 | frogoAdmobRepository.getFrogoAdmobId(
62 | "admob_id.json",
63 | object : FrogoAdmobApiResponse {
64 | override fun onSuccess(data: FrogoAdmobId) {
65 | runOnUiThread {
66 | showLogDebug(data.admobAppId)
67 | showLogDebug(data.admobBannerID[0])
68 | showLogDebug(data.admobInterstitialID[0])
69 | showLogDebug(data.testAdmobAppId)
70 | showLogDebug(data.testAdmobBanner)
71 | showLogDebug(data.testAdmobInterstitial)
72 | }
73 | }
74 |
75 | override fun onFailed(statusCode: Int, errorMessage: String) {
76 | runOnUiThread {
77 | showLogDebug(errorMessage)
78 | }
79 | }
80 |
81 | override fun onFinish() {
82 | }
83 |
84 | override fun onShowProgress() {
85 | }
86 |
87 | override fun onHideProgress() {
88 | }
89 | })
90 | }
91 |
92 | protected inline fun baseGetExtraData(extraKey: String): Model {
93 | val extraIntent = intent.getStringExtra(extraKey)
94 | return Gson().fromJson(extraIntent, Model::class.java)
95 | }
96 |
97 | protected fun baseFragmentNewInstance(
98 | fragment: BaseFragment,
99 | argumentKey: String,
100 | extraDataResult: Model
101 | ) {
102 | fragment.baseNewInstance(argumentKey, extraDataResult)
103 | }
104 |
105 | override fun onCreateOptionsMenu(menu: Menu): Boolean {
106 | return true
107 | }
108 |
109 | override fun onOptionsItemSelected(item: MenuItem): Boolean {
110 | return when (item.itemId) {
111 | android.R.id.home -> {
112 | finish()
113 | true
114 | }
115 | else -> super.onOptionsItemSelected(item)
116 | }
117 | }
118 |
119 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/movie/MovieActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.movie
2 |
3 | import android.os.Bundle
4 | import android.view.View
5 | import androidx.recyclerview.widget.GridLayoutManager
6 | import com.frogobox.admob.core.FrogoAdmob
7 | import com.frogobox.api.movie.ConsumeMovieApi
8 | import com.frogobox.appadmob.BuildConfig
9 | import com.frogobox.appadmob.R
10 | import com.frogobox.appadmob.base.BaseActivity
11 | import com.frogobox.appadmob.databinding.ActivityRecyclerViewBinding
12 | import com.frogobox.coreapi.ConsumeApiResponse
13 | import com.frogobox.coreutil.movie.MovieUrl
14 | import com.frogobox.coreutil.movie.model.TrendingMovie
15 | import com.frogobox.coreutil.movie.response.Trending
16 | import com.frogobox.recycler.core.FrogoRecyclerNotifyListener
17 | import com.frogobox.recycler.core.FrogoRecyclerViewListener
18 | import com.google.android.gms.ads.AdView
19 |
20 | class MovieActivity : BaseActivity() {
21 |
22 | val arrayFrogoAdmobData = mutableListOf()
23 |
24 | override fun setupViewBinding(): ActivityRecyclerViewBinding {
25 | return ActivityRecyclerViewBinding.inflate(layoutInflater)
26 | }
27 |
28 | override fun onCreate(savedInstanceState: Bundle?) {
29 | super.onCreate(savedInstanceState)
30 | setupDetailActivity("RecyclerView (2)")
31 | setupNewsApi()
32 | }
33 |
34 | private fun setupNewsApi() {
35 | val consumeMovieApi =
36 | ConsumeMovieApi(MovieUrl.API_KEY).usingChuckInterceptor(BuildConfig.DEBUG, this)
37 | consumeMovieApi.getTrendingMovieWeek( // Adding Base Parameter on main function
38 |
39 | object : ConsumeApiResponse> {
40 |
41 | override fun onShowProgress() {
42 | // Your Progress Show
43 | }
44 |
45 | override fun onHideProgress() {
46 | // Your Progress Hide
47 | }
48 |
49 | override fun onFailed(statusCode: Int, errorMessage: String) {
50 | // Your failed to do
51 | }
52 |
53 | override fun onFinish() {
54 |
55 | }
56 |
57 | override fun onSuccess(data: Trending) {
58 | data.results?.let { arrayFrogoAdmobData.addAll(it) }
59 | FrogoAdmob.loadRecyclerBannerAds(
60 | getString(R.string.admob_banner),
61 | this@MovieActivity,
62 | arrayFrogoAdmobData
63 | )
64 | setupRecyclerView()
65 | }
66 |
67 | })
68 | }
69 |
70 | private fun setupAdapter(): MovieAdapter {
71 | val adapter = MovieAdapter()
72 | adapter.setupRequirement(R.layout.content_item_news, arrayFrogoAdmobData, object :
73 | FrogoRecyclerViewListener {
74 | override fun onItemClicked(
75 | view: View,
76 | data: Any,
77 | position: Int,
78 | notifyListener: FrogoRecyclerNotifyListener
79 | ) {
80 | }
81 |
82 | override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {
83 | return oldItem == newItem
84 | }
85 |
86 | override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {
87 | return oldItem == newItem
88 | }
89 |
90 | })
91 | return adapter
92 | }
93 |
94 | private fun setupRecyclerView() {
95 | binding.recyclerView.apply {
96 | layoutManager = GridLayoutManager(this@MovieActivity, 2)
97 | adapter = setupAdapter()
98 | }
99 | }
100 |
101 | override fun onResume() {
102 | super.onResume()
103 | for (item in arrayFrogoAdmobData) {
104 | if (item is AdView) {
105 | item.resume()
106 | }
107 | }
108 | }
109 |
110 | override fun onPause() {
111 | super.onPause()
112 | for (item in arrayFrogoAdmobData) {
113 | if (item is AdView) {
114 | item.pause()
115 | }
116 | }
117 | }
118 |
119 | override fun onDestroy() {
120 | super.onDestroy()
121 | for (item in arrayFrogoAdmobData) {
122 | if (item is AdView) {
123 | item.destroy()
124 | }
125 | }
126 |
127 | }
128 |
129 |
130 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/rewarded/RewardedActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.rewarded
2 |
3 | import android.os.Bundle
4 | import com.frogobox.admob.callback.FrogoAdmobRewardedCallback
5 | import com.frogobox.appadmob.R
6 | import com.frogobox.appadmob.base.BaseActivity
7 | import com.frogobox.appadmob.databinding.ActivityRewardedBinding
8 | import com.frogobox.sdk.ext.gone
9 | import com.frogobox.sdk.ext.showToast
10 | import com.frogobox.sdk.ext.visible
11 | import com.google.android.gms.ads.rewarded.RewardItem
12 |
13 | class RewardedActivity : BaseActivity(), FrogoAdmobRewardedCallback {
14 |
15 | private fun getKeyword(): MutableList {
16 | val keywords = mutableListOf()
17 | keywords.add("Kids")
18 | keywords.add("Toys")
19 | keywords.add("Game")
20 | keywords.add("Music")
21 | keywords.add("Piano")
22 | return keywords
23 | }
24 |
25 | private val HTTP_TIMEOUT_MILLIS = 30000
26 |
27 | override fun setupViewBinding(): ActivityRewardedBinding {
28 | return ActivityRewardedBinding.inflate(layoutInflater)
29 | }
30 |
31 | override fun onCreate(savedInstanceState: Bundle?) {
32 | super.onCreate(savedInstanceState)
33 | setupDetailActivity("Rewarded Activity")
34 | setupUI()
35 | }
36 |
37 | private fun setupUI() {
38 | binding.apply {
39 | btnAdmobRewarded.setOnClickListener {
40 | showAdRewarded(getString(R.string.admob_rewarded), this@RewardedActivity)
41 | }
42 |
43 | btnAdmobRewardedTimeout.setOnClickListener {
44 | showAdRewarded(
45 | getString(R.string.admob_rewarded),
46 | HTTP_TIMEOUT_MILLIS,
47 | this@RewardedActivity
48 | )
49 | }
50 |
51 | btnAdmobRewardedKeyword.setOnClickListener {
52 | showAdRewarded(
53 | getString(R.string.admob_rewarded),
54 | getKeyword(),
55 | this@RewardedActivity
56 | )
57 | }
58 |
59 | btnAdmobRewardedTimeoutKeyword.setOnClickListener {
60 | showAdRewarded(
61 | getString(R.string.admob_rewarded),
62 | HTTP_TIMEOUT_MILLIS,
63 | getKeyword(),
64 | this@RewardedActivity
65 | )
66 | }
67 |
68 |
69 | btnAdmobRewardedInterstitial.setOnClickListener {
70 | showAdRewardedInterstitial(
71 | getString(R.string.admob_rewarded_interstitial),
72 | this@RewardedActivity
73 | )
74 | }
75 |
76 | btnAdmobRewardedInterstitialTimeout.setOnClickListener {
77 | showAdRewardedInterstitial(
78 | getString(R.string.admob_rewarded_interstitial),
79 | HTTP_TIMEOUT_MILLIS,
80 | this@RewardedActivity
81 | )
82 | }
83 |
84 | btnAdmobRewardedInterstitialKeyword.setOnClickListener {
85 | showAdRewardedInterstitial(
86 | getString(R.string.admob_rewarded_interstitial),
87 | getKeyword(),
88 | this@RewardedActivity
89 | )
90 | }
91 |
92 | btnAdmobRewardedInterstitialTimeoutKeyword.setOnClickListener {
93 | showAdRewardedInterstitial(
94 | getString(R.string.admob_rewarded_interstitial),
95 | HTTP_TIMEOUT_MILLIS,
96 | getKeyword(),
97 | this@RewardedActivity
98 | )
99 | }
100 | }
101 | }
102 |
103 | override fun onUserEarnedReward(tag: String, rewardItem: RewardItem) {
104 | showToast("${rewardItem.amount}")
105 | }
106 |
107 | override fun onShowAdRequestProgress(tag: String, message: String) {
108 | binding.ivProgress.visible()
109 | }
110 |
111 | override fun onHideAdRequestProgress(tag: String, message: String) {
112 | binding.ivProgress.gone()
113 | }
114 |
115 | override fun onAdDismissed(tag: String, message: String) {
116 | showToast(message)
117 | }
118 |
119 | override fun onAdFailed(tag: String, errorMessage: String) {
120 | showToast(errorMessage)
121 | }
122 |
123 | override fun onAdLoaded(tag: String, message: String) {}
124 |
125 | override fun onAdShowed(tag: String, message: String) {}
126 |
127 | }
--------------------------------------------------------------------------------
/app/src/main/java/com/frogobox/appadmob/mvvm/news/NewsActivity.kt:
--------------------------------------------------------------------------------
1 | package com.frogobox.appadmob.mvvm.news
2 |
3 | import android.os.Bundle
4 | import android.view.View
5 | import androidx.recyclerview.widget.LinearLayoutManager
6 | import com.frogobox.admob.core.FrogoAdmob.loadRecyclerBannerAds
7 | import com.frogobox.api.news.ConsumeNewsApi
8 | import com.frogobox.appadmob.BuildConfig
9 | import com.frogobox.appadmob.R
10 | import com.frogobox.appadmob.base.BaseActivity
11 | import com.frogobox.appadmob.databinding.ActivityRecyclerViewBinding
12 | import com.frogobox.coreapi.ConsumeApiResponse
13 | import com.frogobox.coreutil.news.NewsConstant
14 | import com.frogobox.coreutil.news.NewsUrl
15 | import com.frogobox.coreutil.news.response.ArticleResponse
16 | import com.frogobox.recycler.core.FrogoRecyclerNotifyListener
17 | import com.frogobox.recycler.core.FrogoRecyclerViewListener
18 | import com.google.android.gms.ads.AdView
19 |
20 | class NewsActivity : BaseActivity() {
21 |
22 | private val arrayFrogoAdmobData = mutableListOf()
23 |
24 | override fun setupViewBinding(): ActivityRecyclerViewBinding {
25 | return ActivityRecyclerViewBinding.inflate(layoutInflater)
26 | }
27 |
28 | override fun onCreate(savedInstanceState: Bundle?) {
29 | super.onCreate(savedInstanceState)
30 | setupDetailActivity("RecyclerView (1)")
31 | setupNewsApi()
32 | }
33 |
34 | private fun setupNewsApi() {
35 | val consumeNewsApi =
36 | ConsumeNewsApi(NewsUrl.API_KEY).usingChuckInterceptor(BuildConfig.DEBUG, this)
37 | consumeNewsApi.getTopHeadline( // Adding Base Parameter on main function
38 | null,
39 | null,
40 | NewsConstant.CATEGORY_HEALTH,
41 | NewsConstant.COUNTRY_ID,
42 | null,
43 | null,
44 | object : ConsumeApiResponse {
45 |
46 | override fun onShowProgress() {
47 | // Your Progress Show
48 | }
49 |
50 | override fun onHideProgress() {
51 | // Your Progress Hide
52 | }
53 |
54 | override fun onFailed(statusCode: Int, errorMessage: String) {
55 | // Your failed to do
56 | }
57 |
58 | override fun onFinish() {
59 |
60 | }
61 |
62 | override fun onSuccess(data: ArticleResponse) {
63 | data.articles?.let { arrayFrogoAdmobData.addAll(it) }
64 | loadRecyclerBannerAds(
65 | getString(R.string.admob_banner),
66 | this@NewsActivity,
67 | arrayFrogoAdmobData
68 | )
69 | setupRecyclerView()
70 | }
71 |
72 | })
73 | }
74 |
75 | private fun setupAdapter(): NewsAdapter {
76 | val adapter = NewsAdapter()
77 | adapter.setupRequirement(
78 | R.layout.content_item_news,
79 | arrayFrogoAdmobData,
80 | object : FrogoRecyclerViewListener {
81 | override fun onItemClicked(
82 | view: View,
83 | data: Any,
84 | position: Int,
85 | notifyListener: FrogoRecyclerNotifyListener
86 | ) {
87 | }
88 |
89 | override fun areContentsTheSame(oldItem: Any, newItem: Any): Boolean {
90 | return oldItem == newItem
91 | }
92 |
93 | override fun areItemsTheSame(oldItem: Any, newItem: Any): Boolean {
94 | return oldItem == newItem
95 | }
96 |
97 | })
98 | return adapter
99 | }
100 |
101 | private fun setupRecyclerView() {
102 | binding.recyclerView.apply {
103 | layoutManager =
104 | LinearLayoutManager(this@NewsActivity, LinearLayoutManager.VERTICAL, false)
105 | adapter = setupAdapter()
106 | }
107 | }
108 |
109 | override fun onResume() {
110 | super.onResume()
111 | for (item in arrayFrogoAdmobData) {
112 | if (item is AdView) {
113 | item.resume()
114 | }
115 | }
116 | }
117 |
118 | override fun onPause() {
119 | super.onPause()
120 | for (item in arrayFrogoAdmobData) {
121 | if (item is AdView) {
122 | item.pause()
123 | }
124 | }
125 | }
126 |
127 | override fun onDestroy() {
128 | super.onDestroy()
129 | for (item in arrayFrogoAdmobData) {
130 | if (item is AdView) {
131 | item.destroy()
132 | }
133 | }
134 |
135 | }
136 |
137 |
138 | }
--------------------------------------------------------------------------------