Commit d3f6068f authored by songjianyu's avatar songjianyu

混淆完成

parent 487f86f8
This diff is collapsed.
This diff is collapsed.
......@@ -22,7 +22,7 @@
-dontwarn javax.annotation.Nullable
-keep class com.easy.clean.bean.** { *; }
-keep class tooic.fatalityic.corroborateic.** { *; }
-keep class com.google.gson.reflect.** { *; }
-keep class * extends com.google.gson.reflect.TypeToken
-keep class com.google.gson.stream.** { *; }
......
......@@ -20,22 +20,22 @@
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application
android:name=".MyApplication"
android:name="tooic.fatalityic.Adventurousic"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:dataExtractionRules="@xml/eraseic"
android:fullBackupContent="@xml/sociopathic"
android:icon="@mipmap/meccaic"
android:label="@string/overrodeic"
android:roundIcon="@mipmap/downwardic"
android:supportsRtl="true"
android:theme="@style/Theme.AppTheme"
android:theme="@style/falsehoodic"
tools:targetApi="31">
<activity
android:name=".ui.splash.SplashActivity"
android:name="astonishic.chandelieric.Jostleic"
android:exported="true"
android:screenOrientation="portrait"
android:theme="@style/splash.theme"
android:theme="@style/furyic"
tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
......@@ -44,84 +44,84 @@
</intent-filter>
</activity>
<activity
android:name=".ui.main.MainActivity"
android:name="waific.Teflonic.therapistic.Hauntingic"
android:exported="true"
android:screenOrientation="portrait"
android:launchMode="singleTask"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.guide.GuideActivity"
android:name="foamyic.Onlyic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.guide.GuideCleanActivity"
android:name="foamyic.Friskic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.batteryinfo.BatteryInfoActivity"
android:name="mudslingingic.hackic.thanksic.Resinic"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.clean.JunkCleanActivity"
android:name="looteric.beforeic.depressingic.Juggleic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.cleanresult.CleanResultActivity"
android:name="intellectuallyic.jitteryic.mosaicic.Tailspinic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.largefile.LargeFileCleanActivity"
android:name="storytelleric.broccoliic.Secretiveic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.screenshot.ScreenshotCleanActivity"
android:name="stayic.surprisingic.Thornic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.similar.SimilarPhotosActivity"
android:name="startic.perkic.chemistic.Shadyic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.photocompression.PhotoCompressionActivity"
android:name="hairnetic.Slipperyic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.recovery.FileScanResultActivity"
android:name="warpic.Shamrockic"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.recovery.FileRecoveredActivity"
android:name="warpic.Nauticalic"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.recovery.FileRecoveryActivity"
android:name="warpic.Discretionaryic"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.set.SettingActivity"
android:name="overthrewic.dirtyic.coneic.Aerodynamicsic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.photocompression.PhotoCompressionDetailActivity"
android:name="hairnetic.Camerawomanic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.recyclebin.RecycleBinDetailActivity"
android:name="negligentlyic.wrongic.bottomic.Givenic"
android:exported="false"
android:screenOrientation="portrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity" />
<activity
android:name=".ui.videoclean.VideoCleanActivity"
android:name="shrunkic.typecastic.Chaseic"
android:exported="false" />
......@@ -132,11 +132,11 @@
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
android:resource="@xml/tempestic" />
</provider>
<receiver
android:name=".business.push.receiver.AlarmReceiver"
android:name="harrowingic.entitledic.Calamityic"
android:enabled="true"
android:exported="true"
android:permission="android.permission.RECEIVE_BOOT_COMPLETED">
......@@ -166,12 +166,12 @@
</receiver>
<service
android:name=".business.service.StayJobService"
android:name="cottonwoodic.proprietoric.gutic.Wasic"
android:exported="false"
android:foregroundServiceType="dataSync"
android:permission="android.permission.BIND_JOB_SERVICE" />
<service
android:name=".business.push.fcm.MessagingService"
android:name="hymnalic.underhandedic.rutic.Foughtic"
android:directBootAware="true"
android:exported="false"
android:permission="com.google.android.c2dm.permission.SEND">
......@@ -181,7 +181,7 @@
</service>
<receiver
android:name=".business.push.fcm.FcmReceiver"
android:name="hymnalic.underhandedic.rutic.Driftwoodic"
android:directBootAware="true"
android:exported="true"
android:permission="com.google.android.c2dm.permission.SEND">
......@@ -198,7 +198,7 @@
android:value="ca-app-pub-3940256099942544~3347511713" />
<meta-data
android:name="com.facebook.sdk.ApplicationId"
android:value="@string/facebook_app_id" />
android:value="@string/helpfulic" />
</application>
</manifest>
\ No newline at end of file
package astonishic.chandelieric
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import tooic.fatalityic.Runawayic.ifAgreePrivacy
import tooic.fatalityic.corroborateic.indexic.Lurkic
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.delay
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
import kotlin.random.Random
class Headhunteric : ViewModel() {
private var countdownJob: Job? = null
private var startTime: Long = 0
val totalTimeMs = Lurkic.adsConfigBean.openAdLoading * 1000L // 倒计时总时长
private val checkIntervalMs = 100L // 检查间隔(100毫秒)
var jumpNext: (() -> Unit)? = null
var onTick: ((sLong: Long, total: Long) -> Unit)? = null
fun startCountdown() {
if (!ifAgreePrivacy) return
countdownJob?.cancel()
startTime = System.currentTimeMillis()
countdownJob = viewModelScope.launch(Dispatchers.IO) {
while (isActive) {
val currentTime = System.currentTimeMillis()
val elapsed = currentTime - startTime
val remaining = totalTimeMs - elapsed
if (remaining <= 0) {
launch(Dispatchers.Main) {
onTick?.invoke(elapsed, totalTimeMs)
}
break
} else {
launch(Dispatchers.Main) {
onTick?.invoke(elapsed, totalTimeMs)
}
}
delay(Random.nextLong(checkIntervalMs, checkIntervalMs + 100L))
}
launch(Dispatchers.Main) {
jumpNext?.invoke()
}
}
}
/**
* 停止倒计时(可选,便于资源释放)
*/
fun stopCountdown() {
countdownJob?.cancel()
countdownJob = null
}
}
package astonishic.chandelieric
import android.Manifest
import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Color
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.Spannable
import android.text.SpannableString
import android.text.TextPaint
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.util.Log
import android.view.View
import androidx.activity.viewModels
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import tooic.fatalityic.Runawayic.ifAgreePrivacy
import androidx.lifecycle.lifecycleScope
import tooic.fatalityic.GlobalConfig.URL_PRIVACY
import tooic.fatalityic.Adventurousic
import com.easy.clean.R
import tooic.fatalityic.Runawayic
import tooic.fatalityic.Runawayic.isGuided
import tooic.fatalityic.jittersic.Reinstateic
import tooic.fatalityic.jittersic.jumpAction
import tooic.fatalityic.corroborateic.Protegeic.Companion.BATTERY_INFO
import tooic.fatalityic.corroborateic.indexic.Lurkic
import autonomyic.polemicalic.congestionic.Unwindic
import autonomyic.polemicalic.congestionic.NASAic
import incredibleic.guffawic.Glowwormic
import incredibleic.guffawic.Equalizeic
import incredibleic.guffawic.Equalizeic.requestCfgCallBack
import incredibleic.guffawic.Equalizeic.spConfig
import cottonwoodic.proprietoric.gutic.Wasic.Companion.startStayJobService
import com.easy.clean.databinding.BroodicBinding
import rememberic.Categoricallyic
import foamyic.Friskic
import waific.Teflonic.therapistic.Hauntingic
import tooic.fatalityic.redic.speckledic.hankeringic.Oustic.checkStorePermission
import tooic.fatalityic.redic.speckledic.hankeringic.Oustic.requestStoragePermission
import tooic.fatalityic.redic.speckledic.hankeringic.Moatic
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.util.concurrent.atomic.AtomicBoolean
@SuppressLint("CustomSplashScreen")
class Jostleic : Reinstateic<BroodicBinding>(BroodicBinding::inflate) {
private val viewModel: Headhunteric by viewModels()
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
}
override fun useDefaultImmersive() {
setStatusBarColor()
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, 0, systemBars.right, systemBars.bottom)
insets
}
}
override fun onCreate(savedInstanceState: Bundle?) {
// initUMP()
super.onCreate(savedInstanceState)
handleIntentExtras()
}
override fun onResumeOneShoot() {
super.onResumeOneShoot()
viewModel.startCountdown()
}
override fun onStop() {
super.onStop()
viewModel.stopCountdown()
}
override fun initView() {
super.initView()
showLoadingAd()
setPrivacyPolicy()
requestNotificationPermission()
binding.utilityic.max = viewModel.totalTimeMs.toInt()
}
private fun setPrivacyPolicy() {
val privacyPolicy = getString(R.string.arcadeic)
val text = "${getString(R.string.acquaintedic)} $privacyPolicy"
val spannableString = SpannableString(text)
val start = text.indexOf(privacyPolicy)
val end = start + privacyPolicy.length
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
startActivity(Intent(Intent.ACTION_VIEW, Uri.parse(URL_PRIVACY)))
}
override fun updateDrawState(ds: TextPaint) {
super.updateDrawState(ds)
ds.color = getColor(R.color.robic)
ds.bgColor = 0
}
}
spannableString.setSpan(clickableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
binding.emancipationic.text = spannableString
binding.emancipationic.movementMethod = LinkMovementMethod.getInstance()
binding.emancipationic.highlightColor = Color.TRANSPARENT
}
private fun requestNotificationPermission() {
if (isGuided) {
return
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val array = arrayOf(Manifest.permission.POST_NOTIFICATIONS)
launcher.launch(array) { permissions ->
val flag = permissions.values.all { it }
if (flag) Adventurousic.appContext.startStayJobService()
}
}
}
override fun initListener() {
super.initListener()
binding.handsomeic.setOnClickListener {
ifAgreePrivacy = true
showLoadingAd()
Glowwormic.event("app_start")
Glowwormic.event("page_${javaClass.simpleName}")
viewModel.startCountdown()
Adventurousic.appContext.initApp()
}
viewModel.onTick = { p, _ ->
binding.utilityic.progress = p.toInt()
}
viewModel.jumpNext = {
jumpNext()
}
}
override fun handleBackCallBack() {
}
private fun initUMP() {
val ump = Moatic(this)
if (ump.consentInformation.canRequestAds()) {
Unwindic.init(this)
} else {
ump.callback = {
Unwindic.init(this)
}
ump.requestUMP()
}
}
private fun showLoadingAd() {
binding.fornicationic.visibility = if (ifAgreePrivacy) View.GONE else View.VISIBLE
binding.vehicularic.visibility = if (ifAgreePrivacy) View.VISIBLE else View.GONE
binding.interposeic.visibility = if (ifAgreePrivacy) View.GONE else View.VISIBLE
if (ifAgreePrivacy) {
val acAction = {
Unwindic.showOpen(this, showCallBack = object : NASAic() {
override fun show() {
viewModel.stopCountdown()
}
override fun next() {
binding.root.postDelayed({ jumpNext() }, 200)
}
})
}
if (spConfig.isNotEmpty()) {
Log.e(TAG, "1")
acAction.invoke()
} else {
if (Equalizeic.requestCfgIng.get()) {
requestCfgCallBack = {
lifecycleScope.launch(Dispatchers.Main) {
Log.e(TAG, "2")
acAction.invoke()
}
}
} else {
Log.e(TAG, "3")
acAction.invoke()
}
}
}
}
val jumped = AtomicBoolean(false)
fun jumpNext() {
if (jumped.get()) return
jumped.set(true)
when {
!isGuided -> {
isGuided = true
goToAc(Friskic::class.java)
finish()
}
isHotLaunch -> {
goToAc(Hauntingic::class.java)
finish()
}
actionId.isNotEmpty() -> {
actionIdJump()
}
else -> {
goToAc(Hauntingic::class.java)
finish()
}
}
intent.extras?.clear()
}
fun actionIdJump() {
when (actionId) {
BATTERY_INFO -> {
jumpAction(actionId)
finish()
}
else -> {
if (checkStorePermission()) {
jumpAction(actionId)
finish()
} else {
val dialog = Categoricallyic(this)
dialog.action = {
requestStoragePermission(launcher) {
if (it) {
jumpAction(actionId)
finish()
} else {
goToAc(Hauntingic::class.java)
finish()
}
}
}
dialog.showDialog()
}
}
}
}
override fun onNewIntent(intent: Intent?) {
super.onNewIntent(intent)
handleIntentExtras()
}
var isHotLaunch: Boolean = false
var actionId = ""
fun handleIntentExtras() {
super.onNewIntent(intent)
actionId = intent?.extras?.getString("actionId") ?: ""
isHotLaunch = intent?.extras?.getBoolean("isHotLaunch") == true
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
import android.animation.ObjectAnimator
import android.animation.ValueAnimator.INFINITE
import android.annotation.SuppressLint
import android.app.AlertDialog
import android.app.Dialog
import android.content.Context
import android.os.CountDownTimer
import android.view.LayoutInflater
import android.view.animation.LinearInterpolator
import android.widget.TextView
import com.easy.clean.R
import com.easy.clean.databinding.SecreteicBinding
object Aqueductic {
private val TAG = "AdCountDownDialog"
fun Context.showAdCountDownDialog(): AlertDialog {
val binding = SecreteicBinding.inflate(LayoutInflater.from(this))
val dialog = AlertDialog.Builder(this).create()
dialog.setView(binding.root)
dialog.setCancelable(false)
dialog.setCanceledOnTouchOutside(false)
dialog.show()
val params = dialog.window?.attributes
// params?.width = LinearLayout.LayoutParams.WRAP_CONTENT
params?.width = resources.getDimensionPixelSize(R.dimen.suffereric)
// params?.height = LinearLayout.LayoutParams.WRAP_CONTENT
dialog.window?.attributes = params
dialog.window?.setBackgroundDrawableResource(android.R.color.transparent)
// 创建一个旋转动画
// val rotateAnimator = ObjectAnimator.ofFloat(binding.raindropic, "rotation", 0f, -360f)
// rotateAnimator.setDuration(1000) // 设置动画持续时间为1000毫秒
// rotateAnimator.repeatCount = INFINITE
// rotateAnimator.interpolator = LinearInterpolator() // 设置插值器为线性插值
// rotateAnimator.start()
return dialog
}
fun createUICountdownTimer(dialog: Dialog?, onFinish: () -> Unit) {
if (dialog == null) {
onFinish.invoke()
return
}
val tvCountdown = dialog.findViewById<TextView>(R.id.rhythmicic)
val countDownTimer = object : CountDownTimer(4000, 1000) {
@SuppressLint("SetTextI18n")
override fun onTick(millisUntilFinished: Long) {
val s = millisUntilFinished / 1000
tvCountdown?.text = "Ads are about to be shown(${s}s)"
}
override fun onFinish() {
kotlin.runCatching {
dialog.dismiss()
}
onFinish.invoke()
}
}
countDownTimer.start()
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.widget.Button
import android.widget.FrameLayout
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.LayoutRes
import com.applovin.mediation.MaxAd
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import com.easy.clean.R
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdView
import androidx.core.content.withStyledAttributes
@SuppressLint("ViewConstructor")
class Circumcisionic(context: Context, attrs: AttributeSet? = null) :
FrameLayout(context, attrs) {
private val TAG = "NativeParentView"
private var removeAll = true
var isAdShowed = false
var adGravity = android.view.Gravity.CENTER
init {
// 获取XML属性
context.withStyledAttributes(attrs, R.styleable.showic, 0, 0) {
// 从XML中读取属性值
// 例如,如果你的XML中有自定义属性 `app:customAttribute="value"`
removeAll = getBoolean(R.styleable.showic_vulgarityic, true)
// 回收TypedArray
}
}
fun setNativeAd(
nativeAd: NativeAd,
@LayoutRes resource: Int? = null,
) {
val layout = resource ?: R.layout.explanatoryic
val adView =
layout.let { LayoutInflater.from(context).inflate(it, null) } as NativeAdView
adView.mediaView = adView.findViewById(R.id.learnic)
adView.headlineView = adView.findViewById(R.id.baritoneic)
adView.bodyView = adView.findViewById(R.id.dispensaryic)
adView.callToActionView = adView.findViewById(R.id.rotationic)
adView.iconView = adView.findViewById(R.id.resourcefulnessic)
(adView.headlineView as TextView?)?.text = nativeAd.headline
adView.mediaView?.mediaContent = nativeAd.mediaContent
if (nativeAd.body == null) {
adView.bodyView?.visibility = INVISIBLE
} else {
adView.bodyView?.visibility = VISIBLE
(adView.bodyView as TextView?)?.text = nativeAd.body
}
if (nativeAd.callToAction == null) {
adView.callToActionView?.visibility = INVISIBLE
} else {
adView.callToActionView?.visibility = VISIBLE
(adView.callToActionView as Button?)?.text = nativeAd.callToAction
}
if (nativeAd.icon == null) {
adView.iconView?.visibility = GONE
} else {
(adView.iconView as ImageView?)?.setImageDrawable(
nativeAd.icon?.drawable
)
adView.iconView?.visibility = VISIBLE
}
adView.setNativeAd(nativeAd)
setBackgroundResource(0)
if (removeAll) {
removeAllViews()
}
val params = LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT
)
params.gravity = adGravity
addView(adView, params)
}
fun setNativeAd(
nativeAdLoader: MaxNativeAdLoader,
nativeAd: MaxAd,
@LayoutRes resource: Int? = null
) {
val layout = resource ?: R.layout.deceitic
val binder: MaxNativeAdViewBinder =
MaxNativeAdViewBinder.Builder(layout)
.setTitleTextViewId(R.id.garishic)
.setBodyTextViewId(R.id.yeahic)
.setAdvertiserTextViewId(R.id.famishedic)
.setIconImageViewId(R.id.approachic)
.setMediaContentViewGroupId(R.id.coveic)
.setOptionsContentViewGroupId(R.id.recitationic)
.setStarRatingContentViewGroupId(R.id.processionalic)
.setCallToActionButtonId(R.id.guffic)
.build()
val adView = MaxNativeAdView(binder, context)
nativeAdLoader.render(adView, nativeAd)
setBackgroundResource(0)
removeAllViews()
val params = LayoutParams(
LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT
)
params.gravity = adGravity
addView(adView, params)
}
}
package autonomyic.polemicalic.congestionic
import tooic.fatalityic.GlobalConfig
import com.google.android.gms.ads.appopen.AppOpenAd
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.rewarded.RewardedAd
import com.reyun.solar.engine.SolarEngineManager
import com.reyun.solar.engine.infos.SEAdImpEventModel
import org.json.JSONObject
/**
* https://help.solar-engine.com/cn/docs/yu-ding-yi-shi-jian
*/
object Combic {
fun eventSolar(ad: Any?, valueMicros: Long) = Thread {
val json = JSONObject()
//变现平台
val adNetworkPlatform = "AdMob"
//聚合平台标识
val mediationPlatform = "admob"
//广告的类型
// adType 为激励视频时,只需要传入 1
// 1:激励视频
// 2:开屏
// 3:插屏
// 4:全屏视频
// 5:Banner
// 6:信息流
// 7:短视频信息流
// 8:大横幅
// 9:视频贴片
// 10:中等尺寸横幅
// 0:其它
var adType = -1
//变现平台的应用 ID
val adNetworkAppID = GlobalConfig.ID_ADMOB_APPLICATION
//变现平台的变现广告位 ID
var adNetworkADID = ""
//广告 ecpm,单位:元(广告千次展现的变现收入,0或负值表示没传,单位为元)
val ecpm = valueMicros / 1000.0
//货币种类
val currencyType = "USD"
when (ad) {
is AppOpenAd -> {
adType = 2
adNetworkADID = ad.adUnitId
}
is InterstitialAd -> {
adType = 3
adNetworkADID = ad.adUnitId
}
is NativeAd -> {
adType = 6
adNetworkADID = GlobalConfig.ID_ADMOB_NATIVE
}
is RewardedAd -> {
adType = 1
adNetworkADID = ad.adUnitId
}
else -> {//banner
adType = 5
adNetworkADID = GlobalConfig.ID_ADMOB_BANNER
}
}
try {
} catch (e: Exception) {
//
}
val seAdImpEventModel = SEAdImpEventModel(
adNetworkPlatform,
mediationPlatform,
adType,
adNetworkAppID,
adNetworkADID,
ecpm,
currencyType,
true,
json
)
SolarEngineManager.getInstance().trackAdImpression(seAdImpEventModel)
}.start()
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
import tooic.fatalityic.Adventurousic
import incredibleic.guffawic.Glowwormic
import tooic.fatalityic.redic.speckledic.hankeringic.Upholsteryic
import org.json.JSONObject
import java.util.UUID
val taichiPref by lazy {
Adventurousic.appContext.getSharedPreferences("TaichiTroasCache", 0)
}
val taichiSharedPreferencesEditor by lazy {
taichiPref.edit()
}
abstract class Footprintic {
abstract val TAG: String
var adUnit: String = ""
var from: String = ""
val reqId = UUID.randomUUID().toString()
var isUnLimit: Boolean = false
fun adPrepareShow() {
val obj1 = JSONObject()
obj1.put("ad_unit", adUnit)
obj1.put("req_id", reqId)
obj1.put("from", from)
Glowwormic.event("ad_prepare_show", ext = obj1)
Upholsteryic.logDebug(TAG, "ad_prepare_show_$adUnit $obj1")
}
fun adPulStart() {
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_unit", adUnit)
obj.put("ad_type", adUnit)
obj.put("from", from)
Glowwormic.event("ad_pull_start", ext = obj)
Upholsteryic.logDebug(TAG, "ad_pull_start_$adUnit $obj")
}
fun adShowError(reason: Any) {
val obj = JSONObject()
obj.put("ad_unit", adUnit)
obj.put("req_id", reqId)
obj.put("from", from)
obj.put("reason", reason.toString())
Glowwormic.event("ad_show_error", ext = obj)
Upholsteryic.logDebug(TAG, "ad_show_error_$adUnit $obj")
}
fun adLimited(value: String) {
val obj = JSONObject()
obj.put("ad_unit", adUnit)
obj.put("req_id", reqId)
obj.put("from", from)
Glowwormic.event("ad_limit", value, obj)
Upholsteryic.logDebug(TAG, "ad_limit_$adUnit $obj")
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
abstract class NASAic {
open fun show() {}
open fun failed(where: Int = 0) {
next()
}
open fun adFailed(where: Int = 0) {
next()
}
open fun close(where: Int = 0) {
next()
}
abstract fun next()
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
import android.app.Activity
import android.app.Dialog
import autonomyic.polemicalic.congestionic.Tumoric.openInterLastShowTime
import java.lang.ref.WeakReference
class Refrigerationic<T>() {
var adDialog: Dialog? = null
/**
* 当前缓存的广告
*/
var currentAd: T? = null
/**
* 是否正在缓存加载广告
*/
var loadingAd: Boolean = false
/**
* 用于保存引用现有页面,在此页面显示广告(因为要等待广告加载完毕)
*/
var activityRef: WeakReference<Activity>? = null
/**
* 上一次的缓存成功时间
*/
var lastLoadTime: Long = 0
/**
* 上次展示时间
*/
// var lastShowTime: Long = 0
/**
* 广告已经展示
*/
fun onAdDisplayed() {
currentAd = null
activityRef = null
adDialog?.dismiss()
adDialog = null
openInterLastShowTime = System.currentTimeMillis()
}
fun onAdHidden() {
//重置下上次展示的时间,避免看广告的时间算入间隔
openInterLastShowTime = System.currentTimeMillis()
}
fun onAdDisplayFailed() {
adDialog?.dismiss()
adDialog = null
currentAd = null
activityRef = null
}
fun onAdLoaded(ad: T?) {
//这里可能提前设置,所有可以不设置,max回调的类型可能不同
if (ad != null) {
currentAd = ad
}
loadingAd = false
lastLoadTime = System.currentTimeMillis()
}
fun onAdLoadFailed() {
adDialog?.dismiss()
adDialog = null
loadingAd = false
}
}
package autonomyic.polemicalic.congestionic
/**
* 广告类型
* 0=开屏广告、1=插屏广告、2=原生广告、3=Banner横幅广告
*/
@JvmInline
value class Resignationic private constructor(val value: Int) {
companion object {
val OPEN = Resignationic(0)
val INSERT = Resignationic(1)
val NATIVE = Resignationic(2)
val BANNER = Resignationic(3)
fun from(adsType: Int): Resignationic {
return when (adsType) {
OPEN.value -> OPEN
INSERT.value -> INSERT
NATIVE.value -> NATIVE
else -> BANNER
}
}
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
import com.easy.clean.BuildConfig
import tooic.fatalityic.corroborateic.indexic.Lurkic
import tooic.fatalityic.redic.speckledic.hankeringic.Farawayic
import tooic.fatalityic.redic.speckledic.hankeringic.Curableic.toFormatTime4
/**
* 控制广告计数与判断显示条件
*
*/
object Tumoric {
const val NUM_DISPLAY = "local_numDisplayLimit"
const val NUM_REQUEST = "local_numRequestLimit"
const val NUM_CLICK = "local_numClickLimit"
const val SAVE_DATE = "local_saveDate"
/**
* 保存的时间,用来判断是否是当天,不是当天要重置计数次数
*/
private var saveDate
get() = getSaveDateSetDefault()
set(value) = Farawayic.getInstance().put(SAVE_DATE, value)
private fun getSaveDateSetDefault(): String {
val date = Farawayic.getInstance().getString(SAVE_DATE, "") ?: ""
if (date == "") {
saveDate = System.currentTimeMillis().toFormatTime4()
}
return date
}
/**
* 广告请求是否到达限制
*/
private inline val isRequestLimited: Boolean
get() {
val maxCount = Lurkic.adsConfigBean.numRequestLimit
return maxCount > -1 && Farawayic.getInstance()
.getInt(NUM_REQUEST, 0) >= maxCount
}
/**
* 广告展示是否到达限制
*/
private inline val isDisplayLimited: Boolean
get() {
val maxCount = Lurkic.adsConfigBean.numDisplayLimit
return maxCount > -1 && Farawayic.getInstance()
.getInt(NUM_DISPLAY, 0) >= maxCount
}
/**
* 广告点击是否到达限制
*/
private inline val isClickLimited: Boolean
get() {
val maxCount = Lurkic.adsConfigBean.numClickLimit
return maxCount > -1 && Farawayic.getInstance()
.getInt(NUM_CLICK, 0) >= maxCount
}
private fun getAdEventMsg(adsType: Resignationic): String {
return when (adsType) {
Resignationic.OPEN -> "Open"
Resignationic.INSERT -> "Inter"
Resignationic.NATIVE -> "Native"
else -> "Banner"
}
}
/**
* 是否显示广告
*
* @return true or false
*/
fun isAdShow(adsType: Resignationic, adEvent: Footprintic?): Boolean {
if (BuildConfig.DEBUG) {
return true
}
val currentDate = System.currentTimeMillis().toFormatTime4()
if (saveDate != currentDate) {
//如果已经不是今天了,就重置个数
saveDate = currentDate
Farawayic.getInstance().put(NUM_DISPLAY, 0)
Farawayic.getInstance().put(NUM_REQUEST, 0)
Farawayic.getInstance().put(NUM_CLICK, 0)
}
if (isDisplayLimited) {
val value = "current${getAdEventMsg(adsType)} " +
"show=${Farawayic.getInstance().getInt(NUM_DISPLAY, 0)} " +
"${getAdEventMsg(adsType).lowercase()}_" + "max_show=${Lurkic.adsConfigBean.numDisplayLimit}"
adEvent?.adLimited(value)
}
if (isClickLimited) {
val value =
"current${getAdEventMsg(adsType)}Click=${Farawayic.getInstance().getInt(NUM_CLICK, 0)} "
"${getAdEventMsg(adsType).lowercase()}_max_click=${Lurkic.adsConfigBean.numClickLimit}"
adEvent?.adLimited(value)
}
if (isRequestLimited) {
val value = "current${getAdEventMsg(adsType)}Request=${Farawayic.getInstance().getInt(NUM_REQUEST, 0)} " +
"${getAdEventMsg(adsType).lowercase()}_max_request=${Lurkic.adsConfigBean.numRequestLimit}"
adEvent?.adLimited(value)
}
return !(isDisplayLimited || isClickLimited || isRequestLimited)
}
private fun addNum(key: String) {
val currentDate = System.currentTimeMillis().toFormatTime4()
if (saveDate != currentDate) {
//如果已经不是今天了,就重置个数
saveDate = currentDate
Farawayic.getInstance().put(key, 1)
return
}
Farawayic.getInstance()
.put(key, (Farawayic.getInstance().getInt(key, 0) + 1))
}
fun addDisplayNum() {
addNum(NUM_DISPLAY)
}
fun addRequestNum() {
addNum(NUM_REQUEST)
}
fun addClickNum() {
addNum(NUM_CLICK)
}
/**
* 开屏和插页广告的显示间隔限制
*/
fun isIntervalLimited(adEvent: Footprintic): Boolean {
val flag = ((System.currentTimeMillis() - openInterLastShowTime) / 1000).toInt() < (Lurkic.adsConfigBean.timeInterval)
if (flag) {
adEvent.adShowError("ad in timeInterval")
}
return flag
}
//开屏和插页上一次展示时间共用,避免开屏插页连弹
var openInterLastShowTime = 0L
get() {
return Farawayic.getInstance().getLong("openInterLastShowTime", field)
}
set(value) {
field = value
Farawayic.getInstance().put("openInterLastShowTime", value, true)
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic
import android.app.Activity
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.annotation.LayoutRes
import com.applovin.sdk.AppLovinMediationProvider
import com.applovin.sdk.AppLovinSdk
import com.applovin.sdk.AppLovinSdkInitializationConfiguration
import com.base.appzxhy.business.ads.admob.Predestinationic
import com.easy.clean.BuildConfig
import tooic.fatalityic.GlobalConfig
import tooic.fatalityic.Adventurousic
import tooic.fatalityic.corroborateic.indexic.Lurkic.Companion.adsConfigBean
import tooic.fatalityic.corroborateic.indexic.Jewishic.Companion.configBean
import autonomyic.polemicalic.congestionic.complementic.foldic.Indignationic
import autonomyic.polemicalic.congestionic.complementic.foldic.Juvenileic
import autonomyic.polemicalic.congestionic.complementic.foldic.Swayic
import autonomyic.polemicalic.congestionic.complementic.foldic.Epilepticic
import autonomyic.polemicalic.congestionic.distendic.Skirtic
import autonomyic.polemicalic.congestionic.distendic.Synopsisic
import autonomyic.polemicalic.congestionic.distendic.Sleeplessnessic
import autonomyic.polemicalic.congestionic.distendic.Thermometeric
import incredibleic.guffawic.Glowwormic
import tooic.fatalityic.redic.speckledic.hankeringic.Farawayic
import tooic.fatalityic.redic.speckledic.hankeringic.Upholsteryic
import tooic.fatalityic.redic.speckledic.hankeringic.Alongic.toast
import com.google.android.gms.ads.MobileAds
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.android.gms.ads.initialization.AdapterStatus
import java.util.Collections
import java.util.concurrent.Executors
/**
* 广告管理类
*/
object Unwindic {
private val adOpenMgr by lazy {
Predestinationic()
}
private val adInterMgr by lazy {
Juvenileic()
}
private val adNativeMgr by lazy {
Swayic()
}
private val adBannerMgr by lazy {
Indignationic()
}
private val maxOpenMgr by lazy {
Thermometeric()
}
private val maxInsertMgr by lazy {
Synopsisic()
}
private val maxNativeMgr by lazy {
Sleeplessnessic()
}
/**
* 是否初始化
*/
var isAdmobInit = false
private set
/**
* 是否初始化
*/
var isMaxInit = false
private set
var isAdUtEvent = false
fun eventAdUt() {
if (!isAdUtEvent) {
isAdUtEvent = true
Glowwormic.event("ad_ut_${configBean.ut}")
}
}
/**
* Init 初始化
*
* @param context 这里最好是appContext,因为是耗时操作,等它初始化完毕马上加载开屏和插屏广告
*/
fun init(context: Context) {
if (configBean.isInBlackList) {
Glowwormic.event("isInBlackList", value = "isInBlackList=${configBean.isInBlackList}")
return
}
initAdmob(context)
initMax(context)
}
private fun initAdmob(context: Context) {
if (isAdmobInit) return
MobileAds.initialize(context) {
val readyAdapter = it.adapterStatusMap.entries.find { entry ->
entry.value.initializationState == AdapterStatus.State.READY
}
isAdmobInit = readyAdapter != null
Glowwormic.event("AdmobInit", "AdmobInit=$isAdmobInit")
// context.toast("admob init")
if (adsConfigBean.adSwitch) {
admobInitCallBack?.invoke()
admobInitCallBack = null
adNativeMgr.loadAd(Adventurousic.appContext, Epilepticic("nativeAd", "preload"), null)
// adOpenMgr.loadAd(context, true, Epilepticic("openAd", context::class.java.simpleName))
adInterMgr.loadAd(context, Epilepticic("interAd", context::class.java.simpleName))
}
}
}
private fun initMax(context: Context) = kotlin.runCatching {
if (isMaxInit) return@runCatching
val executor = Executors.newSingleThreadExecutor()
executor.execute {
val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(context).id
Farawayic.getInstance().getString("gid", currentGaid)
val build = AppLovinSdkInitializationConfiguration
.builder(GlobalConfig.KEY_MAX, context)
build.mediationProvider = AppLovinMediationProvider.MAX
if (BuildConfig.DEBUG) {
build.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
}
val initConfig = build.build()
runCatching {
AppLovinSdk.getInstance(context).initialize(initConfig) {
isMaxInit = true
// maxOpenMgr.loadAd(context)
if (!adsConfigBean.adSwitch) {
maxInsertMgr.loadAd(context, Skirtic("interAd", context::class.java.simpleName))
context.toast("max init")
maxInitCallBack?.invoke()
maxInitCallBack = null
}
}
}
}
}
var admobInitCallBack: (() -> Unit)? = null
var maxInitCallBack: (() -> Unit)? = null
/**
* 展示开屏广告
*
* @param activity 当前页面
* @param showCallBack 展示回调
*/
fun showOpen(
activity: Activity,
isUnLimit: Boolean = false,
showCallBack: NASAic? = null,
) {
eventAdUt()
if (!adsConfigBean.isAdShow) {
showCallBack?.failed()
return
}
if (configBean.isInBlackList) {
Glowwormic.event("isInBlackList", "isInBlackList=${configBean.isInBlackList}")
showCallBack?.failed()
return
}
val from = activity::class.java.simpleName
if (adsConfigBean.adSwitch) {
val admobEvent = Epilepticic("openAd", from)
admobEvent.isUnLimit = isUnLimit
if (isAdmobInit) {
adOpenMgr.show(activity, admobEvent, showCallBack)
} else {
admobInitCallBack = {
}
adOpenMgr.show(activity, admobEvent, showCallBack)
}
} else {
if (isMaxInit) {
maxOpenMgr.show(activity, isUnLimit, Skirtic("openAd", from), showCallBack)
} else {
maxInitCallBack = {
maxOpenMgr.show(activity, isUnLimit, Skirtic("openAd", from), showCallBack)
}
}
}
}
/**
* 展示插屏广告
*
* @param activity 当前页面
* @param showCallBack 展示回调
* @param isUnLimit 是否不受限制 默认false 代表受到限制
*/
fun showInsert(
activity: Activity,
isUnLimit: Boolean = false,
showCallBack: NASAic? = null,
) {
eventAdUt()
if (!adsConfigBean.isAdShow) {
showCallBack?.failed()
return
}
if (configBean.isInBlackList) {
Glowwormic.event("isInBlackList", configBean.isInBlackList.toString())
showCallBack?.failed()
return
}
Upholsteryic.logDebug("showAd", "adSwitch=${adsConfigBean.adSwitch}")
val from = activity::class.java.simpleName
if (adsConfigBean.adSwitch) {
adInterMgr.show(activity, isUnLimit, Epilepticic("interAd", from), showCallBack)
} else {
maxInsertMgr.show(activity, isUnLimit, Skirtic("interAd", from), showCallBack)
}
}
/**
* 展示原生广告
*
* @param nativeView 需要展示广告的布局容器
* @param layout 原生广告布局 ,这里传入的layout要和com.example.mydemo.strategy.ads.admob.NativeView里的id一致
*/
fun showNative(
nativeView: Circumcisionic,
@LayoutRes layout: Int,
nativeCallBack: ((Any?) -> Unit)? = null
) {
if (!adsConfigBean.isAdShow) {
nativeCallBack?.invoke(null)
nativeView.visibility = View.GONE
return
}
nativeView.visibility = View.VISIBLE
if (configBean.isInBlackList) {
Glowwormic.event("isInBlackList", configBean.isInBlackList.toString())
return
}
val showNative = {
if (adsConfigBean.adSwitch) {
adNativeMgr.show(Epilepticic("nativeAd", "nativeAd"), nativeView, layout, nativeCallBack)
} else {
maxNativeMgr.show(Skirtic("nativeAd", "nativeAd"), nativeView, layout, nativeCallBack)
}
}
if (isAdmobInit) {
showNative.invoke()
} else {
admobInitCallBack = { showNative.invoke() }
}
}
/**
* 展示banner广告
*
* @param parent 展示广告的父布局容器
*/
fun showBanner(parent: ViewGroup, collapsible: Boolean = true, adClose: (() -> Unit)? = null) {
if (!adsConfigBean.isAdShow) {
parent.visibility = View.GONE
return
}
parent.visibility = View.VISIBLE
if (configBean.isInBlackList) {
Glowwormic.event("isInBlackList", configBean.isInBlackList.toString())
return
}
if (adsConfigBean.adSwitch) {
adBannerMgr.show(parent, collapsible, adClose)
}
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.complementic.foldic
import android.os.Bundle
import android.view.ViewGroup
import android.view.ViewTreeObserver
import tooic.fatalityic.GlobalConfig
import tooic.fatalityic.corroborateic.indexic.Lurkic
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import com.google.ads.mediation.admob.AdMobAdapter
import com.google.android.gms.ads.AdListener
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.LoadAdError
import java.util.UUID
/**
*banner广告加载显示管理类
*/
class Indignationic {
private var adView: AdView? = null
private var listener: ViewTreeObserver.OnGlobalLayoutListener? = null
fun show(parent: ViewGroup, collapsible: Boolean, adClose: (() -> Unit)? = null) {
if (!Lurkic.adsConfigBean.adSwitch) {
return
}
val admobEvent = Epilepticic("banner", "banner")
if (!Tumoric.isAdShow(Resignationic.BANNER, admobEvent)) {
adView = null
return
}
parent.removeAllViews()
adView?.destroy()
adView = null
adView = AdView(parent.context)
parent.addView(adView)
adView?.onPaidEventListener = AdmobOnPaidEventListener(adView, admobEvent.scope)
listener = ViewTreeObserver.OnGlobalLayoutListener {
val screenPixelDensity = parent.context.resources.displayMetrics.density
val adWidth = (parent.width / screenPixelDensity).toInt()
val adSize =
AdSize.getCurrentOrientationAnchoredAdaptiveBannerAdSize(parent.context, adWidth)
adView?.adUnitId = GlobalConfig.ID_ADMOB_BANNER
adView?.setAdSize(adSize)
loadAd(admobEvent, collapsible, adClose)
parent.viewTreeObserver.removeOnGlobalLayoutListener(listener)
}
parent.viewTreeObserver.addOnGlobalLayoutListener(listener)
}
fun loadAd(admobEvent: Epilepticic, collapsible: Boolean, adClose: (() -> Unit)?) {
val build = AdRequest.Builder()
if (collapsible) {
val extras = Bundle()
extras.putString("collapsible", "bottom")
extras.putString("collapsible_request_id", UUID.randomUUID().toString())
build.addNetworkExtrasBundle(AdMobAdapter::class.java, extras)
}
val adRequest = build.build()
adView?.adListener =
object : AdListener() {
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
super.onAdFailedToLoad(loadAdError)
admobEvent.pullAd(loadAdError.responseInfo, loadAdError)
}
override fun onAdLoaded() {
admobEvent.pullAd(adView?.responseInfo)
}
override fun onAdOpened() {
}
override fun onAdClosed() {
super.onAdClosed()
adClose?.invoke()
}
}
adView?.loadAd(adRequest)
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.complementic.foldic
import android.app.Activity
import android.content.Context
import tooic.fatalityic.GlobalConfig
import tooic.fatalityic.Adventurousic
import autonomyic.polemicalic.congestionic.Aqueductic.createUICountdownTimer
import autonomyic.polemicalic.congestionic.Aqueductic.showAdCountDownDialog
import autonomyic.polemicalic.congestionic.Footprintic
import autonomyic.polemicalic.congestionic.Refrigerationic
import autonomyic.polemicalic.congestionic.NASAic
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.interstitial.InterstitialAd
import com.google.android.gms.ads.interstitial.InterstitialAdLoadCallback
import java.lang.ref.WeakReference
import kotlin.div
import kotlin.text.get
import kotlin.text.toInt
/**
*插屏广告加载显示管理类
*/
class Juvenileic {
private var adState = Refrigerationic<InterstitialAd>()
private var showCallBack: NASAic? = null
fun show(
activity: Activity,
isUnLimit: Boolean,
adEvent: Footprintic,
showCallBack: NASAic? = null
) {
if (activity.isFinishing || activity.isDestroyed) {
showCallBack?.failed(0)
adState.onAdDisplayFailed()
return
}
if (!isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.INSERT, adEvent)) {
showCallBack?.failed(2)
return
}
if (Tumoric.isIntervalLimited(adEvent)) {
showCallBack?.failed(3)
return
}
}
adEvent.adPrepareShow()
adState.activityRef = WeakReference(activity)
this.showCallBack = showCallBack
if (adState.adDialog == null) {
adState.adDialog = activity.showAdCountDownDialog()
} else {
adState.adDialog?.dismiss()
}
val needLoad = adState.currentAd == null || !adAvailable()
if (needLoad) {
if (!adState.loadingAd) {
loadAd(activity, adEvent, isUnLimit, true)
}
} else {
showReadyAd(adEvent)
}
}
private fun showReadyAd(adEvent: Footprintic) {
adState.currentAd?.run {
fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
super.onAdShowedFullScreenContent()
val ac = adState.activityRef?.get()
(adEvent as Epilepticic).showAd(responseInfo, ac)
adState.onAdDisplayed()
showCallBack?.show()
Tumoric.addDisplayNum()
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
adEvent.adShowError(adError)
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
adState.onAdHidden()
showCallBack?.close()
showCallBack = null
loadAd(Adventurousic.appContext, Epilepticic("interAd", "preload"))
}
override fun onAdClicked() {
super.onAdClicked()
(adEvent as Epilepticic).clickAd(responseInfo)
//计数
Tumoric.addClickNum()
}
}
val activity = adState.activityRef?.get()
activity?.let {
createUICountdownTimer(adState.adDialog) {
show(it)
}
}
}
}
fun loadAd(
context: Context,
adEvent: Footprintic,
isUnLimit: Boolean = false,
isShow: Boolean = false,
) {
if (!isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.INSERT, adEvent)) {
this.showCallBack?.close(4)
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
adEvent.adPulStart()
InterstitialAd.load(
context, GlobalConfig.ID_ADMOB_INTER, AdRequest.Builder().build(),
object : InterstitialAdLoadCallback() {
override fun onAdLoaded(ad: InterstitialAd) {
adState.onAdLoaded(ad)
if (this@Juvenileic.showCallBack != null || isShow) {
showReadyAd(adEvent)
}
(adEvent as Epilepticic).pullAd(ad.responseInfo)
Tumoric.addRequestNum()
ad.onPaidEventListener = AdmobOnPaidEventListener(adEvent.scope)
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
adState.onAdLoadFailed()
(adEvent as Epilepticic).pullAd(loadAdError.responseInfo, loadAdError)
showCallBack?.adFailed()
showCallBack = null
}
}
)
}
private fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
}
\ No newline at end of file
package com.base.appzxhy.business.ads.admob
import android.app.Activity
import android.content.Context
import tooic.fatalityic.GlobalConfig
import tooic.fatalityic.Adventurousic
import autonomyic.polemicalic.congestionic.Footprintic
import autonomyic.polemicalic.congestionic.Refrigerationic
import autonomyic.polemicalic.congestionic.NASAic
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import autonomyic.polemicalic.congestionic.complementic.foldic.Epilepticic
import autonomyic.polemicalic.congestionic.complementic.foldic.AdmobOnPaidEventListener
import tooic.fatalityic.redic.speckledic.hankeringic.Upholsteryic
import com.google.android.gms.ads.AdError
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.FullScreenContentCallback
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.appopen.AppOpenAd
import java.lang.ref.WeakReference
/**
* 开屏广告加载显示管理类
*/
class Predestinationic {
private val TAG = "AdOpenMgr"
private val adState = Refrigerationic<AppOpenAd>()
private var showCallBack: NASAic? = null
fun show(activity: Activity, adEvent: Footprintic, showCallBack: NASAic?) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (!adEvent.isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.OPEN, adEvent)) {
showCallBack?.failed()
return
}
if (Tumoric.isIntervalLimited(adEvent)) {
showCallBack?.failed()
return
}
}
adEvent.adPrepareShow()
adState.activityRef = WeakReference(activity)
this.showCallBack = showCallBack
// if (adState.adDialog == null) {
// adState.adDialog = activity.showAdPreparingDialog(1)
// } else {
// adState.adDialog?.dismiss()
// }
val needLoad = adState.currentAd == null || !adAvailable()
if (needLoad) {
if (!adState.loadingAd) {
loadAd(activity, adEvent) {
showReadyAd(adEvent)
}
}
} else {
showReadyAd(adEvent)
}
}
private fun showReadyAd(adEvent: Footprintic) {
val ac = adState.activityRef?.get()
if (ac == null || ac.isFinishing || ac.isDestroyed) {
Upholsteryic.logDebug(TAG, "showReadyAd ac=null isFinishing isDestroyed")
return
}
adState.currentAd?.run {
fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
(adEvent as Epilepticic).showAd(this@run.responseInfo, ac)
showCallBack?.show()
adState.onAdDisplayed()
//计数
Tumoric.addDisplayNum()
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
super.onAdFailedToShowFullScreenContent(adError)
showCallBack?.adFailed()
showCallBack = null
adState.onAdDisplayFailed()
(adEvent as Epilepticic).adShowError(adError)
}
override fun onAdDismissedFullScreenContent() {
super.onAdDismissedFullScreenContent()
showCallBack?.close()
showCallBack = null
adState.onAdHidden()
//预加载,“Timeout for show call succeed.”预加载的广告大概率,
loadAd(Adventurousic.appContext, Epilepticic("openAd", "preload"))
}
override fun onAdClicked() {
(adEvent as Epilepticic).clickAd(this@run.responseInfo)
//计数
Tumoric.addClickNum()
}
}
val activity = adState.activityRef?.get()
activity?.let { show(it) }
}
}
fun loadAd(
context: Context,
adEvent: Footprintic,
loadCallBack: (() -> Unit)? = null
) {
if (!adEvent.isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.OPEN, adEvent)) {
this.showCallBack?.close()
this.showCallBack = null
adState.onAdLoadFailed()
return
}
}
adEvent.adPulStart()
AppOpenAd.load(
context,
GlobalConfig.ID_ADMOB_OPEN,
AdRequest.Builder().build(),
object : AppOpenAd.AppOpenAdLoadCallback() {
override fun onAdLoaded(appOpenAd: AppOpenAd) {
adState.onAdLoaded(appOpenAd)
loadCallBack?.invoke()
(adEvent as Epilepticic).pullAd(appOpenAd.responseInfo)
appOpenAd.onPaidEventListener = AdmobOnPaidEventListener(appOpenAd, adEvent.scope)
Tumoric.addRequestNum()
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
showCallBack?.adFailed()
showCallBack = null
adState.onAdLoadFailed()
(adEvent as Epilepticic).pullAd(loadAdError.responseInfo, loadAdError)
}
}
)
}
private fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.complementic.foldic
import android.content.Context
import android.util.Log
import tooic.fatalityic.GlobalConfig
import tooic.fatalityic.Adventurousic
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import autonomyic.polemicalic.congestionic.Circumcisionic
import com.google.android.gms.ads.AdListener
import com.google.android.gms.ads.AdLoader
import com.google.android.gms.ads.AdRequest
import com.google.android.gms.ads.LoadAdError
import com.google.android.gms.ads.nativead.NativeAd
import com.google.android.gms.ads.nativead.NativeAdOptions
import java.util.concurrent.ConcurrentLinkedDeque
/**
*原生广告加载显示管理类
*/
class Swayic {
private val TAG = "AdNativeMgr"
/**
* 上一次的缓存成功时间
*/
protected var lastTime: Long = 0
/**
* 原生广告缓存队列
*/
private val cacheItems = ConcurrentLinkedDeque<NativeAd>()
fun loadAd(
context: Context,
admobEvent: Epilepticic,
showAction: ((ad: NativeAd) -> Unit)? = null
) {
admobEvent.adPulStart()
if (!Tumoric.isAdShow(Resignationic.NATIVE, admobEvent)) {
// Log.e(TAG, "loadAd return")
return
}
var currentNativeAd: NativeAd? = null
val adLoader = AdLoader.Builder(
context,
GlobalConfig.ID_ADMOB_NATIVE
).forNativeAd { nativeAd ->
lastTime = System.currentTimeMillis()
nativeAd.setOnPaidEventListener(AdmobOnPaidEventListener(nativeAd, admobEvent.scope))
currentNativeAd = nativeAd
admobEvent.pullAd(nativeAd.responseInfo)
if (showAction != null) {
showAction.invoke(nativeAd)
} else {
// Log.e(TAG, "offer ad")
cacheItems.offer(nativeAd)
}
}.withAdListener(object : AdListener() {
override fun onAdFailedToLoad(error: LoadAdError) {
admobEvent.pullAd(error.responseInfo, error)
}
override fun onAdClicked() {
super.onAdClicked()
admobEvent.clickAd(currentNativeAd?.responseInfo)
}
override fun onAdClosed() {
super.onAdClosed()
}
}).withNativeAdOptions(
NativeAdOptions.Builder().build()
).build()
adLoader.loadAds(AdRequest.Builder().build(), 1)
}
fun show(
admobEvent: Epilepticic,
parent: Circumcisionic,
layout: Int,
nativeCallBack: ((Any?) -> Unit)? = null
) {
admobEvent.adPrepareShow()
if (!Tumoric.isAdShow(Resignationic.NATIVE, admobEvent)) {
Log.e(TAG, "!isAdShow")
cacheItems.clear()
return
}
Log.e(TAG, "adNative can show")
if (!adAvailable()) {
//缓存过期了就清空
Log.e(TAG, "cacheItems clear")
cacheItems.clear()
}
parent.isAdShowed = true
val nativeAd = cacheItems.peek()
if (nativeAd == null) {
loadAd(parent.context, admobEvent) { ad ->
Log.e(TAG, "load show")
nativeCallBack?.invoke(ad)
parent.setNativeAd(ad, layout)
admobEvent.showAd(ad.responseInfo)
loadAd(Adventurousic.appContext, Epilepticic("nativeAd", "preload"), null)
}
} else {
val flag = cacheItems.remove(nativeAd)
Log.e(TAG, "ready show remove=$flag size=${cacheItems.size}")
nativeCallBack?.invoke(nativeAd)
parent.setNativeAd(nativeAd, layout)
admobEvent.showAd(nativeAd.responseInfo)
loadAd(Adventurousic.appContext, Epilepticic("nativeAd", "preload"), null)
}
}
private fun adAvailable(): Boolean {
return (lastTime == 0L) || ((System.currentTimeMillis() - lastTime) / 1000 / 60).toInt() < 30
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.distendic
import android.os.Bundle
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdRevenueListener
import com.applovin.mediation.MaxError
import com.applovin.sdk.AppLovinSdk
import tooic.fatalityic.Adventurousic
import autonomyic.polemicalic.congestionic.Footprintic
import autonomyic.polemicalic.congestionic.taichiPref
import autonomyic.polemicalic.congestionic.taichiSharedPreferencesEditor
import incredibleic.guffawic.Glowwormic
import tooic.fatalityic.redic.speckledic.hankeringic.Upholsteryic.logDebug
import com.facebook.appevents.AppEventsConstants
import com.facebook.appevents.AppEventsLogger
import com.google.firebase.analytics.FirebaseAnalytics
import org.json.JSONObject
class Skirtic : Footprintic {
override val TAG: String = "AdMaxEvent"
constructor(adUnit: String, from: String) : super() {
this.adUnit = adUnit
this.from = from
}
fun pullAd(
ad: MaxAd?,
error: MaxError? = null
) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("req_id", reqId)
obj.put("from", from)
obj.put("status", if (ad == null) "0" else "1")
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
if (error == null) {
obj.put("status", "1")
} else {
obj.put("errMsg", error)
obj.put("status", "2")
}
Glowwormic.event("ad_pull", ext = obj)
logDebug(TAG, "ad_pull $obj")
}
fun clickAd(ad: MaxAd?) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
if (!adUnit.equals("nativeAd")) {
Glowwormic.event("ad_click", ext = obj)
} else {
Glowwormic.event("ad_click", ext = obj)
}
}
fun showAd(ad: MaxAd?, activity: String?) {
val obj = JSONObject()
obj.put("UnitId", ad?.adUnitId)
obj.put("ad_unit", adUnit)
obj.put(
"creativeId",
ad?.creativeId
)
obj.put("networkname", ad?.networkName)
obj.put("placement", ad?.placement)
obj.put("networkplacement", ad?.networkPlacement)
obj.put("latency", ad?.requestLatencyMillis)
obj.put("valueMicros", ad?.revenue)
obj.put("from", activity)
obj.put("mediation", "applovin")
if (adUnit != "nativeAd") {
Glowwormic.event("ad_show", ext = obj)
} else {
Glowwormic.event("ad_show", ext = obj)
}
}
class EventOnPaidEventListener : MaxAdRevenueListener {
override fun onAdRevenuePaid(ad: MaxAd) {
val params = Bundle()
val currentImpressionRevenue: Double = ad.revenue // In USD
val mFirebaseAnalytics = FirebaseAnalytics.getInstance(Adventurousic.appContext)
params.putString(FirebaseAnalytics.Param.AD_PLATFORM, "appLovin")
params.putString(FirebaseAnalytics.Param.AD_SOURCE, ad.networkName)
params.putString(FirebaseAnalytics.Param.AD_FORMAT, ad.format.getDisplayName())
params.putString(FirebaseAnalytics.Param.AD_UNIT_NAME, ad.adUnitId)
params.putDouble(FirebaseAnalytics.Param.VALUE, currentImpressionRevenue)
params.putString(FirebaseAnalytics.Param.CURRENCY, "USD")
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.AD_IMPRESSION, params)
mFirebaseAnalytics.logEvent("Ad_Impression_Revenue", params)
val previousTaichiTroasCache = taichiPref.getFloat("TaichiTroasCache", 0f)
val currentTaichiTroasCache = previousTaichiTroasCache + currentImpressionRevenue
if (currentTaichiTroasCache >= 0.01) {
val roasbundle = Bundle()
roasbundle.putDouble(FirebaseAnalytics.Param.VALUE, currentTaichiTroasCache)
roasbundle.putString(FirebaseAnalytics.Param.CURRENCY, "USD")///(Required)tROAS事件必须
mFirebaseAnalytics.logEvent("Total_Ads_Revenue_001", roasbundle) // 给Taichi用
taichiSharedPreferencesEditor.putFloat("TaichiTroasCache", 0f)//重新清零,开始计算
val logger = AppEventsLogger.newLogger(Adventurousic.appContext)
val parameters = Bundle()
parameters.putString(AppEventsConstants.EVENT_PARAM_CURRENCY, "USD")
logger.logEvent("ad_value", currentTaichiTroasCache, parameters)
} else {
taichiSharedPreferencesEditor.putFloat(
"TaichiTroasCache",
currentTaichiTroasCache.toFloat()
)
taichiSharedPreferencesEditor.commit()
}
val obj = JSONObject()
val revenue = ad.revenue
val countryCode =
AppLovinSdk.getInstance(Adventurousic.appContext).configuration.countryCode
val networkName = ad.networkName
val adUnitId = ad.adUnitId
val adFormat = ad.format
val placement = ad.placement
val networkPlacement = ad.networkPlacement
obj.put("valueMicros", revenue)
obj.put("currencyCode", countryCode)
obj.put("adUnitId", adUnitId)
obj.put("networkName", networkName)
obj.put("adFormat", adFormat)
obj.put("placement", placement)
obj.put("networkPlacement", networkPlacement)
Glowwormic.event("ad_price", ext = obj)
}
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.distendic
import androidx.annotation.LayoutRes
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxError
import com.applovin.mediation.nativeAds.MaxNativeAdListener
import com.applovin.mediation.nativeAds.MaxNativeAdLoader
import com.applovin.mediation.nativeAds.MaxNativeAdView
import tooic.fatalityic.GlobalConfig
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import autonomyic.polemicalic.congestionic.Circumcisionic
import incredibleic.guffawic.Glowwormic
import org.json.JSONObject
import java.util.UUID
/**
*原生广告加载显示管理类
*/
class Sleeplessnessic {
/**
* 上一次的缓存成功时间
*/
protected var lastTime: Long = 0
/**
* 原生广告
*/
private var currentAd: MaxAd? = null
private var currentLoader: MaxNativeAdLoader? = null
private fun loadAd(
adMaxEvent: Skirtic,
parent: Circumcisionic,
@LayoutRes layout: Int
) {
if (!Tumoric.isAdShow(Resignationic.NATIVE, adMaxEvent)) return
val reqId = UUID.randomUUID().toString()
val obj = JSONObject()
obj.put("req_id", reqId)
obj.put("ad_type", "nativeAd")
val nativeAdLoader = MaxNativeAdLoader(GlobalConfig.ID_MAX_NATIVE, parent.context)
nativeAdLoader.setNativeAdListener(object : MaxNativeAdListener() {
override fun onNativeAdLoaded(nativeAdView: MaxNativeAdView?, ad: MaxAd) {
currentLoader = nativeAdLoader
currentAd = ad
lastTime = System.currentTimeMillis()
adMaxEvent.pullAd(ad)
nativeAdLoader.setRevenueListener(Skirtic.EventOnPaidEventListener())
show(adMaxEvent, parent, layout)
}
override fun onNativeAdLoadFailed(adUnitId: String, error: MaxError) {
adMaxEvent.pullAd(null, error)
}
override fun onNativeAdClicked(ad: MaxAd) {
}
})
nativeAdLoader.loadAd()
}
fun show(
adMaxEvent: Skirtic,
parent: Circumcisionic,
@LayoutRes layout: Int,
nativeCallBack: ((Any?) -> Unit)? = null
) {
if (!Tumoric.isAdShow(Resignationic.NATIVE, adMaxEvent)) {
currentLoader = null
currentAd = null
return
}
val nativeAd = currentAd
val nativeLoader = currentLoader
if ((nativeAd == null || nativeLoader == null).also {
if (it) {
val obj2 = JSONObject()
obj2.put("reason", "no_ad")
obj2.put("ad_unit", "nativeAd")
Glowwormic.event("ad_show_error", ext = obj2)
}
} || (!adAvailable()).also {
if (it) {
val obj2 = JSONObject()
obj2.put("ad_unit", "nativeAd")
Glowwormic.event("ad_expire", ext = obj2)
}
}) {
//缓存过期了就清空
currentLoader = null
currentAd = null
loadAd(Skirtic("nativeAd", "preload"), parent, layout)
return
}
val obj = JSONObject()
obj.put("ad_unit", "nativeAd")
Glowwormic.event("ad_prepare_show", ext = obj)
parent.setNativeAd(nativeLoader!!, nativeAd!!, layout)
nativeCallBack?.invoke(nativeAd)
}
private fun adAvailable(): Boolean {
return ((System.currentTimeMillis() - lastTime) / 1000 / 60).toInt() < 30
}
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.distendic
import android.app.Activity
import android.content.Context
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxInterstitialAd
import tooic.fatalityic.GlobalConfig
import autonomyic.polemicalic.congestionic.Aqueductic.showAdCountDownDialog
import autonomyic.polemicalic.congestionic.Footprintic
import autonomyic.polemicalic.congestionic.Refrigerationic
import autonomyic.polemicalic.congestionic.NASAic
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import java.lang.ref.WeakReference
/**
*插屏广告加载显示管理类
*/
class Synopsisic {
private var adState = Refrigerationic<MaxInterstitialAd>()
private var showCallBack: NASAic? = null
fun show(
activity: Activity,
isUnLimit: Boolean,
adEvent: Footprintic,
showCallBack: NASAic?
) {
if (activity.isFinishing || activity.isDestroyed) {
showCallBack?.failed(1)
return
}
if (showCallBack != null) {
adState.activityRef = WeakReference(activity)
this.showCallBack = showCallBack
if (adState.adDialog == null) {
adState.adDialog = activity.showAdCountDownDialog()
}
adEvent.adPrepareShow()
}
if (!adState.loadingAd) {
if (!isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.INSERT, adEvent)) {
showCallBack?.failed(3)
return
}
if (Tumoric.isIntervalLimited(adEvent)) {
showCallBack?.failed(4)
return
}
}
if (!adAvailable() || adState.currentAd == null) {
loadAd(activity, adEvent, isUnLimit)
return
}
if (adState.currentAd?.isReady == false) {
loadAd(activity, adEvent, isUnLimit)
return
}
showReadyAd(adEvent)
}
}
private fun showReadyAd(adEvent: Footprintic) {
adState.currentAd?.run {
setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) = Unit
override fun onAdLoadFailed(p0: String, p1: MaxError) = Unit
override fun onAdDisplayed(ad: MaxAd) {
adState.onAdDisplayed()
showCallBack?.show()
(adEvent as Skirtic).showAd(ad, activity::class.simpleName)
//计数
Tumoric.addDisplayNum()
}
override fun onAdDisplayFailed(ad: MaxAd, error: MaxError) {
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
(adEvent as Skirtic).adShowError(error)
}
override fun onAdHidden(p0: MaxAd) {
adState.onAdHidden()
showCallBack?.close()
loadAd(activity.applicationContext, Skirtic("interAd", "preload"))
}
override fun onAdClicked(ad: MaxAd) {
(adEvent as Skirtic).clickAd(ad)
//计数
Tumoric.addClickNum()
}
})
setRevenueListener(Skirtic.EventOnPaidEventListener())
showAd(activity)
}
}
fun loadAd(
context: Context,
adEvent: Footprintic,
isUnLimit: Boolean = false,
) {
if (!isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.INSERT, adEvent)) {
this.showCallBack?.close(4)
this.showCallBack = null
return
}
}
if (!adState.loadingAd) {
adState.loadingAd = true
adEvent.adPulStart()
adState.currentAd = MaxInterstitialAd(GlobalConfig.ID_MAX_INTER, context)
adState.currentAd?.setListener(object : MaxAdListener {
override fun onAdDisplayed(p0: MaxAd) = Unit
override fun onAdHidden(p0: MaxAd) = Unit
override fun onAdClicked(p0: MaxAd) = Unit
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) = Unit
override fun onAdLoaded(ad: MaxAd) {
adState.onAdLoaded(null)
val ac = adState.activityRef?.get()
if (ac != null) {
show(ac, isUnLimit, adEvent, null)
}
(adEvent as Skirtic).pullAd(ad)
Tumoric.addRequestNum()
}
override fun onAdLoadFailed(ad: String, error: MaxError) {
adState.onAdLoadFailed()
(adEvent as Skirtic).pullAd(null, error)
showCallBack?.adFailed(5)
showCallBack = null
}
})
adState.currentAd?.loadAd()
}
}
private fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
}
\ No newline at end of file
package autonomyic.polemicalic.congestionic.distendic
import android.app.Activity
import android.content.Context
import com.applovin.mediation.MaxAd
import com.applovin.mediation.MaxAdListener
import com.applovin.mediation.MaxError
import com.applovin.mediation.ads.MaxAppOpenAd
import tooic.fatalityic.GlobalConfig
import autonomyic.polemicalic.congestionic.Footprintic
import autonomyic.polemicalic.congestionic.Refrigerationic
import autonomyic.polemicalic.congestionic.NASAic
import autonomyic.polemicalic.congestionic.Resignationic
import autonomyic.polemicalic.congestionic.Tumoric
import java.lang.ref.WeakReference
/**
* 开屏广告加载显示管理类
*/
class Thermometeric {
private val adState = Refrigerationic<MaxAppOpenAd>()
private var showCallBack: NASAic? = null
fun show(activity: Activity, isUnLimit: Boolean, adEvent: Footprintic, showCallBack: NASAic?) {
if (activity.isFinishing || activity.isDestroyed) {
return
}
if (showCallBack != null) {
this.showCallBack = showCallBack
adState.activityRef = WeakReference(activity)
adEvent.adPrepareShow()
}
if (!adState.loadingAd) {
if (!isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.OPEN, adEvent)) {
showCallBack?.failed()
return
}
if (Tumoric.isIntervalLimited(adEvent)) {
showCallBack?.failed()
return
}
}
if (!adAvailable() || adState.currentAd == null) {
loadAd(activity, isUnLimit, adEvent)
return
}
if (adState.currentAd?.isReady != true) {
loadAd(activity, isUnLimit, adEvent)
return
}
showReadyAd(activity, adEvent)
}
}
private fun showReadyAd(activity: Activity, adEvent: Footprintic) {
adState.currentAd?.run {
setListener(object : MaxAdListener {
override fun onAdLoaded(p0: MaxAd) {
}
override fun onAdDisplayed(ad: MaxAd) {
adState.onAdDisplayed()
showCallBack?.show()
Tumoric.addDisplayNum()
(adEvent as Skirtic).showAd(ad, activity::class.simpleName)
}
override fun onAdHidden(p0: MaxAd) {
adState.onAdHidden()
showCallBack?.close()
showCallBack = null
loadAd(activity.applicationContext, false, Skirtic("openAd", "preload"))
}
override fun onAdClicked(ad: MaxAd) {
(adEvent as Skirtic).clickAd(ad)
//计数
Tumoric.addClickNum()
}
override fun onAdLoadFailed(p0: String, p1: MaxError) {
}
override fun onAdDisplayFailed(p0: MaxAd, error: MaxError) {
adState.onAdDisplayFailed()
showCallBack?.adFailed()
showCallBack = null
adEvent.adShowError(error)
}
})
showAd()
}
}
fun loadAd(context: Context, isUnLimit: Boolean, adEvent: Footprintic) {
if (!isUnLimit) {
if (!Tumoric.isAdShow(Resignationic.OPEN, adEvent)) {
this.showCallBack?.close()
this.showCallBack = null
return
}
}
if (!adState.loadingAd) {
adState.loadingAd = true
adEvent.adPulStart()
adState.currentAd = MaxAppOpenAd(GlobalConfig.ID_MAX_OPEN, context)
adState.currentAd?.setListener(object : MaxAdListener {
override fun onAdLoaded(ad: MaxAd) {
adState.onAdLoaded(null)
val ac = adState.activityRef?.get()
if (ac != null) {
show(ac, isUnLimit, adEvent, null)
}
(adEvent as Skirtic).pullAd(ad)
Tumoric.addRequestNum()
}
override fun onAdDisplayed(p0: MaxAd) {
}
override fun onAdHidden(p0: MaxAd) {
}
override fun onAdClicked(p0: MaxAd) {
}
override fun onAdLoadFailed(p0: String, error: MaxError) {
adState.onAdLoadFailed()
showCallBack?.adFailed()
showCallBack = null
(adEvent as Skirtic).pullAd(null, error)
}
override fun onAdDisplayFailed(p0: MaxAd, p1: MaxError) {
}
})
adState.currentAd?.loadAd()
}
}
fun adAvailable() = ((System.currentTimeMillis() - adState.lastLoadTime) / 1000 / 60).toInt() < 30
}
\ No newline at end of file
package com.easy.clean
/**
*Create by SleepDog on 2024-12-24
*/
object GlobalConfig {
//包名
const val PACKAGE_NAME = "com.easy.clean.tvb.cool"
// 域名
/**
* Url Event 上报接口
*/
const val URL_EVENT = "https://rp.danehyjudydanehy1310.xyz"
/**
* Url Api 业务接口
*/
const val URL_API = "https://api.danehyjudydanehy1310.xyz"
/**
* Url Privacy 隐私链接
*/
const val URL_PRIVACY = "https://sites.google.com/view/supereasyclean/super-easy-clean"
/**
* Url Use 使用条款
*/
const val URL_USE = ""
/**
* Key Aes 加密key
*/
const val KEY_AES = "88ccwvgo8zrbnmeo"
/**
* Key solar 归因key
*/
const val KEY_SOLAR = ""
// admob广告位id
inline val ID_ADMOB_APPLICATION get() = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544~3347511713" else "ca-app-pub-3640696756167444~8485925253"
inline val ID_ADMOB_INTER get() = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544/1033173712" else "ca-app-pub-3640696756167444/8577649931"
inline val ID_ADMOB_NATIVE get() = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544/2247696110" else "ca-app-pub-3640696756167444/7264568260"
inline val ID_ADMOB_OPEN get() = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544/9257395921" else "ca-app-pub-3640696756167444/3381712310"
inline val ID_ADMOB_BANNER get() = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544/9214589741" else "ca-app-pub-3640696756167444/3640792689"
inline val ID_ADMOB_REWARD get() = if (BuildConfig.DEBUG) "ca-app-pub-3940256099942544/5224354917" else "ca-app-pub-3940256099942544/5224354917"
// max广告位id
inline val KEY_MAX get() = if (BuildConfig.DEBUG) "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW" else "GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
inline val ID_MAX_INTER get() = if (BuildConfig.DEBUG) "3a9efc39d536ffe6" else "eb38c10f710ef358"
inline val ID_MAX_NATIVE get() = if (BuildConfig.DEBUG) "cc0cc5b36a2608ca" else "2c6a3803e7352f6f"
inline val ID_MAX_OPEN get() = if (BuildConfig.DEBUG) "ad4efa4a0bc2a585" else "d3f1a759e8f6966a"
inline val ID_MAX_BANNER get() = if (BuildConfig.DEBUG) "" else ""
inline val ID_MAX_REWARD get() = if (BuildConfig.DEBUG) "" else ""
}
\ No newline at end of file
package com.easy.clean
import android.app.Activity
import android.app.Application
import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.text.TextUtils
import android.util.Log
import com.easy.clean.business.helper.EventUtils
import com.easy.clean.business.helper.InstallHelps
import com.easy.clean.business.helper.NewComUtils
import com.easy.clean.business.service.StayJobService.Companion.startStayJobService
import com.easy.clean.utils.ActivityManagerUtils
import com.easy.clean.utils.AppPreferences
import com.easy.clean.utils.LogEx
import com.easy.clean.utils.SolarEngineUtils.initSolarEngine
import com.easy.clean.utils.SolarEngineUtils.solarkey
import com.facebook.FacebookSdk
import com.google.android.gms.ads.identifier.AdvertisingIdClient
import com.google.gson.Gson
import com.hjq.language.MultiLanguages
import com.hjq.language.OnLanguageListener
import com.reyun.solar.engine.SolarEngineManager
import org.json.JSONObject
import java.util.Locale
import java.util.UUID
import com.easy.clean.SpConstObject.appLanguageSp
import com.easy.clean.SpConstObject.appLanguageCountrySp
import com.easy.clean.bean.config.AdConfigBean
import com.easy.clean.bean.config.ConfigBean
import com.easy.clean.bean.config.PopupConfigBean
import com.easy.clean.business.ads.AdsMgr
import com.easy.clean.business.helper.NewComUtils.spConfig
import com.easy.clean.business.push.fcm.FCMManager
import com.easy.clean.business.push.notification.MyNotificationManager
import com.easy.clean.business.push.receiver.AlarmReceiver.Companion.startAlarm
import com.easy.clean.business.push.receiver.ScreenStatusReceiver
import com.easy.clean.business.push.timer.TimerManager.Companion.changeTimer
import com.easy.clean.business.push.work.RepeatingWorker.Companion.schedulePeriodicWork
import com.easy.clean.ui.batteryinfo.BatteryReceiver.Companion.registerBatteryReceiver
import com.easy.clean.ui.splash.SplashActivity
import com.facebook.appevents.AppEventsLogger
class MyApplication : Application() {
private val TAG = "MyApplication"
var uuid = ""
companion object {
lateinit var appContext: MyApplication
@JvmField
var PAUSED_VALUE = 0
val noLoadingActivities = listOf(
"full", // 过滤全屏广告
"adActivity",
"AdActivity",
"AppLovinFullscreenActivity",
SplashActivity::class.java.simpleName,
// 返回前台时不跳转启动页的 activity
)
}
override fun onCreate() {
super.onCreate()
appContext = this
initUUid()
initGid()
initApp()
initLanguage()
}
private fun initLanguage() {
// 初始化语种切换框架
MultiLanguages.init(this)
// 设置语种变化监听器
MultiLanguages.setOnLanguageListener(object : OnLanguageListener {
override fun onAppLocaleChange(oldLocale: Locale, newLocale: Locale) {
appLanguageSp = newLocale.language
appLanguageCountrySp = newLocale.country
Log.i("MultiLanguages", "监听到应用切换了语种,旧语种:$oldLocale,新语种:$newLocale")
}
override fun onSystemLocaleChange(oldLocale: Locale, newLocale: Locale) {
Log.i(
"MultiLanguages",
"监听到系统切换了语种,旧语种:" + oldLocale + ",新语种:" + newLocale +
",是否跟随系统:" + MultiLanguages.isSystemLanguage(this@MyApplication)
)
}
})
}
private fun initGid() {
Thread {
val info: AdvertisingIdClient.Info =
AdvertisingIdClient.getAdvertisingIdInfo(applicationContext)
val advertisingId = info.id
AppPreferences.getInstance().put("gid", advertisingId)
}.start()
}
override fun attachBaseContext(base: Context?) {
super.attachBaseContext(MultiLanguages.attach(base))
}
private fun initUUid() {
uuid = AppPreferences.getInstance().getString("uuid", "")
if (TextUtils.isEmpty(uuid)) {
uuid = UUID.randomUUID().toString() + System.currentTimeMillis()
AppPreferences.getInstance().put("uuid", uuid)
LogEx.logDebug(TAG, "uuid=$uuid")
}
LogEx.logDebug(TAG, "uuid=${AppPreferences.getInstance().getString("uuid", "")}")
}
fun initApp() {
kotlin.runCatching {
startStayJobService()
}
//初始化广告相关业务
AdsMgr.init(appContext)
//初始化facebook sdk
FacebookSdk.sdkInitialize(applicationContext)
AppEventsLogger.activateApp(this)
// val token = AppPreferences.getInstance().getString("token", "")
val topic = GlobalConfig.PACKAGE_NAME + "_push"
// LogEx.logDebug(TAG, "topic=${topic} token=$token")
FCMManager.initFirebase(this)
FCMManager.subscribeToTopic(topic)
initAppConfig()
SolarEngineManager.getInstance().preInit(this, solarkey)
initLifeListener()
ScreenStatusReceiver.registerScreenStatusReceiver(this)
// PackageStatusReceiver.registerPackageStatusReceiver(this)
registerBatteryReceiver(this)
//workManager
schedulePeriodicWork(appContext)
startAlarm(appContext, 24)
startAlarm(appContext, 48)
startAlarm(appContext, 72)
//开启通知队列
MyNotificationManager.startNotificationQueue()
appContext.initSolarEngine(true)
}
private fun initAppConfig() {
Thread {
initConfig()
InstallHelps.init {
initRemoteConfig()
}
}.start()
}
private var lastTimePause = 0L
private var lastTimeResume = 0L
private fun isHotLaunch(): Boolean {
if ((lastTimeResume - lastTimePause) > 5000) {
return true
}
return false
}
private fun initLifeListener() {
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
private var count = 0
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
ActivityManagerUtils.getInstance().addActivity(activity)
}
override fun onActivityStarted(activity: Activity) {
count++
lastTimeResume = System.currentTimeMillis()
if (count == 1 && isHotLaunch()) {
val topActivity: Activity? = ActivityManagerUtils.getInstance().topActivity
val flag = if (topActivity == null) {
true
} else {
noLoadingActivities.all { !topActivity.localClassName.contains(it, true) }
}
LogEx.logDebug(TAG, "flag=$flag" + " activity:" + activity.localClassName)
if (flag) {
topActivity?.startActivity(
Intent(
topActivity, SplashActivity::class.java
).apply {
putExtra("isHotLaunch", true)
putExtra("type", -1)
})
}
}
lastTimeResume = 0
}
override fun onActivityResumed(activity: Activity) {
PAUSED_VALUE = 1
}
override fun onActivityPaused(activity: Activity) {
PAUSED_VALUE = 2
lastTimePause = System.currentTimeMillis()
}
override fun onActivityStopped(activity: Activity) {
count--
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {
ActivityManagerUtils.getInstance().removeActivity(activity)
}
})
}
private fun initRemoteConfig() {
NewComUtils.requestCfg { config ->
LogEx.logDebug("requestCfg", "config=$config")
if (config != null) {
AppPreferences.getInstance().put("config", config)
initConfig(config)
} else {
EventUtils.event("configNull")
}
}
}
private fun initConfig(config: String = spConfig) {
if (config.isEmpty()) return
// kotlin.runCatching {
val configBean = Gson().fromJson(config, ConfigBean::class.java)
val jsonObject = JSONObject()
jsonObject.put("ut", configBean.ut)
EventUtils.event("user_type", ext = jsonObject)
//配置
ConfigBean.configBean = configBean
//广告
AdConfigBean.adsConfigBean = configBean.adConfigBean
LogEx.logDebug("initConfig", "adsConfigBean=${configBean.adConfigBean.functionInShowAd}")
//通知配置
PopupConfigBean.popupConfigBean = configBean.popupConfigBean
LogEx.logDebug("initConfig", "popupConfigBean=${configBean.popupConfigBean.popupCount}")
//启动定时器
changeTimer()
// }
}
}
\ No newline at end of file
package com.easy.clean
import com.easy.clean.utils.AppPreferences
import java.util.Locale
object SpConstObject {
//是否已经点击start
var ifAgreePrivacy = false
get() {
return AppPreferences.getInstance().getBoolean("ifAgreePrivacy", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("ifAgreePrivacy", value, true)
}
//是否已经走过引导页
var isGuided
get() = AppPreferences.getInstance().getBoolean("isGuided", false)
set(value) = AppPreferences.getInstance().putBoolean("isGuided", value)
var appLanguageSp: String = Locale.getDefault().language
get() {
return AppPreferences.getInstance().getString("languageSp", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("languageSp", value, true)
}
var appLanguageCountrySp: String = Locale.getDefault().country
get() {
return AppPreferences.getInstance().getString("languageCountrySp", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("languageCountrySp", value, true)
}
//清理过的文件大小
var cleanedSize = 0L
get() {
return AppPreferences.getInstance().getLong("cleanedSize", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("cleanedSize", value, true)
}
//是否已经评价过
var isScoreRated = false
get() {
return AppPreferences.getInstance().getBoolean("isScoreRated", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("isScoreRated", value, true)
}
//平均分数
var scoreRate = 0
get() {
return AppPreferences.getInstance().getInt("scoreRate", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("scoreRate", value, true)
}
//回到主页的次数
var mainPageCount = 0L
get() {
return AppPreferences.getInstance().getLong("mainPageCount", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("mainPageCount", value, true)
}
//fcm token
var fcmToken = ""
get() {
return AppPreferences.getInstance().getString("fcmToken", field)
}
set(value) {
field = value
AppPreferences.getInstance().put("fcmToken", value, true)
}
}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment