From daf5698a99a221b213a88f6f65bd493849e62ead Mon Sep 17 00:00:00 2001 From: litingting Date: Tue, 23 Apr 2024 17:34:58 +0800 Subject: [PATCH] =?UTF-8?q?V1.0.1(2)=20=E5=B9=BF=E5=91=8A=E7=89=88?= =?UTF-8?q?=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/build.gradle.kts | 17 +++- app/google-services.json | 29 +++++++ .../funny/sounds/audio/VariousFunnySounds.kt | 26 +++++- .../funny/sounds/audio/max/MaxListener.java | 9 ++ .../funny/sounds/audio/max/MaxManager.java | 82 +++++++++++++++++++ .../sounds/audio/ui/activity/OpenActivity.kt | 67 ++++++++++++++- .../sounds/audio/ui/activity/PlayActivity.kt | 54 +++++++++--- .../audio/ui/activity/SourceActivity.kt | 67 ++++++++++++--- app/src/main/res/layout/activity_open.xml | 12 ++- build.gradle.kts | 8 ++ settings.gradle.kts | 2 + 12 files changed, 343 insertions(+), 31 deletions(-) create mode 100644 app/google-services.json create mode 100644 app/src/main/java/com/various/funny/sounds/audio/max/MaxListener.java create mode 100644 app/src/main/java/com/various/funny/sounds/audio/max/MaxManager.java diff --git a/.gitignore b/.gitignore index 2bfca55..546ee02 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ local.properties .idea/ app/release/ +.safedk/ diff --git a/app/build.gradle.kts b/app/build.gradle.kts index c4089ca..68e3fcd 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,6 +5,12 @@ plugins { id("com.android.application") id("org.jetbrains.kotlin.android") id ("kotlin-kapt") + id("applovin-quality-service") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") +} +applovin{ + apiKey = "y87o4e7vb5bbqzuGVTFyOIfZiyBG0Nf0Ksq8S3m2MJOHf_A5BcWGJnKuQqoxwxVvtdQdiTC4O3MPzFwy8rJ9Cc" } val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) android { @@ -18,8 +24,8 @@ android { applicationId = "com.various.funny.sounds.audio" minSdk = 23 targetSdk = 34 - versionCode = 1 - versionName = "1.0.0" + versionCode = 2 + versionName = "1.0.1" setProperty("archivesBaseName", "Various Funny Sounds_V" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.audio.runner.AndroidJUnitRunner" } @@ -61,4 +67,11 @@ dependencies { implementation ("androidx.room:room-ktx:2.6.1") implementation ("androidx.room:room-runtime:2.6.1") kapt ("androidx.room:room-compiler:2.6.1") + + implementation("com.applovin:applovin-sdk:+") + implementation("com.applovin.mediation:vungle-adapter:+") + implementation("com.applovin.mediation:bytedance-adapter:+") + implementation(platform("com.google.firebase:firebase-bom:32.3.1")) + implementation("com.google.firebase:firebase-analytics-ktx") + implementation ("com.google.firebase:firebase-crashlytics-ktx") } \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..89af1e3 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "302797298052", + "project_id": "various-funny-sounds", + "storage_bucket": "various-funny-sounds.appspot.com" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:302797298052:android:853a3ab1d40f7a7b1b25d1", + "android_client_info": { + "package_name": "com.various.funny.sounds.audio" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyBbjKvStdaHM10KbT38jJoiMgrPA3IoVGw" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/src/main/java/com/various/funny/sounds/audio/VariousFunnySounds.kt b/app/src/main/java/com/various/funny/sounds/audio/VariousFunnySounds.kt index f597d3e..fbe15e5 100644 --- a/app/src/main/java/com/various/funny/sounds/audio/VariousFunnySounds.kt +++ b/app/src/main/java/com/various/funny/sounds/audio/VariousFunnySounds.kt @@ -1,6 +1,12 @@ package com.various.funny.sounds.audio +import android.annotation.SuppressLint import android.app.Application +import android.content.Intent +import android.util.Log +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.applovin.sdk.AppLovinSdk +import com.applovin.sdk.AppLovinSdkInitializationConfiguration import com.various.funny.sounds.audio.db.MyRoomBase import com.various.funny.sounds.audio.helper.ComUtils import kotlinx.coroutines.CoroutineScope @@ -11,16 +17,21 @@ class VariousFunnySounds : Application() { companion object { lateinit var appContext: VariousFunnySounds - + const val MAX_SDK = "3cUMfTcsZKzlJevxK4IkNysgDAeQA4B5w332p3g8B9ZAgC54WQNZLVxuxnCx4sCHA5StLJnDTAFa68mFTi8rd8" + const val MAX_Provider = "max" + const val MAX_INIT_SDK_ACTION = "init_sdk_success" + var initSDkOk = false } override fun onCreate() { super.onCreate() appContext = this + MAXSDK() getData() } + @SuppressLint("SuspiciousIndentation") private fun getData() { val open = assets.open("resource_target.json") CoroutineScope(Dispatchers.IO).launch { @@ -30,7 +41,16 @@ class VariousFunnySounds : Application() { } } - - + } + private fun MAXSDK(){ + val initConfig = + AppLovinSdkInitializationConfiguration.builder(MAX_SDK, this) + .setMediationProvider(MAX_Provider) + .build() + AppLovinSdk.getInstance(this).initialize(initConfig) { + initSDkOk = true + LocalBroadcastManager.getInstance(this).sendBroadcast(Intent(MAX_INIT_SDK_ACTION)) + } + AppLovinSdk.getInstance(this).settings.setVerboseLogging(true) } } \ No newline at end of file diff --git a/app/src/main/java/com/various/funny/sounds/audio/max/MaxListener.java b/app/src/main/java/com/various/funny/sounds/audio/max/MaxListener.java new file mode 100644 index 0000000..b9e165c --- /dev/null +++ b/app/src/main/java/com/various/funny/sounds/audio/max/MaxListener.java @@ -0,0 +1,9 @@ +package com.various.funny.sounds.audio.max; + +import com.applovin.mediation.MaxAd; + +public interface MaxListener { + void onFail(MaxAd ad); + void onSuccess(); + void onHidden( ); +} diff --git a/app/src/main/java/com/various/funny/sounds/audio/max/MaxManager.java b/app/src/main/java/com/various/funny/sounds/audio/max/MaxManager.java new file mode 100644 index 0000000..0abce18 --- /dev/null +++ b/app/src/main/java/com/various/funny/sounds/audio/max/MaxManager.java @@ -0,0 +1,82 @@ +package com.various.funny.sounds.audio.max; + +import android.app.Activity; +import android.util.Log; + +import androidx.annotation.NonNull; + +import com.applovin.mediation.MaxAd; +import com.applovin.mediation.MaxAdListener; +import com.applovin.mediation.MaxError; +import com.applovin.mediation.ads.MaxInterstitialAd; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class MaxManager { + + private static final String id_1 = "d6fa375e3d84dbfc"; + private static final String id_2 = "8f6d9428116466c8"; + private static final String id_3 = "b8c94caf5277e32a"; + + public static MaxInterstitialAd checkCacheAd(List list) { + Collections.shuffle(list); + for (MaxInterstitialAd ad : list) { + if (ad.isReady()) { + return ad; + } + } + return null; + } + + public static void setMaxListener(MaxInterstitialAd ad, MaxListener maxListener) { + ad.setListener(new MaxAdListener() { + @Override + public void onAdLoaded(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdDisplayed(@NonNull MaxAd maxAd) { + maxListener.onSuccess(); + } + + @Override + public void onAdHidden(@NonNull MaxAd maxAd) { + maxListener.onHidden(); + } + + @Override + public void onAdClicked(@NonNull MaxAd maxAd) { + + } + + @Override + public void onAdLoadFailed(@NonNull String s, @NonNull MaxError maxError) { + + } + + @Override + public void onAdDisplayFailed(@NonNull MaxAd maxAd, @NonNull MaxError maxError) { + maxListener.onFail(maxAd); + } + }); + + } + + + public static List loadAd(Activity activity) { + MaxInterstitialAd Ad1 = new MaxInterstitialAd(id_1, activity); + Ad1.loadAd(); + MaxInterstitialAd Ad2 = new MaxInterstitialAd(id_2, activity); + Ad2.loadAd(); + MaxInterstitialAd Ad3 = new MaxInterstitialAd(id_3, activity); + Ad3.loadAd(); + ArrayList maxInterstitialAds = new ArrayList<>(); + maxInterstitialAds.add(Ad1); + maxInterstitialAds.add(Ad2); + maxInterstitialAds.add(Ad3); + return maxInterstitialAds; + } +} diff --git a/app/src/main/java/com/various/funny/sounds/audio/ui/activity/OpenActivity.kt b/app/src/main/java/com/various/funny/sounds/audio/ui/activity/OpenActivity.kt index ae75f0a..f29b7d5 100644 --- a/app/src/main/java/com/various/funny/sounds/audio/ui/activity/OpenActivity.kt +++ b/app/src/main/java/com/various/funny/sounds/audio/ui/activity/OpenActivity.kt @@ -1,31 +1,90 @@ package com.various.funny.sounds.audio.ui.activity +import android.content.BroadcastReceiver +import android.content.Context import android.content.Intent +import android.content.IntentFilter import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.os.CountDownTimer +import android.util.Log import android.view.View import android.view.WindowManager +import androidx.localbroadcastmanager.content.LocalBroadcastManager +import com.applovin.mediation.MaxAd +import com.applovin.mediation.ads.MaxInterstitialAd import com.various.funny.sounds.audio.R +import com.various.funny.sounds.audio.VariousFunnySounds +import com.various.funny.sounds.audio.max.MaxListener +import com.various.funny.sounds.audio.max.MaxManager class OpenActivity : AppCompatActivity() { + private lateinit var listAd: List + private lateinit var countDownTimer: CountDownTimer + + private var needShowAd = true override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_open) initStatusBar() - val countDownTimer = object : CountDownTimer(2000, 1000) { + countDownTimer = object : CountDownTimer(12000, 500) { override fun onTick(millisUntilFinished: Long) { - + if (needShowAd) { + startShowAd {} + } } override fun onFinish() { - startActivity(Intent(this@OpenActivity, HomeActivity::class.java)) + if (needShowAd) { + startShowAd { + startActivity(Intent(this@OpenActivity, HomeActivity::class.java)) + } + } } - } + checkAd() + } + private fun checkAd() { + if (!VariousFunnySounds.initSDkOk) { + LocalBroadcastManager.getInstance(this).registerReceiver(object : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + initAd() + } + }, IntentFilter(VariousFunnySounds.MAX_INIT_SDK_ACTION)) + } else { + initAd() + } + } + + private fun initAd() { + listAd = MaxManager.loadAd(this@OpenActivity) countDownTimer.start() } + private fun startShowAd(action: () -> Unit) { + val checkCacheAd = MaxManager.checkCacheAd(listAd) + if (checkCacheAd == null) { + action.invoke() + } else { + needShowAd = false + MaxManager.setMaxListener(checkCacheAd, object : MaxListener { + override fun onFail(ad: MaxAd?) { + startActivity(Intent(this@OpenActivity, HomeActivity::class.java)) + } + + override fun onSuccess() { + + } + + override fun onHidden() { + startActivity(Intent(this@OpenActivity, HomeActivity::class.java)) + } + + }) + checkCacheAd.showAd() + } + } + private fun initStatusBar() { val flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR diff --git a/app/src/main/java/com/various/funny/sounds/audio/ui/activity/PlayActivity.kt b/app/src/main/java/com/various/funny/sounds/audio/ui/activity/PlayActivity.kt index 8df6617..d492360 100644 --- a/app/src/main/java/com/various/funny/sounds/audio/ui/activity/PlayActivity.kt +++ b/app/src/main/java/com/various/funny/sounds/audio/ui/activity/PlayActivity.kt @@ -7,12 +7,16 @@ import android.view.WindowManager import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.view.isVisible +import com.applovin.mediation.MaxAd +import com.applovin.mediation.ads.MaxInterstitialAd import com.bumptech.glide.Glide import com.various.funny.sounds.audio.R import com.various.funny.sounds.audio.data.NewBeanChild import com.various.funny.sounds.audio.databinding.ActivityPlayBinding import com.various.funny.sounds.audio.db.MyRoomBase import com.various.funny.sounds.audio.helper.ComUtils +import com.various.funny.sounds.audio.max.MaxListener +import com.various.funny.sounds.audio.max.MaxManager import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -28,10 +32,11 @@ class PlayActivity : AppCompatActivity(), View.OnClickListener { private var mediaPlayer: MediaPlayer? = null private var isDownload = false - + private lateinit var listAds: List private lateinit var newBeanChild: NewBeanChild override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + listAds = MaxManager.loadAd(this@PlayActivity) playBinding = ActivityPlayBinding.inflate(layoutInflater) setContentView(playBinding.root) initStatusBar() @@ -61,15 +66,7 @@ class PlayActivity : AppCompatActivity(), View.OnClickListener { override fun onClick(v: View?) { when (v) { playBinding.imPlay -> { - if(isDownload) { - playBinding.imPlay.isSelected = !playBinding.imPlay.isSelected - play() - }else{ - playBinding.progressbar.isVisible = true - startDownload() - } - - + showAd() } playBinding.iconBack -> { @@ -88,6 +85,16 @@ class PlayActivity : AppCompatActivity(), View.OnClickListener { } + private fun playAction() { + if (isDownload) { + playBinding.imPlay.isSelected = !playBinding.imPlay.isSelected + play() + } else { + playBinding.progressbar.isVisible = true + startDownload() + } + } + private fun initMediaPlayer() { mediaPlayer = MediaPlayer() mediaPlayer?.isLooping = true @@ -106,7 +113,8 @@ class PlayActivity : AppCompatActivity(), View.OnClickListener { if (file == null) { isDownload = false playBinding.imPlay.isSelected = false - Toast.makeText(this@PlayActivity, getString(R.string.sorry), Toast.LENGTH_SHORT).show() + Toast.makeText(this@PlayActivity, getString(R.string.sorry), Toast.LENGTH_SHORT) + .show() playBinding.progressbar.isVisible = false } else { playBinding.progressbar.isVisible = false @@ -137,6 +145,30 @@ class PlayActivity : AppCompatActivity(), View.OnClickListener { } } + private fun showAd() { + val checkCacheAd = MaxManager.checkCacheAd(listAds) + if (checkCacheAd != null) { + MaxManager.setMaxListener(checkCacheAd, object : MaxListener { + override fun onFail(ad: MaxAd?) { + playAction() + + } + + override fun onSuccess() { + + } + + override fun onHidden() { + playAction() + + } + + }) + checkCacheAd.showAd() + } else { + playAction() + } + } override fun onDestroy() { super.onDestroy() diff --git a/app/src/main/java/com/various/funny/sounds/audio/ui/activity/SourceActivity.kt b/app/src/main/java/com/various/funny/sounds/audio/ui/activity/SourceActivity.kt index 3578c71..7ada59d 100644 --- a/app/src/main/java/com/various/funny/sounds/audio/ui/activity/SourceActivity.kt +++ b/app/src/main/java/com/various/funny/sounds/audio/ui/activity/SourceActivity.kt @@ -2,54 +2,101 @@ package com.various.funny.sounds.audio.ui.activity import androidx.appcompat.app.AppCompatActivity import android.os.Bundle +import android.util.Log import android.view.View import android.view.WindowManager import androidx.lifecycle.ViewModelProvider import androidx.recyclerview.widget.GridLayoutManager +import com.applovin.mediation.MaxAd +import com.applovin.mediation.ads.MaxInterstitialAd import com.various.funny.sounds.audio.databinding.ActivitySourceBinding import com.various.funny.sounds.audio.helper.ComUtils import com.various.funny.sounds.audio.helper.ItemSpace +import com.various.funny.sounds.audio.max.MaxListener +import com.various.funny.sounds.audio.max.MaxManager import com.various.funny.sounds.audio.ui.adapter.SourceAdapter class SourceActivity : AppCompatActivity() { private lateinit var sourceBinding: ActivitySourceBinding - private lateinit var mAdapter:SourceAdapter + private lateinit var mAdapter: SourceAdapter private lateinit var viewModel: SourceViewModel - companion object{ + + companion object { val INTENT_KEY_ID = "key_class_id" } - private lateinit var id:String + private lateinit var id: String + private lateinit var listAds: List override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + listAds = MaxManager.loadAd(this@SourceActivity) + sourceBinding = ActivitySourceBinding.inflate(layoutInflater) setContentView(sourceBinding.root) id = intent.getStringExtra(INTENT_KEY_ID)!! viewModel = ViewModelProvider(this)[SourceViewModel::class.java] viewModel.query(id) mAdapter = SourceAdapter(this@SourceActivity) - viewModel.getList().observe(this){ + viewModel.getList().observe(this) { mAdapter.updateData(it) } initStatusBar() onInitSource() sourceBinding.iconBack.setOnClickListener { - finish() + showAd(true) } } - private fun onInitSource(){ - val i = ComUtils.getScreenWidthPx() - ComUtils.dpToPx(110f)*3 + + override fun onBackPressed() { + super.onBackPressed() + showAd(false) + } + + private fun showAd(needFinish: Boolean) { + val checkCacheAd = MaxManager.checkCacheAd(listAds) + if (checkCacheAd != null) { + MaxManager.setMaxListener(checkCacheAd, object : MaxListener { + override fun onFail(ad: MaxAd?) { + if (needFinish) { + finish() + } + + } + + override fun onSuccess() { + + } + + override fun onHidden() { + if (needFinish) { + finish() + } + + } + + }) + checkCacheAd.showAd() + } else { + if (needFinish) { + finish() + } + } + } + + private fun onInitSource() { + val i = ComUtils.getScreenWidthPx() - ComUtils.dpToPx(110f) * 3 val spacePx = i / 4 sourceBinding.recyclerViewSource.run { adapter = mAdapter - layoutManager = GridLayoutManager(this@SourceActivity,3) + layoutManager = GridLayoutManager(this@SourceActivity, 3) addItemDecoration(ItemSpace(spacePx)) - setPadding(spacePx,ComUtils.dpToPx(6f),0,0) + setPadding(spacePx, ComUtils.dpToPx(6f), 0, 0) } } - private fun initStatusBar(){ + + private fun initStatusBar() { val flags = window.decorView.systemUiVisibility or View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.decorView.systemUiVisibility = flags xor View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS) diff --git a/app/src/main/res/layout/activity_open.xml b/app/src/main/res/layout/activity_open.xml index c16540f..9331af6 100644 --- a/app/src/main/res/layout/activity_open.xml +++ b/app/src/main/res/layout/activity_open.xml @@ -4,11 +4,12 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - android:paddingTop="25dp" android:background="@mipmap/home_background" + android:paddingTop="25dp" tools:context=".ui.activity.OpenActivity"> + + \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 1bc1d16..22afa97 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,4 +2,12 @@ plugins { id("com.android.application") version "8.1.3" apply false id("org.jetbrains.kotlin.android") version "1.9.0" apply false + id("com.google.gms.google-services") version "4.3.15" apply false + id ("com.google.firebase.crashlytics") version "2.9.2" apply false +} + +buildscript{ + dependencies{ + classpath("com.applovin.quality:AppLovinQualityServiceGradlePlugin:+") + } } \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 24448bb..4e3a3bf 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -3,6 +3,7 @@ pluginManagement { google() mavenCentral() gradlePluginPortal() + maven{url = uri("https://artifacts.applovin.com/android")} } } dependencyResolutionManagement { @@ -10,6 +11,7 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + maven ("https://artifact.bytedance.com/repository/pangle") } }