From 20cdcddd36ce8ebc46616a7f45299005b73582a4 Mon Sep 17 00:00:00 2001 From: Dmitriy Chugunov Date: Sun, 11 Feb 2024 23:37:22 +0300 Subject: [PATCH] add yandex ads banner --- app/build.gradle.kts | 4 + app/proguard-rules.pro | 4 +- app/src/main/AndroidManifest.xml | 5 +- .../kotlin/it/hamy/muza/MainApplication.kt | 6 + .../muza/ui/components/YandexAdsBanner.kt | 69 ++++++ .../muza/ui/screens/home/HomePlaylists.kt | 201 ++++++++++-------- 6 files changed, 197 insertions(+), 92 deletions(-) create mode 100644 app/src/main/kotlin/it/hamy/muza/ui/components/YandexAdsBanner.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 38dbc38..e3e6b59 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -91,6 +91,10 @@ dependencies { implementation(libs.room) implementation("androidx.media3:media3-datasource-okhttp:1.0.0-alpha03") + + implementation ("com.yandex.android:mobileads:6.4.0") + implementation("com.google.android.gms:play-services-ads-identifier:18.0.1") + kapt(libs.room.compiler) implementation(projects.innertube) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 8c15294..4d78e7e 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -31,4 +31,6 @@ -dontwarn org.openjsse.javax.net.ssl.SSLParameters -dontwarn org.openjsse.javax.net.ssl.SSLSocket -dontwarn org.openjsse.net.ssl.OpenJSSE --dontwarn org.slf4j.impl.StaticLoggerBinder \ No newline at end of file +-dontwarn org.slf4j.impl.StaticLoggerBinder + +-keep class com.yandex** { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index e0dd9d9..08d4410 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,11 +1,14 @@ - + + + diff --git a/app/src/main/kotlin/it/hamy/muza/MainApplication.kt b/app/src/main/kotlin/it/hamy/muza/MainApplication.kt index c96e0be..2e7182e 100644 --- a/app/src/main/kotlin/it/hamy/muza/MainApplication.kt +++ b/app/src/main/kotlin/it/hamy/muza/MainApplication.kt @@ -4,6 +4,7 @@ import android.app.Application import coil.ImageLoader import coil.ImageLoaderFactory import coil.disk.DiskCache +import com.yandex.mobile.ads.common.MobileAds import it.hamy.muza.enums.CoilDiskCacheMaxSize import it.hamy.muza.utils.coilDiskCacheMaxSizeKey import it.hamy.muza.utils.getEnum @@ -13,6 +14,11 @@ class MainApplication : Application(), ImageLoaderFactory { override fun onCreate() { super.onCreate() DatabaseInitializer() + MobileAds.initialize(this) { + /** + * Инициализация либы яндекса + */ + } } override fun newImageLoader(): ImageLoader { diff --git a/app/src/main/kotlin/it/hamy/muza/ui/components/YandexAdsBanner.kt b/app/src/main/kotlin/it/hamy/muza/ui/components/YandexAdsBanner.kt new file mode 100644 index 0000000..b3265f8 --- /dev/null +++ b/app/src/main/kotlin/it/hamy/muza/ui/components/YandexAdsBanner.kt @@ -0,0 +1,69 @@ +package it.hamy.muza.ui.components + +import android.util.Log +import android.widget.Toast +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.viewinterop.AndroidView +import com.yandex.mobile.ads.banner.BannerAdEventListener +import com.yandex.mobile.ads.banner.BannerAdSize +import com.yandex.mobile.ads.banner.BannerAdView +import com.yandex.mobile.ads.common.AdRequest +import com.yandex.mobile.ads.common.AdRequestError +import com.yandex.mobile.ads.common.ImpressionData + +@Composable +fun YandexAdsBanner(id: String) { + AndroidView(modifier = Modifier.fillMaxSize(), factory = { context -> + BannerAdView(context).apply { + /** + * ID блока рекламы + */ + setAdUnitId(id) + /** + * Размер блока рекламы + */ + setAdSize(BannerAdSize.inlineSize(context, 140, 60)) + /** + * Билдер запроса + */ + val adRequest = AdRequest.Builder().build() + /** + * Слушатель экшнов + */ + setBannerAdEventListener(object : BannerAdEventListener { + override fun onAdLoaded() { + + } + + override fun onAdFailedToLoad(p0: AdRequestError) { + /** + * Тут дебажим ошибки + */ + } + + override fun onAdClicked() { + + } + + override fun onLeftApplication() { + + } + + override fun onReturnedToApplication() { + + } + + override fun onImpression(p0: ImpressionData?) { + + } + + }) + /** + * Запуск баннера + */ + loadAd(adRequest) + } + }) +} \ No newline at end of file diff --git a/app/src/main/kotlin/it/hamy/muza/ui/screens/home/HomePlaylists.kt b/app/src/main/kotlin/it/hamy/muza/ui/screens/home/HomePlaylists.kt index 8ba49a0..ef0149c 100644 --- a/app/src/main/kotlin/it/hamy/muza/ui/screens/home/HomePlaylists.kt +++ b/app/src/main/kotlin/it/hamy/muza/ui/screens/home/HomePlaylists.kt @@ -9,17 +9,22 @@ import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.only +import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.width import androidx.compose.foundation.lazy.grid.GridCells import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.foundation.lazy.grid.items import androidx.compose.foundation.lazy.grid.rememberLazyGridState +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -40,6 +45,7 @@ import it.hamy.muza.enums.SortOrder import it.hamy.muza.models.Playlist import it.hamy.muza.models.PlaylistPreview import it.hamy.muza.query +import it.hamy.muza.ui.components.YandexAdsBanner import it.hamy.muza.ui.components.themed.FloatingActionsContainerWithScrollToTop import it.hamy.muza.ui.components.themed.Header import it.hamy.muza.ui.components.themed.HeaderIconButton @@ -104,107 +110,122 @@ fun HomePlaylists( val lazyGridState = rememberLazyGridState() - Box { - LazyVerticalGrid( - state = lazyGridState, - columns = GridCells.Adaptive(Dimensions.thumbnails.song * 2 + Dimensions.itemsVerticalPadding * 2), - contentPadding = LocalPlayerAwareWindowInsets.current - .only(WindowInsetsSides.Vertical + WindowInsetsSides.End).asPaddingValues(), - verticalArrangement = Arrangement.spacedBy(Dimensions.itemsVerticalPadding * 2), - horizontalArrangement = Arrangement.spacedBy( - space = Dimensions.itemsVerticalPadding * 2, - alignment = Alignment.CenterHorizontally - ), + Box(modifier = Modifier.fillMaxSize()) { + Column( modifier = Modifier .fillMaxSize() - .background(colorPalette.background0) ) { - item(key = "header", contentType = 0, span = { GridItemSpan(maxLineSpan) }) { - Header(title = "Плейлисты") { - SecondaryTextButton( - text = "Новый плейлист", - onClick = { isCreatingANewPlaylist = true } - ) + LazyVerticalGrid( + state = lazyGridState, + columns = GridCells.Adaptive(Dimensions.thumbnails.song * 2 + Dimensions.itemsVerticalPadding * 2), + contentPadding = LocalPlayerAwareWindowInsets.current + .only(WindowInsetsSides.Vertical + WindowInsetsSides.End).asPaddingValues(), + verticalArrangement = Arrangement.spacedBy(Dimensions.itemsVerticalPadding * 2), + horizontalArrangement = Arrangement.spacedBy( + space = Dimensions.itemsVerticalPadding * 2, + alignment = Alignment.CenterHorizontally + ), + modifier = Modifier + .fillMaxWidth() + .background(colorPalette.background0) + ) { + item(key = "header", contentType = 0, span = { GridItemSpan(maxLineSpan) }) { + Header(title = "Плейлисты") { + SecondaryTextButton( + text = "Новый плейлист", + onClick = { isCreatingANewPlaylist = true } + ) - Spacer( + Spacer( + modifier = Modifier + .weight(1f) + ) + + HeaderIconButton( + icon = R.drawable.medical, + color = if (sortBy == PlaylistSortBy.SongCount) colorPalette.text else colorPalette.textDisabled, + onClick = { sortBy = PlaylistSortBy.SongCount } + ) + + HeaderIconButton( + icon = R.drawable.text, + color = if (sortBy == PlaylistSortBy.Name) colorPalette.text else colorPalette.textDisabled, + onClick = { sortBy = PlaylistSortBy.Name } + ) + + HeaderIconButton( + icon = R.drawable.time, + color = if (sortBy == PlaylistSortBy.DateAdded) colorPalette.text else colorPalette.textDisabled, + onClick = { sortBy = PlaylistSortBy.DateAdded } + ) + + Spacer( + modifier = Modifier + .width(2.dp) + ) + + HeaderIconButton( + icon = R.drawable.arrow_up, + color = colorPalette.text, + onClick = { sortOrder = !sortOrder }, + modifier = Modifier + .graphicsLayer { rotationZ = sortOrderIconRotation } + ) + } + } + + item(key = "favorites") { + PlaylistItem( + icon = R.drawable.heart, + colorTint = colorPalette.red, + name = "Любимые", + songCount = null, + thumbnailSizeDp = thumbnailSizeDp, + alternative = true, modifier = Modifier - .weight(1f) - ) - - HeaderIconButton( - icon = R.drawable.medical, - color = if (sortBy == PlaylistSortBy.SongCount) colorPalette.text else colorPalette.textDisabled, - onClick = { sortBy = PlaylistSortBy.SongCount } - ) - - HeaderIconButton( - icon = R.drawable.text, - color = if (sortBy == PlaylistSortBy.Name) colorPalette.text else colorPalette.textDisabled, - onClick = { sortBy = PlaylistSortBy.Name } - ) - - HeaderIconButton( - icon = R.drawable.time, - color = if (sortBy == PlaylistSortBy.DateAdded) colorPalette.text else colorPalette.textDisabled, - onClick = { sortBy = PlaylistSortBy.DateAdded } - ) - - Spacer( - modifier = Modifier - .width(2.dp) - ) - - HeaderIconButton( - icon = R.drawable.arrow_up, - color = colorPalette.text, - onClick = { sortOrder = !sortOrder }, - modifier = Modifier - .graphicsLayer { rotationZ = sortOrderIconRotation } + .clickable(onClick = { onBuiltInPlaylist(BuiltInPlaylist.Favorites) }) + .animateItemPlacement() ) } - } - item(key = "favorites") { - PlaylistItem( - icon = R.drawable.heart, - colorTint = colorPalette.red, - name = "Любимые", - songCount = null, - thumbnailSizeDp = thumbnailSizeDp, - alternative = true, - modifier = Modifier - .clickable(onClick = { onBuiltInPlaylist(BuiltInPlaylist.Favorites) }) - .animateItemPlacement() - ) - } + item(key = "offline") { + PlaylistItem( + icon = R.drawable.airplane, + colorTint = colorPalette.blue, + name = "Сохранённые", + songCount = null, + thumbnailSizeDp = thumbnailSizeDp, + alternative = true, + modifier = Modifier + .clickable(onClick = { onBuiltInPlaylist(BuiltInPlaylist.Offline) }) + .animateItemPlacement() + ) + } - item(key = "offline") { - PlaylistItem( - icon = R.drawable.airplane, - colorTint = colorPalette.blue, - name = "Сохранённые", - songCount = null, - thumbnailSizeDp = thumbnailSizeDp, - alternative = true, - modifier = Modifier - .clickable(onClick = { onBuiltInPlaylist(BuiltInPlaylist.Offline) }) - .animateItemPlacement() - ) - } - - items(items = items, key = { it.playlist.id }) { playlistPreview -> - PlaylistItem( - playlist = playlistPreview, - thumbnailSizeDp = thumbnailSizeDp, - thumbnailSizePx = thumbnailSizePx, - alternative = true, - modifier = Modifier - .clickable(onClick = { onPlaylistClick(playlistPreview.playlist) }) - .animateItemPlacement() - ) + items(items = items, key = { it.playlist.id }) { playlistPreview -> + PlaylistItem( + playlist = playlistPreview, + thumbnailSizeDp = thumbnailSizeDp, + thumbnailSizePx = thumbnailSizePx, + alternative = true, + modifier = Modifier + .clickable(onClick = { onPlaylistClick(playlistPreview.playlist) }) + .animateItemPlacement() + ) + } + item { + Box( + modifier = Modifier + .fillMaxSize() + .padding(start = 14.dp, end = 10.dp, top = 30.dp) + .align(Alignment.CenterHorizontally), + contentAlignment = Alignment.Center, + ) { + YandexAdsBanner(id = "R-M-5961316-1") + } + } } } - FloatingActionsContainerWithScrollToTop( lazyGridState = lazyGridState, iconId = R.drawable.search,