Commit f4628fa3 authored by wanglei's avatar wanglei

...

parent 4a5242fb
package com.base.filerecoveryrecyclebin.activity //package com.base.filerecoveryrecyclebin.activity
//
import android.annotation.SuppressLint //import android.annotation.SuppressLint
import android.content.Intent //import android.content.Intent
import android.graphics.Color //import android.graphics.Color
import android.net.Uri //import android.net.Uri
import android.text.SpannableString //import android.text.SpannableString
import android.text.Spanned //import android.text.Spanned
import android.text.style.UnderlineSpan //import android.text.style.UnderlineSpan
import android.view.View //import android.view.View
import androidx.lifecycle.lifecycleScope //import androidx.lifecycle.lifecycleScope
import com.base.filerecoveryrecyclebin.MyApplication //import com.base.filerecoveryrecyclebin.MyApplication
import com.base.filerecoveryrecyclebin.activity.appmanager.AppManagerAnimationActivity //import com.base.filerecoveryrecyclebin.activity.appmanager.AppManagerAnimationActivity
import com.base.filerecoveryrecyclebin.activity.appprocess.AppProcessAnimationActivity //import com.base.filerecoveryrecyclebin.activity.appprocess.AppProcessAnimationActivity
import com.base.filerecoveryrecyclebin.activity.battery.BatteryInfoAnimationActivity //import com.base.filerecoveryrecyclebin.activity.battery.BatteryInfoAnimationActivity
import com.base.filerecoveryrecyclebin.activity.guide.GuideActivity //import com.base.filerecoveryrecyclebin.activity.guide.GuideActivity
import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity //import com.base.filerecoveryrecyclebin.activity.junkclean.ScanJunkActivity
import com.base.filerecoveryrecyclebin.activity.photomanager.PhotoManagerAnimationActivity //import com.base.filerecoveryrecyclebin.activity.photomanager.PhotoManagerAnimationActivity
import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity //import com.base.filerecoveryrecyclebin.activity.recovery.FileScanResultActivity
import com.base.filerecoveryrecyclebin.activity.repeat.RepeatActivity //import com.base.filerecoveryrecyclebin.activity.repeat.RepeatActivity
import com.base.filerecoveryrecyclebin.activity.whatsapp.WhatsAppCleanerAnimationActivity //import com.base.filerecoveryrecyclebin.activity.whatsapp.WhatsAppCleanerAnimationActivity
import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper //import com.base.filerecoveryrecyclebin.ads.AdmobMaxHelper
import com.base.filerecoveryrecyclebin.bean.ConstObject //import com.base.filerecoveryrecyclebin.bean.ConstObject
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_MANAGER //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_MANAGER
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_PROCESS //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_APP_PROCESS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_BATTERY_INFO //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_BATTERY_INFO
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_JUNK_CLEAN_PUSH //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_JUNK_CLEAN_PUSH
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_DOCUMENTS //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_DOCUMENTS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_PHOTOS //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_PHOTOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_VIDEOS //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_RECOVERY_VIDEOS
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SCREENSHOT_CLEAN //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SCREENSHOT_CLEAN
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SIMILAR_IMAGE //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_SIMILAR_IMAGE
import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_WHATSAPP //import com.base.filerecoveryrecyclebin.bean.ConstObject.ID_WHATSAPP
import com.base.filerecoveryrecyclebin.bean.ConstObject.ifAgreePrivacy //import com.base.filerecoveryrecyclebin.bean.ConstObject.ifAgreePrivacy
import com.base.filerecoveryrecyclebin.bean.ConstObject.isGuide //import com.base.filerecoveryrecyclebin.bean.ConstObject.isGuide
import com.base.filerecoveryrecyclebin.databinding.ActivitySplashBinding //import com.base.filerecoveryrecyclebin.databinding.ActivitySplashBinding
import com.base.filerecoveryrecyclebin.fcm.CloseNotificationReceiver //import com.base.filerecoveryrecyclebin.fcm.CloseNotificationReceiver
import com.base.filerecoveryrecyclebin.fcm.CloseNotificationReceiver.Companion.NotificationId //import com.base.filerecoveryrecyclebin.fcm.CloseNotificationReceiver.Companion.NotificationId
import com.base.filerecoveryrecyclebin.fcm.NotificationUtil //import com.base.filerecoveryrecyclebin.fcm.NotificationUtil
import com.base.filerecoveryrecyclebin.help.BaseActivity //import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.help.ConfigHelper //import com.base.filerecoveryrecyclebin.help.ConfigHelper
import com.base.filerecoveryrecyclebin.service.StayNotificationService.Companion.startStayNotification //import com.base.filerecoveryrecyclebin.service.StayNotificationService.Companion.startStayNotification
import com.base.filerecoveryrecyclebin.utils.AppPreferences //import com.base.filerecoveryrecyclebin.utils.AppPreferences
import com.base.filerecoveryrecyclebin.utils.BarUtils //import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.LogEx //import com.base.filerecoveryrecyclebin.utils.LogEx
import kotlinx.coroutines.Job //import kotlinx.coroutines.Job
import kotlinx.coroutines.cancel //import kotlinx.coroutines.cancel
import kotlinx.coroutines.delay //import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableSharedFlow //import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow //import kotlinx.coroutines.flow.SharedFlow
import kotlinx.coroutines.flow.collectLatest //import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.isActive //import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch //import kotlinx.coroutines.launch
import kotlin.random.Random //import kotlin.random.Random
//
@SuppressLint("CustomSplashScreen") //@SuppressLint("CustomSplashScreen")
class SplashActivity : BaseActivity<ActivitySplashBinding>() { //class SplashActivity : BaseActivity<ActivitySplashBinding>() {
//
private val TAG = "SplashActivity" // private val TAG = "SplashActivity"
private var job: Job? = null // private var job: Job? = null
private val progress = MutableSharedFlow<Int>() // private val progress = MutableSharedFlow<Int>()
private val progressFlow: SharedFlow<Int> = progress // private val progressFlow: SharedFlow<Int> = progress
private var oneClickStart: Boolean = false // private var oneClickStart: Boolean = false
private var actionId = -1 // private var actionId = -1
//
//
override val binding: ActivitySplashBinding by lazy { // override val binding: ActivitySplashBinding by lazy {
ActivitySplashBinding.inflate(layoutInflater) // ActivitySplashBinding.inflate(layoutInflater)
} // }
//
override fun initView() { // override fun initView() {
BarUtils.setStatusBarLightMode(this, true) // BarUtils.setStatusBarLightMode(this, true)
BarUtils.setStatusBarColor(this, Color.TRANSPARENT) // BarUtils.setStatusBarColor(this, Color.TRANSPARENT)
//
// if (MyApplication.isInterOpenShowing) { //// if (MyApplication.isInterOpenShowing) {
// finish() //// finish()
//// return
//// }
//
// startStayNotification()
// NotificationUtil.stopNotificationHandler()
//
// actionId = intent?.extras?.getInt("actionId") ?: -1
// closeNotification()
//
// progressCollect()
//
// if (ifAgreePrivacy) {
// AdmobMaxHelper.preloadAd(this)
// job = startProgress()
// binding.llStart.visibility = View.GONE
// binding.llProgress.visibility = View.VISIBLE
// } else {
// binding.llStart.visibility = View.VISIBLE
// binding.llProgress.visibility = View.GONE
// }
//
// val spannableString = SpannableString("Privacy Policy")
// spannableString.setSpan(
// UnderlineSpan(),
// 0,
// spannableString.length,
// Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
// )
// binding.idTvPrivacyPolicy.text = spannableString
//
// binding.idTvPrivacyPolicy.setOnClickListener {
// val intent = Intent(
// Intent.ACTION_VIEW,
// Uri.parse(ConfigHelper.privacyPolicy)
// )
// startActivity(intent)
// }
// }
//
// private fun progressCollect() {
// lifecycleScope.launch {
// progressFlow.collectLatest {
// if (it >= 100) {
// job?.cancel()
// jumpNext()
// this.cancel()
// }
// }
// }
// }
//
// var jumped: Boolean = false
// private fun jumpNext() {
//
// if (jumped) {
// return // return
// } // }
// jumped = true
startStayNotification() // LogEx.logDebug(TAG, "jumpNext actionId=$actionId")
NotificationUtil.stopNotificationHandler() //
// when (actionId) {
actionId = intent?.extras?.getInt("actionId") ?: -1 // ID_JUNK_CLEAN_PUSH -> {
closeNotification() // startActivity(Intent(this, ScanJunkActivity::class.java))
// }
progressCollect() //
// ID_SIMILAR_IMAGE -> {
if (ifAgreePrivacy) { // startActivity(Intent(this, PhotoManagerAnimationActivity::class.java))
AdmobMaxHelper.preloadAd(this) // }
job = startProgress() //
binding.llStart.visibility = View.GONE // ID_SCREENSHOT_CLEAN -> {
binding.llProgress.visibility = View.VISIBLE // startActivity(Intent(this, PhotoManagerAnimationActivity::class.java))
} else { // }
binding.llStart.visibility = View.VISIBLE //
binding.llProgress.visibility = View.GONE // ID_RECOVERY_PHOTOS -> {
} // startActivity(Intent(this, FileScanResultActivity::class.java).apply {
// putExtra("ScanType", ConstObject.SCAN_PHOTOS)
val spannableString = SpannableString("Privacy Policy") // })
spannableString.setSpan( // }
UnderlineSpan(), //
0, // ID_RECOVERY_VIDEOS -> {
spannableString.length, // startActivity(Intent(this, FileScanResultActivity::class.java).apply {
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE // putExtra("ScanType", ConstObject.SCAN_VIDEOS)
) // })
binding.idTvPrivacyPolicy.text = spannableString // }
//
binding.idTvPrivacyPolicy.setOnClickListener { // ID_RECOVERY_DOCUMENTS -> {
val intent = Intent( // startActivity(Intent(this, FileScanResultActivity::class.java).apply {
Intent.ACTION_VIEW, // putExtra("ScanType", ConstObject.SCAN_DOCUMENTS)
Uri.parse(ConfigHelper.privacyPolicy) // })
) // }
startActivity(intent) //
} // ID_WHATSAPP -> {
} // startActivity(Intent(this, WhatsAppCleanerAnimationActivity::class.java))
// }
private fun progressCollect() { //
lifecycleScope.launch { // ID_APP_PROCESS -> {
progressFlow.collectLatest { // startActivity(Intent(this, AppProcessAnimationActivity::class.java))
if (it >= 100) { // }
job?.cancel() //
jumpNext() // ID_APP_MANAGER -> {
this.cancel() // startActivity(Intent(this, AppManagerAnimationActivity::class.java))
} // }
} //
} // ID_BATTERY_INFO -> {
} // startActivity(Intent(this, BatteryInfoAnimationActivity::class.java))
// }
var jumped: Boolean = false //
private fun jumpNext() { //
// else -> {
if (jumped) { // val isHotLaunch = intent?.extras?.getBoolean("isHotLaunch", false) ?: false
return // if (!isHotLaunch) {
} // startActivity(Intent(this@SplashActivity, MainActivity::class.java))
jumped = true // if (!isGuide) {
LogEx.logDebug(TAG, "jumpNext actionId=$actionId") // startActivity(Intent(this@SplashActivity, GuideActivity::class.java))
// isGuide = true
when (actionId) { // } else {
ID_JUNK_CLEAN_PUSH -> { // startActivity(Intent(this@SplashActivity, MainActivity::class.java))
startActivity(Intent(this, ScanJunkActivity::class.java)) // }
} // }
// }
ID_SIMILAR_IMAGE -> { // }
startActivity(Intent(this, PhotoManagerAnimationActivity::class.java)) // finish()
} // intent?.extras?.clear()
// }
ID_SCREENSHOT_CLEAN -> { //
startActivity(Intent(this, PhotoManagerAnimationActivity::class.java)) // private fun closeNotification() {
} // sendBroadcast(Intent(this, CloseNotificationReceiver::class.java).apply {
// this.action = CloseNotificationReceiver.Action
ID_RECOVERY_PHOTOS -> { // this.putExtra(NotificationId, actionId)
startActivity(Intent(this, FileScanResultActivity::class.java).apply { // })
putExtra("ScanType", ConstObject.SCAN_PHOTOS) // }
}) //
} // override fun initListener() {
//
ID_RECOVERY_VIDEOS -> { // binding.idTvStart.setOnClickListener {
startActivity(Intent(this, FileScanResultActivity::class.java).apply { // if (oneClickStart) {
putExtra("ScanType", ConstObject.SCAN_VIDEOS) // return@setOnClickListener
}) // }
} // oneClickStart = true
// ifAgreePrivacy = true
ID_RECOVERY_DOCUMENTS -> { // (application as MyApplication).initApp(true)
startActivity(Intent(this, FileScanResultActivity::class.java).apply { // AdmobMaxHelper.preloadAd(this)
putExtra("ScanType", ConstObject.SCAN_DOCUMENTS) // binding.llStart.visibility = View.GONE
}) // binding.llProgress.visibility = View.VISIBLE
} // job = startProgress()
// }
ID_WHATSAPP -> { // }
startActivity(Intent(this, WhatsAppCleanerAnimationActivity::class.java)) //
} // private var processTime = 0L
// private var outTimeAdStart = false
ID_APP_PROCESS -> { // private fun startProgress() = lifecycleScope.launch {
startActivity(Intent(this, AppProcessAnimationActivity::class.java)) // LogEx.logDebug(TAG, "startProgress")
} // while (isActive) {
// val value = binding.pb.progress + 2
ID_APP_MANAGER -> { // binding.pb.setProgress(value, true)
startActivity(Intent(this, AppManagerAnimationActivity::class.java)) // progress.emit(value)
} //
// val delayTime = 300L
ID_BATTERY_INFO -> { // delay(delayTime)
startActivity(Intent(this, BatteryInfoAnimationActivity::class.java)) // processTime += delayTime
} // if (processTime >= Random.nextLong(2500, 3000)) {
// if (!outTimeAdStart) {
// outTimeAdStart = true
else -> { // outTimeAd()
val isHotLaunch = intent?.extras?.getBoolean("isHotLaunch", false) ?: false // }
if (!isHotLaunch) { // }
startActivity(Intent(this@SplashActivity, MainActivity::class.java)) // }
if (!isGuide) { // }
startActivity(Intent(this@SplashActivity, GuideActivity::class.java)) //
isGuide = true //
} else { // private fun outTimeAd() {
startActivity(Intent(this@SplashActivity, MainActivity::class.java)) // LogEx.logDebug(TAG, "outTimeAd")
} //
} // var loaded: Boolean = true
} // AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag ->
} // LogEx.logDebug(TAG, "showBeforeAction flag=$flag")
finish() // loaded = flag
intent?.extras?.clear() // job?.cancel()
} // }, onHidden = {
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
private fun closeNotification() { // if (sp == 1 && !loaded) {
sendBroadcast(Intent(this, CloseNotificationReceiver::class.java).apply { // AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) {
this.action = CloseNotificationReceiver.Action // binding.pb.progress = 100
this.putExtra(NotificationId, actionId) // jumpNext()
}) // }
} // } else {
// binding.pb.progress = 100
override fun initListener() { // jumpNext()
// }
binding.idTvStart.setOnClickListener { //
if (oneClickStart) { // })
return@setOnClickListener // }
} //
oneClickStart = true // override fun onResume() {
ifAgreePrivacy = true // super.onResume()
(application as MyApplication).initApp(true) // LogEx.logDebug(TAG, "onResume")
AdmobMaxHelper.preloadAd(this) // if (ifAgreePrivacy && job?.isActive == false) {
binding.llStart.visibility = View.GONE // job = startProgress()
binding.llProgress.visibility = View.VISIBLE // }
job = startProgress() // }
} //
} // override fun onPause() {
// super.onPause()
private var processTime = 0L // job?.cancel()
private var outTimeAdStart = false // LogEx.logDebug(TAG, "onPause")
private fun startProgress() = lifecycleScope.launch { // }
LogEx.logDebug(TAG, "startProgress") //
while (isActive) { //
val value = binding.pb.progress + 2 //}
binding.pb.setProgress(value, true) \ No newline at end of file
progress.emit(value)
val delayTime = 300L
delay(delayTime)
processTime += delayTime
if (processTime >= Random.nextLong(2500, 3000)) {
if (!outTimeAdStart) {
outTimeAdStart = true
outTimeAd()
}
}
}
}
private fun outTimeAd() {
LogEx.logDebug(TAG, "outTimeAd")
var loaded: Boolean = true
AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag ->
LogEx.logDebug(TAG, "showBeforeAction flag=$flag")
loaded = flag
job?.cancel()
}, onHidden = {
val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
if (sp == 1 && !loaded) {
AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) {
binding.pb.progress = 100
jumpNext()
}
} else {
binding.pb.progress = 100
jumpNext()
}
})
}
override fun onResume() {
super.onResume()
LogEx.logDebug(TAG, "onResume")
if (ifAgreePrivacy && job?.isActive == false) {
job = startProgress()
}
}
override fun onPause() {
super.onPause()
job?.cancel()
LogEx.logDebug(TAG, "onPause")
}
}
\ No newline at end of file
...@@ -14,7 +14,6 @@ import com.base.filerecoveryrecyclebin.databinding.ActivityBatteryBinding ...@@ -14,7 +14,6 @@ import com.base.filerecoveryrecyclebin.databinding.ActivityBatteryBinding
import com.base.filerecoveryrecyclebin.help.BaseActivity import com.base.filerecoveryrecyclebin.help.BaseActivity
import com.base.filerecoveryrecyclebin.receiver.BatteryReceiver import com.base.filerecoveryrecyclebin.receiver.BatteryReceiver
import com.base.filerecoveryrecyclebin.utils.BarUtils import com.base.filerecoveryrecyclebin.utils.BarUtils
import com.base.filerecoveryrecyclebin.utils.LogEx
import com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog import com.base.filerecoveryrecyclebin.view.DialogViews.showExitFunctionDialog
import kotlin.math.abs import kotlin.math.abs
......
...@@ -63,7 +63,7 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi ...@@ -63,7 +63,7 @@ class BatteryInfoAnimationActivity : BaseActivity<ActivityBatteryInfoAnimationBi
binding.lottieCompleted.playAnimation() binding.lottieCompleted.playAnimation()
binding.tv.text = "Completed!" binding.tv.text = "Completed!"
delay(1000) delay(1000)
AdmobMaxHelper.admobMaxShowOpenAd(this@BatteryInfoAnimationActivity, showBeforeAction = {}) { AdmobMaxHelper.admobMaxShowInterstitialAd(this@BatteryInfoAnimationActivity) {
binding.lottie.clearAnimation() binding.lottie.clearAnimation()
startActivity(Intent(this@BatteryInfoAnimationActivity, BatteryActivity::class.java)) startActivity(Intent(this@BatteryInfoAnimationActivity, BatteryActivity::class.java))
finish() finish()
......
...@@ -64,7 +64,6 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(), ...@@ -64,7 +64,6 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
mTaskManager = TaskManager(binding, this) mTaskManager = TaskManager(binding, this)
if (ifAgreePrivacy) { if (ifAgreePrivacy) {
onAgreePrivacy() onAgreePrivacy()
// EventUtils.event("app_start")
} else { } else {
PrivacyManager(binding, this, this) PrivacyManager(binding, this, this)
} }
...@@ -83,16 +82,9 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(), ...@@ -83,16 +82,9 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
if (jumpType == 0) { if (jumpType == 0) {
startStayNotification() startStayNotification()
} }
AdmobMaxHelper.preloadAd(this)
mTaskManager?.startProgress() mTaskManager?.startProgress()
loadAd() loadAd()
// if (!ConfigHelper.ifGuest) {
// mTaskManager?.pauseProgress()
// onProgressMax()
// return
// } else {
// loadAd()
// }
} }
...@@ -103,9 +95,6 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(), ...@@ -103,9 +95,6 @@ class Splash2Activity : BaseActivity<ActivitySplashBinding>(),
} }
private fun loadAd() { private fun loadAd() {
// AdmobMaxHelper.admobMaxShowOpenAd(this){
//
// }
AdmobMaxHelper.admobMaxShowOpenAd(this, { AdmobMaxHelper.admobMaxShowOpenAd(this, {
mTaskManager?.pauseProgress() mTaskManager?.pauseProgress()
}, { }, {
......
...@@ -154,11 +154,11 @@ object AdmobMaxHelper { ...@@ -154,11 +154,11 @@ object AdmobMaxHelper {
} }
if (getSpAdmobTrueMaxFalse()) { if (getSpAdmobTrueMaxFalse()) {
AdmobOpenUtils.loadAppOpenAd() // AdmobOpenUtils.loadAppOpenAd()
AdmobInterstitialUtils.loadInterstitialAd(activity) AdmobInterstitialUtils.loadInterstitialAd(activity)
} else { } else {
if (isAdInit.get()) { if (isAdInit.get()) {
AdMaxOpenUtils.loadAppOpenAd(activity) // AdMaxOpenUtils.loadAppOpenAd(activity)
AdMaxInterstitialUtils.loadInterstitialAd(activity) AdMaxInterstitialUtils.loadInterstitialAd(activity)
} else { } else {
AdMaxInit.maxInitAction = { AdMaxInit.maxInitAction = {
......
package com.base.filerecoveryrecyclebin.help package com.base.filerecoveryrecyclebin.help
import android.os.Build import android.os.Build
import android.text.TextUtils
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import com.android.installreferrer.api.InstallReferrerClient import com.android.installreferrer.api.InstallReferrerClient
import com.android.installreferrer.api.InstallReferrerStateListener import com.android.installreferrer.api.InstallReferrerStateListener
......
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