Skip to content

Commit

Permalink
V0.2.1 (#43)
Browse files Browse the repository at this point in the history
* Updated README.md for Basic Ads and Basic.

* Fixing README.md image.

* Returned to normal image alignment in README.md

* Corrected Kotlin Version in documentation

* Added template for Basic-Ads

* Removed activity default arg to ensure users enter an Activity when required.

* * Updated Kotlin compiler to 2.1.0-RC2
* Updated WASM to include migrated W3 Libraries
* Updated README.md files to include changes to compiler

* * Added additional callbacks for lambda execution on Composables

* * Added additional callbacks for lambda execution on Composables

* * Added additional callbacks for lambda execution on Composables
  • Loading branch information
robertjamison authored Nov 20, 2024
1 parent 55d5d39 commit 4becd9b
Show file tree
Hide file tree
Showing 24 changed files with 324 additions and 119 deletions.
15 changes: 8 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
# Basic
<img src="docs/images/basic.png" alt="basic" height="240" align="right"/>
<img src="docs/images/basic_240.png" alt="basic" align="right"/>

![GitHub License](https://img.shields.io/github/license/lexilabs-app/basic)
![GitHub Release Date](https://img.shields.io/github/release-date/lexilabs-app/basic)
[![Kotlin](https://img.shields.io/badge/Kotlin-2.0.21-7f52ff.svg?style=flat&logo=kotlin)](https://kotlinlang.org)
[![Kotlin](https://img.shields.io/badge/Kotlin-2.1.0--RC2-7f52ff.svg?style=flat&logo=kotlin)](https://kotlinlang.org)

A Kotlin Multiplatform library to rapidly add basic features like pictures, logging, and audio to any project in a small and fast way.

Expand All @@ -22,23 +22,24 @@ A Kotlin Multiplatform library to rapidly add basic features like pictures, logg
| Windows | :no_entry_sign: | :hourglass_flowing_sand: | :white_check_mark: | :hourglass_flowing_sand: |

## Documentation
* [Basic-Ads](basic-ads/README.md) [![MavenCentral](https://img.shields.io/maven-central/v/app.lexilabs.basic/basic-ads?color=blue)](https://central.sonatype.com/artifact/app.lexilabs.basic/basic-ads)
* [Basic-Images](basic-images/README.md) [![Maven Central](https://img.shields.io/maven-central/v/app.lexilabs.basic/basic-images?color=blue)](https://central.sonatype.com/artifact/app.lexilabs.basic/basic-images)
* [Basic-Logging](basic-logging/README.md) [![Maven Central](https://img.shields.io/maven-central/v/app.lexilabs.basic/basic-logging?color=blue)](https://central.sonatype.com/artifact/app.lexilabs.basic/basic-logging)
* [Basic-Sound](basic-sound/README.md) [![Maven Central](https://img.shields.io/maven-central/v/app.lexilabs.basic/basic-sound?color=blue)](https://central.sonatype.com/artifact/app.lexilabs.basic/basic-sound)
* [Basic-Ads](basic-ads/README.md) [![MavenCentral](https://img.shields.io/maven-central/v/app.lexilabs.basic/basic-ads?color=blue)](https://central.sonatype.com/artifact/app.lexilabs.basic/basic-ads)

## Quick Start
Add your dependencies from Maven
```toml
# in your 'gradle/libs.versions.toml' file
[versions]
kotlin = "2.1.0-RC2" # Updated Kotlin version required for Basic-Sound due to hotfix for reading Compose Resources
lexilabs-basic = "+" # gets the latest version

[libraries]
lexilabs-basic-images = { module = "app.lexilabs.basic:basic-images", version.ref = "lexilabs-basic" }
lexilabs-basic-logging = { module = "app.lexilabs.basic:basic-logging", version.ref = "lexilabs-basic" }
lexilabs-basic-sound = { module = "app.lexilabs.basic:basic-sound", version.ref = "lexilabs-basic" }
lexilabs-basic-ads = { module = "app.lexilabs.basic:basic-ads", version.ref = "lexilabs-basic" }
lexilabs-basic-ads = { group = "app.lexilabs.basic", name = "basic-ads", version.ref = "lexilabs-basic" }
lexilabs-basic-images = { group = "app.lexilabs.basic", name = "basic-images", version.ref = "lexilabs-basic" }
lexilabs-basic-logging = { group = "app.lexilabs.basic", name = "basic-logging", version.ref = "lexilabs-basic" }
lexilabs-basic-sound = { group = "app.lexilabs.basic", name = "basic-sound", version.ref = "lexilabs-basic" }
```
then include the library in your gradle build
```kotlin
Expand Down
21 changes: 17 additions & 4 deletions basic-ads/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,15 @@

[Basic-Ads](https://basic.lexilabs.app/basic-ads) [![Maven Central](https://img.shields.io/maven-central/v/app.lexilabs.basic/basic-ads?color=blue)](https://central.sonatype.com/artifact/app.lexilabs.basic/basic-ads)

A Kotlin Multiplatform library to rapidly get Gooble AdMob running on Android and iOS
A Kotlin Multiplatform library to rapidly get Google AdMob running on Android and iOS

![badge-android](http://img.shields.io/badge/android-full_support-65c663.svg?style=flat)
![badge-ios](http://img.shields.io/badge/ios-full_support-65c663.svg?style=flat)

### How it works
Basic-Ads uses the existing Android and iOS Google AdMob libraries to display ads as `Composables`.
A [full walkthrough](https://medium.com/@robert.jamison/composable-ads-f8795924aa0d) is available on my Medium Blog.
A [full walkthrough](https://medium.com/@robert.jamison/composable-ads-f8795924aa0d) is available on my Medium Blog,
and there's also [an easy-start template](https://github.com/LexiLabs-App/Example-Basic-Ads).

## Preparation
For **Android**, complete the steps in AdMob's instructions:
Expand Down Expand Up @@ -75,8 +76,8 @@ fun AdScreen() {
BannerAd() // Results in a Test Banner Ad being created
// You'll need to access your platform-specific Activity (Android) or null (iOS) to pass as an `Any?` argument
InterstitialAd(activity) // Results in a Test Interstitial Ad being created
RewardedInterstitialAd(activity) // Results in a Test Rewarded Interstitial Ad (Beta) being created
RewardedAd(activity) // Results in a Test Rewarded Ad being created
RewardedInterstitialAd(activity, {} ) // Results in a Test Rewarded Interstitial Ad (Beta) being created
RewardedAd(activity, {}) // Results in a Test Rewarded Ad being created
}
```

Expand All @@ -97,6 +98,18 @@ fun AdScreen() {
},
onRewardEarned = {
playSomeCoolSound()
},
onShown = {
addValueToSomeCounter()
},
onImpression = {
addValueToSomeTracker()
},
onClick = {
incrementSomeValueSomewhere()
},
onFailure = {
runTheBackupOption()
}
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,14 @@ public actual class AdLoader {

@SuppressLint("MissingPermission")
@RequiresPermission("android.permission.INTERNET")
public actual fun showInterstitialAd(activity: Any?, onDismissed: () -> Unit){
public actual fun showInterstitialAd(
activity: Any?,
onDismissed: () -> Unit,
onShown: () -> Unit,
onImpression: () -> Unit,
onClick: () -> Unit,
onFailure: () -> Unit,
){
// if (interstitialAd != null) {
interstitialAd?.let {
interstitialAd?.fullScreenContentCallback = object: com.google.android.gms.ads.FullScreenContentCallback() {
Expand All @@ -60,6 +67,7 @@ public actual class AdLoader {
// Called when a click is recorded for an ad.
Log.d(tag, "Ad was clicked.")
loadInterstitialAd(activity, interstitialAdUnitId)
onClick()
}

override fun onAdDismissedFullScreenContent() {
Expand All @@ -68,25 +76,29 @@ public actual class AdLoader {
Log.d(tag, "Ad dismissed fullscreen content.")
interstitialAd = null
loadInterstitialAd(activity, interstitialAdUnitId)
onDismissed()
}

override fun onAdFailedToShowFullScreenContent(p0: com.google.android.gms.ads.AdError) {
super.onAdFailedToShowFullScreenContent(p0)
// Called when ad fails to show.
Log.e(tag, "Ad failed to show fullscreen content.")
interstitialAd = null
onFailure()
}

override fun onAdImpression() {
super.onAdImpression()
// Called when an impression is recorded for an ad.
Log.d(tag, "Ad recorded an impression.")
onImpression()
}

override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
// Called when ad is shown.
Log.d(tag, "Ad showed fullscreen content.")
onShown()
}
}
// CONTINUE
Expand Down Expand Up @@ -123,14 +135,23 @@ public actual class AdLoader {

@SuppressLint("MissingPermission")
@RequiresPermission("android.permission.INTERNET")
public actual fun showRewardedInterstitialAd(activity: Any?, onDismissed: () -> Unit, onRewardEarned: () -> Unit){
public actual fun showRewardedInterstitialAd(
activity: Any?,
onRewardEarned: () -> Unit,
onDismissed: () -> Unit,
onShown: () -> Unit,
onImpression: () -> Unit,
onClick: () -> Unit,
onFailure: () -> Unit,
){
rewardedInterstitialAd?.let {
rewardedInterstitialAd?.fullScreenContentCallback = object: com.google.android.gms.ads.FullScreenContentCallback() {
override fun onAdClicked() {
super.onAdClicked()
// Called when a click is recorded for an ad.
Log.d(tag, "Ad was clicked.")
loadRewardedInterstitialAd(activity, rewardedInterstitialAdUnitId)
onClick()
}

override fun onAdDismissedFullScreenContent() {
Expand All @@ -139,25 +160,29 @@ public actual class AdLoader {
Log.d(tag, "Ad dismissed fullscreen content.")
rewardedInterstitialAd = null
loadRewardedInterstitialAd(activity, rewardedInterstitialAdUnitId)
onDismissed()
}

override fun onAdFailedToShowFullScreenContent(p0: com.google.android.gms.ads.AdError) {
super.onAdFailedToShowFullScreenContent(p0)
// Called when ad fails to show.
Log.e(tag, "Ad failed to show fullscreen content.")
rewardedInterstitialAd = null
onFailure()
}

override fun onAdImpression() {
super.onAdImpression()
// Called when an impression is recorded for an ad.
Log.d(tag, "Ad recorded an impression.")
onImpression()
}

override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
// Called when ad is shown.
Log.d(tag, "Ad showed fullscreen content.")
onShown()
}
}
// CONTINUE
Expand Down Expand Up @@ -198,14 +223,23 @@ public actual class AdLoader {

@SuppressLint("MissingPermission")
@RequiresPermission("android.permission.INTERNET")
public actual fun showRewardedAd(activity: Any?, onDismissed: () -> Unit, onRewardEarned: () -> Unit){
public actual fun showRewardedAd(
activity: Any?,
onRewardEarned: () -> Unit,
onDismissed: () -> Unit,
onShown: () -> Unit,
onImpression: () -> Unit,
onClick: () -> Unit,
onFailure: () -> Unit,
){
rewardedAd?.let {
rewardedAd?.fullScreenContentCallback = object: com.google.android.gms.ads.FullScreenContentCallback() {
override fun onAdClicked() {
super.onAdClicked()
// Called when a click is recorded for an ad.
Log.d(tag, "Ad was clicked.")
loadRewardedAd(activity, rewardedAdUnitId)
onClick()
}

override fun onAdDismissedFullScreenContent() {
Expand All @@ -214,25 +248,29 @@ public actual class AdLoader {
Log.d(tag, "Ad dismissed fullscreen content.")
rewardedAd = null
loadRewardedAd(activity, rewardedAdUnitId)
onDismissed()
}

override fun onAdFailedToShowFullScreenContent(p0: com.google.android.gms.ads.AdError) {
super.onAdFailedToShowFullScreenContent(p0)
// Called when ad fails to show.
Log.e(tag, "Ad failed to show fullscreen content.")
rewardedAd = null
onFailure()
}

override fun onAdImpression() {
super.onAdImpression()
// Called when an impression is recorded for an ad.
Log.d(tag, "Ad recorded an impression.")
onImpression()
}

override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
// Called when ad is shown.
Log.d(tag, "Ad showed fullscreen content.")
onShown()
}
}
// CONTINUE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,44 @@ public actual fun BannerAd(adUnitId: String, adSize: AdSize) {

@RequiresPermission("android.permission.INTERNET")
@Composable
public actual fun InterstitialAd(activity: Any?, adUnitId: String, onDismissed: () -> Unit) {
public actual fun InterstitialAd(
activity: Any?,
adUnitId: String,
onDismissed: () -> Unit,
onShown: () -> Unit,
onImpression: () -> Unit,
onClick: () -> Unit,
onFailure: () -> Unit,
) {
val adLoader = AdLoader()
adLoader.loadInterstitialAd(
activity,
adUnitId,
onLoaded = {
adLoader.showInterstitialAd(activity) { onDismissed() }
adLoader.showInterstitialAd(
activity = activity,
onDismissed = { onDismissed() },
onShown = { onShown() },
onImpression = { onImpression() },
onClick = { onClick() },
onFailure = { onFailure() }
)
}
)
}

@RequiresPermission("android.permission.INTERNET")
@Composable
public actual fun RewardedAd(activity: Any?, adUnitId: String, onDismissed: () -> Unit, onRewardEarned: () -> Unit) {
public actual fun RewardedAd(
activity: Any?,
adUnitId: String,
onRewardEarned: () -> Unit,
onDismissed: () -> Unit,
onShown: () -> Unit,
onImpression: () -> Unit,
onClick: () -> Unit,
onFailure: () -> Unit,
) {
val adLoader = AdLoader()
adLoader.loadRewardedAd(
activity = activity,
Expand All @@ -43,15 +67,28 @@ public actual fun RewardedAd(activity: Any?, adUnitId: String, onDismissed: () -
adLoader.showRewardedAd(
activity = activity,
onDismissed = { onDismissed() },
onRewardEarned = { onRewardEarned() }
onRewardEarned = { onRewardEarned() },
onShown = { onShown() },
onImpression = { onImpression() },
onClick = { onClick() },
onFailure = { onFailure() }
)
}
)
}

@RequiresPermission("android.permission.INTERNET")
@Composable
public actual fun RewardedInterstitialAd(activity: Any?, adUnitId: String, onDismissed: () -> Unit, onRewardEarned: () -> Unit) {
public actual fun RewardedInterstitialAd(
activity: Any?,
adUnitId: String,
onRewardEarned: () -> Unit,
onDismissed: () -> Unit,
onShown: () -> Unit,
onImpression: () -> Unit,
onClick: () -> Unit,
onFailure: () -> Unit,
) {
val adLoader = AdLoader()
adLoader.loadRewardedInterstitialAd(
activity = activity,
Expand All @@ -60,7 +97,11 @@ public actual fun RewardedInterstitialAd(activity: Any?, adUnitId: String, onDis
adLoader.showRewardedInterstitialAd(
activity = activity,
onDismissed = { onDismissed() },
onRewardEarned = { onRewardEarned() }
onRewardEarned = { onRewardEarned() },
onShown = { onShown() },
onImpression = { onImpression() },
onClick = { onClick() },
onFailure = { onFailure() }
)
}
)
Expand Down
Loading

0 comments on commit 4becd9b

Please sign in to comment.