diff --git a/admob/app/src/main/AndroidManifest.xml b/admob/app/src/main/AndroidManifest.xml
index aeddd6ffc..fdd24ea52 100644
--- a/admob/app/src/main/AndroidManifest.xml
+++ b/admob/app/src/main/AndroidManifest.xml
@@ -36,6 +36,7 @@
+
diff --git a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/EntryChoiceActivity.kt b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/EntryChoiceActivity.kt
index adc6fee47..cc69a5f04 100644
--- a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/EntryChoiceActivity.kt
+++ b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/EntryChoiceActivity.kt
@@ -12,11 +12,15 @@ class EntryChoiceActivity : BaseEntryChoiceActivity() {
Choice(
"Java",
"Run the Firebase Admob quickstart written in Java.",
- Intent(this, MainActivity::class.java)),
+ Intent(this, com.google.samples.quickstart.admobexample.java.MainActivity::class.java)),
Choice(
"Kotlin",
"Run the Firebase Admob quickstart written in Kotlin.",
- Intent(this, com.google.samples.quickstart.admobexample.kotlin.MainActivity::class.java))
+ Intent(this, com.google.samples.quickstart.admobexample.kotlin.MainActivity::class.java)),
+ Choice(
+ "Compose",
+ "Run the Firebase Admob quickstart written in Compose.",
+ Intent(this, com.google.samples.quickstart.admobexample.kotlin.MainComposeActivity::class.java))
)
}
}
diff --git a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/MainComposeActivity.kt b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/MainComposeActivity.kt
new file mode 100644
index 000000000..04511c033
--- /dev/null
+++ b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/MainComposeActivity.kt
@@ -0,0 +1,207 @@
+package com.google.samples.quickstart.admobexample.kotlin
+
+import android.content.ContentValues.TAG
+import android.os.Bundle
+import android.util.Log
+import androidx.activity.ComponentActivity
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.material.Surface
+import androidx.compose.material.TopAppBar
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Scaffold
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.res.colorResource
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.res.stringResource
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.viewinterop.AndroidView
+import com.google.android.gms.ads.AdError
+import com.google.android.gms.ads.AdRequest
+import com.google.android.gms.ads.AdSize
+import com.google.android.gms.ads.AdView
+import com.google.android.gms.ads.FullScreenContentCallback
+import com.google.android.gms.ads.LoadAdError
+import com.google.android.gms.ads.MobileAds
+import com.google.samples.quickstart.admobexample.kotlin.ui.theme.AdmobTheme
+import com.google.samples.quickstart.admobexample.R
+import com.google.android.gms.ads.interstitial.InterstitialAd
+import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
+
+class MainComposeActivity : ComponentActivity() {
+ private var mInterstitialAd: InterstitialAd? = null
+ private lateinit var adUnitId: String //="ca-app-pub-3940256099942544/1033173712" //could be set to another id
+ private val buttonClickLambda = { displayNewInterstitial() }
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ adUnitId = getString(R.string.interstitial_ad_unit_id)
+
+ setContent {
+ AdmobTheme {
+ //A surface container using the 'background' color from the theme
+ Surface(
+ modifier = Modifier.fillMaxSize(),
+ color = MaterialTheme.colors.background
+ ) {
+ MainAppView( buttonClickEventAdLoader = buttonClickLambda ) // call Composable UI
+ }
+ }
+
+ initializeInterstitial()
+ }
+ }
+
+ private fun setInterstitialCallback() {
+
+
+ mInterstitialAd?.fullScreenContentCallback = object: FullScreenContentCallback() {
+ override fun onAdClicked() {
+ // Called when a click is recorded for an ad.
+ Log.d(TAG, "Ad was clicked.")
+ }
+
+ override fun onAdDismissedFullScreenContent() {
+ // Called when ad is dismissed.
+ Log.d(TAG, "Ad dismissed fullscreen content.")
+ mInterstitialAd = null
+ initializeInterstitial() // get a new ad
+ }
+
+ override fun onAdFailedToShowFullScreenContent(p0: AdError) {
+ // Called when ad fails to show.
+ Log.e(TAG, "Ad failed to show fullscreen content.")
+ mInterstitialAd = null
+ initializeInterstitial() // get a new ad
+ }
+
+ override fun onAdImpression() {
+ // Called when an impression is recorded for an ad.
+ Log.d(TAG, "Ad recorded an impression.")
+ }
+
+ override fun onAdShowedFullScreenContent() {
+ // Called when ad is shown.
+ Log.d(TAG, "Ad showed fullscreen content.")
+ }
+ }
+ }
+
+ private fun initializeInterstitial(){
+ MobileAds.initialize(this)
+ val adRequest = AdRequest.Builder().build()
+
+ InterstitialAd.load(this, adUnitId, adRequest, object : InterstitialAdLoadCallback() {
+ override fun onAdFailedToLoad(adError: LoadAdError) {
+ Log.d(TAG, adError.toString())
+ mInterstitialAd = null
+ }
+
+ override fun onAdLoaded(interstitialAd: InterstitialAd) {
+ Log.d(TAG, "Ad was loaded.")
+ mInterstitialAd = interstitialAd
+ }
+ })
+ }
+
+ fun displayNewInterstitial(){
+ if (mInterstitialAd != null) { // ad is available
+ setInterstitialCallback() // set the callback methods
+ mInterstitialAd?.show(this)
+ } else { // ad is not available
+ Log.d("TAG", "The interstitial ad wasn't ready yet.")
+ initializeInterstitial()
+ }
+ }
+
+
+}
+
+
+@Composable
+fun MainAppView(modifier: Modifier = Modifier, buttonClickEventAdLoader : () -> Unit = {}){
+ Scaffold(
+ topBar = { // top bar with app name
+ TopAppBar(
+ backgroundColor = colorResource(R.color.colorPrimary)
+ ) {
+ androidx.compose.material.Text(
+ text = stringResource(R.string.app_name),
+ style = androidx.compose.material.MaterialTheme.typography.h6,
+ textAlign = TextAlign.Center,
+ modifier = Modifier.padding(8.dp),
+ color = Color.White
+ )
+ }
+ },
+ content = {
+
+ Column(
+ modifier = Modifier
+ .padding(it)
+ .fillMaxWidth()
+ .fillMaxHeight(),
+
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Spacer(modifier = Modifier.height(24.dp))
+
+ Image(painter = painterResource(R.drawable.firebase_lockup_400), contentDescription = "")
+ Spacer(modifier = Modifier.height(160.dp))
+ Button(
+ colors = ButtonDefaults.buttonColors(backgroundColor = colorResource(R.color.colorAccent)),
+ onClick = { buttonClickEventAdLoader() } //lambda for onClick action
+ ) {
+ Text(
+ text = stringResource(R.string.interstitial_button_text),
+ fontSize = 24.sp,
+ color = Color.White
+ )
+ }
+
+ }
+ },
+ bottomBar = { // keeps the banner ad at the bottom!
+ AdvertBanner()
+ }
+ )
+
+}
+
+
+@Composable
+fun AdvertBanner(modifier: Modifier = Modifier) { // banner advert
+
+ Row(
+ modifier = Modifier
+ .fillMaxWidth()
+ ) {
+ AndroidView(
+ modifier = modifier.fillMaxWidth(),
+ factory = { context ->
+ AdView(context).apply {
+ setAdSize(AdSize.BANNER)
+ adUnitId = context.getString(R.string.banner_ad_unit_id)
+ loadAd(AdRequest.Builder().build())
+ }
+ }
+ )
+ }
+
+}
diff --git a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Color.kt b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Color.kt
new file mode 100644
index 000000000..ca187c6ee
--- /dev/null
+++ b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Color.kt
@@ -0,0 +1,13 @@
+package com.google.samples.quickstart.admobexample.kotlin.ui.theme
+
+import androidx.compose.ui.graphics.Color
+import com.google.samples.quickstart.admobexample.R
+
+val Purple80 = Color(0xFFD0BCFF)
+val PurpleGrey80 = Color(0xFFCCC2DC)
+val Pink80 = Color(0xFFEFB8C8)
+
+// self-defined light-mode colour scheme
+val FirebaseBlue = Color(0xFF0288D1) // copied from colors.xml
+val FirebaseBannerBlue = Color(0xFF039BE5) // copied from colors.xml
+val FirebaseOrange = Color(0xFFFFA000) // copied from colors.xml
\ No newline at end of file
diff --git a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Shape.kt b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Shape.kt
new file mode 100644
index 000000000..cb1986dc6
--- /dev/null
+++ b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Shape.kt
@@ -0,0 +1,11 @@
+package com.google.samples.quickstart.admobexample.kotlin.ui.theme
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.Shapes
+import androidx.compose.ui.unit.dp
+
+val Shapes = Shapes(
+ small = RoundedCornerShape(16.dp),
+ medium = RoundedCornerShape(4.dp),
+ large = RoundedCornerShape(0.dp)
+)
\ No newline at end of file
diff --git a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Theme.kt b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Theme.kt
new file mode 100644
index 000000000..2ae9d75d4
--- /dev/null
+++ b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Theme.kt
@@ -0,0 +1,49 @@
+package com.google.samples.quickstart.admobexample.kotlin.ui.theme
+
+import androidx.compose.foundation.isSystemInDarkTheme
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.darkColors
+import androidx.compose.material.lightColors
+import androidx.compose.runtime.Composable
+
+private val DarkColorPalette = darkColors(
+ primary = Purple80,
+ primaryVariant = PurpleGrey80,
+ secondary = Pink80
+)
+
+private val LightColorPalette = lightColors(
+ primary = FirebaseBlue,
+ primaryVariant = FirebaseBannerBlue,
+ secondary = FirebaseOrange
+
+ /* Other default colors to override
+ background = Color(0xFFFFFBFE),
+ surface = Color(0xFFFFFBFE),
+ onPrimary = Color.White,
+ onSecondary = Color.White,
+ onTertiary = Color.White,
+ onBackground = Color(0xFF1C1B1F),
+ onSurface = Color(0xFF1C1B1F),
+ */
+)
+
+@Composable
+fun AdmobTheme(
+ darkTheme: Boolean = isSystemInDarkTheme(),
+ content: @Composable () -> Unit
+) {
+ val colors = if (darkTheme) {
+ DarkColorPalette
+ } else {
+ LightColorPalette
+ }
+
+ MaterialTheme(
+ colors = colors,
+ typography = Typography,
+ shapes = Shapes,
+ content = content
+ )
+}
+
diff --git a/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Type.kt b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Type.kt
new file mode 100644
index 000000000..d4b748c80
--- /dev/null
+++ b/admob/app/src/main/java/com/google/samples/quickstart/admobexample/kotlin/ui/theme/Type.kt
@@ -0,0 +1,34 @@
+package com.google.samples.quickstart.admobexample.kotlin.ui.theme
+
+import androidx.compose.material.Typography
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.FontFamily
+import androidx.compose.ui.text.font.FontWeight
+import androidx.compose.ui.unit.sp
+
+// Set of Material typography styles to start with
+val Typography = Typography(
+ body1 = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 16.sp,
+ lineHeight = 24.sp,
+ letterSpacing = 0.5.sp
+ )
+ /* Other default text styles to override
+ titleLarge = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Normal,
+ fontSize = 22.sp,
+ lineHeight = 28.sp,
+ letterSpacing = 0.sp
+ ),
+ labelSmall = TextStyle(
+ fontFamily = FontFamily.Default,
+ fontWeight = FontWeight.Medium,
+ fontSize = 11.sp,
+ lineHeight = 16.sp,
+ letterSpacing = 0.5.sp
+ )
+ */
+)
\ No newline at end of file
diff --git a/admob/build.gradle b/admob/build.gradle
index fbaae1ec7..d577ca24d 100644
--- a/admob/build.gradle
+++ b/admob/build.gradle
@@ -1,6 +1,9 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
+ ext {
+ compose_version = '1.3.0'
+ }
repositories {
mavenLocal()
google()