V1.0.1(2) 广告版本更新

This commit is contained in:
litingting 2024-04-23 17:34:58 +08:00
parent 354b2298db
commit daf5698a99
12 changed files with 343 additions and 31 deletions

1
.gitignore vendored
View File

@ -15,3 +15,4 @@
local.properties
.idea/
app/release/
.safedk/

View File

@ -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")
}

29
app/google-services.json Normal file
View File

@ -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"
}

View File

@ -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)
}
}

View File

@ -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( );
}

View File

@ -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<MaxInterstitialAd> 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<MaxInterstitialAd> 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<MaxInterstitialAd> maxInterstitialAds = new ArrayList<>();
maxInterstitialAds.add(Ad1);
maxInterstitialAds.add(Ad2);
maxInterstitialAds.add(Ad3);
return maxInterstitialAds;
}
}

View File

@ -1,29 +1,88 @@
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<MaxInterstitialAd>
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() {
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()
}
countDownTimer.start()
}
private fun initStatusBar() {

View File

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

View File

@ -2,13 +2,18 @@ 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() {
@ -16,13 +21,17 @@ class SourceActivity : AppCompatActivity() {
private lateinit var mAdapter: SourceAdapter
private lateinit var viewModel: SourceViewModel
companion object {
val INTENT_KEY_ID = "key_class_id"
}
private lateinit var id: String
private lateinit var listAds: List<MaxInterstitialAd>
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)!!
@ -35,9 +44,46 @@ class SourceActivity : AppCompatActivity() {
initStatusBar()
onInitSource()
sourceBinding.iconBack.setOnClickListener {
showAd(true)
}
}
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
@ -49,6 +95,7 @@ class SourceActivity : AppCompatActivity() {
setPadding(spacePx, ComUtils.dpToPx(6f), 0, 0)
}
}
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

View File

@ -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">
<ImageView
android:id="@+id/image"
android:layout_width="206dp"
android:layout_height="206dp"
android:layout_marginTop="220dp"
@ -17,4 +18,13 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:indeterminateTint="@color/white"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toBottomOf="@id/image" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -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:+")
}
}

View File

@ -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")
}
}