Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Sign in / Register
Toggle navigation
B
Browser White
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
wanglei
Browser White
Commits
ca7d2ae8
Commit
ca7d2ae8
authored
Aug 27, 2024
by
wanglei
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
...ad
parent
0e02fbb7
Hide whitespace changes
Inline
Side-by-side
Showing
32 changed files
with
2358 additions
and
22 deletions
+2358
-22
build.gradle.kts
app/build.gradle.kts
+1
-0
MyApplication.kt
app/src/main/java/com/base/browserwhite/MyApplication.kt
+3
-3
AdDisplayUtils.java
...c/main/java/com/base/browserwhite/ads/AdDisplayUtils.java
+308
-0
AdmobMaxHelper.kt
...src/main/java/com/base/browserwhite/ads/AdmobMaxHelper.kt
+162
-0
CustomDialog.kt
app/src/main/java/com/base/browserwhite/ads/CustomDialog.kt
+20
-0
AdmobBannerColla.kt
.../java/com/base/browserwhite/ads/admob/AdmobBannerColla.kt
+90
-0
AdmobEvent.kt
...c/main/java/com/base/browserwhite/ads/admob/AdmobEvent.kt
+248
-0
AdmobInterstitialUtils.kt
...com/base/browserwhite/ads/admob/AdmobInterstitialUtils.kt
+179
-0
AdmobNativeUtils.kt
.../java/com/base/browserwhite/ads/admob/AdmobNativeUtils.kt
+113
-0
AdmobOpenUtils.kt
...in/java/com/base/browserwhite/ads/admob/AdmobOpenUtils.kt
+144
-0
NativeView.kt
...c/main/java/com/base/browserwhite/ads/admob/NativeView.kt
+62
-0
AdMaxEvent.kt
...src/main/java/com/base/browserwhite/ads/max/AdMaxEvent.kt
+144
-0
AdMaxInit.kt
app/src/main/java/com/base/browserwhite/ads/max/AdMaxInit.kt
+48
-0
AdMaxInterstitialUtils.kt
...a/com/base/browserwhite/ads/max/AdMaxInterstitialUtils.kt
+194
-0
AdMaxNativeUtils.kt
...in/java/com/base/browserwhite/ads/max/AdMaxNativeUtils.kt
+160
-0
AdMaxOpenUtils.kt
...main/java/com/base/browserwhite/ads/max/AdMaxOpenUtils.kt
+182
-0
ConfigHelper.kt
app/src/main/java/com/base/browserwhite/help/ConfigHelper.kt
+1
-1
EventUtils.kt
app/src/main/java/com/base/browserwhite/help/EventUtils.kt
+3
-2
NewsUtils.kt
app/src/main/java/com/base/browserwhite/help/NewsUtils.kt
+0
-1
StayNotificationService.kt
.../com/base/browserwhite/service/StayNotificationService.kt
+1
-1
SplashActivity.kt
.../java/com/base/browserwhite/ui/activity/SplashActivity.kt
+5
-6
CleaningActivity.kt
...se/browserwhite/ui/activity/cleanjunk/CleaningActivity.kt
+1
-1
WebDownloadManagerActivity.kt
...rwhite/ui/activity/download/WebDownloadManagerActivity.kt
+6
-6
bg_355bea_10.xml
app/src/main/res/drawable/bg_355bea_10.xml
+5
-0
bg_ad_border.xml
app/src/main/res/drawable/bg_ad_border.xml
+7
-0
bg_ff8a00_10.xml
app/src/main/res/drawable/bg_ff8a00_10.xml
+5
-0
circle_progress_bar.xml
app/src/main/res/drawable/circle_progress_bar.xml
+27
-0
dialog_ad_loading.xml
app/src/main/res/layout/dialog_ad_loading.xml
+33
-0
dialog_download_finish.xml
app/src/main/res/layout/dialog_download_finish.xml
+1
-1
layout_admob_native_custom.xml
app/src/main/res/layout/layout_admob_native_custom.xml
+99
-0
layout_admob_native_download.xml
app/src/main/res/layout/layout_admob_native_download.xml
+0
-0
layout_max_native_small.xml
app/src/main/res/layout/layout_max_native_small.xml
+106
-0
No files found.
app/build.gradle.kts
View file @
ca7d2ae8
...
@@ -129,6 +129,7 @@ dependencies {
...
@@ -129,6 +129,7 @@ dependencies {
//firebase
//firebase
implementation
(
platform
(
"com.google.firebase:firebase-bom:32.3.1"
))
implementation
(
platform
(
"com.google.firebase:firebase-bom:32.3.1"
))
implementation
(
"com.google.firebase:firebase-analytics"
)
implementation
(
"com.google.firebase:firebase-analytics"
)
implementation
(
"com.google.firebase:firebase-analytics-ktx"
)
implementation
(
"com.google.firebase:firebase-crashlytics"
)
implementation
(
"com.google.firebase:firebase-crashlytics"
)
//机器学习二维码扫描
//机器学习二维码扫描
...
...
app/src/main/java/com/base/browserwhite/MyApplication.kt
View file @
ca7d2ae8
...
@@ -52,14 +52,14 @@ class MyApplication : Application() {
...
@@ -52,14 +52,14 @@ class MyApplication : Application() {
// LogEx.logDebug(TAG, "flag=$flag" + " activity:" + activity.localClassName)
// LogEx.logDebug(TAG, "flag=$flag" + " activity:" + activity.localClassName)
//
//
// if (flag && !isInterOpenShowing) {
// if (flag && !isInterOpenShowing) {
// if (AdmobMaxHelper.isOpenAdLoaded()) {
// if (
com.base.browserwhite.ads.
AdmobMaxHelper.isOpenAdLoaded()) {
// var loaded: Boolean = true
// var loaded: Boolean = true
// AdmobMaxHelper.admobMaxShowOpenAd(activity, {
//
com.base.browserwhite.ads.
AdmobMaxHelper.admobMaxShowOpenAd(activity, {
// loaded = it
// loaded = it
// }, {
// }, {
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// if (sp == 1 && !loaded) {
// if (sp == 1 && !loaded) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(activity)
//
com.base.browserwhite.ads.
AdmobMaxHelper.admobMaxShowInterstitialAd(activity)
// }
// }
// })
// })
// } else {
// } else {
...
...
app/src/main/java/com/base/browserwhite/ads/AdDisplayUtils.java
0 → 100644
View file @
ca7d2ae8
package
com
.
base
.
browserwhite
.
ads
;
import
android.content.Context
;
import
android.content.SharedPreferences
;
import
android.util.Log
;
import
com.base.browserwhite.BuildConfig
;
import
com.base.browserwhite.MyApplication
;
import
com.base.browserwhite.help.EventUtils
;
import
com.base.browserwhite.utils.AppPreferences
;
import
com.base.browserwhite.utils.LogEx
;
import
com.facebook.appevents.AppEventsLogger
;
import
org.json.JSONException
;
import
org.json.JSONObject
;
import
java.text.SimpleDateFormat
;
import
java.util.Calendar
;
import
java.util.Date
;
import
java.util.Locale
;
public
class
AdDisplayUtils
{
private
String
TAG
=
"AdDisplayUtils"
;
public
static
final
int
DEFAULT_MAX_AD_REQUEST_COUNT
=
100
;
// 广告请求次数限制默认值
public
static
final
int
DEFAULT_MAX_AD_REQUEST_FAIL_COUNT
=
20
;
// 单个广告点击次数限制默认值
public
static
final
int
DEFAULT_MAX_AD_DISPLAY_COUNT
=
45
;
// 总广告展示次数限制默认值
public
static
final
int
DEFAULT_MAX_AD_CLICK_COUNT
=
10
;
// 单个广告点击次数限制默认值
private
static
final
String
AD_PREFS_NAME
=
"ad_prefs"
;
// SharedPreferences 名称
private
static
AdDisplayUtils
instance
;
// 单例对象
private
String
currentDate
;
// 当前日期
private
Context
context
=
MyApplication
.
context
;
public
void
saveSp
()
{
this
.
maxAdRequestCount
=
Integer
.
parseInt
(
AppPreferences
.
getInstance
().
getString
(
"adMaxRequestCount"
,
String
.
valueOf
(
DEFAULT_MAX_AD_REQUEST_COUNT
)));
saveMaxAdRequestCount
();
this
.
maxAdRequestFailCount
=
Integer
.
parseInt
(
AppPreferences
.
getInstance
().
getString
(
"adRequestFailCount"
,
String
.
valueOf
(
DEFAULT_MAX_AD_REQUEST_FAIL_COUNT
)));
saveMaxAdRequestFailCount
();
this
.
maxAdDisplayCount
=
Integer
.
parseInt
(
AppPreferences
.
getInstance
().
getString
(
"adShowCount"
,
String
.
valueOf
(
DEFAULT_MAX_AD_DISPLAY_COUNT
)));
saveMaxAdDisplayCount
();
this
.
maxAdClickCount
=
Integer
.
parseInt
(
AppPreferences
.
getInstance
().
getString
(
"adClickCount"
,
String
.
valueOf
(
DEFAULT_MAX_AD_CLICK_COUNT
)));
saveMaxAdClickCount
();
}
private
AdDisplayUtils
()
{
currentDate
=
getCurrentDate
();
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
maxAdRequestCount
=
prefs
.
getInt
(
MAX_AD_REQUEST_COUNT_KEY
,
DEFAULT_MAX_AD_REQUEST_COUNT
);
maxAdRequestFailCount
=
prefs
.
getInt
(
MAX_AD_REQUEST_FAIL_COUNT_KEY
,
DEFAULT_MAX_AD_REQUEST_FAIL_COUNT
);
maxAdDisplayCount
=
prefs
.
getInt
(
MAX_AD_DISPLAY_COUNT_KEY
,
DEFAULT_MAX_AD_DISPLAY_COUNT
);
maxAdClickCount
=
prefs
.
getInt
(
MAX_AD_CLICK_COUNT_KEY
,
DEFAULT_MAX_AD_CLICK_COUNT
);
adRequestCount
=
prefs
.
getInt
(
getAdRequestCountKey
(),
0
);
adRequestFailCount
=
prefs
.
getInt
(
getAdRequestFailCountKey
(),
0
);
adDisplayCount
=
prefs
.
getInt
(
getAdDisplayCountKey
(),
0
);
adClickCount
=
prefs
.
getInt
(
getAdClickCountKey
(),
0
);
}
public
static
synchronized
AdDisplayUtils
getInstance
()
{
if
(
instance
==
null
)
{
instance
=
new
AdDisplayUtils
();
}
return
instance
;
}
public
boolean
shouldSendAdRequest
()
{
return
adRequestCount
<
maxAdRequestCount
;
}
public
boolean
shouldIncrementRequestFailAd
()
{
return
adRequestFailCount
<
maxAdRequestFailCount
;
}
public
boolean
shouldDisplayAd
()
{
return
adDisplayCount
<
maxAdDisplayCount
;
}
public
boolean
shouldIncrementClickCount
()
{
return
adClickCount
<
maxAdClickCount
;
}
public
boolean
shouldShowAd
(
String
ad_unit
)
{
if
(
BuildConfig
.
DEBUG
)
{
return
true
;
}
boolean
shouldDisplayAd
=
shouldDisplayAd
();
boolean
shouldIncrementClickCount
=
shouldIncrementClickCount
();
boolean
shouldIncrementRequestFailAd
=
shouldIncrementRequestFailAd
();
boolean
shouldSendAdRequest
=
shouldSendAdRequest
();
LogEx
.
INSTANCE
.
logDebug
(
TAG
,
"shouldSendAdRequest="
+
shouldSendAdRequest
,
false
);
LogEx
.
INSTANCE
.
logDebug
(
TAG
,
"shouldIncrementRequestFailAd="
+
shouldIncrementRequestFailAd
,
false
);
LogEx
.
INSTANCE
.
logDebug
(
TAG
,
"shouldIncrementClickCount="
+
shouldIncrementClickCount
,
false
);
LogEx
.
INSTANCE
.
logDebug
(
TAG
,
"shouldDisplayAd="
+
shouldDisplayAd
,
false
);
boolean
show
=
shouldIncrementRequestFailAd
&&
shouldSendAdRequest
&&
shouldDisplayAd
&&
shouldIncrementClickCount
;
if
(!
show
)
{
LogEx
.
INSTANCE
.
logDebug
(
"glc"
,
"!shouldShowAd"
,
false
);
JSONObject
obj2
=
new
JSONObject
();
try
{
obj2
.
put
(
"reason"
,
"ad limit"
);
obj2
.
put
(
"shouldSendAdRequest"
,
shouldSendAdRequest
);
obj2
.
put
(
"shouldIncrementRequestFailAd"
,
shouldIncrementRequestFailAd
);
obj2
.
put
(
"shouldDisplayAd"
,
shouldDisplayAd
);
obj2
.
put
(
"shouldIncrementClickCount"
,
shouldIncrementClickCount
);
obj2
.
put
(
"adDisplayCount"
,
adDisplayCount
);
obj2
.
put
(
"maxAdDisplayCount"
,
maxAdDisplayCount
);
obj2
.
put
(
"adClickCount"
,
adClickCount
);
obj2
.
put
(
"maxAdClickCount"
,
maxAdClickCount
);
obj2
.
put
(
"adRequestFailCount"
,
adRequestFailCount
);
obj2
.
put
(
"adRequestCount"
,
maxAdRequestFailCount
);
obj2
.
put
(
"adRequestCount"
,
adRequestCount
);
obj2
.
put
(
"ad_unit"
,
ad_unit
);
EventUtils
.
INSTANCE
.
event
(
"ad_show_error"
,
null
,
obj2
,
false
);
}
catch
(
JSONException
ignored
)
{
}
}
return
show
;
}
//region AdRequestCount
private
int
maxAdRequestCount
=
0
;
// 最大广告请求次数
private
int
adRequestCount
=
0
;
// 当前广告请求次数
private
static
final
String
MAX_AD_REQUEST_COUNT_KEY
=
"max_ad_request_count"
;
// 广告请求次数限制的键
private
static
final
String
AD_REQUEST_COUNT_KEY
=
"ad_request_count"
;
//广告请求次数
private
void
saveMaxAdRequestCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
MAX_AD_REQUEST_COUNT_KEY
,
maxAdRequestCount
);
editor
.
apply
();
}
public
void
incrementAdRequestCount
()
{
if
(!
currentDate
.
equals
(
getCurrentDate
()))
{
currentDate
=
getCurrentDate
();
adRequestCount
=
0
;
}
adRequestCount
++;
saveAdRequestCount
();
}
private
String
getAdRequestCountKey
()
{
return
AD_REQUEST_COUNT_KEY
+
"_"
+
currentDate
;
}
private
void
saveAdRequestCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
getAdRequestCountKey
(),
adRequestCount
);
editor
.
apply
();
}
//endregion
//region AdRequestFailCount
private
int
maxAdRequestFailCount
;
// 请求失败总
private
int
adRequestFailCount
=
0
;
// 请求失败当前
private
static
final
String
MAX_AD_REQUEST_FAIL_COUNT_KEY
=
"max_ad_request_fail_count"
;
// 单个广告点击次数限制的键
private
static
final
String
AD_REQUEST_FAIL_COUNT_KEY
=
"ad_request_fail_count"
;
// 单个广告点击次数限制的键
private
void
saveMaxAdRequestFailCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
MAX_AD_REQUEST_FAIL_COUNT_KEY
,
maxAdRequestFailCount
);
editor
.
apply
();
}
public
void
incrementAdRequestFailCount
()
{
if
(!
currentDate
.
equals
(
getCurrentDate
()))
{
currentDate
=
getCurrentDate
();
adRequestFailCount
=
0
;
}
adRequestFailCount
++;
saveAdRequestFailCount
();
Log
.
d
(
"glc"
,
"广告请求失败:"
+
adRequestFailCount
);
}
private
String
getAdRequestFailCountKey
()
{
return
AD_REQUEST_FAIL_COUNT_KEY
+
"_"
+
currentDate
;
}
private
void
saveAdRequestFailCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
getAdRequestFailCountKey
(),
adRequestFailCount
);
editor
.
apply
();
}
//endregion
//region AdDisplayCount
private
int
maxAdDisplayCount
;
// 总广告展示次数限制
private
int
adDisplayCount
=
0
;
// 当前广告展示次数
private
static
final
String
MAX_AD_DISPLAY_COUNT_KEY
=
"max_ad_display_count"
;
// 总广告展示次数限制的键
private
static
final
String
AD_DISPLAY_COUNT_KEY
=
"ad_display_count"
;
// 广告展示次数的键
private
void
saveMaxAdDisplayCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
MAX_AD_DISPLAY_COUNT_KEY
,
maxAdDisplayCount
);
editor
.
apply
();
}
public
void
incrementAdDisplayCount
()
{
if
(!
currentDate
.
equals
(
getCurrentDate
()))
{
currentDate
=
getCurrentDate
();
adDisplayCount
=
0
;
}
adDisplayCount
++;
int
max
=
AppPreferences
.
getInstance
().
getInt
(
"facebookAdShowEventCount"
,
3
);
if
(
adClickCount
>=
max
&&
max
!=
-
1
)
{
AppEventsLogger
logger
=
AppEventsLogger
.
newLogger
(
context
);
logger
.
logEvent
(
"ad_show"
);
AppPreferences
.
getInstance
().
put
(
"facebookAdShowEventCount"
,
-
1
);
}
saveAdDisplayCount
();
}
private
String
getAdDisplayCountKey
()
{
return
AD_DISPLAY_COUNT_KEY
+
"_"
+
currentDate
;
}
private
void
saveAdDisplayCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
getAdDisplayCountKey
(),
adDisplayCount
);
editor
.
apply
();
}
//endregion
//region AdClickCount
public
int
maxAdClickCount
;
// 单个广告点击次数限制
private
int
adClickCount
=
0
;
// 当前广告点击次数
private
static
final
String
MAX_AD_CLICK_COUNT_KEY
=
"max_ad_click_count"
;
// 单个广告点击次数限制的键
private
static
final
String
AD_CLICK_COUNT_KEY
=
"ad_click_count"
;
// 广告点击次数的键
private
void
saveMaxAdClickCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
MAX_AD_CLICK_COUNT_KEY
,
maxAdClickCount
);
editor
.
apply
();
}
public
void
incrementAdClickCount
()
{
LogEx
.
INSTANCE
.
logDebug
(
TAG
,
"incrementAdClickCount"
,
false
);
if
(!
currentDate
.
equals
(
getCurrentDate
()))
{
currentDate
=
getCurrentDate
();
adClickCount
=
0
;
}
adClickCount
++;
saveAdClickCount
();
}
private
String
getAdClickCountKey
()
{
return
AD_CLICK_COUNT_KEY
+
"_"
+
currentDate
;
}
public
void
setAdClickCount
(
int
s
)
{
if
(!
currentDate
.
equals
(
getCurrentDate
()))
{
currentDate
=
getCurrentDate
();
adClickCount
=
0
;
}
adClickCount
=
s
;
saveAdClickCount
();
}
private
void
saveAdClickCount
()
{
SharedPreferences
prefs
=
context
.
getSharedPreferences
(
AD_PREFS_NAME
,
0
);
SharedPreferences
.
Editor
editor
=
prefs
.
edit
();
editor
.
putInt
(
getAdClickCountKey
(),
adClickCount
);
editor
.
apply
();
LogEx
.
INSTANCE
.
logDebug
(
TAG
,
"adClickCount="
+
adClickCount
,
false
);
}
//endregion
public
String
getCurrentDate
()
{
SimpleDateFormat
dateFormat
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
,
Locale
.
getDefault
());
Date
currentDate
=
Calendar
.
getInstance
().
getTime
();
return
dateFormat
.
format
(
currentDate
);
}
}
app/src/main/java/com/base/browserwhite/ads/AdmobMaxHelper.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads
import
android.app.Activity
import
android.util.Log
import
android.view.ViewGroup
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.R
import
com.base.browserwhite.ads.admob.AdmobInterstitialUtils
import
com.base.browserwhite.ads.admob.AdmobNativeUtils
import
com.base.browserwhite.ads.admob.AdmobOpenUtils
import
com.base.browserwhite.ads.max.AdMaxInit
import
com.base.browserwhite.ads.max.AdMaxInit.initAdMax
import
com.base.browserwhite.ads.max.AdMaxInterstitialUtils
import
com.base.browserwhite.ads.max.AdMaxNativeUtils
import
com.base.browserwhite.ads.max.AdMaxOpenUtils
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.LogEx
import
com.google.android.gms.ads.MobileAds
import
java.util.concurrent.atomic.AtomicBoolean
object
AdmobMaxHelper
{
private
val
TAG
=
"AdmobMaxHelper"
var
isAdInit
=
AtomicBoolean
(
false
)
var
isBlack
:
Boolean
=
false
var
isInterOpenShowing
:
Boolean
=
false
private
fun
getSpAdmobTrueMaxFalse
():
Boolean
{
val
ss
=
AppPreferences
.
getInstance
().
getString
(
"admobTrueMaxFalse"
,
"1"
).
toInt
()
return
ss
==
1
}
fun
showBackInterAdSp
():
Boolean
{
val
isShowBackIntAd
=
AppPreferences
.
getInstance
().
getString
(
"isShowBackIntAd"
,
"0"
).
toInt
()
//1要看插屏 0不看
return
isShowBackIntAd
==
1
}
fun
showDeleteAdSp
():
Boolean
{
val
isDeleteInterAd
=
AppPreferences
.
getInstance
().
getString
(
"isDeleteInterAd"
,
"0"
).
toInt
()
//1要看插屏 0不看
return
isDeleteInterAd
==
1
}
fun
initAdmobMaxAd
()
{
if
(
isBlack
)
{
return
}
if
(
getSpAdmobTrueMaxFalse
())
{
if
(!
isAdInit
.
get
())
{
LogEx
.
logDebug
(
TAG
,
"init sp Admob"
)
MobileAds
.
initialize
(
MyApplication
.
context
)
{
initializationStatus
->
isAdInit
.
set
(
true
)
EventUtils
.
event
(
"AdmobInit"
,
"AdmobInit"
)
}
}
}
else
{
if
(!
isAdInit
.
get
())
{
LogEx
.
logDebug
(
TAG
,
"init sp AdMax"
)
MyApplication
.
context
.
initAdMax
()
}
}
}
//展示广告关闭时赋值
var
lastShowedOnHiddenTime
=
0L
fun
admobMaxShowInterstitialAd
(
activity
:
Activity
,
isLoading
:
Boolean
=
true
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
if
(
isBlack
)
{
EventUtils
.
event
(
"ad_black"
,
"interAd"
)
onHidden
?.
invoke
()
return
}
val
isShowLoadingAd
=
AppPreferences
.
getInstance
().
getString
(
"isShowLoadingAd"
,
"0"
).
toInt
()
if
(
isShowLoadingAd
==
0
&&
isLoading
)
{
EventUtils
.
event
(
"ad_switch_close"
)
onHidden
?.
invoke
()
return
}
val
adInterval
=
AppPreferences
.
getInstance
().
getString
(
"adInterval"
,
"0"
).
toInt
()
if
((
System
.
currentTimeMillis
()
-
lastShowedOnHiddenTime
)
<
adInterval
*
1000
&&
lastShowedOnHiddenTime
!=
0L
)
{
onHidden
?.
invoke
()
EventUtils
.
event
(
"ad_interval"
)
return
}
if
(
getSpAdmobTrueMaxFalse
())
{
AdmobInterstitialUtils
.
showInterstitialAd
(
activity
)
{
onHidden
?.
invoke
()
}
}
else
{
AdMaxInterstitialUtils
.
showInterstitialAd
(
activity
)
{
onHidden
?.
invoke
()
}
}
}
fun
admobMaxShowOpenAd
(
activity
:
Activity
,
showBeforeAction
:
(
flag
:
Boolean
)
->
Unit
,
onHidden
:
(()
->
Unit
)?
=
null
,
)
{
if
(
isBlack
)
{
EventUtils
.
event
(
"ad_black"
,
"openAd"
)
onHidden
?.
invoke
()
return
}
if
(
getSpAdmobTrueMaxFalse
())
{
AdmobOpenUtils
.
showAppOpenAd
(
activity
,
showBefore
=
showBeforeAction
)
{
onHidden
?.
invoke
()
}
}
else
{
AdMaxOpenUtils
.
showAppOpenAd
(
activity
,
loadCallBack
=
showBeforeAction
)
{
onHidden
?.
invoke
()
}
}
}
fun
admobMaxShowNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
where
:
Int
=
0
)
{
if
(
isBlack
)
{
return
}
if
(
getSpAdmobTrueMaxFalse
())
{
AdmobNativeUtils
.
showNativeAd
(
activity
,
parent
)
}
else
{
var
layout
=
R
.
layout
.
layout_max_native_small
// if (where == 0) {
// layout = R.layout.layout_max_native_small_f8f8f8
// }
// if (where == 1) {
// layout = R.layout.layout_max_native_big
// }
// if (where == 2) {
// layout = R.layout.layout_max_native_big_2
// }
AdMaxNativeUtils
.
showNativeAd
(
activity
,
parent
,
layout
)
}
}
fun
preloadAd
(
activity
:
Activity
)
{
if
(
isBlack
)
{
return
}
if
(
getSpAdmobTrueMaxFalse
())
{
// com.base.browserwhite.ads.admob.AdmobOpenUtils.loadAppOpenAd()
AdmobInterstitialUtils
.
loadInterstitialAd
(
activity
)
}
else
{
if
(
isAdInit
.
get
())
{
// com.base.browserwhite.ads.max.AdMaxOpenUtils.loadAppOpenAd(activity)
AdMaxInterstitialUtils
.
loadInterstitialAd
(
activity
)
}
else
{
AdMaxInit
.
maxInitAction
=
{
Log
.
d
(
TAG
,
"max init suc"
)
// com.base.browserwhite.ads.max.AdMaxOpenUtils.loadAppOpenAd(activity)
// com.base.browserwhite.ads.max.AdMaxInterstitialUtils.loadInterstitialAd(activity)
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/CustomDialog.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads
import
android.app.Dialog
import
android.content.Context
import
android.view.Gravity
import
android.view.View
class
CustomDialog
(
context
:
Context
,
layoutId
:
Int
?
=
null
,
view
:
View
?
=
null
)
:
Dialog
(
context
)
{
init
{
layoutId
?.
let
{
setContentView
(
it
)
}
view
?.
let
{
setContentView
(
it
)
}
val
window
=
window
window
?.
apply
{
setGravity
(
Gravity
.
CENTER
)
setBackgroundDrawableResource
(
android
.
R
.
color
.
transparent
)
}
setCancelable
(
false
)
}
}
app/src/main/java/com/base/browserwhite/ads/admob/AdmobBannerColla.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.admob
import
android.content.Context
import
android.os.Bundle
import
android.view.View
import
android.view.ViewGroup
import
android.view.ViewTreeObserver
import
androidx.core.view.children
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.LogEx
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
java.util.UUID
object
AdmobBannerUtils
{
private
const
val
TAG
=
"AdmobBannerUtils"
private
var
adView
:
AdView
?
=
null
private
var
listener
:
ViewTreeObserver
.
OnGlobalLayoutListener
?
=
null
fun
showCollapsibleBannerAd
(
context
:
Context
,
parent
:
ViewGroup
)
{
val
isShowBanner
=
AppPreferences
.
getInstance
().
getString
(
"isShowBanner"
,
"0"
).
toInt
()
if
(
isShowBanner
==
0
)
{
return
}
if
(
adView
!=
null
)
{
adView
?.
destroy
()
}
adView
=
AdView
(
context
)
adView
?.
tag
=
"CollapsibleBannerAd"
// parent.removeAllViews()
val
list
=
parent
.
children
list
.
forEach
{
if
(
it
.
tag
!=
"zhanweitu"
)
{
parent
.
removeView
(
it
)
}
}
parent
.
addView
(
adView
)
listener
=
ViewTreeObserver
.
OnGlobalLayoutListener
{
val
screenPixelDensity
=
context
.
resources
.
displayMetrics
.
density
val
adWidth
=
(
parent
.
width
/
screenPixelDensity
).
toInt
()
val
adSize
=
AdSize
.
getCurrentOrientationAnchoredAdaptiveBannerAdSize
(
context
,
adWidth
)
adView
?.
adUnitId
=
if
(
BuildConfig
.
DEBUG
)
ConfigHelper
.
bannerAdmobIdTest
else
ConfigHelper
.
bannerAdmobId
adView
?.
setAdSize
(
adSize
)
loadCollapsibleBanner
(
parent
)
parent
.
viewTreeObserver
.
removeOnGlobalLayoutListener
(
listener
)
}
parent
.
viewTreeObserver
.
addOnGlobalLayoutListener
(
listener
)
}
private
fun
loadCollapsibleBanner
(
parent
:
ViewGroup
)
{
val
extras
=
Bundle
()
extras
.
putString
(
"collapsible"
,
"bottom"
)
extras
.
putString
(
"collapsible_request_id"
,
UUID
.
randomUUID
().
toString
())
val
adRequest
=
AdRequest
.
Builder
().
addNetworkExtrasBundle
(
AdMobAdapter
::
class
.
java
,
extras
).
build
()
adView
?.
adListener
=
object
:
AdListener
()
{
override
fun
onAdLoaded
()
{
LogEx
.
logDebug
(
TAG
,
"onAdLoaded"
)
}
override
fun
onAdOpened
()
{
LogEx
.
logDebug
(
TAG
,
"onAdOpened"
)
}
override
fun
onAdClosed
()
{
super
.
onAdClosed
()
LogEx
.
logDebug
(
TAG
,
"onAdClosed"
)
val
removeList
=
arrayListOf
<
View
>()
parent
.
children
.
forEach
{
if
(
it
.
tag
!=
"CollapsibleBannerAd"
)
{
removeList
.
add
(
it
)
}
}
removeList
.
forEach
{
parent
.
removeView
(
it
)
}
}
}
adView
?.
loadAd
(
adRequest
)
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/admob/AdmobEvent.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.admob
import
android.app.Activity
import
android.os.Bundle
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.help.EventUtils
import
com.facebook.appevents.AppEventsConstants
import
com.facebook.appevents.AppEventsLogger
import
com.google.android.gms.ads.AdValue
import
com.google.android.gms.ads.OnPaidEventListener
import
com.google.android.gms.ads.ResponseInfo
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.google.firebase.analytics.FirebaseAnalytics
import
com.google.firebase.analytics.ktx.analytics
import
com.google.firebase.ktx.Firebase
import
org.json.JSONObject
object
AdmobEvent
{
fun
pullAd
(
responseInfo
:
ResponseInfo
?,
adUnit
:
String
,
error
:
String
?
=
null
,
reqId
:
String
?
=
null
)
{
val
obj
=
JSONObject
()
if
(
responseInfo
!=
null
)
{
val
response
=
responseInfo
.
adapterResponses
.
getOrNull
(
0
)
if
(
response
!=
null
)
{
obj
.
put
(
"source"
,
response
.
adSourceName
)
val
credentials
=
mapOf
(
"placementid"
to
response
.
credentials
.
get
(
"placementid"
),
"appid"
to
response
.
credentials
.
get
(
"appid"
),
"pubid"
to
response
.
credentials
.
get
(
"pubid"
)
)
obj
.
put
(
"credentials"
,
credentials
.
toString
())
}
obj
.
put
(
"session_id"
,
responseInfo
.
responseId
)
}
obj
.
put
(
"networkname"
,
responseInfo
?.
mediationAdapterClassName
)
obj
.
put
(
"ad_unit"
,
adUnit
)
obj
.
put
(
"req_id"
,
reqId
)
if
(
error
==
null
)
{
obj
.
put
(
"status"
,
"1"
)
}
else
{
obj
.
put
(
"errMsg"
,
error
)
obj
.
put
(
"status"
,
"2"
)
}
EventUtils
.
event
(
"ad_pull"
,
ext
=
obj
)
}
private
val
taichiPref
by
lazy
{
MyApplication
.
context
.
getSharedPreferences
(
"TaichiTroasCache"
,
0
)
}
private
val
taichiSharedPreferencesEditor
by
lazy
{
taichiPref
.
edit
()
}
class
EventOnPaidEventListener
(
private
val
ad
:
Any
?)
:
OnPaidEventListener
{
override
fun
onPaidEvent
(
adValue
:
AdValue
)
{
val
valueMicros
=
adValue
.
valueMicros
val
currencyCode
=
adValue
.
currencyCode
val
precision
=
adValue
.
precisionType
val
obj
=
JSONObject
()
obj
.
put
(
"valueMicros"
,
valueMicros
)
obj
.
put
(
"currencyCode"
,
currencyCode
)
obj
.
put
(
"precision"
,
precision
)
Firebase
.
analytics
.
logEvent
(
"ad_price"
,
Bundle
().
apply
{
putDouble
(
"valueMicros"
,
valueMicros
/
1000000.0
)
})
val
params
=
Bundle
()
val
currentImpressionRevenue
=
adValue
.
valueMicros
.
toDouble
()
/
1000000.0
params
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentImpressionRevenue
)
params
.
putString
(
FirebaseAnalytics
.
Param
.
CURRENCY
,
"USD"
)
val
precisionType
=
when
(
adValue
.
precisionType
)
{
0
->
"UNKNOWN"
1
->
"ESTIMATED"
2
->
"PUBLISHER_PROVIDED"
3
->
"PRECISE"
else
->
"Invalid"
}
params
.
putString
(
"precisionType"
,
precisionType
)
Firebase
.
analytics
.
logEvent
(
"Ad_Impression_Revenue"
,
params
)
val
previousTaichiTroasCache
=
taichiPref
.
getFloat
(
"TaichiTroasCache"
,
0f
)
val
currentTaichiTroasCache
=
(
previousTaichiTroasCache
+
currentImpressionRevenue
).
toFloat
()
if
(
currentTaichiTroasCache
>=
0.01
)
{
//如果超过0.01就触发一次tROAS taichi事件
val
roasbundle
=
Bundle
()
roasbundle
.
putDouble
(
FirebaseAnalytics
.
Param
.
VALUE
,
currentTaichiTroasCache
.
toDouble
()
)
roasbundle
.
putString
(
FirebaseAnalytics
.
Param
.
CURRENCY
,
"USD"
)
Firebase
.
analytics
.
logEvent
(
"Total_Ads_Revenue_001"
,
roasbundle
)
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
0f
)
//重新清零,开始计算
val
logger
=
AppEventsLogger
.
newLogger
(
MyApplication
.
context
)
val
parameters
=
Bundle
()
parameters
.
putString
(
AppEventsConstants
.
EVENT_PARAM_CURRENCY
,
"USD"
)
logger
.
logEvent
(
"ad_value"
,
currentTaichiTroasCache
.
toDouble
(),
parameters
)
}
else
{
taichiSharedPreferencesEditor
.
putFloat
(
"TaichiTroasCache"
,
currentTaichiTroasCache
)
}
taichiSharedPreferencesEditor
.
commit
()
when
(
ad
)
{
is
AppOpenAd
->
{
val
adUnitId
=
ad
.
adUnitId
val
loadedAdapterResponseInfo
=
ad
.
responseInfo
.
loadedAdapterResponseInfo
val
adSourceName
=
loadedAdapterResponseInfo
?.
adSourceName
val
adSourceId
=
loadedAdapterResponseInfo
?.
adSourceId
val
adSourceInstanceName
=
loadedAdapterResponseInfo
?.
adSourceInstanceName
val
adSourceInstanceId
=
loadedAdapterResponseInfo
?.
adSourceInstanceId
val
sessionId
=
ad
.
responseInfo
.
responseId
val
extras
=
ad
.
responseInfo
.
responseExtras
val
mediationGroupName
=
extras
.
getString
(
"mediation_group_name"
)
val
mediationABTestName
=
extras
.
getString
(
"mediation_ab_test_name"
)
val
mediationABTestVariant
=
extras
.
getString
(
"mediation_ab_test_variant"
)
obj
.
put
(
"adUnitId"
,
adUnitId
)
obj
.
put
(
"adSourceName"
,
adSourceName
)
obj
.
put
(
"adSourceId"
,
adSourceId
)
obj
.
put
(
"adSourceInstanceName"
,
adSourceInstanceName
)
obj
.
put
(
"adSourceInstanceId"
,
adSourceInstanceId
)
obj
.
put
(
"mediationGroupName"
,
mediationGroupName
)
obj
.
put
(
"mediationABTestName"
,
mediationABTestName
)
obj
.
put
(
"mediationABTestVariant"
,
mediationABTestVariant
)
obj
.
put
(
"session_id"
,
sessionId
)
}
is
InterstitialAd
->
{
val
adUnitId
=
ad
.
adUnitId
val
loadedAdapterResponseInfo
=
ad
.
responseInfo
.
loadedAdapterResponseInfo
val
adSourceName
=
loadedAdapterResponseInfo
?.
adSourceName
val
adSourceId
=
loadedAdapterResponseInfo
?.
adSourceId
val
adSourceInstanceName
=
loadedAdapterResponseInfo
?.
adSourceInstanceName
val
adSourceInstanceId
=
loadedAdapterResponseInfo
?.
adSourceInstanceId
val
sessionId
=
ad
.
responseInfo
.
responseId
val
extras
=
ad
.
responseInfo
.
responseExtras
val
mediationGroupName
=
extras
.
getString
(
"mediation_group_name"
)
val
mediationABTestName
=
extras
.
getString
(
"mediation_ab_test_name"
)
val
mediationABTestVariant
=
extras
.
getString
(
"mediation_ab_test_variant"
)
obj
.
put
(
"adUnitId"
,
adUnitId
)
obj
.
put
(
"adSourceName"
,
adSourceName
)
obj
.
put
(
"adSourceId"
,
adSourceId
)
obj
.
put
(
"adSourceInstanceName"
,
adSourceInstanceName
)
obj
.
put
(
"adSourceInstanceId"
,
adSourceInstanceId
)
obj
.
put
(
"mediationGroupName"
,
mediationGroupName
)
obj
.
put
(
"mediationABTestName"
,
mediationABTestName
)
obj
.
put
(
"mediationABTestVariant"
,
mediationABTestVariant
)
obj
.
put
(
"session_id"
,
sessionId
)
}
is
RewardedAd
->
{
val
loadedAdapterResponseInfo
=
ad
.
responseInfo
.
loadedAdapterResponseInfo
val
adSourceName
=
loadedAdapterResponseInfo
?.
adSourceName
val
adSourceId
=
loadedAdapterResponseInfo
?.
adSourceId
val
adSourceInstanceName
=
loadedAdapterResponseInfo
?.
adSourceInstanceName
val
adSourceInstanceId
=
loadedAdapterResponseInfo
?.
adSourceInstanceId
val
sessionId
=
ad
.
responseInfo
.
responseId
val
extras
=
ad
.
responseInfo
.
responseExtras
val
mediationGroupName
=
extras
.
getString
(
"mediation_group_name"
)
val
mediationABTestName
=
extras
.
getString
(
"mediation_ab_test_name"
)
val
mediationABTestVariant
=
extras
.
getString
(
"mediation_ab_test_variant"
)
obj
.
put
(
"adSourceName"
,
adSourceName
)
obj
.
put
(
"adSourceId"
,
adSourceId
)
obj
.
put
(
"adSourceInstanceName"
,
adSourceInstanceName
)
obj
.
put
(
"adSourceInstanceId"
,
adSourceInstanceId
)
obj
.
put
(
"mediationGroupName"
,
mediationGroupName
)
obj
.
put
(
"mediationABTestName"
,
mediationABTestName
)
obj
.
put
(
"mediationABTestVariant"
,
mediationABTestVariant
)
obj
.
put
(
"session_id"
,
sessionId
)
}
is
NativeAd
->
{
val
loadedAdapterResponseInfo
=
ad
.
responseInfo
?.
loadedAdapterResponseInfo
val
adSourceName
=
loadedAdapterResponseInfo
?.
adSourceName
val
adSourceId
=
loadedAdapterResponseInfo
?.
adSourceId
val
adSourceInstanceName
=
loadedAdapterResponseInfo
?.
adSourceInstanceName
val
adSourceInstanceId
=
loadedAdapterResponseInfo
?.
adSourceInstanceId
val
sessionId
=
ad
.
responseInfo
?.
responseId
val
extras
=
ad
.
responseInfo
?.
responseExtras
val
mediationGroupName
=
extras
?.
getString
(
"mediation_group_name"
)
val
mediationABTestName
=
extras
?.
getString
(
"mediation_ab_test_name"
)
val
mediationABTestVariant
=
extras
?.
getString
(
"mediation_ab_test_variant"
)
obj
.
put
(
"adSourceName"
,
adSourceName
)
obj
.
put
(
"adSourceId"
,
adSourceId
)
obj
.
put
(
"adSourceInstanceName"
,
adSourceInstanceName
)
obj
.
put
(
"adSourceInstanceId"
,
adSourceInstanceId
)
obj
.
put
(
"mediationGroupName"
,
mediationGroupName
)
obj
.
put
(
"mediationABTestName"
,
mediationABTestName
)
obj
.
put
(
"mediationABTestVariant"
,
mediationABTestVariant
)
obj
.
put
(
"session_id"
,
sessionId
)
}
}
EventUtils
.
event
(
"ad_price"
,
ext
=
obj
)
}
}
fun
clickAd
(
responseInfo
:
ResponseInfo
?,
adUnit
:
String
)
{
val
response
=
responseInfo
?.
adapterResponses
?.
getOrNull
(
0
)
val
obj
=
JSONObject
()
obj
.
put
(
"source"
,
response
?.
adSourceName
)
obj
.
put
(
"ad_unit"
,
adUnit
)
val
credentials
=
mapOf
(
"placementid"
to
response
?.
credentials
?.
get
(
"placementid"
),
"appid"
to
response
?.
credentials
?.
get
(
"appid"
),
"pubid"
to
response
?.
credentials
?.
get
(
"pubid"
)
)
obj
.
put
(
"credentials"
,
credentials
.
toString
())
obj
.
put
(
"session_id"
,
responseInfo
?.
responseId
)
obj
.
put
(
"networkname"
,
responseInfo
?.
mediationAdapterClassName
)
if
(
adUnit
!=
"nativeAd"
)
{
EventUtils
.
event
(
"ad_click"
,
ext
=
obj
)
}
else
{
EventUtils
.
event
(
"bigimage_ad_click"
,
ext
=
obj
)
}
}
fun
showAd
(
responseInfo
:
ResponseInfo
?,
adUnit
:
String
,
activity
:
Activity
?
=
null
)
{
val
response
=
responseInfo
?.
adapterResponses
?.
getOrNull
(
0
)
val
obj
=
JSONObject
()
obj
.
put
(
"source"
,
response
?.
adSourceName
)
obj
.
put
(
"ad_unit"
,
adUnit
)
obj
.
put
(
"networkname"
,
responseInfo
?.
mediationAdapterClassName
)
val
credentials
=
mapOf
(
"placementid"
to
response
?.
credentials
?.
get
(
"placementid"
),
"appid"
to
response
?.
credentials
?.
get
(
"appid"
),
"pubid"
to
response
?.
credentials
?.
get
(
"pubid"
)
)
obj
.
put
(
"credentials"
,
credentials
.
toString
())
obj
.
put
(
"session_id"
,
responseInfo
?.
responseId
)
obj
.
put
(
"from"
,
activity
?.
javaClass
?.
simpleName
)
if
(
adUnit
!=
"nativeAd"
)
{
EventUtils
.
event
(
"ad_show"
,
ext
=
obj
)
}
else
{
EventUtils
.
event
(
"bigimage_ad_show"
,
ext
=
obj
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/admob/AdmobInterstitialUtils.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.admob
import
android.app.Activity
import
android.app.Dialog
import
android.widget.Toast
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.R
import
com.base.browserwhite.ads.AdDisplayUtils
import
com.base.browserwhite.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import
com.base.browserwhite.ads.CustomDialog
import
com.base.browserwhite.ads.admob.AdmobEvent.clickAd
import
com.base.browserwhite.ads.admob.AdmobEvent.pullAd
import
com.base.browserwhite.ads.admob.AdmobEvent.showAd
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.help.EventUtils
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
org.json.JSONObject
import
java.util.UUID
object
AdmobInterstitialUtils
{
private
var
interAd
:
InterstitialAd
?
=
null
private
var
interLoadTime
=
Long
.
MAX_VALUE
private
var
adLastDisplayTime
:
Long
=
0
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
private
fun
isAdExpired
():
Boolean
{
return
System
.
currentTimeMillis
()
-
interLoadTime
>
1000
*
60
*
60
}
fun
showInterstitialAd
(
activity
:
Activity
,
isReLoadAd
:
Boolean
=
false
,
isShowDialog
:
Boolean
=
true
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
val
obj1
=
JSONObject
()
obj1
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_prepare_show"
,
ext
=
obj1
)
if
(
isAdExpired
())
{
val
obj2
=
JSONObject
()
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_expire"
,
ext
=
obj2
)
interAd
=
null
loadInterstitialAd
(
activity
)
onHidden
?.
invoke
()
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"interAd"
))
{
onHidden
?.
invoke
()
return
}
if
(
interAd
!=
null
)
{
displayInterstitialAd
(
activity
,
onHidden
)
}
else
{
showAdDialogAndLoadInterstitial
(
activity
,
isReLoadAd
,
isShowDialog
,
onHidden
)
}
}
fun
loadInterstitialAd
(
activity
:
Activity
,
onLoad
:
(()
->
Unit
)?
=
null
)
{
if
(
interAd
!=
null
)
{
onLoad
?.
invoke
()
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
""
))
{
onLoad
?.
invoke
()
return
}
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"interAd"
)
obj
.
put
(
"from"
,
activity
.
javaClass
.
simpleName
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
InterstitialAd
.
load
(
activity
,
if
(
BuildConfig
.
DEBUG
)
ConfigHelper
.
interAdmobIdTest
else
ConfigHelper
.
interAdmobId
,
mRequest
,
object
:
InterstitialAdLoadCallback
()
{
override
fun
onAdFailedToLoad
(
p0
:
LoadAdError
)
{
interAd
=
null
onLoad
?.
invoke
()
pullAd
(
p0
.
responseInfo
,
"interAd"
,
p0
.
message
,
reqId
=
reqId
)
if
(
BuildConfig
.
DEBUG
)
{
Toast
.
makeText
(
MyApplication
.
context
,
"拉取失败"
+
p0
.
message
,
Toast
.
LENGTH_SHORT
).
show
()
}
}
override
fun
onAdLoaded
(
ad
:
InterstitialAd
)
{
interAd
=
ad
onLoad
?.
invoke
()
interLoadTime
=
System
.
currentTimeMillis
()
pullAd
(
ad
.
responseInfo
,
"interAd"
,
reqId
=
reqId
)
ad
.
onPaidEventListener
=
AdmobEvent
.
EventOnPaidEventListener
(
ad
)
}
})
}
private
fun
showAdDialogAndLoadInterstitial
(
activity
:
Activity
,
isReLoadAd
:
Boolean
,
isShowDialog
:
Boolean
,
onHidden
:
(()
->
Unit
)?
)
{
if
(!
isShowDialog
)
{
onHidden
?.
invoke
()
return
}
var
mDialog
:
Dialog
?
=
null
if
(!
activity
.
isFinishing
&&
!
activity
.
isDestroyed
)
{
mDialog
=
CustomDialog
(
activity
,
R
.
layout
.
dialog_ad_loading
)
// 设置对话框的样式和内容
mDialog
.
show
()
}
loadInterstitialAd
(
activity
)
{
mDialog
?.
dismiss
()
if
(!
isReLoadAd
)
{
showInterstitialAd
(
activity
,
true
,
false
)
{
onHidden
?.
invoke
()
}
}
}
if
(
isReLoadAd
)
{
mDialog
?.
dismiss
()
onHidden
?.
invoke
()
}
}
private
fun
displayInterstitialAd
(
activity
:
Activity
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
val
thisInterAd
=
interAd
interAd
=
null
thisInterAd
?.
fullScreenContentCallback
=
object
:
FullScreenContentCallback
()
{
override
fun
onAdClicked
()
{
clickAd
(
thisInterAd
?.
responseInfo
,
"interAd"
)
AdDisplayUtils
.
getInstance
().
incrementAdClickCount
()
}
override
fun
onAdDismissedFullScreenContent
()
{
interAd
=
null
onHidden
?.
invoke
()
loadInterstitialAd
(
activity
)
lastShowedOnHiddenTime
=
System
.
currentTimeMillis
()
}
override
fun
onAdFailedToShowFullScreenContent
(
p0
:
AdError
)
{
interAd
=
null
onHidden
?.
invoke
()
loadInterstitialAd
(
activity
)
}
override
fun
onAdShowedFullScreenContent
()
{
showAd
(
thisInterAd
?.
responseInfo
,
"interAd"
,
activity
)
AdDisplayUtils
.
getInstance
().
incrementAdDisplayCount
()
adLastDisplayTime
=
System
.
currentTimeMillis
()
/
1000
}
}
thisInterAd
?.
show
(
activity
)
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/admob/AdmobNativeUtils.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.admob
import
android.app.Activity
import
android.view.ViewGroup
import
androidx.core.view.isVisible
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.R
import
com.base.browserwhite.ads.AdDisplayUtils
import
com.base.browserwhite.ads.admob.AdmobEvent.clickAd
import
com.base.browserwhite.ads.admob.AdmobEvent.pullAd
import
com.base.browserwhite.ads.admob.AdmobEvent.showAd
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
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
org.json.JSONObject
import
java.util.UUID
object
AdmobNativeUtils
{
private
const
val
TAG
=
"AdmobNativeUtils"
private
var
nativeAd
:
NativeAd
?
=
null
private
var
isLoading
=
false
private
var
nativeLoadTime
=
Long
.
MAX_VALUE
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
private
fun
loadNativeAd
()
{
if
(
nativeAd
!=
null
)
{
return
}
if
(
isLoading
)
{
return
}
isLoading
=
true
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"NativeAd"
))
{
return
}
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"nativeAd"
)
val
adLoader
=
AdLoader
.
Builder
(
MyApplication
.
context
,
if
(
BuildConfig
.
DEBUG
)
ConfigHelper
.
nativeAdmobIdTest
else
ConfigHelper
.
nativeAdmobId
).
forNativeAd
{
nativeLoadTime
=
System
.
currentTimeMillis
()
nativeAd
=
it
LogEx
.
logDebug
(
TAG
,
"nativeAd=${nativeAd.toString()}"
)
isLoading
=
false
loadingListener
?.
invoke
()
pullAd
(
it
.
responseInfo
,
"nativeAd"
,
reqId
=
reqId
)
it
.
setOnPaidEventListener
(
AdmobEvent
.
EventOnPaidEventListener
(
it
))
}.
withAdListener
(
object
:
AdListener
()
{
override
fun
onAdClicked
()
{
clickAd
(
nativeAd
?.
responseInfo
,
"nativeAd"
)
}
override
fun
onAdFailedToLoad
(
p0
:
LoadAdError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdFailedToLoad=${p0.message}"
)
nativeAd
=
null
isLoading
=
false
pullAd
(
p0
.
responseInfo
,
"nativeAd"
,
p0
.
message
,
reqId
=
reqId
)
// Log.e("MXL", "NativeAdFailedToLoad: " + p0.message)
}
}).
build
()
adLoader
.
loadAd
(
mRequest
)
}
fun
showNativeAd
(
activity
:
Activity
?,
parent
:
ViewGroup
,
layout
:
Int
=
R
.
layout
.
layout_admob_native_custom
)
{
val
obj
=
JSONObject
()
obj
.
put
(
"ad_unit"
,
"NativeAd"
)
EventUtils
.
event
(
"ad_prepare_show_native"
,
ext
=
obj
)
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"NativeAd"
))
{
return
}
loadingListener
=
{
if
(
System
.
currentTimeMillis
()
-
nativeLoadTime
<=
1000
*
60
*
60
)
{
nativeAd
?.
let
{
NativeView
(
parent
.
context
,
layout
).
run
{
parent
.
removeAllViews
()
setNativeAd
(
it
)
parent
.
addView
(
this
)
parent
.
isVisible
=
true
showAd
(
nativeAd
?.
responseInfo
,
"nativeAd"
,
activity
)
}
}
}
nativeAd
=
null
loadingListener
=
null
loadNativeAd
()
}
if
(
nativeAd
==
null
)
{
loadNativeAd
()
val
obj2
=
JSONObject
()
obj2
.
put
(
"reason"
,
"no_ad"
)
obj2
.
put
(
"ad_unit"
,
"nativeAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj2
)
}
else
{
loadingListener
?.
invoke
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/admob/AdmobOpenUtils.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.admob
import
android.app.Activity
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.ads.AdDisplayUtils
import
com.base.browserwhite.ads.admob.AdmobEvent.clickAd
import
com.base.browserwhite.ads.admob.AdmobEvent.pullAd
import
com.base.browserwhite.ads.admob.AdmobEvent.showAd
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
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
org.json.JSONObject
import
java.util.UUID
object
AdmobOpenUtils
{
private
const
val
TAG
=
"AdmobOpenUtils"
private
val
mRequest
=
AdRequest
.
Builder
().
build
()
private
var
openLoadTime
=
Long
.
MAX_VALUE
private
var
mOpenAd
:
AppOpenAd
?
=
null
fun
isOpenAdLoaded
()
=
mOpenAd
!=
null
fun
loadAppOpenAd
(
skip
:
Boolean
=
false
,
onLoad
:
((
where
:
Int
)
->
Unit
)?
=
null
)
{
if
(
mOpenAd
!=
null
||
skip
)
{
onLoad
?.
invoke
(
1
)
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"openAd"
))
{
onLoad
?.
invoke
(
2
)
return
}
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"openAd"
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
AppOpenAd
.
load
(
MyApplication
.
context
,
if
(
BuildConfig
.
DEBUG
)
ConfigHelper
.
openAdmobIdTest
else
ConfigHelper
.
openAdmobId
,
mRequest
,
object
:
AppOpenAd
.
AppOpenAdLoadCallback
()
{
override
fun
onAdLoaded
(
ad
:
AppOpenAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdLoaded"
)
openLoadTime
=
System
.
currentTimeMillis
()
mOpenAd
=
ad
onLoad
?.
invoke
(
3
)
pullAd
(
ad
.
responseInfo
,
"openAd"
,
reqId
=
reqId
)
ad
.
onPaidEventListener
=
AdmobEvent
.
EventOnPaidEventListener
(
ad
)
}
override
fun
onAdFailedToLoad
(
p0
:
LoadAdError
)
{
LogEx
.
logDebug
(
TAG
,
"LoadAdError ${p0.message}"
)
mOpenAd
=
null
onLoad
?.
invoke
(
4
)
pullAd
(
p0
.
responseInfo
,
"openAd"
,
p0
.
message
,
reqId
=
reqId
)
}
})
}
fun
showAppOpenAd
(
activity
:
Activity
,
isRetry
:
Boolean
=
false
,
showBefore
:
((
flag
:
Boolean
)
->
Unit
)?
=
null
,
onHidden
:
((
where
:
Int
)
->
Unit
)?
=
null
)
{
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"openAd"
))
{
onHidden
?.
invoke
(
1
)
return
}
if
(
System
.
currentTimeMillis
()
-
openLoadTime
>
1000
*
60
*
60
)
{
LogEx
.
logDebug
(
TAG
,
"openLoadTime out time"
)
mOpenAd
=
null
loadAppOpenAd
()
onHidden
?.
invoke
(
2
)
val
obj2
=
JSONObject
()
obj2
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_expire"
,
ext
=
obj2
)
return
}
if
(!
isRetry
)
{
val
obj1
=
JSONObject
()
obj1
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_prepare_show"
,
ext
=
obj1
)
}
if
(
mOpenAd
!=
null
)
{
LogEx
.
logDebug
(
TAG
,
"mOpenAd!=null"
)
val
thisMOpenAd
=
mOpenAd
mOpenAd
=
null
thisMOpenAd
?.
fullScreenContentCallback
=
object
:
FullScreenContentCallback
()
{
override
fun
onAdClicked
()
{
clickAd
(
thisMOpenAd
?.
responseInfo
,
"openAd"
)
}
override
fun
onAdDismissedFullScreenContent
()
{
mOpenAd
=
null
onHidden
?.
invoke
(
3
)
loadAppOpenAd
()
}
override
fun
onAdFailedToShowFullScreenContent
(
p0
:
AdError
)
{
mOpenAd
=
null
onHidden
?.
invoke
(
4
)
loadAppOpenAd
()
val
obj
=
JSONObject
()
obj
.
put
(
"reason"
,
p0
.
message
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj
)
}
override
fun
onAdShowedFullScreenContent
()
{
showBefore
?.
invoke
(
true
)
showAd
(
thisMOpenAd
?.
responseInfo
,
"openAd"
,
activity
)
}
}
thisMOpenAd
?.
show
(
activity
)
}
else
{
LogEx
.
logDebug
(
TAG
,
"mOpenAd=null"
)
loadAppOpenAd
{
if
(
mOpenAd
!=
null
)
{
showAppOpenAd
(
activity
,
true
,
showBefore
,
onHidden
)
}
else
{
val
obj
=
JSONObject
()
obj
.
put
(
"reason"
,
"no_ad"
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj
)
onHidden
?.
invoke
(
5
)
}
}
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/admob/NativeView.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.admob
import
android.annotation.SuppressLint
import
android.content.Context
import
android.util.AttributeSet
import
android.view.LayoutInflater
import
android.view.View
import
android.view.ViewGroup
import
android.widget.Button
import
android.widget.FrameLayout
import
android.widget.ImageView
import
android.widget.TextView
import
com.base.browserwhite.R
import
com.google.android.gms.ads.nativead.NativeAd
import
com.google.android.gms.ads.nativead.NativeAdView
@SuppressLint
(
"ViewConstructor"
)
class
NativeView
(
context
:
Context
,
val
layout
:
Int
,
attrs
:
AttributeSet
?
=
null
)
:
FrameLayout
(
context
,
attrs
)
{
init
{
layoutParams
=
LayoutParams
(
ViewGroup
.
LayoutParams
.
MATCH_PARENT
,
ViewGroup
.
LayoutParams
.
WRAP_CONTENT
)
}
fun
setNativeAd
(
nativeAd
:
NativeAd
?)
{
nativeAd
?:
return
val
adView
=
LayoutInflater
.
from
(
context
)
.
inflate
(
layout
,
this
,
false
)
as
NativeAdView
adView
.
mediaView
=
adView
.
findViewById
(
R
.
id
.
ad_media
)
adView
.
headlineView
=
adView
.
findViewById
(
R
.
id
.
ad_headline
)
adView
.
bodyView
=
adView
.
findViewById
(
R
.
id
.
ad_body
)
adView
.
callToActionView
=
adView
.
findViewById
(
R
.
id
.
ad_call_to_action
)
adView
.
iconView
=
adView
.
findViewById
(
R
.
id
.
ad_app_icon
)
(
adView
.
headlineView
as
TextView
?)
?.
text
=
nativeAd
.
headline
adView
.
mediaView
!!
.
mediaContent
=
nativeAd
.
mediaContent
if
(
nativeAd
.
body
==
null
)
{
adView
.
bodyView
!!
.
visibility
=
View
.
INVISIBLE
}
else
{
adView
.
bodyView
!!
.
visibility
=
View
.
VISIBLE
(
adView
.
bodyView
as
TextView
?)
?.
text
=
nativeAd
.
body
}
if
(
nativeAd
.
callToAction
==
null
)
{
adView
.
callToActionView
!!
.
visibility
=
View
.
INVISIBLE
}
else
{
adView
.
callToActionView
!!
.
visibility
=
View
.
VISIBLE
(
adView
.
callToActionView
as
Button
?)
?.
text
=
nativeAd
.
callToAction
}
if
(
nativeAd
.
icon
==
null
)
{
adView
.
iconView
!!
.
visibility
=
View
.
GONE
}
else
{
(
adView
.
iconView
as
ImageView
?)
?.
setImageDrawable
(
nativeAd
.
icon
!!
.
drawable
)
adView
.
iconView
!!
.
visibility
=
View
.
VISIBLE
}
adView
.
setNativeAd
(
nativeAd
)
removeAllViews
()
addView
(
adView
)
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/max/AdMaxEvent.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.max
import
android.os.Bundle
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdRevenueListener
import
com.applovin.sdk.AppLovinSdk
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
import
com.facebook.FacebookSdk
import
com.facebook.appevents.AppEventsConstants
import
com.facebook.appevents.AppEventsLogger
import
com.google.firebase.analytics.FirebaseAnalytics
import
org.json.JSONObject
object
AdMaxEvent
{
fun
pullAd
(
ad
:
MaxAd
?,
adUnit
:
String
,
error
:
String
?
=
null
,
reqId
:
String
?
=
null
,
code
:
Int
?
=
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
(
"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"
)
}
EventUtils
.
event
(
"ad_pull"
,
ext
=
obj
)
}
fun
clickAd
(
ad
:
MaxAd
?,
adUnit
:
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
)
if
(!
adUnit
.
equals
(
"nativeAd"
))
{
EventUtils
.
event
(
"ad_click"
,
ext
=
obj
)
}
else
{
EventUtils
.
event
(
"big_imgad_click"
,
ext
=
obj
)
}
}
fun
showAd
(
ad
:
MaxAd
?,
adUnit
:
String
,
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"
)
LogEx
.
logDebug
(
"glc"
,
"from: $activity"
)
if
(
adUnit
!=
"nativeAd"
)
{
EventUtils
.
event
(
"ad_show"
,
ext
=
obj
)
}
else
{
EventUtils
.
event
(
"big_img_show"
,
ext
=
obj
)
}
}
private
val
taichiPref
=
FacebookSdk
.
getApplicationContext
()
.
getSharedPreferences
(
"TaichiTroasCache"
,
0
)
private
val
taichiSharedPreferencesEditor
=
taichiPref
.
edit
()
class
EventOnPaidEventListener
:
MaxAdRevenueListener
{
override
fun
onAdRevenuePaid
(
ad
:
MaxAd
)
{
val
params
=
Bundle
()
val
currentImpressionRevenue
:
Double
=
ad
.
revenue
// In USD
val
mFirebaseAnalytics
=
FirebaseAnalytics
.
getInstance
(
MyApplication
.
context
)
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
(
MyApplication
.
context
)
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
(
MyApplication
.
context
).
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
)
EventUtils
.
event
(
"ad_price"
,
ext
=
obj
)
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/max/AdMaxInit.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.max
import
android.content.Context
import
com.applovin.sdk.AppLovinMediationProvider
import
com.applovin.sdk.AppLovinSdk
import
com.applovin.sdk.AppLovinSdkInitializationConfiguration
import
com.base.browserwhite.ads.AdmobMaxHelper.isAdInit
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
import
java.util.concurrent.Executors
object
AdMaxInit
{
private
const
val
TAG
=
"AdMaxInit"
var
maxInitAction
:
(()
->
Unit
)?
=
null
fun
Context
.
initAdMax
()
{
// If you want to test your own AppLovin SDK key, change the value here and update the package name in the build.gradle
// val YOUR_SDK_KEY = "05TMDQ5tZabpXQ45_UTbmEGNUtVAzSTzT6KmWQc5_CuWdzccS4DCITZoL3yIWUG3bbq60QC_d4WF28tUC4gVTF"
val
YOUR_SDK_KEY
=
"GGPreND6SRmCt1zJgn5faiLGD8c2PVGPLgPpSg7cHanVTud1DhtuI9MmteTqlEviaJ57WnxW68kQDaATJ5z3cW"
val
executor
=
Executors
.
newSingleThreadExecutor
();
executor
.
execute
{
val
initConfigBuilder
=
AppLovinSdkInitializationConfiguration
.
builder
(
YOUR_SDK_KEY
,
this
)
initConfigBuilder
.
mediationProvider
=
AppLovinMediationProvider
.
MAX
// Enable test mode by default for the current device. Cannot be run on the main thread.
// val currentGaid = AdvertisingIdClient.getAdvertisingIdInfo(this).id
// if (currentGaid != null) {
// initConfigBuilder.testDeviceAdvertisingIds = Collections.singletonList(currentGaid)
// }
// Initialize the AppLovin SDK
val
sdk
=
AppLovinSdk
.
getInstance
(
this
)
sdk
.
initialize
(
initConfigBuilder
.
build
())
{
LogEx
.
logDebug
(
TAG
,
"max init"
)
isAdInit
.
set
(
true
)
maxInitAction
?.
invoke
()
maxInitAction
=
null
EventUtils
.
event
(
"MaxInit"
,
"MaxInit"
)
}
executor
.
shutdown
()
}
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/max/AdMaxInterstitialUtils.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.max
import
android.app.Activity
import
android.app.Dialog
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdListener
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.ads.MaxInterstitialAd
import
com.base.browserwhite.R
import
com.base.browserwhite.ads.AdDisplayUtils
import
com.base.browserwhite.ads.AdmobMaxHelper.isInterOpenShowing
import
com.base.browserwhite.ads.AdmobMaxHelper.lastShowedOnHiddenTime
import
com.base.browserwhite.ads.CustomDialog
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
import
org.json.JSONObject
import
java.util.UUID
object
AdMaxInterstitialUtils
{
private
const
val
TAG
=
"AdMaxInterstitialUtils"
private
var
interstitialAd
:
MaxInterstitialAd
?
=
null
private
var
interLoadTime
=
Long
.
MAX_VALUE
private
var
onHidden
:
(()
->
Unit
)?
=
null
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
var
activityString
:
String
=
""
private
fun
setListener
(
activity
:
Activity
)
{
activityString
=
activity
::
class
.
java
.
toString
().
split
(
"."
).
last
()
if
(
interstitialAd
==
null
)
{
interstitialAd
=
MaxInterstitialAd
(
ConfigHelper
.
interAdMaxId
,
activity
)
interstitialAd
?.
setListener
(
object
:
MaxAdListener
{
override
fun
onAdLoaded
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdLoaded"
)
loadingListener
?.
invoke
()
loadingListener
=
null
interLoadTime
=
System
.
currentTimeMillis
()
val
reqId
=
UUID
.
randomUUID
().
toString
()
AdMaxEvent
.
pullAd
(
p0
,
"interAd"
,
reqId
=
reqId
)
}
override
fun
onAdLoadFailed
(
p0
:
String
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdLoadFailed"
)
val
reqId
=
UUID
.
randomUUID
().
toString
()
AdMaxEvent
.
pullAd
(
null
,
"interAd"
,
reqId
=
reqId
,
error
=
p1
.
message
,
code
=
p1
.
code
)
AdDisplayUtils
.
getInstance
().
incrementAdRequestFailCount
()
loadingListener
?.
invoke
()
loadingListener
=
null
}
override
fun
onAdDisplayed
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdDisplayed"
)
AdDisplayUtils
.
getInstance
().
incrementAdDisplayCount
()
AdMaxEvent
.
showAd
(
p0
,
"interAd"
,
activityString
)
isInterOpenShowing
=
true
}
override
fun
onAdHidden
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdHidden"
)
onHidden
?.
invoke
()
onHidden
=
null
AdMaxOpenUtils
.
loadAppOpenAd
(
activity
)
// loadInterstitialAd(activity)
isInterOpenShowing
=
false
lastShowedOnHiddenTime
=
System
.
currentTimeMillis
()
}
override
fun
onAdClicked
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdClicked activity=$activityString"
)
AdDisplayUtils
.
getInstance
().
incrementAdClickCount
()
AdMaxEvent
.
clickAd
(
p0
,
"interAd"
)
}
override
fun
onAdDisplayFailed
(
p0
:
MaxAd
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdDisplayFailed"
)
onHidden
?.
invoke
()
onHidden
=
null
val
obj2
=
JSONObject
()
obj2
.
put
(
"code"
,
p1
.
code
)
obj2
.
put
(
"reason"
,
p1
.
message
)
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj2
)
isInterOpenShowing
=
false
}
})
interstitialAd
?.
setRevenueListener
(
AdMaxEvent
.
EventOnPaidEventListener
())
}
}
fun
showInterstitialAd
(
activity
:
Activity
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
setListener
(
activity
)
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(
isAdExpired
())
{
val
obj2
=
JSONObject
()
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_expire"
,
ext
=
obj2
)
onHidden
?.
invoke
()
loadInterstitialAd
(
activity
)
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"interAd"
))
{
onHidden
?.
invoke
()
return
}
LogEx
.
logDebug
(
TAG
,
"showInterstitialAd,展示插屏广告"
)
val
obj1
=
JSONObject
()
obj1
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_prepare_show"
,
ext
=
obj1
)
isInterOpenShowing
=
false
if
(
interstitialAd
?.
isReady
==
true
)
{
LogEx
.
logDebug
(
TAG
,
"有缓存直接播放。"
)
AdMaxInterstitialUtils
.
onHidden
=
onHidden
interstitialAd
?.
showAd
(
activity
)
}
else
{
LogEx
.
logDebug
(
TAG
,
"展示广告时,没有缓存,需要拉取。"
)
val
obj2
=
JSONObject
()
obj2
.
put
(
"reason"
,
"no cache ad"
)
obj2
.
put
(
"ad_unit"
,
"interAd"
)
EventUtils
.
event
(
"ad_nocache_pull"
,
ext
=
obj2
)
val
loaded
=
loadInterstitialAd
(
activity
)
if
(
loaded
)
{
LogEx
.
logDebug
(
TAG
,
"loaded=true"
)
val
dialog
=
showAdDialogAndLoadInterstitial
(
activity
)
loadingListener
=
{
dialog
?.
dismiss
()
if
(
interstitialAd
?.
isReady
==
true
)
{
AdMaxInterstitialUtils
.
onHidden
=
onHidden
interstitialAd
?.
showAd
(
activity
)
}
else
{
onHidden
?.
invoke
()
}
}
}
else
{
LogEx
.
logDebug
(
TAG
,
"loaded=false"
)
onHidden
?.
invoke
()
}
}
}
private
fun
isAdExpired
():
Boolean
{
return
System
.
currentTimeMillis
()
-
interLoadTime
>
1000
*
60
*
60
}
private
fun
showAdDialogAndLoadInterstitial
(
activity
:
Activity
,
):
Dialog
?
{
var
customDialog
:
Dialog
?
=
null
if
(!
activity
.
isFinishing
&&
!
activity
.
isDestroyed
)
{
customDialog
=
CustomDialog
(
activity
,
R
.
layout
.
dialog_ad_loading
)
// 设置对话框的样式和内容
customDialog
.
show
()
}
return
customDialog
}
fun
loadInterstitialAd
(
activity
:
Activity
):
Boolean
{
setListener
(
activity
)
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"interAd"
))
{
return
false
}
LogEx
.
logDebug
(
TAG
,
"loadInterstitialAd"
)
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"interAd"
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
interstitialAd
?.
loadAd
()
AdDisplayUtils
.
getInstance
().
incrementAdRequestCount
()
return
true
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/max/AdMaxNativeUtils.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.max
import
android.app.Activity
import
android.content.Context
import
android.view.ViewGroup
import
androidx.core.view.isVisible
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
com.applovin.mediation.nativeAds.MaxNativeAdViewBinder
import
com.base.browserwhite.MyApplication
import
com.base.browserwhite.R
import
com.base.browserwhite.ads.AdDisplayUtils
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
import
org.json.JSONObject
object
AdMaxNativeUtils
{
private
val
TAG
=
"AdMaxNativeUtils"
private
var
nativeAdLoader
:
MaxNativeAdLoader
=
MaxNativeAdLoader
(
ConfigHelper
.
nativeAdMaxId
,
MyApplication
.
context
)
private
var
nativeAd
:
MaxAd
?
=
null
private
var
nativeLoadTime
=
Long
.
MAX_VALUE
private
var
haveSetAdListener
:
Boolean
=
false
private
var
loadingListener
:
(()
->
Unit
)?
=
null
private
var
activityString
:
String
=
""
private
fun
setNativeAdListener
()
{
if
(!
haveSetAdListener
)
{
//加载展示监听
nativeAdLoader
.
setNativeAdListener
(
object
:
MaxNativeAdListener
()
{
override
fun
onNativeAdLoaded
(
nativeAdView
:
MaxNativeAdView
?,
ad
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onNativeAdLoaded"
)
// Cleanup any pre-existing native ad to prevent memory leaks.
if
(
nativeAd
?.
nativeAd
?.
isExpired
==
true
)
{
nativeAdLoader
.
destroy
(
nativeAd
)
}
// Save ad to be rendered later.
nativeAd
=
ad
nativeLoadTime
=
System
.
currentTimeMillis
()
loadingListener
?.
invoke
()
loadingListener
=
null
}
override
fun
onNativeAdLoadFailed
(
p0
:
String
,
p1
:
MaxError
)
{
super
.
onNativeAdLoadFailed
(
p0
,
p1
)
loadingListener
?.
invoke
()
loadingListener
=
null
LogEx
.
logDebug
(
TAG
,
"onNativeAdLoadFailed"
)
LogEx
.
logDebug
(
TAG
,
"code=${p1.code}"
)
LogEx
.
logDebug
(
TAG
,
"message=${p1.message}"
)
// AdDisplayUtils.getInstance().incrementAdRequestFailCount()
val
obj2
=
JSONObject
()
obj2
.
put
(
"reason"
,
"no_ad"
)
obj2
.
put
(
"ad_unit"
,
"nativeAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj2
)
}
override
fun
onNativeAdClicked
(
p0
:
MaxAd
)
{
super
.
onNativeAdClicked
(
p0
)
LogEx
.
logDebug
(
TAG
,
"onNativeAdClicked"
)
// AdDisplayUtils.getInstance().incrementAdClickCount()
nativeAd
?.
let
{
AdMaxEvent
.
clickAd
(
it
,
"nativeAd"
)
}
}
override
fun
onNativeAdExpired
(
p0
:
MaxAd
)
{
super
.
onNativeAdExpired
(
p0
)
}
})
//广告价格监听
nativeAdLoader
.
setRevenueListener
{
ad
->
}
haveSetAdListener
=
true
}
}
private
fun
createNativeAdView
(
context
:
Context
,
layout
:
Int
):
MaxNativeAdView
{
// val binder: MaxNativeAdViewBinder = MaxNativeAdViewBinder.Builder(R.layout.layout_max_native_custom)
// .setTitleTextViewId(R.id.title_text_view)
// .setBodyTextViewId(R.id.body_text_view)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
// .setIconImageViewId(R.id.icon_image_view)
// .setMediaContentViewGroupId(R.id.media_view_container)
// .setOptionsContentViewGroupId(R.id.options_view)
// .setStarRatingContentViewGroupId(R.id.star_rating_view)
// .setCallToActionButtonId(R.id.cta_button)
// .build()
// return MaxNativeAdView(binder, context)
val
binder
:
MaxNativeAdViewBinder
=
MaxNativeAdViewBinder
.
Builder
(
layout
)
.
setTitleTextViewId
(
R
.
id
.
ad_headline
)
.
setBodyTextViewId
(
R
.
id
.
ad_body
)
// .setAdvertiserTextViewId(R.id.advertiser_text_view)
.
setIconImageViewId
(
R
.
id
.
ad_app_icon
)
.
setMediaContentViewGroupId
(
R
.
id
.
ad_media
)
// .setOptionsContentViewGroupId(R.id.options_view)
// .setStarRatingContentViewGroupId(R.id.star_rating_view)
.
setCallToActionButtonId
(
R
.
id
.
ad_call_to_action
)
.
build
()
return
MaxNativeAdView
(
binder
,
context
)
}
fun
loadNativeAd
()
{
setNativeAdListener
()
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"nativeAd"
))
{
return
}
nativeAdLoader
.
loadAd
()
}
fun
showNativeAd
(
activity
:
Activity
,
parent
:
ViewGroup
,
layout
:
Int
)
{
activityString
=
activity
::
class
.
java
.
toString
().
split
(
"."
).
last
()
LogEx
.
logDebug
(
TAG
,
"activityString=$activityString"
)
setNativeAdListener
()
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"nativeAd"
))
{
LogEx
.
logDebug
(
TAG
,
"!shouldShowAd"
)
return
}
if
(
nativeAd
?.
nativeAd
?.
isExpired
==
true
||
nativeAd
==
null
)
{
LogEx
.
logDebug
(
TAG
,
"nativeAd?.nativeAd?.isExpired == true"
)
nativeAdLoader
.
destroy
(
nativeAd
)
nativeAdLoader
.
loadAd
()
loadingListener
=
{
if
(
nativeAd
!=
null
)
{
showReadyNative
(
activity
,
parent
,
layout
)
}
}
}
else
{
showReadyNative
(
activity
,
parent
,
layout
)
}
}
private
fun
showReadyNative
(
activity
:
Activity
,
parent
:
ViewGroup
,
layout
:
Int
)
{
val
adView
=
createNativeAdView
(
activity
,
layout
)
LogEx
.
logDebug
(
TAG
,
"showReadNative adUnitId=${nativeAd?.adUnitId}"
)
parent
.
isVisible
=
true
parent
.
removeAllViews
()
nativeAdLoader
.
render
(
adView
,
nativeAd
)
parent
.
addView
(
adView
)
nativeAd
?.
let
{
AdMaxEvent
.
showAd
(
it
,
"nativeAd"
,
activityString
)
}
LogEx
.
logDebug
(
TAG
,
"loadingListener finish"
)
}
}
\ No newline at end of file
app/src/main/java/com/base/browserwhite/ads/max/AdMaxOpenUtils.kt
0 → 100644
View file @
ca7d2ae8
package
com.base.browserwhite.ads.max
import
android.app.Activity
import
com.applovin.mediation.MaxAd
import
com.applovin.mediation.MaxAdListener
import
com.applovin.mediation.MaxError
import
com.applovin.mediation.ads.MaxAppOpenAd
import
com.base.browserwhite.ads.AdDisplayUtils
import
com.base.browserwhite.ads.AdmobMaxHelper.isInterOpenShowing
import
com.base.browserwhite.help.ConfigHelper
import
com.base.browserwhite.help.EventUtils
import
com.base.browserwhite.utils.LogEx
import
org.json.JSONObject
import
java.util.UUID
object
AdMaxOpenUtils
{
private
const
val
TAG
=
"AdMaxOpenUtils"
private
var
appOpenAd
:
MaxAppOpenAd
?
=
null
private
var
openLoadTime
=
Long
.
MAX_VALUE
private
var
onHidden
:
(()
->
Unit
)?
=
null
private
var
loadingListener
:
((
flag
:
Boolean
)
->
Unit
)?
=
null
private
var
activityString
=
""
private
fun
setListener
(
activity
:
Activity
)
{
activityString
=
activity
::
class
.
java
.
toString
().
split
(
"."
).
last
()
if
(
appOpenAd
==
null
)
{
appOpenAd
=
MaxAppOpenAd
(
ConfigHelper
.
openAdMaxId
,
activity
)
appOpenAd
?.
setListener
(
object
:
MaxAdListener
{
override
fun
onAdLoaded
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"广告拉取成功"
)
openLoadTime
=
System
.
currentTimeMillis
()
loadingListener
?.
invoke
(
true
)
loadingListener
=
null
AdMaxEvent
.
pullAd
(
p0
,
"openAd"
)
}
override
fun
onAdLoadFailed
(
p0
:
String
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"广告拉取失败了,onAdLoadFailed:"
+
p0
)
LogEx
.
logDebug
(
TAG
,
"广告拉取失败了,onAdLoadFailed:"
+
p1
.
message
.
toString
())
LogEx
.
logDebug
(
TAG
,
"广告拉取失败了,onAdLoadFailed:"
+
p1
.
code
)
loadingListener
?.
invoke
(
false
)
loadingListener
=
null
AdDisplayUtils
.
getInstance
().
incrementAdRequestFailCount
()
val
reqId
=
UUID
.
randomUUID
().
toString
()
AdMaxEvent
.
pullAd
(
null
,
"openAd"
,
reqId
=
reqId
,
error
=
p1
.
message
,
code
=
p1
.
code
)
}
override
fun
onAdDisplayed
(
p0
:
MaxAd
)
{
AdDisplayUtils
.
getInstance
().
incrementAdDisplayCount
()
AdMaxEvent
.
showAd
(
p0
,
"openAd"
,
activityString
)
isInterOpenShowing
=
true
}
override
fun
onAdHidden
(
p0
:
MaxAd
)
{
LogEx
.
logDebug
(
TAG
,
"onAdHidden"
)
onHidden
?.
invoke
()
onHidden
=
null
loadAppOpenAd
(
activity
)
isInterOpenShowing
=
false
}
override
fun
onAdDisplayFailed
(
p0
:
MaxAd
,
p1
:
MaxError
)
{
LogEx
.
logDebug
(
TAG
,
"onAdDisplayFailed"
)
onHidden
?.
invoke
()
onHidden
=
null
loadAppOpenAd
(
activity
)
val
obj
=
JSONObject
()
obj
.
put
(
"code"
,
p1
.
code
)
obj
.
put
(
"reason"
,
p1
.
message
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_show_error"
,
ext
=
obj
)
isInterOpenShowing
=
false
}
override
fun
onAdClicked
(
p0
:
MaxAd
)
{
AdDisplayUtils
.
getInstance
().
incrementAdClickCount
()
AdMaxEvent
.
clickAd
(
p0
,
"openAd"
)
}
})
appOpenAd
?.
setRevenueListener
(
AdMaxEvent
.
EventOnPaidEventListener
())
}
}
fun
showAppOpenAd
(
activity
:
Activity
,
loadCallBack
:
((
loaded
:
Boolean
)
->
Unit
)?
=
null
,
onHidden
:
(()
->
Unit
)?
=
null
)
{
setListener
(
activity
)
if
(
activity
.
isFinishing
||
activity
.
isDestroyed
)
{
return
}
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"openAd"
))
{
LogEx
.
logDebug
(
TAG
,
"!shouldShowAd"
)
onHidden
?.
invoke
()
return
}
if
(
System
.
currentTimeMillis
()
-
openLoadTime
>
1000
*
60
*
60
)
{
LogEx
.
logDebug
(
TAG
,
"openLoadTime > "
)
onHidden
?.
invoke
()
val
obj2
=
JSONObject
()
obj2
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_expire"
,
ext
=
obj2
)
appOpenAd
?.
loadAd
()
}
// if (!isAdInit.get()) {
// EventUtils.event("isAdInit", value = "showAppOpenAd isAdInit=${isAdInit.get()}")
// onHidden?.invoke()
// return
// }
LogEx
.
logDebug
(
TAG
,
"showAppOpenAd"
)
val
obj1
=
JSONObject
()
obj1
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_prepare_show"
,
ext
=
obj1
)
isInterOpenShowing
=
false
if
(
appOpenAd
?.
isReady
==
true
)
{
LogEx
.
logDebug
(
TAG
,
"广告准备好了,展示广告"
)
AdMaxOpenUtils
.
onHidden
=
onHidden
appOpenAd
?.
showAd
()
}
else
{
val
obj
=
JSONObject
()
obj
.
put
(
"reason"
,
"no cache ad"
)
obj
.
put
(
"ad_unit"
,
"openAd"
)
EventUtils
.
event
(
"ad_nocache_pull"
,
ext
=
obj
)
LogEx
.
logDebug
(
TAG
,
"展示时候,发现广告需要拉取"
)
val
loaded
=
loadAppOpenAd
(
activity
)
if
(
loaded
)
{
loadingListener
=
{
loadResult
->
loadCallBack
?.
invoke
(
loadResult
)
LogEx
.
logDebug
(
TAG
,
"loadingListener callback"
)
if
(
appOpenAd
?.
isReady
==
true
)
{
AdMaxOpenUtils
.
onHidden
=
onHidden
appOpenAd
?.
showAd
()
}
else
{
onHidden
?.
invoke
()
}
}
}
else
{
onHidden
?.
invoke
()
}
}
}
fun
loadAppOpenAd
(
activity
:
Activity
):
Boolean
{
setListener
(
activity
)
if
(!
AdDisplayUtils
.
getInstance
().
shouldShowAd
(
"openAd"
))
{
LogEx
.
logDebug
(
TAG
,
"!shouldShowAd"
)
return
false
}
val
reqId
=
UUID
.
randomUUID
().
toString
()
val
obj
=
JSONObject
()
obj
.
put
(
"req_id"
,
reqId
)
obj
.
put
(
"ad_type"
,
"openAd"
)
EventUtils
.
event
(
"ad_pull_start"
,
ext
=
obj
)
appOpenAd
?.
loadAd
()
AdDisplayUtils
.
getInstance
().
incrementAdRequestCount
()
return
true
}
}
app/src/main/java/com/base/browserwhite/
utils
/ConfigHelper.kt
→
app/src/main/java/com/base/browserwhite/
help
/ConfigHelper.kt
View file @
ca7d2ae8
package
com.base.browserwhite.
utils
package
com.base.browserwhite.
help
object
ConfigHelper
{
object
ConfigHelper
{
...
...
app/src/main/java/com/base/browserwhite/
utils
/EventUtils.kt
→
app/src/main/java/com/base/browserwhite/
help
/EventUtils.kt
View file @
ca7d2ae8
package
com.base.browserwhite.
utils
package
com.base.browserwhite.
help
import
android.os.Build
import
android.os.Build
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.help.AESHelper
import
com.base.browserwhite.help.ReportUtils.doPost
import
com.base.browserwhite.help.ReportUtils.doPost
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.LogEx
import
org.json.JSONException
import
org.json.JSONException
import
org.json.JSONObject
import
org.json.JSONObject
...
...
app/src/main/java/com/base/browserwhite/help/NewsUtils.kt
View file @
ca7d2ae8
...
@@ -3,7 +3,6 @@ package com.base.browserwhite.help
...
@@ -3,7 +3,6 @@ package com.base.browserwhite.help
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.BuildConfig
import
com.base.browserwhite.bean.NewsBean
import
com.base.browserwhite.bean.NewsBean
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.AppPreferences
import
com.base.browserwhite.utils.ConfigHelper
import
com.base.browserwhite.utils.LogEx
import
com.base.browserwhite.utils.LogEx
import
com.google.gson.Gson
import
com.google.gson.Gson
import
com.google.gson.JsonParser
import
com.google.gson.JsonParser
...
...
app/src/main/java/com/base/browserwhite/service/StayNotificationService.kt
View file @
ca7d2ae8
...
@@ -19,7 +19,7 @@ import com.base.browserwhite.R
...
@@ -19,7 +19,7 @@ import com.base.browserwhite.R
import
com.base.browserwhite.bean.ConstObject
import
com.base.browserwhite.bean.ConstObject
import
com.base.browserwhite.ui.activity.MainActivity
import
com.base.browserwhite.ui.activity.MainActivity
import
com.base.browserwhite.ui.activity.SplashActivity
import
com.base.browserwhite.ui.activity.SplashActivity
import
com.base.browserwhite.
utils
.EventUtils
import
com.base.browserwhite.
help
.EventUtils
import
kotlin.random.Random
import
kotlin.random.Random
...
...
app/src/main/java/com/base/browserwhite/ui/activity/SplashActivity.kt
View file @
ca7d2ae8
...
@@ -20,7 +20,7 @@ import com.base.browserwhite.ui.activity.cleanjunk.ScanJunkActivity
...
@@ -20,7 +20,7 @@ import com.base.browserwhite.ui.activity.cleanjunk.ScanJunkActivity
import
com.base.browserwhite.ui.activity.news.NewsActivity
import
com.base.browserwhite.ui.activity.news.NewsActivity
import
com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity
import
com.base.browserwhite.ui.activity.scanqrc.ScanQRCActivity
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.utils.BarUtils
import
com.base.browserwhite.
utils
.ConfigHelper
import
com.base.browserwhite.
help
.ConfigHelper
import
com.base.browserwhite.utils.LogEx
import
com.base.browserwhite.utils.LogEx
import
kotlinx.coroutines.Job
import
kotlinx.coroutines.Job
import
kotlinx.coroutines.cancel
import
kotlinx.coroutines.cancel
...
@@ -30,7 +30,6 @@ import kotlinx.coroutines.flow.SharedFlow
...
@@ -30,7 +30,6 @@ 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
@SuppressLint
(
"CustomSplashScreen"
)
@SuppressLint
(
"CustomSplashScreen"
)
class
SplashActivity
:
BaseActivity
<
ActivitySplashBinding
>()
{
class
SplashActivity
:
BaseActivity
<
ActivitySplashBinding
>()
{
...
@@ -61,7 +60,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
...
@@ -61,7 +60,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
progressCollect
()
progressCollect
()
if
(
ifAgreePrivacy
)
{
if
(
ifAgreePrivacy
)
{
//
AdmobMaxHelper.preloadAd(this)
// AdmobMaxHelper.preloadAd(this)
job
=
startProgress
()
job
=
startProgress
()
binding
.
llStart
.
visibility
=
View
.
GONE
binding
.
llStart
.
visibility
=
View
.
GONE
binding
.
llProgress
.
visibility
=
View
.
VISIBLE
binding
.
llProgress
.
visibility
=
View
.
VISIBLE
...
@@ -154,7 +153,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
...
@@ -154,7 +153,7 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
oneClickStart
=
true
oneClickStart
=
true
ifAgreePrivacy
=
true
ifAgreePrivacy
=
true
// (application as MyApplication).initApp(true)
// (application as MyApplication).initApp(true)
// AdmobMaxHelper.preloadAd(this)
//
com.base.browserwhite.ads.
AdmobMaxHelper.preloadAd(this)
binding
.
llStart
.
visibility
=
View
.
GONE
binding
.
llStart
.
visibility
=
View
.
GONE
binding
.
llProgress
.
visibility
=
View
.
VISIBLE
binding
.
llProgress
.
visibility
=
View
.
VISIBLE
job
=
startProgress
()
job
=
startProgress
()
...
@@ -187,14 +186,14 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
...
@@ -187,14 +186,14 @@ class SplashActivity : BaseActivity<ActivitySplashBinding>() {
// LogEx.logDebug(TAG, "outTimeAd")
// LogEx.logDebug(TAG, "outTimeAd")
//
//
// var loaded: Boolean = true
// var loaded: Boolean = true
// AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag ->
//
com.base.browserwhite.ads.
AdmobMaxHelper.admobMaxShowOpenAd(this, showBeforeAction = { flag ->
// LogEx.logDebug(TAG, "showBeforeAction flag=$flag")
// LogEx.logDebug(TAG, "showBeforeAction flag=$flag")
// loaded = flag
// loaded = flag
// job?.cancel()
// job?.cancel()
// }, onHidden = {
// }, onHidden = {
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// val sp = AppPreferences.getInstance().getString("splashShowInter", "0").toInt()
// if (sp == 1 && !loaded) {
// if (sp == 1 && !loaded) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) {
//
com.base.browserwhite.ads.
AdmobMaxHelper.admobMaxShowInterstitialAd(this, isLoading = false) {
// binding.pb.progress = 100
// binding.pb.progress = 100
// jumpNext()
// jumpNext()
// }
// }
...
...
app/src/main/java/com/base/browserwhite/ui/activity/cleanjunk/CleaningActivity.kt
View file @
ca7d2ae8
...
@@ -82,7 +82,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
...
@@ -82,7 +82,7 @@ class CleaningActivity : BaseActivity<ActivityLayoutCleanupingBinding>() {
// val isCleanEndAdSp = AppPreferences.getInstance().getString("isCleanEndAdSp", "0").toInt()
// val isCleanEndAdSp = AppPreferences.getInstance().getString("isCleanEndAdSp", "0").toInt()
// if (isCleanEndAdSp == 1) {
// if (isCleanEndAdSp == 1) {
// AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity) {
//
com.base.browserwhite.ads.
AdmobMaxHelper.admobMaxShowInterstitialAd(this@CleaningActivity) {
// startActivity(
// startActivity(
// Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", JUNK_CLEANER)
// Intent(this@CleaningActivity, ResultActivity::class.java).putExtra("from", JUNK_CLEANER)
// .putExtra("clean_size", intentSize)
// .putExtra("clean_size", intentSize)
...
...
app/src/main/java/com/base/browserwhite/ui/activity/download/WebDownloadManagerActivity.kt
View file @
ca7d2ae8
...
@@ -9,7 +9,6 @@ import androidx.core.view.updatePadding
...
@@ -9,7 +9,6 @@ import androidx.core.view.updatePadding
import
com.base.browserwhite.bean.DownloadBean
import
com.base.browserwhite.bean.DownloadBean
import
com.base.browserwhite.databinding.ActivityWebDownloadManagerBinding
import
com.base.browserwhite.databinding.ActivityWebDownloadManagerBinding
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.BaseActivity
import
com.base.browserwhite.ui.activity.mediabrowser.MediaBrowserActivity
import
com.base.browserwhite.ui.activity.mediabrowser.MediaVideoDetailActivity
import
com.base.browserwhite.ui.activity.mediabrowser.MediaVideoDetailActivity
import
com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog
import
com.base.browserwhite.ui.views.DialogViews.showDeleteTipDialog
import
com.base.browserwhite.ui.views.DialogViews.showGerPermission
import
com.base.browserwhite.ui.views.DialogViews.showGerPermission
...
@@ -20,7 +19,6 @@ import com.base.browserwhite.utils.DownloadHelper.getDownloadJsonBean
...
@@ -20,7 +19,6 @@ import com.base.browserwhite.utils.DownloadHelper.getDownloadJsonBean
import
com.base.browserwhite.utils.DownloadHelper.saveDownloadRecordFile
import
com.base.browserwhite.utils.DownloadHelper.saveDownloadRecordFile
import
com.base.browserwhite.utils.IntentEx.shareAction
import
com.base.browserwhite.utils.IntentEx.shareAction
import
com.base.browserwhite.utils.KotlinExt.toFormatTime
import
com.base.browserwhite.utils.KotlinExt.toFormatTime
import
com.base.browserwhite.utils.LogEx
import
com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import
com.base.browserwhite.utils.PermissionHelp.checkStorePermission
import
com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import
com.base.browserwhite.utils.PermissionHelp.requestStorePermission
import
com.google.gson.Gson
import
com.google.gson.Gson
...
@@ -73,11 +71,13 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
...
@@ -73,11 +71,13 @@ class WebDownloadManagerActivity : BaseActivity<ActivityWebDownloadManagerBindin
if
(
checkStorePermission
())
{
if
(
checkStorePermission
())
{
initData
()
initData
()
}
else
{
}
else
{
showGerPermission
(
desc
=
""
,
deny
=
{
finishToMain
()
},
allow
=
{
showGerPermission
(
requestStorePermission
(
launcher
,
result
=
{
desc
=
"This feature requires access to your storage to manage your downloads. We will not transfer your data to any third-party services. Please grant permission so that we can provide you with better services."
,
if
(
it
)
initData
()
else
finishToMain
()
deny
=
{
finishToMain
()
},
allow
=
{
requestStorePermission
(
launcher
,
result
=
{
if
(
it
)
initData
()
else
finishToMain
()
})
})
})
})
}
}
}
}
...
...
app/src/main/res/drawable/bg_355bea_10.xml
0 → 100644
View file @
ca7d2ae8
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#355BEA"
/>
<corners
android:radius=
"10dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_ad_border.xml
0 → 100644
View file @
ca7d2ae8
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<!-- <stroke-->
<!-- android:width="1dp"-->
<!-- android:color="#E5E5E5" />-->
<solid
android:color=
"#F2F2F2"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/bg_ff8a00_10.xml
0 → 100644
View file @
ca7d2ae8
<?xml version="1.0" encoding="utf-8"?>
<shape
xmlns:android=
"http://schemas.android.com/apk/res/android"
>
<solid
android:color=
"#FF8A00"
/>
<corners
android:radius=
"10dp"
/>
</shape>
\ No newline at end of file
app/src/main/res/drawable/circle_progress_bar.xml
0 → 100644
View file @
ca7d2ae8
<?xml version="1.0" encoding="utf-8"?>
<rotate
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:fromDegrees=
"0"
android:toDegrees=
"360"
>
<shape
android:innerRadiusRatio=
"3"
android:shape=
"ring"
android:thicknessRatio=
"7.0"
>
<size
android:height=
"48dp"
android:width=
"48dp"
/>
<gradient
android:centerColor=
"#355bea"
android:endColor=
"#355bea"
android:startColor=
"#355bea"
android:type=
"sweep"
android:useLevel=
"false"
/>
<stroke
android:width=
"3dp"
android:color=
"#FFFFFF"
/>
<corners
android:radius=
"3dp"
/>
</shape>
</rotate>
app/src/main/res/layout/dialog_ad_loading.xml
0 → 100644
View file @
ca7d2ae8
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"wrap_content"
android:layout_height=
"90dp"
android:background=
"@drawable/bg_ffffff_10"
android:gravity=
"center"
android:orientation=
"horizontal"
>
<ProgressBar
android:id=
"@+id/progressBar"
style=
"?android:attr/progressBarStyle"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"18dp"
android:indeterminate=
"true"
android:indeterminateDrawable=
"@drawable/circle_progress_bar"
/>
<TextView
android:id=
"@+id/dialog_ad_loading_text"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"11dp"
android:layout_marginEnd=
"18dp"
android:text=
"Network fluctuation, ad is loading, please wait."
android:textColor=
"#ff000000"
android:textSize=
"14sp"
tools:ignore=
"HardcodedText"
/>
</LinearLayout>
\ No newline at end of file
app/src/main/res/layout/dialog_download_finish.xml
View file @
ca7d2ae8
...
@@ -77,7 +77,7 @@
...
@@ -77,7 +77,7 @@
android:layout_height=
"175dp"
android:layout_height=
"175dp"
android:layout_marginTop=
"20dp"
>
android:layout_marginTop=
"20dp"
>
<include
layout=
"@layout/layout_
native_admob
_download"
/>
<include
layout=
"@layout/layout_
admob_native
_download"
/>
</FrameLayout>
</FrameLayout>
<TextView
<TextView
...
...
app/src/main/res/layout/layout_admob_native_custom.xml
0 → 100644
View file @
ca7d2ae8
<com.google.android.gms.ads.nativead.NativeAdView
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_margin=
"10dp"
>
<LinearLayout
android:background=
"@drawable/bg_ad_border"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:baselineAligned=
"false"
>
<com.google.android.gms.ads.nativead.MediaView
android:id=
"@+id/ad_media"
android:layout_width=
"91dp"
android:layout_height=
"91dp"
android:layout_gravity=
"center_vertical"
android:layout_marginStart=
"5dp"
/>
<LinearLayout
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginHorizontal=
"8dp"
android:layout_weight=
"1"
android:orientation=
"vertical"
>
<TextView
android:id=
"@+id/ad_headline"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:ellipsize=
"end"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"14sp"
android:textStyle=
"bold"
/>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:orientation=
"horizontal"
>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:background=
"#FF923E"
android:padding=
"2dp"
android:text=
"Ad"
android:textColor=
"@color/white"
android:textSize=
"12sp"
tools:ignore=
"HardcodedText"
/>
<TextView
android:id=
"@+id/ad_body"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_marginStart=
"8dp"
android:layout_marginEnd=
"10dp"
android:ellipsize=
"end"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"12sp"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:paddingVertical=
"5dp"
>
<ImageView
android:id=
"@+id/ad_app_icon"
android:layout_width=
"30dp"
android:layout_height=
"30dp"
android:layout_gravity=
"center_vertical"
tools:ignore=
"ContentDescription"
/>
<androidx.appcompat.widget.AppCompatButton
android:id=
"@+id/ad_call_to_action"
android:layout_width=
"match_parent"
android:layout_height=
"26dp"
android:layout_gravity=
"center_vertical"
android:layout_marginHorizontal=
"12dp"
android:background=
"@drawable/bg_ff8a00_10"
android:gravity=
"center"
android:textColor=
"@color/white"
android:textSize=
"15sp"
/>
</LinearLayout>
</LinearLayout>
</LinearLayout>
</com.google.android.gms.ads.nativead.NativeAdView>
\ No newline at end of file
app/src/main/res/layout/layout_
native_admob
_download.xml
→
app/src/main/res/layout/layout_
admob_native
_download.xml
View file @
ca7d2ae8
File moved
app/src/main/res/layout/layout_max_native_small.xml
0 → 100644
View file @
ca7d2ae8
<FrameLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
xmlns:tools=
"http://schemas.android.com/tools"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_margin=
"2dp"
>
<LinearLayout
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center"
android:background=
"#D9D9D9"
android:baselineAligned=
"false"
android:minHeight=
"40dp"
android:orientation=
"horizontal"
android:paddingHorizontal=
"5dp"
android:paddingVertical=
"2dp"
tools:ignore=
"UselessParent"
>
<FrameLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
>
<FrameLayout
android:id=
"@+id/ad_media"
android:layout_width=
"80dp"
android:layout_height=
"60dp"
android:layout_gravity=
"center"
/>
<TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"end"
android:background=
"@color/black"
android:padding=
"2dp"
android:text=
"Ad"
android:textColor=
"@color/white"
android:textSize=
"8sp"
tools:ignore=
"HardcodedText,SmallSp"
/>
</FrameLayout>
<LinearLayout
android:layout_width=
"0dp"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_vertical"
android:layout_marginHorizontal=
"5dp"
android:layout_weight=
"1"
android:orientation=
"vertical"
>
<TextView
android:id=
"@+id/ad_headline"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:ellipsize=
"end"
android:includeFontPadding=
"false"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"16sp"
android:textStyle=
"bold"
/>
<TextView
android:id=
"@+id/ad_body"
android:layout_width=
"match_parent"
android:layout_height=
"wrap_content"
android:ellipsize=
"end"
android:maxLines=
"2"
android:textColor=
"@color/black"
android:textSize=
"14sp"
tools:ignore=
"SmallSp"
/>
</LinearLayout>
<LinearLayout
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:layout_gravity=
"center_horizontal"
android:orientation=
"vertical"
>
<ImageView
android:id=
"@+id/ad_app_icon"
android:layout_width=
"30dp"
android:layout_height=
"30dp"
android:layout_gravity=
"center_horizontal"
tools:ignore=
"ContentDescription"
/>
<androidx.appcompat.widget.AppCompatButton
android:id=
"@+id/ad_call_to_action"
android:layout_width=
"wrap_content"
android:layout_height=
"30dp"
android:layout_gravity=
"center_vertical"
android:layout_marginHorizontal=
"8dp"
android:layout_marginVertical=
"5dp"
android:background=
"@drawable/bg_355bea_10"
android:gravity=
"center"
android:textColor=
"@color/white"
android:textSize=
"12sp"
/>
</LinearLayout>
</LinearLayout>
</FrameLayout>
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment