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()