From e2588fde548089c2372730242fe4d4399aacd4c4 Mon Sep 17 00:00:00 2001 From: litingting Date: Thu, 13 Nov 2025 10:07:49 +0800 Subject: [PATCH] V1.1(2)TradPlus --- app/build.gradle.kts | 110 +++++++++- app/google-services.json | 29 +++ .../UpLoadLibrary_07_03_11_54-release.aar | Bin 0 -> 19887 bytes app/proguard-rules.pro | 5 +- app/src/main/AndroidManifest.xml | 9 +- .../main/java/com/prank/funky/voice/App.kt | 4 + .../com/prank/funky/voice/ad/AdListener.kt | 11 + .../funky/voice/ad/MetaFacebookLDUHelper.kt | 51 +++++ .../com/prank/funky/voice/ad/TPManager.kt | 206 ++++++++++++++++++ .../voice/collection/CollectionActivity.kt | 3 +- .../voice/playSounds/PlaySoundsActivity.kt | 47 ++-- .../voice/recordSounds/CustomActivity.kt | 3 +- .../funky/voice/soundsList/ListActivity.kt | 2 + .../funky/voice/welcome/WelcomeActivity.kt | 159 ++++++++++++-- app/src/main/res/xml/net.xml | 6 + build.gradle.kts | 5 +- gradle.properties | 2 +- settings.gradle.kts | 20 ++ 18 files changed, 624 insertions(+), 48 deletions(-) create mode 100644 app/google-services.json create mode 100644 app/libs/UpLoadLibrary_07_03_11_54-release.aar create mode 100644 app/src/main/java/com/prank/funky/voice/ad/AdListener.kt create mode 100644 app/src/main/java/com/prank/funky/voice/ad/MetaFacebookLDUHelper.kt create mode 100644 app/src/main/java/com/prank/funky/voice/ad/TPManager.kt create mode 100644 app/src/main/res/xml/net.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 6e2c4a9..f822be9 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -5,18 +5,20 @@ plugins { alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.compose) id("io.objectbox") + id("com.google.gms.google-services") + id("com.google.firebase.crashlytics") } val timestamp = SimpleDateFormat("MM_dd_HH_mm").format(Date()) android { namespace = "com.prank.funky.voice" - compileSdk = 35 + compileSdk = 36 defaultConfig { applicationId = "com.prank.funky.voice" minSdk = 24 - targetSdk = 35 - versionCode = 1 - versionName = "1.0" + targetSdk = 36 + versionCode = 2 + versionName = "1.1" setProperty("archivesBaseName", "FunkyVoice_V" + versionName + "(${versionCode})_$timestamp") testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } @@ -30,12 +32,16 @@ android { ) } } +// compileOptions { +// sourceCompatibility = JavaVersion.VERSION_11 +// targetCompatibility = JavaVersion.VERSION_11 +// } compileOptions { - sourceCompatibility = JavaVersion.VERSION_11 - targetCompatibility = JavaVersion.VERSION_11 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { - jvmTarget = "11" + jvmTarget = "1.8" } buildFeatures { viewBinding = true @@ -63,5 +69,93 @@ dependencies { androidTestImplementation(libs.androidx.ui.test.junit4) debugImplementation(libs.androidx.ui.tooling) debugImplementation(libs.androidx.ui.test.manifest) - implementation ("com.github.bumptech.glide:glide:4.16.0") + implementation ("com.github.bumptech.glide:glide:5.0.5") + + implementation(files("libs/UpLoadLibrary_07_03_11_54-release.aar")) + implementation ("com.squareup.okhttp3:okhttp:4.12.0") + implementation("com.squareup.okhttp3:logging-interceptor:4.12.0") + + + implementation(platform("com.google.firebase:firebase-bom:33.7.0")) + // When using the BoM, you don't specify versions in Firebase library dependencies + // Add the dependency for the Firebase SDK for Google Analytics + implementation("com.google.firebase:firebase-analytics") + implementation("com.google.firebase:firebase-crashlytics") + implementation("com.google.firebase:firebase-config") + + + // TradPlus + implementation("com.tradplusad:tradplus:14.5.0.1") + //noinspection GradleCompatible + implementation("androidx.legacy:legacy-support-v4:1.0.0") + implementation("androidx.appcompat:appcompat:1.3.0-alpha02") + // Meta + implementation("com.facebook.android:audience-network-sdk:6.20.0") + implementation("com.tradplusad:tradplus-facebook:1.14.5.0.1") + // Applovin + implementation("com.applovin:applovin-sdk:13.3.1") + implementation("com.tradplusad:tradplus-applovin:9.14.5.0.1") + implementation("com.google.android.gms:play-services-ads-identifier:18.2.0") + // Ironsource + implementation("com.ironsource.sdk:mediationsdk:8.10.0") + implementation("com.tradplusad:tradplus-ironsource:10.14.5.0.1") + implementation("com.google.android.gms:play-services-appset:16.0.0") + implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") + implementation("com.google.android.gms:play-services-basement:17.5.0") + // Adcolony + implementation("com.adcolony:sdk:4.8.0") + implementation("com.tradplusad:tradplus-adcolony:4.14.5.0.1") + implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") + // Pangle + implementation("com.tradplusad:tradplus-pangle:19.14.5.0.1") + implementation("com.pangle.global:pag-sdk:7.3.0.3") + // UnityAds + implementation("com.tradplusad:tradplus-unity:5.14.5.0.1") + implementation("com.unity3d.ads:unity-ads:4.15.1") + // Chartboost + implementation("com.tradplusad:tradplus-chartboostx:15.14.5.0.1") + implementation("com.chartboost:chartboost-sdk:9.8.3") + implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") + implementation("com.google.android.gms:play-services-base:17.4.0") + // Inmobi + implementation("com.tradplusad:tradplus-inmobix:23.14.5.0.1") + implementation("com.inmobi.monetization:inmobi-ads-kotlin:10.8.3") + implementation("androidx.core:core-ktx:1.5.0") + implementation("com.inmobi.omsdk:inmobi-omsdk:1.5.2.0") + // Fyber + implementation("com.fyber:marketplace-sdk:8.3.7") + implementation("com.tradplusad:tradplus-fyber:24.14.5.0.1") + implementation("com.google.android.gms:play-services-ads-identifier:17.0.0") + implementation("com.google.android.gms:play-services-base:17.4.0") + // Start.io + implementation("com.startapp:inapp-sdk:5.2.3") + implementation("com.tradplusad:tradplus-startapp:28.14.5.0.1") + // Mintegral + implementation("com.tradplusad:tradplus-mintegralx_overseas:18.14.5.0.1") + implementation("androidx.recyclerview:recyclerview:1.1.0") + implementation("com.mbridge.msdk.oversea:mbridge_android_sdk:16.9.71") + // Liftoff + implementation("com.tradplusad:tradplus-vunglex:7.14.5.0.1") + implementation("com.vungle:vungle-ads:7.5.0") + // Yandex + implementation("com.yandex.android:mobileads:7.13.0") { + exclude(group = "com.caverock", module = "androidsvg-aar") + } + implementation("com.tradplusad:tradplus-yandex:50.14.6.10.1") + // Bigo + implementation("com.bigossp:bigo-ads:5.4.0") + implementation("com.tradplusad:tradplus-bigo:57.14.5.0.1") + // Cross Promotion + implementation("com.tradplusad:tradplus-crosspromotion:27.14.5.0.1") + // TP Exchange + // 请注意保持与主包版本同步更新 + implementation("com.google.code.gson:gson:2.8.6") + implementation("com.tradplusad:tp_exchange:40.14.5.0.1") + + + // TradPlus Tools +// implementation("com.tradplusad:tradplus-tool:1.1.4") + + // Google UMP + implementation ("com.google.android.ump:user-messaging-platform:3.2.0") } \ No newline at end of file diff --git a/app/google-services.json b/app/google-services.json new file mode 100644 index 0000000..73ef4d2 --- /dev/null +++ b/app/google-services.json @@ -0,0 +1,29 @@ +{ + "project_info": { + "project_number": "1098450660647", + "project_id": "funky-voice", + "storage_bucket": "funky-voice.firebasestorage.app" + }, + "client": [ + { + "client_info": { + "mobilesdk_app_id": "1:1098450660647:android:ced86a0bca6189b26acd02", + "android_client_info": { + "package_name": "com.prank.funky.voice" + } + }, + "oauth_client": [], + "api_key": [ + { + "current_key": "AIzaSyCm8ET5NhcGvRLEmeEarGYNgwthaqPffeg" + } + ], + "services": { + "appinvite_service": { + "other_platform_oauth_client": [] + } + } + } + ], + "configuration_version": "1" +} \ No newline at end of file diff --git a/app/libs/UpLoadLibrary_07_03_11_54-release.aar b/app/libs/UpLoadLibrary_07_03_11_54-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..5a50672d4163d99bab2c87853bdd1fba74e1b59e GIT binary patch literal 19887 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...); ; -} \ No newline at end of file +} + +-keep public class com.tradplus.** { *; } +-keep class com.tradplus.ads.** { *; } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 39397c0..fe509fa 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,7 @@ - + - + + diff --git a/app/src/main/java/com/prank/funky/voice/App.kt b/app/src/main/java/com/prank/funky/voice/App.kt index 3d11e01..9fc5a17 100644 --- a/app/src/main/java/com/prank/funky/voice/App.kt +++ b/app/src/main/java/com/prank/funky/voice/App.kt @@ -4,6 +4,7 @@ import android.app.Application import com.prank.funky.voice.objectBox.DbBaseFunction import com.prank.funky.voice.objectBox.EntitySounds import com.prank.funky.voice.utils.Util +import com.up.uploadlibrary.UpLoadManager import java.io.IOException import java.util.Collections @@ -18,6 +19,9 @@ class App : Application() { super.onCreate() mApp = this DbBaseFunction.init(this) + + UpLoadManager.init(this,TAG) + if (entitySoundsList != null) return try { val open = getAssets().open("pranksounds.json") diff --git a/app/src/main/java/com/prank/funky/voice/ad/AdListener.kt b/app/src/main/java/com/prank/funky/voice/ad/AdListener.kt new file mode 100644 index 0000000..7a89941 --- /dev/null +++ b/app/src/main/java/com/prank/funky/voice/ad/AdListener.kt @@ -0,0 +1,11 @@ +package com.prank.funky.voice.ad + +interface AdListener { + + fun loadFail(){} + fun showSuccess(){} + + fun showFail(){} + + fun showClose(){} +} \ No newline at end of file diff --git a/app/src/main/java/com/prank/funky/voice/ad/MetaFacebookLDUHelper.kt b/app/src/main/java/com/prank/funky/voice/ad/MetaFacebookLDUHelper.kt new file mode 100644 index 0000000..bde3cf5 --- /dev/null +++ b/app/src/main/java/com/prank/funky/voice/ad/MetaFacebookLDUHelper.kt @@ -0,0 +1,51 @@ +package com.prank.funky.voice.ad + + + +import android.content.Context +import android.location.Geocoder +import android.util.Log +import com.facebook.ads.AdSettings + +import java.util.Locale + +object MetaFacebookLDUHelper { + + private const val TAG = "FacebookLDU" + + /** + * 检查用户是否在加州,并启用 LDU + */ + fun checkAndEnableLDU(context: Context) { + try { + val geocoder = Geocoder(context, Locale.getDefault()) + val locationList = geocoder.getFromLocationName("California, USA", 1) + + if (!locationList.isNullOrEmpty()) { + enableLDUForCalifornia() + } else { + disableLDU() + } + } catch (e: Exception) { + enableLDUForCalifornia() + } + } + + /** + * 启用加州 LDU 模式 + * country = 1 表示美国 + * state = 1000 表示加州 + */ + fun enableLDUForCalifornia() { + AdSettings.setDataProcessingOptions(arrayOf("LDU"), 1, 1000) + Log.d(TAG, "Facebook LDU 已启用 (加州用户)") + } + + /** + * 禁用 LDU 模式(恢复默认) + */ + private fun disableLDU() { + AdSettings.setDataProcessingOptions(emptyArray()) + Log.d(TAG, "Facebook LDU 已关闭 (非加州用户)") + } +} diff --git a/app/src/main/java/com/prank/funky/voice/ad/TPManager.kt b/app/src/main/java/com/prank/funky/voice/ad/TPManager.kt new file mode 100644 index 0000000..2ed927c --- /dev/null +++ b/app/src/main/java/com/prank/funky/voice/ad/TPManager.kt @@ -0,0 +1,206 @@ +package com.prank.funky.voice.ad + +import android.app.Activity +import android.os.CountDownTimer +import android.util.Log +import com.tradplus.ads.base.bean.TPAdError +import com.tradplus.ads.base.bean.TPAdInfo +import com.tradplus.ads.open.interstitial.InterstitialAdListener +import com.tradplus.ads.open.interstitial.TPInterstitial + + +object TPManager { + + + const val type_no_cache = 0 + const val type_has_cache = 1 + const val type_show_success = 2 + const val type_show_close = 3 + const val type_show_fail = 4 + + + + const val place1Id = "CD5465E02C6A7D6E59F2B0F7A3872812" + const val place2Id = "995A5D9A0301959DEC2A1F0C896DE312" + const val place3Id = "AD1B17B176B83EC76EEDAD044E23BA12" + + + var place1LoadFail = false + var place2LoadFail = false + var place3LoadFail = false + + val list = mutableListOf() + + val mTAG = "TP AD" + + + fun loadAllAd(activity: Activity) { + if (list.size <= 0) { + place1LoadFail = false + place2LoadFail = false + place3LoadFail = false + val mInterstitialAd1 = TPInterstitial(activity, place1Id) + val mInterstitialAd2 = TPInterstitial(activity, place2Id) + val mInterstitialAd3 = TPInterstitial(activity, place3Id) + list.add(mInterstitialAd1) + list.add(mInterstitialAd2) + list.add(mInterstitialAd3) + } + for (ad in list) { + if (!ad.isReady) { + setCallBack(ad, object : AdListener { + override fun loadFail() { + + } + }) + ad.loadAd() + } + } + } + + + fun getReadyAd(): TPInterstitial? { + list.shuffle() + for (ad in list) { + if (ad.isReady) { + Log.d(mTAG, "-cache------------") + return ad + } + } + return null + } + + + fun showWelcomeAd( + activity: Activity, + totalTim: Long, + countAction: (millisUntilFinished: Long) -> Unit, + goMain: () -> Unit + ): CountDownTimer { + var alreadyShow = false + var timer: CountDownTimer? = null + timer = object : CountDownTimer(totalTim, 100) { + override fun onTick(millisUntilFinished: Long) { + countAction(millisUntilFinished) + Log.d(mTAG, "onTick ${Thread.currentThread().name} timer=${timer}") + if (!alreadyShow) { + showCheck(activity) { + if (it == type_has_cache) { + alreadyShow = true + } + if (it == type_show_close || it == type_show_fail) { + Log.d( + mTAG, + "goMain 111 ${Thread.currentThread().name} " + ) + goMain() + } + + } + } + } + + override fun onFinish() { + Log.d(mTAG, "onFinish() ${Thread.currentThread().name} ") + if (!alreadyShow) { + showCheck(activity) { + if (it == type_show_close || it == type_show_fail || it == type_no_cache) { + Log.d( + mTAG, + "goMain 222 ${Thread.currentThread().name} " + ) + goMain() + } + } + } + } + } + return timer + } + + + private fun setCallBack(ad: TPInterstitial, listener: AdListener) { + ad.setAdListener(object : InterstitialAdListener { + override fun onAdLoaded(p0: TPAdInfo?) { + Log.d(mTAG, "----onAdLoaded ${p0?.tpAdUnitId}") + + } + + override fun onAdFailed(p0: TPAdError?) { + listener.loadFail() + Log.d(mTAG, "----onAdFailed code=${p0?.errorCode} msg=${p0?.errorMsg}") + } + + override fun onAdImpression(p0: TPAdInfo?) { + listener.showSuccess() + Log.d(mTAG, "----onAdImpression ${p0?.tpAdUnitId}") + } + + override fun onAdClicked(p0: TPAdInfo?) { + + } + + override fun onAdClosed(p0: TPAdInfo?) { + listener.showClose() + } + + override fun onAdVideoError( + p0: TPAdInfo?, + p1: TPAdError? + ) { + + } + + override fun onAdVideoStart(p0: TPAdInfo?) { + + } + + override fun onAdVideoEnd(p0: TPAdInfo?) { + + } + + + }) + } + + + private fun showCheck(activity: Activity, action: (type: Int) -> Unit) { + val readyAd = getReadyAd() + if (readyAd != null) { + Log.d(mTAG, "readyAd ") + action(type_has_cache) + setCallBack(readyAd, object : AdListener { + override fun loadFail() { + + } + + override fun showSuccess() { + action(type_show_success) + } + + override fun showFail() { + action(type_show_fail) + } + + override fun showClose() { + action(type_show_close) + } + + }) + if (readyAd.isReady) { + readyAd.showAd(activity, null) + } + } else { + action(type_no_cache) + } + } + + + fun showTPAD(activity: Activity, listener: () -> Unit) { + showCheck(activity) { type -> + if (type == type_no_cache || type == type_show_close || type == type_show_fail) { + listener() + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/prank/funky/voice/collection/CollectionActivity.kt b/app/src/main/java/com/prank/funky/voice/collection/CollectionActivity.kt index a0485c1..f5c687f 100644 --- a/app/src/main/java/com/prank/funky/voice/collection/CollectionActivity.kt +++ b/app/src/main/java/com/prank/funky/voice/collection/CollectionActivity.kt @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.prank.funky.voice.utils.RecyclerSpace import com.prank.funky.voice.R +import com.prank.funky.voice.ad.TPManager import com.prank.funky.voice.utils.Util import com.prank.funky.voice.objectBox.DbBaseFunction import com.prank.funky.voice.playSounds.PlaySoundsActivity @@ -51,7 +52,7 @@ class CollectionActivity : AppCompatActivity() { insets } findViewById(R.id.framelayout_back).setOnClickListener { finish() } - + TPManager.showTPAD(this@CollectionActivity) { } recyclerView = findViewById(R.id.favorite_recyclerview) emptyLayout = findViewById(R.id.empty_favorite) diff --git a/app/src/main/java/com/prank/funky/voice/playSounds/PlaySoundsActivity.kt b/app/src/main/java/com/prank/funky/voice/playSounds/PlaySoundsActivity.kt index 3041127..627d1bc 100644 --- a/app/src/main/java/com/prank/funky/voice/playSounds/PlaySoundsActivity.kt +++ b/app/src/main/java/com/prank/funky/voice/playSounds/PlaySoundsActivity.kt @@ -24,6 +24,7 @@ import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.bumptech.glide.Glide import com.prank.funky.voice.R +import com.prank.funky.voice.ad.TPManager import com.prank.funky.voice.utils.Util import com.prank.funky.voice.objectBox.DbBaseFunction import com.prank.funky.voice.objectBox.EntitySoundsDetail @@ -69,10 +70,14 @@ class PlaySoundsActivity : AppCompatActivity() { insets } + onBackPressedDispatcher.addCallback(this, object : OnBackPressedCallback(true) { override fun handleOnBackPressed() { Util.showLog("-----------handleOnBackPressed") - backIntent() + TPManager.showTPAD(this@PlaySoundsActivity) { + backIntent() + } + } @@ -153,7 +158,10 @@ class PlaySoundsActivity : AppCompatActivity() { private fun setAllClick() { findViewById(R.id.framelayout_back).setOnClickListener { Util.showLog("-----------finish") - backIntent() + TPManager.showTPAD(this@PlaySoundsActivity) { + backIntent() + } + } favoriteLayout.setOnClickListener { @@ -189,26 +197,29 @@ class PlaySoundsActivity : AppCompatActivity() { clockTimer?.showDown(timerLayout) } playSoundsBtn.setOnClickListener { view -> - mediaPlayer?.let { - if (playSoundsBtn.isSelected) { - if (it.isPlaying) { - it.pause() - isPause = true - playAnime.pauseRipple() - } - } else { - if (!it.isPlaying) { - it.start() - if (isPause) { - playAnime.resumeRipple() - } else { - playAnime.startRipple() + + TPManager.showTPAD(this@PlaySoundsActivity) { + mediaPlayer?.let { + if (playSoundsBtn.isSelected) { + if (it.isPlaying) { + it.pause() + isPause = true + playAnime.pauseRipple() + } + } else { + if (!it.isPlaying) { + it.start() + if (isPause) { + playAnime.resumeRipple() + } else { + playAnime.startRipple() + } + isPause = false } - isPause = false } } + playSoundsBtn.setSelected(!playSoundsBtn.isSelected) } - playSoundsBtn.setSelected(!playSoundsBtn.isSelected) } } diff --git a/app/src/main/java/com/prank/funky/voice/recordSounds/CustomActivity.kt b/app/src/main/java/com/prank/funky/voice/recordSounds/CustomActivity.kt index c10d6f9..ad958f6 100644 --- a/app/src/main/java/com/prank/funky/voice/recordSounds/CustomActivity.kt +++ b/app/src/main/java/com/prank/funky/voice/recordSounds/CustomActivity.kt @@ -17,6 +17,7 @@ import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.prank.funky.voice.utils.RecyclerSpace import com.prank.funky.voice.R +import com.prank.funky.voice.ad.TPManager import com.prank.funky.voice.utils.Util import com.prank.funky.voice.objectBox.DbBaseFunction import com.prank.funky.voice.playSounds.PlaySoundsActivity @@ -63,7 +64,7 @@ class CustomActivity : AppCompatActivity() { recyclerViewCustom = findViewById(R.id.custom_recyclerview) emptyLayout = findViewById(R.id.empty_custom) - + TPManager.showTPAD(this@CustomActivity) { } importManager = ImportManager(this) { localUri, oldName -> Util.showLog("-----选择-- -$localUri") importSoundsUri = localUri diff --git a/app/src/main/java/com/prank/funky/voice/soundsList/ListActivity.kt b/app/src/main/java/com/prank/funky/voice/soundsList/ListActivity.kt index fd499e2..50864f5 100644 --- a/app/src/main/java/com/prank/funky/voice/soundsList/ListActivity.kt +++ b/app/src/main/java/com/prank/funky/voice/soundsList/ListActivity.kt @@ -12,6 +12,7 @@ import androidx.core.view.WindowInsetsCompat import androidx.recyclerview.widget.GridLayoutManager import androidx.recyclerview.widget.RecyclerView import com.prank.funky.voice.R +import com.prank.funky.voice.ad.TPManager import com.prank.funky.voice.utils.RecyclerSpace import com.prank.funky.voice.utils.Util import com.prank.funky.voice.objectBox.EntitySounds @@ -40,6 +41,7 @@ class ListActivity : AppCompatActivity() { insets } + TPManager.showTPAD(this@ListActivity) { } findViewById(R.id.framelayout_back).setOnClickListener { finish() } diff --git a/app/src/main/java/com/prank/funky/voice/welcome/WelcomeActivity.kt b/app/src/main/java/com/prank/funky/voice/welcome/WelcomeActivity.kt index abdbffe..f70828f 100644 --- a/app/src/main/java/com/prank/funky/voice/welcome/WelcomeActivity.kt +++ b/app/src/main/java/com/prank/funky/voice/welcome/WelcomeActivity.kt @@ -3,19 +3,33 @@ package com.prank.funky.voice.welcome import android.content.Intent import android.os.Bundle import android.os.CountDownTimer +import android.util.Log import android.widget.ProgressBar import android.widget.TextView import androidx.activity.enableEdgeToEdge import androidx.appcompat.app.AppCompatActivity import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat -import com.prank.funky.voice.home.HomeActivity +import com.google.android.ump.ConsentForm +import com.google.android.ump.ConsentInformation +import com.google.android.ump.ConsentRequestParameters +import com.google.android.ump.UserMessagingPlatform import com.prank.funky.voice.R +import com.prank.funky.voice.ad.MetaFacebookLDUHelper +import com.prank.funky.voice.ad.TPManager +import com.prank.funky.voice.home.HomeActivity +import com.tradplus.ads.base.common.TPPrivacyManager.OnPrivacyRegionListener +import com.tradplus.ads.open.TradPlusSdk +import com.tradplus.ads.open.TradPlusSdk.TradPlusInitListener +import kotlinx.coroutines.DelicateCoroutinesApi +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.launch class WelcomeActivity : AppCompatActivity() { private lateinit var pb: ProgressBar private lateinit var tv_progress: TextView - private val count = 2000L + private val count = 12000L private var countDownTimer:CountDownTimer? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -30,21 +44,23 @@ class WelcomeActivity : AppCompatActivity() { pb = findViewById(R.id.load_pb) tv_progress = findViewById(R.id.text_progress) - countDownTimer = object : CountDownTimer(count,100){ - override fun onTick(millisUntilFinished: Long) { - val progressPercentage: Int = ((100 * millisUntilFinished) / count).toInt() - val progressInt = 100 - progressPercentage - tv_progress.text = getString(R.string.welcome_progress, progressInt) - pb.progress = progressInt - } - override fun onFinish() { - tv_progress.text = getString(R.string.welcome_progress, 100) - pb.progress = 100 - startActivity(Intent(this@WelcomeActivity, HomeActivity::class.java)) - finish() - } + setPrivacyConsent() + } + + private fun startCountDown(){ + countDownTimer = countDownTimer?:TPManager.showWelcomeAd(this@WelcomeActivity,count,{millisUntilFinished-> + val progressPercentage: Int = ((100 * millisUntilFinished) / count).toInt() + val progressInt = 100 - progressPercentage + tv_progress.text = getString(R.string.welcome_progress, progressInt) + pb.progress = progressInt + + }){ + tv_progress.text = getString(R.string.welcome_progress, 100) + pb.progress = 100 + startActivity(Intent(this@WelcomeActivity, HomeActivity::class.java)) + finish() } countDownTimer?.start() } @@ -53,4 +69,117 @@ class WelcomeActivity : AppCompatActivity() { super.onDestroy() countDownTimer?.cancel() } + + + private fun setPrivacyConsent() { + // Google UMP + val params: ConsentRequestParameters? = + ConsentRequestParameters.Builder() // 指示用户是否低于同意年龄; true 低于同意年龄 + // 未满同意年龄的用户不会收到 GDPR 消息表单 + .setTagForUnderAgeOfConsent(false) + .build() + + val consentInformation: ConsentInformation = + UserMessagingPlatform.getConsentInformation(this) + consentInformation.requestConsentInfoUpdate( + this, + params, + ConsentInformation.OnConsentInfoUpdateSuccessListener { + UserMessagingPlatform.loadAndShowConsentFormIfRequired( + this, + ConsentForm.OnConsentFormDismissedListener { loadAndShowError -> + if (loadAndShowError != null) { + // Consent gathering failed. + } + // Consent has been gathered. + if (consentInformation.canRequestAds()) { + Log.i("TP AD", "授权完成,初始化SDK: ") + // 授权完成,初始化SDK + initTPSDK() + } + } as ConsentForm.OnConsentFormDismissedListener) + } as ConsentInformation.OnConsentInfoUpdateSuccessListener, + ConsentInformation.OnConsentInfoUpdateFailureListener { requestConsentError -> } as ConsentInformation.OnConsentInfoUpdateFailureListener) + + + // 用户已经进行过UMP选择 + if (consentInformation.canRequestAds()) { + // 授权完成,初始化SDK + Log.i("TP AD", "用户已经进行过UMP选择,初始化SDK: ") + initTPSDK() + } + + // 集成Google UMP后; 如果美国加州没有投放APP,无需调用 + checkAreaSetCCPA(); + } + + + private fun checkAreaSetCCPA() { + // 判断用户是否已经选择过,返回true表示已经进行过选择,就不需要再次进行GDPR弹窗 + val firstShowGDPR = TradPlusSdk.isFirstShowGDPR(this) + // 查询地区 + TradPlusSdk.checkCurrentArea(this, object : OnPrivacyRegionListener { + override fun onSuccess(isEu: Boolean, isCn: Boolean, isCalifornia: Boolean) { + // 获取到相关地域配置后,设置相关隐私API + + // 集成Google UMP后无需处理欧洲地区 + // 表明是欧洲地区,设置GDPR弹窗 +// if (isEu) { +// if (!firstShowGDPR) { +// TradPlusSdk.showUploadDataNotifyDialog(application, new TradPlusSdk.TPGDPRAuthListener() { +// @Override +// public void onAuthResult(int level) { +// // 获取设置结果并做记录,true 表明用户 进行过选择 +// TradPlusSdk.setIsFirstShowGDPR(application, true); +// } +// }, Const.URL.GDPR_URL); // Const.URL.GDPR_URL 为TradPlus 定义的授权页面 +// } +// } + + // 表明是美国加州地区,设置CCPA + Log.i("TP AD", "onSuccess isCalifornia=${isCalifornia} ") + if (isCalifornia) { + // false 加州用户均不上报数据 ;true 接受上报数据 + // 默认不上报,如果上报数据,需要让用户选择 + TradPlusSdk.setCCPADoNotSell(this@WelcomeActivity, false) + MetaFacebookLDUHelper.enableLDUForCalifornia() + } + + if (!isEu) { + Log.i("TP AD", "isEu= initTPSDK ") + initTPSDK() + } + } + + override fun onFailed() { + // 一般为网络问题导致查询失败,开发者需要自己判断地区,然后进行隐私设置 + // 然后在初始化SDK + Log.i("TP AD", "onFailed ") + MetaFacebookLDUHelper.checkAndEnableLDU(this@WelcomeActivity) + initTPSDK() + } + }) + } + + + @OptIn(DelicateCoroutinesApi::class) + private fun initTPSDK() { + GlobalScope.launch(Dispatchers.Main) { + if (!TradPlusSdk.getIsInit()) { + TradPlusSdk.initSdk(this@WelcomeActivity, "74516D6295B6B6C71D15B49ACA505F11") + TradPlusSdk.setTradPlusInitListener(object : TradPlusInitListener { + override fun onInitSuccess() { + Log.i("TP AD", "onInitSuccess: ") + startCountDown() + // appId为TradPlus后台建的应用ID +// ImportSDKUtil.getInstance().showTestTools(this@WelcomeActivity, "74516D6295B6B6C71D15B49ACA505F11") + TPManager.loadAllAd(this@WelcomeActivity) + } + }) + + + } + } + + } } \ No newline at end of file diff --git a/app/src/main/res/xml/net.xml b/app/src/main/res/xml/net.xml new file mode 100644 index 0000000..0ac6102 --- /dev/null +++ b/app/src/main/res/xml/net.xml @@ -0,0 +1,6 @@ + + + + mobile-server.lux-ad.com + + diff --git a/build.gradle.kts b/build.gradle.kts index 9681706..3cb7e75 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,9 +3,12 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.compose) apply false + id("com.google.gms.google-services") version "4.4.2" apply false + id ("com.google.firebase.crashlytics") version "3.0.2" apply false } buildscript{ dependencies{ - classpath("io.objectbox:objectbox-gradle-plugin:4.0.3") + classpath("io.objectbox:objectbox-gradle-plugin:5.0.1") } + } \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index 20e2a01..97a23a8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ # http://www.gradle.org/docs/current/userguide/build_environment.html # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 +org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. For more details, visit # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects diff --git a/settings.gradle.kts b/settings.gradle.kts index efa6ae8..0f2aa20 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -16,6 +16,26 @@ dependencyResolutionManagement { repositories { google() mavenCentral() + //------------------------- TradPlus + // Ironsource + maven { url = uri("https://android-sdk.is.com/") } + // Pangle + maven { + url = uri("https://artifact.bytedance.com/repository/pangle") + } + // Chartboost + maven { url = uri("https://cboost.jfrog.io/artifactory/chartboost-ads/") } + maven { + name = "Chartboost Mediation’s maven repo" + url = uri("https://cboost.jfrog.io/artifactory/chartboost-mediation") + } + // Mintegral + //Launch GP market application, Android X Version + //If you fail to pull the code using gradle, add the maven warehouse configuration to the project root build.gradle file + maven { + url = + uri("https://dl-maven-android.mintegral.com/repository/mbridge_android_sdk_oversea") + } } }