A library simplifies and makes more effectiveness Google Admob Ads & Google Play Billing
- Step 1. Add the JitPack repository to your settings.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
- Step 2. Add the dependency
dependencies {
implementation 'com.github.ogzkesk:EonAd:<version>'
}
- Describe your Admob App-ID in manifest.xml
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="{your_app_id}" />
- Initialize in Application.kt
class App : Application(){
override fun onCreate() {
super.onCreate()
EonAd.getInstance().init(this)
}
}
- You can just set Resume Ads ( App Open Ads ) in Application onCreate
class App : Application(){
override fun onCreate() {
super.onCreate()
val eonAd = EonAd.getInstance()
eonAd.init(this)
eonAd.setResumeAd("ad_unit_id")
}
}
- Disable for a certain time use disableResumeAd() will be disable ads until you enabled again.
EonAd.getInstance().disableResumeAds()
// also
EonAd.getInstance().enableResumeAds()
- Disable for one-time event use disableResumeAdsOnClickEvent() will be disable ads only once.
EonAd.getInstance().disableResumeAdsOnClickEvent()
EonAd.getInstance().loadInterstitialAd(context,"ad_unit_id")
- If you want listener, use EonAdCallback to get ad state loading, closed, loaded etc.
EonAd.getInstance().loadInterstitialAd(context,"ad_unit_id",object: EonAdCallback{
override fun onInterstitialAdLoaded(ad: EonInterstitialAd) {
super.onInterstitialAdLoaded(ad)
}
})
- Use loadInterstitialAdWithInterval() to disable Interstitial Ads for a given time
- This disables reloading of ads for a certain period of time.
- For example. In this code, the Interstitial will not show again until 30 seconds after IT'S FIRST SHOWS: :
EonAd.getInstance().loadInterstitialAdWithInterval(context,"ad_unit_id",30_000)
![](https://private-user-images.githubusercontent.com/100413782/251736537-5892f3be-2c7d-4bce-b2a0-0b58192c2a0d.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0MjU5MjIsIm5iZiI6MTczOTQyNTYyMiwicGF0aCI6Ii8xMDA0MTM3ODIvMjUxNzM2NTM3LTU4OTJmM2JlLTJjN2QtNGJjZS1iMmEwLTBiNTgxOTJjMmEwZC5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxM1QwNTQ3MDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hMWIyMzBiOWVmNDQwMjc3YzU0MGZkYzQ1MTliOWQ2NDFkNjA4NDZiNGM3ZTU3YTcwY2RjMjIyMjVkOWI2YjI5JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.JlGSjTYQHqbtaEYozYkedvNDEaKE16CdJOq_4ulXuSA)
![](https://private-user-images.githubusercontent.com/100413782/251736419-76bff833-42fc-4b9e-8912-e9806606b165.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0MjU5MjIsIm5iZiI6MTczOTQyNTYyMiwicGF0aCI6Ii8xMDA0MTM3ODIvMjUxNzM2NDE5LTc2YmZmODMzLTQyZmMtNGI5ZS04OTEyLWU5ODA2NjA2YjE2NS5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxM1QwNTQ3MDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hYWIxZTc3MWExMTEzZTRmNDkzZjdmYmI3ZjZjZDc2NmJiMTI4ZmQ5YjY4MmU0MzQ3NjNiMGVhNTM3OGZkMWQ3JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.nrCilJ3JI1O6jZx5xshm82tquAYWcZEi7FsgIhBtagA)
- Same usage as Interstitial Ads
EonAd.getInstance().loadRewardedAd(context,"ad_unit_id")
- You need to use Callback to get the time the user has earned reward.
EonAd.getInstance().loadRewardedAd(context,"ad_unit_id",object : EonAdCallback{
override fun onRewardedAdLoaded(ad: EonRewardedAd) {
super.onRewardedAdLoaded(ad)
}
override fun onRewardEarned(rewardItem: EonRewardedAdItem) {
super.onRewardEarned(rewardItem)
// Handle Rewarded item
}
})
EonAd.getInstance().loadNativeAd(context,"ad_unit_id"){ nativeAd ->
// populate nativeAd to layout that you created for ad.
}
Note : Use AdCallback for to get other states of ad. ( loading etc. )
- Also you can just use ready templates and add your own view easily .
- Note : All Templates Using Shimmer Loading Effect so you dont need to care about loading state.
![](https://private-user-images.githubusercontent.com/100413782/251736614-8a51ce75-5ef6-4dad-a446-95e9dc28b690.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0MjU5MjIsIm5iZiI6MTczOTQyNTYyMiwicGF0aCI6Ii8xMDA0MTM3ODIvMjUxNzM2NjE0LThhNTFjZTc1LTVlZjYtNGRhZC1hNDQ2LTk1ZTlkYzI4YjY5MC5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxM1QwNTQ3MDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jY2M1YzE1ZmRhZTVjOTY0MTU1NDMwMGE1MzBhM2M2ODk3NzZjYzA2YjFlNDBmNGQ0YjY4OTA0NTJiY2QwZjczJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.R-4-6LU1m77Il64OhTvL8MOb4muZp6MqL-biNtPiDzY)
![](https://private-user-images.githubusercontent.com/100413782/251736611-e17a3444-2b67-4464-be3b-ea1da68fbbe4.gif?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3Mzk0MjU5MjIsIm5iZiI6MTczOTQyNTYyMiwicGF0aCI6Ii8xMDA0MTM3ODIvMjUxNzM2NjExLWUxN2EzNDQ0LTJiNjctNDQ2NC1iZTNiLWVhMWRhNjhmYmJlNC5naWY_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjUwMjEzJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI1MDIxM1QwNTQ3MDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1lOGNlZWYxYmE5MmQ0OTMzZWM0MmYzYzIxMmI4YWJiYmExY2ZiNDcxMTdmZWJlZTlmYzRkMDFmNWYwODQ1N2RmJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCJ9.jQr_KpAq3D5ph4zQn-jEyhIy2XsYUYfhmpZ--pSwiWE)
EonAd.getInstance().loadNativeAdTemplate(
context = context,
adUnitId = "ad_unit_id",
type = NativeAdTemplate.LARGE, // you can set SMALL, MEDIUM, MEDIUM_2, LARGE templates.
onFailedToLoad = {
// handle if failed
},
onNativeAdLoaded = { view ->
// create a frame layout in your xml and populate in it.
binding.myView.removeAllViews()
binding.myView.addView(view)
}
)
- Give nativeAdView that you get from loadNativeAdTemplate() function.
- Note : Do not run loadNativeAdTemplate() in @Composable functions to avoid multiple loads.
EonNativeAdView(
nativeAdView = nativeAdView,
darkModeSupport = true
)
- Similar native ad templates just load banner ads and populate view to your xml layout.
- You have to use Callback if you need ad's other states.
val bannerAdView = EonAd.getInstance().loadBannerAd(context,"ad_unit_id",BannerAdSize.BANNER) // select different banner types that admob provides
binding.myView.removeAllViews()
binding.myView.addView(bannerAdView)
- Note : Do not run loadBannerAd() in @Composable functions to avoid multiple loads.
EonBannerView(view = bannerView)
- Describe permissions in your Manifest.xml
<uses-permission android:name="com.android.vending.BILLING"/>
<uses-permission android:name="android.permission.INTERNET"/>
- Initialize in Application.kt
class App : Application(){
override fun onCreate() {
super.onCreate()
val products = listOf(
PurchaseItem("your_sub_id_1",PurchaseItem.TYPE_SUBSCRIPTION),
PurchaseItem("your_product_id_1",PurchaseItem.TYPE_PRODUCT),
)
Iap.getInstance().init(this,products).connect()
}
}
- NOTE : Billing will connect in 1-2 second. If you want to do something on at app starting you need to be sure CONNECTED .
- You can use with listener if you need to :
Iap.getInstance().init(this,products).connect { connected, disconnected ->
if(connected){
// do something..
}
}
}
-
If you can't, You can connect later on anywhere in app. Just .init(application) enough in Application() class.
-
But if you dont connect after you cannot use billing library.
-
E.g. if you want to check subscription at app start :
val iap = Iap.getInstance()
iap.connect{ connected, disconnected ->
if(connected){
iap.checkSubscription { isAvailable ->
if(isAvailable){
// user has subscription
}
}
}
}
- For fetching products & subscription that you described :
val iap = Iap.getInstance()
val subs = iap.getSubscriptions()
val products = iap.getInAppProducts()
- listen() suspend function that needs coroutine scope
- Use subscribe() for start subscription billing :
someCoroutineScope.launch() {
iap.subscribe(activity,"subscription_id")
.listen { result ->
if(result.purchases.isNotEmpty()){
// user subscribed successfully
}
}
}
- listen() suspend function that needs coroutine scope
- Use purchase() for start inapp product billing :
someCoroutineScope.launch() {
iap.purchase(activity,"product_id")
.listen { result ->
if(result.purchases.isNotEmpty()){
// user bought the product successfully
}
}
}
- If you used disableAutoConsume() you need to consume() item later on otherwise user can't buy that inapp product again.
Iap.getInstance().disableAutoConsume()
- In order for the user to purchase the product again :
Iap.getInstance().consume(PurchaseIap){ error ->
if(error != null){
// check error
}
}
Note : PurchaseIap you gonna get from listen() function when user buy any inapp product
- Check connected state ( this is not a listener )
Iap.getInstance().isConnected()
- If you won't use billing after a while use :
- Note : If released billing won't work until you .connect() again.
Iap.getInstance().release()