Full Code of bayescom/EasyAds-Android for AI

main 7c10daf9c407 cached
225 files
490.2 KB
131.9k tokens
904 symbols
1 requests
Download .txt
Showing preview only (599K chars total). Download the full file or copy to clipboard to get everything.
Repository: bayescom/EasyAds-Android
Branch: main
Commit: 7c10daf9c407
Files: 225
Total size: 490.2 KB

Directory structure:
gitextract_wasj5s9r/

├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── docs/
│   ├── banner.md
│   ├── draw.md
│   ├── easyAds.md
│   ├── easyBDManger.md
│   ├── easyCsjManger.md
│   ├── easyKSManger.md
│   ├── faq.md
│   ├── full.md
│   ├── home.md
│   ├── interstital.md
│   ├── nativeExpress.md
│   ├── reward.md
│   ├── splash.md
│   └── strategyJsonFormat.md
├── easyads/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── Baidu_MobAds_SDK_9352.aar
│   │   └── kssdk-ad-3363.aar
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── easyads/
│                       ├── EasyAds.java
│                       ├── EasyAdsConstant.java
│                       ├── EasyAdsManger.java
│                       ├── core/
│                       │   ├── EABaseSupplierAdapter.java
│                       │   ├── EasyAdBaseAdspot.java
│                       │   ├── banner/
│                       │   │   ├── EABannerListener.java
│                       │   │   ├── EABannerSetting.java
│                       │   │   └── EasyAdBanner.java
│                       │   ├── draw/
│                       │   │   ├── EADrawListener.java
│                       │   │   ├── EADrawSetting.java
│                       │   │   └── EasyAdDraw.java
│                       │   ├── full/
│                       │   │   ├── EAFullScreenVideoListener.java
│                       │   │   ├── EAFullScreenVideoSetting.java
│                       │   │   └── EasyAdFullScreenVideo.java
│                       │   ├── inter/
│                       │   │   ├── EAInterstitialListener.java
│                       │   │   ├── EAInterstitialSetting.java
│                       │   │   └── EasyAdInterstitial.java
│                       │   ├── nati/
│                       │   │   ├── EANativeExpressListener.java
│                       │   │   ├── EANativeExpressSetting.java
│                       │   │   └── EasyAdNativeExpress.java
│                       │   ├── reward/
│                       │   │   ├── EARewardServerCallBackInf.java
│                       │   │   ├── EARewardVideoListener.java
│                       │   │   ├── EARewardVideoSetting.java
│                       │   │   └── EasyAdRewardVideo.java
│                       │   └── splash/
│                       │       ├── EASplashLifeCallback.java
│                       │       ├── EASplashListener.java
│                       │       ├── EASplashSetting.java
│                       │       └── EasyAdSplash.java
│                       ├── custom/
│                       │   ├── EABannerCustomAdapter.java
│                       │   ├── EADrawCustomAdapter.java
│                       │   ├── EAFullScreenCustomAdapter.java
│                       │   ├── EAInterstitialCustomAdapter.java
│                       │   ├── EANativeExpressCustomAdapter.java
│                       │   ├── EARewardCustomAdapter.java
│                       │   └── EASplashCustomAdapter.java
│                       ├── itf/
│                       │   ├── AdCoreAction.java
│                       │   ├── BaseAdapterEvent.java
│                       │   ├── BaseEnsureListener.java
│                       │   └── EABaseADListener.java
│                       ├── model/
│                       │   ├── EALogLevel.java
│                       │   ├── EasyAdError.java
│                       │   ├── EasyAdType.java
│                       │   ├── SdkRule.java
│                       │   ├── SdkSupplier.java
│                       │   └── StrategyModel.java
│                       └── utils/
│                           ├── BigDecimalUtil.java
│                           ├── EAAdapterLoader.java
│                           ├── EALog.java
│                           ├── EASplashPlusManager.java
│                           ├── EASplashZoomOutLayout.java
│                           ├── EAUtil.java
│                           └── ScreenUtil.java
├── easybd/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── libs/
│   │   └── Baidu_MobAds_SDK_9352.aar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── baidu/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── baidu/
│       │   │                   ├── BDBannerAdapter.java
│       │   │                   ├── BDFullScreenVideoAdapter.java
│       │   │                   ├── BDInterstitialAdapter.java
│       │   │                   ├── BDNativeExpressAdapter.java
│       │   │                   ├── BDRewardVideoAdapter.java
│       │   │                   ├── BDSplashAdapter.java
│       │   │                   ├── BDUtil.java
│       │   │                   └── EasyBDManager.java
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── baidu/
│                               └── ExampleUnitTest.java
├── easycsj/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── csj/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── csj/
│       │   │                   ├── CSJSplashClickEyeManager.java
│       │   │                   ├── CsjBannerAdapter.java
│       │   │                   ├── CsjDrawAdapter.java
│       │   │                   ├── CsjFullScreenVideoAdapter.java
│       │   │                   ├── CsjInterstitialAdapter.java
│       │   │                   ├── CsjNativeExpressAdapter.java
│       │   │                   ├── CsjRewardVideoAdapter.java
│       │   │                   ├── CsjSplashAdapter.java
│       │   │                   ├── CsjUtil.java
│       │   │                   └── EasyCsjManger.java
│       │   └── res/
│       │       ├── values/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           └── ea_csj_file_paths.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── csj/
│                               └── ExampleUnitTest.java
├── easyks/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── libs/
│   │   └── kssdk-ad-3363.aar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── ks/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── ks/
│       │   │                   ├── EasyKSManager.java
│       │   │                   ├── KSDrawAdapter.java
│       │   │                   ├── KSFullScreenVideoAdapter.java
│       │   │                   ├── KSInterstitialAdapter.java
│       │   │                   ├── KSNativeExpressAdapter.java
│       │   │                   ├── KSRewardVideoAdapter.java
│       │   │                   ├── KSSplashAdapter.java
│       │   │                   └── KSUtil.java
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── ks/
│                               └── ExampleUnitTest.java
├── easyylh/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── ylh/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── ylh/
│       │   │                   ├── SplashZoomOutManager.java
│       │   │                   ├── YlhBannerAdapter.java
│       │   │                   ├── YlhFullScreenVideoAdapter.java
│       │   │                   ├── YlhInterstitialAdapter.java
│       │   │                   ├── YlhNativeExpressAdapter.java
│       │   │                   ├── YlhRewardVideoAdapter.java
│       │   │                   ├── YlhSplashAdapter.java
│       │   │                   └── YlhUtil.java
│       │   └── res/
│       │       ├── values/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           └── ea_ylh_file_path.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── ylh/
│                               └── ExampleUnitTest.java
├── example/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── Baidu_MobAds_SDK_9352.aar
│   │   ├── circleimageview-2.2.0.aar
│   │   ├── kssdk-ad-3363.aar
│   │   └── mimo-ad-sdk.aar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── demo/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   ├── banner_config.json
│       │   │   ├── draw_config.json
│       │   │   ├── full_config.json
│       │   │   ├── interstitial_config.json
│       │   │   ├── native_config.json
│       │   │   ├── reward_config.json
│       │   │   ├── splash_config.json
│       │   │   └── splash_cus_config.json
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── demo/
│       │   │               ├── BannerActivity.java
│       │   │               ├── BaseActivity.java
│       │   │               ├── DrawActivity.java
│       │   │               ├── EasyADController.java
│       │   │               ├── FullScreenVideoActivity.java
│       │   │               ├── InterstitialActivity.java
│       │   │               ├── MainActivity.java
│       │   │               ├── MyApplication.java
│       │   │               ├── NativeExpressActivity.java
│       │   │               ├── NativeExpressRecyclerViewActivity.java
│       │   │               ├── RewardVideoActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── SplashDialog.java
│       │   │               ├── SplashToMainActivity.java
│       │   │               ├── custom/
│       │   │               │   ├── CustomActivity.java
│       │   │               │   ├── HuaWeiSplashAdapter.java
│       │   │               │   └── XiaoMiSplashAdapter.java
│       │   │               ├── draw/
│       │   │               │   ├── FullScreenVideoView.java
│       │   │               │   ├── OnViewPagerListener.java
│       │   │               │   └── ViewPagerLayoutManager.java
│       │   │               └── utils/
│       │   │                   ├── BaseCallBack.java
│       │   │                   ├── Constant.java
│       │   │                   ├── DialogLogcat.java
│       │   │                   ├── NormalSetting.java
│       │   │                   ├── UIUtils.java
│       │   │                   └── UserPrivacyDialog.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── circle_big_red.xml
│       │       │   ├── dialog_white_radius_bg.xml
│       │       │   ├── ic_launcher_background.xml
│       │       │   └── play_arrow.xml
│       │       ├── drawable-v24/
│       │       │   └── ic_launcher_foreground.xml
│       │       ├── layout/
│       │       │   ├── activity_banner.xml
│       │       │   ├── activity_custom.xml
│       │       │   ├── activity_draw.xml
│       │       │   ├── activity_full_screen_video.xml
│       │       │   ├── activity_interstitial.xml
│       │       │   ├── activity_main.xml
│       │       │   ├── activity_native_express.xml
│       │       │   ├── activity_native_express_recycler_view.xml
│       │       │   ├── activity_reward_video.xml
│       │       │   ├── activity_splash_custom_logo.xml
│       │       │   ├── activity_splash_to_main.xml
│       │       │   ├── dialog_logcat.xml
│       │       │   ├── dialog_user_privacy.xml
│       │       │   ├── item_data.xml
│       │       │   ├── item_express_ad.xml
│       │       │   └── item_view_pager.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       ├── values/
│       │       │   ├── colors.xml
│       │       │   ├── dimens.xml
│       │       │   ├── ic_launcher_background.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       └── xml/
│       │           ├── netwc.xml
│       │           └── xm_file_paths.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── demo/
│                           └── ExampleUnitTest.java
├── gradle/
│   └── wrapper/
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
# Built application 文件
*.apk
*.ap_

# ART/Dalvik VM 文件
*.dex

# Java class 文件
*.class

# Generated 文件夹
bin/
gen/
out/

# Gradle files
.gradle/
build/

# 本地配置文件 (sdk path, etc)
local.properties

# Eclipse生成的Proguard文件夹
proguard/

# 日志文件
*.log

# Android Studio导航编辑器临时文件
.navigation/

# Android Studio captures folder
captures/

# IntelliJ (IDE配置文件)
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/assetWizardSettings.xml
.idea/dictionaries
.idea/libraries
.idea/caches

# 密钥储存库文件
# 如果您不想检查密钥库文件,请取消注释以下行
#*.jks

# 在Android Studio 2.2及更高版本中生成的外部原生构建文件夹
.externalNativeBuild

# Google服务 (e.g. APIs or Firebase)
google-services.json

# Freeline (Android 平台上的秒级编译方案)
freeline.py
freeline/
freeline_project_description.json

# fastlane (自动化打包框架)
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md

# .gitignore_global
####################################
######## OS generated files ########
####################################
.DS_Store
.DS_Store?
*.swp
._*
.Spotlight-V100
.Trashes
Icon?
ehthumbs.db
Thumbs.db
####################################
############# Packages #############
####################################
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

================================================
FILE: LICENSE
================================================
                    GNU GENERAL PUBLIC LICENSE
                       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

                    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

                            NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

                     END OF TERMS AND CONDITIONS

            How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License along
    with this program; if not, write to the Free Software Foundation, Inc.,
    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Lesser General
Public License instead of this License.


================================================
FILE: README.md
================================================
![levelup](levelup.jpg)

# 🚀🚀EasyAds项目全面升级,Pro版本全面开源,搭建媒体属于自己的聚合SDK管理平台。
# 了解更多请点击: [EasyAds Pro 主页](http://easyads-pro.bayescom.cn/),开启您的安全、高效、全面的商业化之路。

--------------------------------------------
**❗️❗原EasyAds项目将停止维护❗️❗**

# EasyAds-Android 快速指引
[![](https://jitpack.io/v/bayescom/EasyAds-Android.svg)](https://jitpack.io/#bayescom/EasyAds-Android)

## 1. 支持的SDK平台及广告位

| SDK平台 | 开屏 | 激励视频 | 横幅 | 插屏(弹窗) | 模板信息流 | 全屏视频 | draw信息流 |
|-------|---|---|---|---|---|---|---| 
| 穿山甲   | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 优量汇   | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| 百青藤   | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ |
| 快手    | ✅ | ✅ | ❌ | ✅ | ✅ | ✅ | ✅ |
 

## 2. 快速接入

下面介绍EasyAds的快速接入方法,开发中也可以参考[Example](https://github.com/bayescom/EasyAds-Android/tree/main/example)下的示例工程,快速了解。

### 2.1 引入SDK

**方式一(推荐)**:
使用Gradle 添加依赖,在项目根目录的build.gradle 文件中添加 `JitPack` 仓库

```
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
```
在项目module目录下的build.gradle 文件中添加SDK内容依赖

```
    dependencies {
        //EasyAds sdk(必须)
        implementation "com.github.bayescom:EasyAds-Android:1.2.1"

        //穿山甲广告SDK(建议)
        implementation "com.pangle.cn:mediation-sdk:6.1.2.5"
        //优量汇广告SDK(建议)
        implementation "com.qq.e.union:union:4.575.1445"
        //百度广告SDK(可选)
        implementation(name: "Baidu_MobAds_SDK_9352", ext: "aar")
//        //快手广告SDK(可选)
        implementation(name: "kssdk-ad-3363", ext: "aar")
    }
```

**方式二**:

将`EasyAds`项目以`Library`的形式导入APP项目工程。


### 2.2 SDK分发策略配置

配置SDK的分发策略,可方便的实现流量的切分操作,实现多SDK的混合执行策略。

在EasyAds中,我们通过JSON文件的方式配置SDK的分发策略,开发者可根据自身流量分发的需求,按照EasyAds中提供的JSON配置格式及方法设置流量分发策略。

以开屏广告对接穿山甲和优量汇两个SDK为例,配置选择80%流量穿山甲->优量汇的顺序请求,20%流量优量汇->穿山甲的顺序请求,配置如下所示。

其中,suppliers字段下配置媒体在穿山甲和优量汇平台申请的广告代码位信息,rules字段下配置流量分发策略及比例;

策略JSON的配置说明详细见:[SDK策略配置JSON说明](https://github.com/bayescom/EasyAds-Android/wiki/2.-SDK%E5%88%86%E5%8F%91%E7%AD%96%E7%95%A5%E9%85%8D%E7%BD%AEJSON)

不同广告位的JSON策略配置示例见:[不同广告位JSON配置示例](https://github.com/bayescom/EasyAds-Android/tree/main/example/src/main/assets)

```json
{
  "rules": [
    {
      "tag": "A",
      "sort": [
        1,
        2
      ],
      "percent": 80
    },
    {
      "tag": "B",
      "sort": [
        2,
        1
      ],
      "percent": 20
    }
  ],
  "suppliers": [
    {
      "tag": "csj",
      "adspotId": "穿山甲广告位ID",
      "appId": "穿山甲应用ID",
      "index": 1
    },
    {
      "tag": "ylh",
      "adspotId": "优量汇广告位ID",
      "appId": "优量汇应用ID",
      "index": 2
    }
  ]
}
```

**注:**
为了方便开发者配置流量分发策略,我们也提供了在线可视化的便捷工具[EasyTools](http://easyads.bayescom.cn/#/tools),方便生成广告位的策略配置JSON。


### 2.3 获取广告

以下步骤,为获取广告的必要步骤,**适用于所有广告位**。 不同广告位置的不同实现,可参考[Example示例](https://github.com/bayescom/EasyAds-Android/tree/main/example/src/main/java/com/easyads/demo);

####  2.3.1 初始化广告对象

初始化广告对象`EasyAdXXX`,以开屏为例

```
EasyAdSplash easySplash = new EasyAdSplash(mActivity, adContainer, listener);
```

####  2.3.2 设置执行策略

调用共有方法`setData(String strategyJson)`,给当前位置广告**赋予执行策略**,即2.2步骤中生成的SDK分发策略配置。

```
easySplash.setData(FileUtil.getJson(mActivity, "splash_config.json"));
```

#### 2.3.3 调用获取广告

方式一:**请求并展示广告**。

```
easySplash.loadAndShow();
```

方式二:先发起请求广告:

```
easySplash.loadOnly();
```

待广告成功拉取后,开发者可根据业务需求在合适的时机,决定调用展示广告方法。(**注意:广告会存在有效期,过久未调用展示,会导致广告失效**)

```
easySplash.show();
```

#### 2.3.4 各广告位集成实现

* [开屏广告:EasyAdSplash](https://github.com/bayescom/EasyAds-Android/wiki/3.1-%E5%BC%80%E5%B1%8F%E5%B9%BF%E5%91%8A)

* [插屏广告:EasyAdInterstitial](https://github.com/bayescom/EasyAds-Android/wiki/3.2-%E6%8F%92%E5%B1%8F%28%E5%BC%B9%E7%AA%97%29%E5%B9%BF%E5%91%8A)

* [横幅广告:EasyAdBanner](https://github.com/bayescom/EasyAds-Android/wiki/3.3-%E6%A8%AA%E5%B9%85%E5%B9%BF%E5%91%8A)

* [原生模板、信息流广告:EasyAdNativeExpress](https://github.com/bayescom/EasyAds-Android/wiki/3.4-%E5%8E%9F%E7%94%9F%E6%A8%A1%E6%9D%BF%E3%80%81%E4%BF%A1%E6%81%AF%E6%B5%81%E5%B9%BF%E5%91%8A)

* [激励视频广告:EasyAdRewardVideo](https://github.com/bayescom/EasyAds-Android/wiki/3.5-%E6%BF%80%E5%8A%B1%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A)

* [全屏视频广告:EasyAdFullScreenVideo](https://github.com/bayescom/EasyAds-Android/wiki/3.6-%E5%85%A8%E5%B1%8F%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A)

* [DRAW视频信息流广告:EasyAdDraw](https://github.com/bayescom/EasyAds-Android/wiki/3.7-DRAW%E8%A7%86%E9%A2%91%E4%BF%A1%E6%81%AF%E6%B5%81%E5%B9%BF%E5%91%8A)

## 3. 进阶设置

### 3.1 SDK全局配置

App多广告位情况下,想要优化SDK的广告位配置,可参考[SDK全局配置](https://github.com/bayescom/EasyAds-Android/wiki/4.-SDK%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE)优化管理你的众多广告位。


### 3.2 自定义广告SDK渠道

想要使用其他的广告SDK,[自定义广告SDK渠道](https://github.com/bayescom/EasyAds-Android/wiki/5.-%E8%87%AA%E5%AE%9A%E4%B9%89%E5%B9%BF%E5%91%8ASDK%E6%B8%A0%E9%81%93)可以帮你轻松加入任何广告SDK。


## 4. SDK错误码 & 常见问题 

调试遇到问题?欢迎查询SDK错误码及常见问题FAQ,帮助你快速解决对接中遇到的问题。

[SDK错误码](https://github.com/bayescom/EasyAds-Android/wiki/6.1-SDK%E9%94%99%E8%AF%AF%E7%A0%81)

[常见问题](https://github.com/bayescom/EasyAds-Android/wiki/6.2-%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98)


## 技术支持

QQ群:
<a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=E_IUfzy5PqOteuekOryWlfjZL6AQZuCE&jump_from=webapi"><img border="0" src="https://pub.idqqimg.com/wpa/images/group.png" alt="EasyAds开源社区群" title="EasyAds开源社区群"></a>

QQ群二维码:

![image](http://www.bayescom.com/uploads/20211220/43af3f34fc5a7bb50d84f94e374b3e98.png)

邮件技术支持:<easyads@bayescom.com>


================================================
FILE: build.gradle
================================================
// Top-level build file where you can add configuration options common to all sub-projects/modules.

def version = '1.2.1'

ext {
    //统一版本号,同时使用在渠道版本号信息中
    EasyAds_version = version

    //是否进行SDK版本发布,true会通过embed 绑定广告aar到渠道处理包中
    releaseSDK = false
}


buildscript {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        google()
        maven { url "https://jitpack.io" }
        //GroMore SDK依赖
        maven {
            url "https://artifact.bytedance.com/repository/pangle"
        }
        // 配置HUAWEI Ads SDK的Maven仓地址
        maven { url 'https://developer.huawei.com/repo/' }
        maven { url "https://plugins.gradle.org/m2/" }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.4'
        classpath 'com.github.kezong:fat-aar:1.3.8'

        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        maven { url 'https://maven.aliyun.com/nexus/content/groups/public/' }
        google()
        maven { url "https://jitpack.io" }
        //GroMore SDK依赖
        maven {
            url "https://artifact.bytedance.com/repository/pangle"
        }
        // 配置HUAWEI Ads SDK的Maven仓地址
        maven { url 'https://developer.huawei.com/repo/' }
        flatDir {
            dirs 'libs'
        }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}


================================================
FILE: docs/banner.md
================================================
# 横幅广告

### 集成最佳实践:

- 适用场景:一般会在 APP 页面的底部或中部呈现。
- 常见尺寸:640*100
- 穿山甲横幅**不支持在列表中展示**,具体表现为,当在列表上下滑动时,原本正常展示的banner广告,会变成灰色纯色色块且无法响应点击。如果希望在列表展示广告,推荐使用模板信息流方式接入,或者SDK渠道中不配置穿山甲渠道。
- 如果banner放在有触摸交互的view中时,请确保非交互情况下`onInterceptTouchEvent`事件返回为`false`,否则会出现广告无法点击问题。
- 若开启了自动刷新,广告所在页面移除时,务必调用广告`destroy()`方法,移除广告资源

### 请求广告

请求广告核心方法,详细请参考demo中代码:

```java
public class BannerActivity extends BaseActivity {
    RelativeLayout rl;
    EasyADController ad;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_banner);
        //banner父布局
        rl = findViewById(R.id.banner_layout);

        //初始化广告处理封装类
        ad = new EasyADController(this);
        //加载banner
        ad.loadBanner("banner_config.json", rl);
    }
}
```

EasyADController中相关处理代码:

```java

    /**
     * 加载并展示banner广告
     *
     * @param adContainer banner广告的承载布局
     */
    public void loadBanner(String jsonFileName, ViewGroup adContainer) {
        //必须:核心事件监听回调
        EABannerListener listener = new EABannerListener() {
            @Override
            public void onAdClose() {
                logAndToast(mActivity, "广告关闭");
            }

            @Override
            public void onAdExposure() {
                logAndToast(mActivity, "广告展现");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }

            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");
            }


            @Override
            public void onAdSucceed() {
                logAndToast(mActivity, "广告加载成功");
            }

        };
        EasyAdBanner easyAdBanner = new EasyAdBanner(mActivity, adContainer, listener);
        baseAD = easyAdBanner;
        //如果集成穿山甲,这里必须配置,建议尺寸要和穿山甲后台中的"代码位尺寸"宽高比例一致,值单位为dp,这里示例使用的广告位宽高比为640:100。
        int adWidth = ScreenUtil.px2dip(mActivity, ScreenUtil.getScreenWidth(mActivity));
        int adHeight = (int) (((double) adWidth / (double) 640) * 100);
        //如果高度传入0代表自适应高度
        easyAdBanner.setCsjExpressSize(adWidth, adHeight);
        //必须:设置策略信息
        easyAdBanner.setData(getJson(mActivity, jsonFileName));
        //必须:请求并展示广告
        easyAdBanner.loadAndShow();
        logAndToast(mActivity, "广告请求中");
    }
```

### 主要API

* EasyAdBanner

|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdBanner(Activity activity, ViewGroup adContainer, EABannerListener listener) | 构造方法,需要传入广告载体布局adContainer
|setRefreshInterval(int refreshInterval) | 设置定时刷新时间,单位为秒,仅优量汇、穿山甲生效,不设置默认不进行定时刷新
|setCsjExpressSize(int width, int height) |设置穿山甲模板尺寸,建议尺寸要和穿山甲后台中的"代码位尺寸"宽高比例一致,值单位为dp
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告

* EABannerListener
 
|方法名 | 方法介绍
|:------------- |:---------------|  
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 

================================================
FILE: docs/draw.md
================================================
# Draw视频信息流广告

集成最佳实践:

- 适用场景:短视频类APP,上划切换时展示广告
- 支持提前加载广告(注意控制时机,不可过早提前),但要注意,一次展示需对应一个广告实例,切忌复用广告实例。

加载广告核心方法,详细请参考demo中代码:

```java
//初始化列表item
TestItem item = new TestItem(TYPE_AD_ITEM);
item.ad = new EasyADController(DrawActivity.this);
mDrawList.add(item);
mRecyclerAdapter = new DrawRecyclerAdapter(this, mDrawList);


//RecycleView得adapter中进行广告展示逻辑
        @Override
        public void onBindViewHolder(@NonNull DrawRecyclerAdapter.ViewHolder holder, int position) {
            View view = new View(mContext);
            TestItem item = null;
            if (mDataList != null) {
                item = mDataList.get(position);
                if (item.type == TYPE_COMMON_ITEM) {//普通draw信息
                    ………………
                } else if (item.type == TYPE_AD_ITEM && item.ad != null) {//广告
                    //请求并展示draw信息流广告
                    item.ad.loadDraw("draw_config.json",holder.videoLayout);
                }
            }

            if (item != null) {
                changeUIVisibility(holder, item.type);
            }
        }
```

EasyADController中相关处理代码:


```java
    public EasyAdDraw easyAdDraw;

    public void loadDraw(String jsonFileName, ViewGroup adContainer) {

        EADrawListener listener = new EADrawListener() {
            @Override
            public void onAdSucceed() {
                if (easyAdDraw != null) {
                    easyAdDraw.show();
                }
                logAndToast(mActivity, "广告加载成功");

            }

            @Override
            public void onAdExposure() {
                logAndToast(mActivity, "广告展示");

            }

            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");

            }

            @Override
            public void onAdClose() { //此位置不存在广告关闭动作,当前回调不会触发
                logAndToast(mActivity, "广告关闭");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }
        };
        easyAdDraw = new EasyAdDraw(mActivity, listener);
        baseAD = easyAdDraw;
        easyAdDraw.setAdContainer(adContainer);
        //必须:设置策略信息
        easyAdDraw.setData(getJson(mActivity, jsonFileName));
        //必须:请求并展示广告
        easyAdDraw.loadAndShow();
        logAndToast(mActivity, "广告请求中");
    }

```



### 主要API

* EasyAdDraw

|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdDraw(Activity activity, EADrawListener listener) |构造方法
|setAdContainer(final ViewGroup adContainer) | 设置广告承载父布局
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告


* EADrawListener 


|方法名 | 方法介绍
|:------------- |:---------------|  
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 

================================================
FILE: docs/easyAds.md
================================================
# EasyAds

| 方法名| 	方法介绍|  
|:------------- |:---------------|  
|getVersion() | 获取EasyAds SDK的版本号信息
|setDebug(boolean isDebug, EALogLevel logLevel) | 设置debug模式,用来调试是查看日志信息,日志tag标记为:`EasyAds-log` 。EALogLevel代表了日志等级,常用的Level如下:<br/>**EALogLevel.DEFAULT**:默认等级,等于SIMPLE等级,打印SDK核心方法日志信息<br/>**EALogLevel.SIMPLE**:基础等级,打印SDK核心方法日志信息 <br/>**EALogLevel.HIGH**:高级模式,可打印一些辅助判断的执行信息,方便排查问题 <br/>**EALogLevel.MAX**: 最大等级,可打印全部信息,比较详细的看到SDK执行信息,用来定位错误信息
|setSplashPlusAutoClose(int time)|   设置开屏v+ 小窗口自动关闭时间,单位毫秒,不设置使用默认各个渠道默认展示逻辑


================================================
FILE: docs/easyBDManger.md
================================================
# EasyBDManager

百度个性化配置信息API方法介绍

| 参数名| 参数类型|	基本介绍|  
|:------------- |:---------------|:---------------|  
|splashParameters |RequestParameters |开屏位置的个性化请求配置信息,[点此了解配置详情](https://union.baidu.com/miniappblog/2020/12/01/newAndroidSDK/#RequestParameters-Builder)
|nativeExpressParameters  |RequestParameters |信息流个性化请求配置信息,[点此了解配置详情](https://union.baidu.com/miniappblog/2020/12/01/newAndroidSDK/#BaiduNativeManager)|
|nativeExpressSmartStyle | StyleParams | 信息流个性化布局配置信息,[点此了解配置详情](https://union.baidu.com/miniappblog/2020/12/01/newAndroidSDK/#StyleParams) 
| interstitialType  | AdSize | 枚举类型,插屏广告的类型,当设置为视频贴片等广告类型时(AdSize.InterstitialForVideoBeforePlay和AdSize.InterstitialForVideoPausePlay),需配合下方的`interstitialVideoLayout`一起使用。
|interstitialVideoLayout | RelativeLayout | 视频贴片类型的插屏布局父布局,需特定interstitialType下生效
| fullScreenUseSurfaceView |boolean | 全屏视频是否使用SurfaceView来渲染,默认false
|rewardUseSurfaceView |boolean | 激励视频是否使用SurfaceView来渲染,默认false
| rewardDownloadAppConfirmPolicy |  int | 激励视频下载确认弹框设置,默认永不弹框

================================================
FILE: docs/easyCsjManger.md
================================================
# EasyCsjManager

穿山甲个性化配置API方法介绍

| 参数名| 参数类型|	基本介绍|  
|:------------- |:---------------|:---------------|  
|csj_splashButtonType | int | 用于控制开屏广告的点击区域,[具体设置值及含义可参考此处](https://www.pangle.cn/support/doc/611f0f0c1b039f004611e4da)
|csj_downloadType | int | 用于控制下载APP前是否弹出二次确认弹窗(适用所有广告类型)。[具体设置值及含义可参考此处](https://www.pangle.cn/support/doc/611f0f0c1b039f004611e4da)
| csj_supportMultiProcess |  boolean | 是否支持多进程,默认true支持
|  csj_askPermission | boolean |    是否允许穿山甲SDK,在必要时进行权限询问,默认false不允许
|csj_directDownloadNetworkType | int[] | 下载类广告允许直接下载的网络状态,如果未设置下载状态集合,默认4g和wifi下可以下载。


================================================
FILE: docs/easyKSManger.md
================================================
# EasyKSManager

快手广告SDK个性化配置API方法介绍


| 参数名| 参数类型|	基本介绍|  
|:------------- |:---------------|:---------------|  
|rewardVideoConfig | KsVideoPlayConfig | 激励视频播放配置,可以进行声音、跳过、横竖屏等内容配置。
| fullScreenVideoConfig |KsVideoPlayConfig | 全屏视频播放配置,作用同上
|interstitialVideoConfig | KsVideoPlayConfig | 全屏视频播放配置,作用同上


================================================
FILE: docs/faq.md
================================================
# 常见问题处理

## 提要

聚合SDK主要负责加载策略的分发逻辑和各广告SDK调用逻辑,不负责具体的广告展示,广告的展示逻辑主要是由各个广告SDK来负责。


---

Q: 项目构建时出现 “unexpected element < queries> found in < manifest>”异常?

A: 穿山甲新版本包引入了queries内容导致的,queries是Android11新引入的manifest基础成分,低版本的gradle无法识别,[点此查看详细说明](https://stackoverflow.com/questions/62969917/how-do-i-fix-unexpected-element-queries-found-in-manifest)。Google发布了以下插件包更新来支持此特性,建议升级Android Gradle Plugin 到以下版本:
 
- 3.3.3
- 3.4.3
- 3.5.4
- 3.6.4
- 4.0.1

---

Q: 请求不到广告怎么办?

A: 首先检查广告的策略配置是否正确,如果配置正确,根据SDK返回的异常code和msg,翻阅**SDK错误码**部分来分析错误原因。<br/>此外,APP应适配好无广告返回时的页面展示和跳转流程,因为不可能所有用户100%都有填充广告。

如果配置一切正常,可以检查是否为未适配http请求导致,Android 9.0开始应用默认不支持http的请求,可能导致广告请求失败,资源和应用下载出现如下报错,请媒体自行适配http请求
`java.io.IOException: Cleartext HTTP traffic to *** notpermitted`

---


Q: 广告拉取成功了,但是为什么没有展示回调?

A: 首先检查是否正常调用了展示方法。一切都正常的话,有可能下发了视频类广告,但未开启硬件加速,导致视频无法正常播放,可以检查日志中是否包含类似 `A TextureView or a subclass can only be used with hardware acceleration enabled.` 这样的日志信息,说明APP没有开启硬件加速。建议在应用`AndroidManifest`中的` application`  层级配置`android:hardwareAccelerated="true"` 以后重试即可。也可配置在指定activity上

---

Q: Native、Banner广告展示大小有问题

A: Native、Banner广告展示内容太大或太小、广告内容被截掉了一部分等,这些一般是代码中的宽高设置有问题导致的。建议首先**阅读广告位的最佳实践说明**,有明确解释广告位大小设置相关建议。 

---


Q: 如何确定广告正常展示?

A: 首先检查广告回调事件,如果有收到广告展示回调,代表展示正常。其次观测广告素材是否完全展示出来,素材角落里是否有"广告"字样,如果缺少或者未完整展示,请检查布局尺寸设置,尽量露出所有布局,以免影响广告效果。


================================================
FILE: docs/full.md
================================================
# 全屏视频广告

集成最佳实践:

- 使用场景基本类似激励视频,广告展示样式也和激励视频基本一致,区别是对于用户来说强制性更低,用户可以提前“跳过”广告。
- 支持提前加载广告(注意控制时机,不可过早提前),但要注意,一次展示需对应一个广告实例,切忌复用广告实例。
 

### 请求广告

加载广告核心方法,详细请参考demo中代码:

```java
public class FullScreenVideoActivity extends BaseActivity {
    EasyAdFullScreenVideo fullScreenVideo;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_full_screen_video);
    }


    public void loadFull(View view) {
        fullScreenVideo = new EasyADController(this).initFullVideo("full_config.json");
        fullScreenVideo.loadOnly();

    }

    public void showFull(View view) {
        if (fullScreenVideo != null) {
            fullScreenVideo.show();
        } else {
            EasyADController.logAndToast(this, "需要先调用loadOnly()");
        }
    }

    public void loadAndShowFull(View view) {
        new EasyADController(this).initFullVideo("full_config.json").loadAndShow();
    }
}
```

EasyADController中相关处理代码:

```java
/**
     * 初始化获取展示全屏视频的广告对象。
     * 也可以选择先提前加载,然后在合适的时机再调用展示方法
     */
    public EasyAdFullScreenVideo initFullVideo(String jsonFileName) {

        //推荐:核心事件监听回调
        EAFullScreenVideoListener listener = new EAFullScreenVideoListener() {
            @Override
            public void onAdSucceed() {
                logAndToast(mActivity, "广告加载成功");

            }

            @Override
            public void onAdClose() {
                logAndToast(mActivity, "广告关闭");
            }

            @Override
            public void onVideoComplete() {
                logAndToast(mActivity, "视频播放结束");
            }

            @Override
            public void onVideoSkipped() {
                logAndToast(mActivity, "跳过视频");
            }

            @Override
            public void onVideoCached() {
                //广告缓存成功,可以在此记录状态,但要注意:不一定所有的广告会返回该回调
                logAndToast(mActivity, "广告缓存成功");
            }

            @Override
            public void onAdExposure() {
                logAndToast(mActivity, "广告展示");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }


            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");
            }
        };
        //初始化
        EasyAdFullScreenVideo easyFullScreenVideo = new EasyAdFullScreenVideo(mActivity, listener);
        baseAD = easyFullScreenVideo;
        //必须:设置策略信息
        easyFullScreenVideo.setData(getJson(mActivity, jsonFileName));

        return easyFullScreenVideo;
    }

```


### 主要API

* EasyAdFullScreenVideo


|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdFullScreenVideo(Activity activity, EAFullScreenVideoListener listener) | 构造方法
|setYlhMediaListener(UnifiedInterstitialMediaListener mediaListener) |**优量汇特有设置**,监听广告资源的运行情况
|setYlhVideoOption(VideoOption videoOption) |**优量汇特有设置**,设置视频播放配置
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告

* EAFullScreenVideoListener

|方法名 | 方法介绍
|:------------- |:---------------|  
|onVideoComplete()|视频播放结束
|onVideoSkipped()|用户点击了跳过,未看完提前关闭了视频
|onVideoCached()|视频缓存完成
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 


================================================
FILE: docs/home.md
================================================
# EasyAds 

APP开发者一般不会在广告集成上进行过多得探索,各种第三方服务又玩法五花八门,如何能使得APP即自由又放心得管理广告SDK?

EasyAds可以让APP开发者在利用广告变现时,做到高效、透明、简洁、安全,真正属于你自己的聚合广告SDK。


### 概述

EasyAds 目前支持以下广告类型,您可以根据开发需要选择合适的广告。

| 广告SDK平台| 开屏 | 激励视频 | 横幅| 插屏(弹窗) | 模板信息流 | 全屏视频 | draw信息流
|:-------------|:---------------|  :---------------|  :---------------|  :---------------|  :---------------|  :---------------|   :---------------|  
| 穿山甲|✅ |✅ |✅ |✅|✅|✅  |✅
| 优量汇(广点通)  |✅ |✅ |✅ |✅ |✅ |✅ |❌
| 百度 |✅ |✅ |✅ | ✅ | ✅ | ✅ |❌
| 快手 |✅ |✅ | ❌ | ✅ | ✅ | ✅|✅

补充说明:不在支持列表的广告SDK平台,您也可以通过使用**自定义SDK渠道**,来统一管理。


## 开始使用

### 1.引入SDK

建议使用Gradle 添加依赖,在项目根目录的build.gradle 文件中添加 `JitPack` 仓库

```
allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
```
在项目module目录下的build.gradle 文件中添加SDK内容依赖

```

```

### 2.获取广告


####  2.1 获取广告的必要步骤:

以下步骤,**适用于所有广告位**,具体广告位置实现,请参考example目录中示例代码。

* 步骤1.初始化广告对象`EasyAdXXX`,以开屏为例

```
//adContainer为开屏广告展示的布局容器
EasyAdSplash easySplash = new EasyAdSplash(mActivity, adContainer, listener);
```

* 步骤2.调用共有方法`setData(String strategyJson)`,给当前位置广告**赋予执行策略**,详细配置方法参考下方`2.2策略配置说明`。

```
easySplash.setData(FileUtil.getJson(mActivity, "splash_config.json"));
```

* 步骤3.调用广告获取方法:

方式一:**请求并展示广告**。

```
easySplash.loadAndShow();
```

方式二:先发起请求广告:

```
easySplash.loadOnly();
```

待广告成功拉取后,或者在合适的时机,由APP自己决定调用展示广告方法:(**注意:广告会存在有效期,过久未调用展示,会导致广告失效**)

```
easySplash.show();
```


#### 2.2 策略配置说明


步骤2`setData(String strategyJson) `中的 `strategyJson`参数为SDK的策略配置信息,可通过修改配置内容来实现流量切分、顺序执行、分组等多种需求,对应的字段结构说明,[点击此处了解策略Json配置说明](docs/strategyJsonFormat.md)。

**为防止json配置异常导致无法执行广告加载,建议您通过以下几种方式来处理**:

* 方式一:通过[点击此处,使用在线生成配置json工具](http://easyads.bayescom.cn),一键获取到配置json信息,复制后直接使用。

* 方式二:修改`assets`下对应的`XXX_config.json`配置文件,将其中的广告信息和策略替换为自己的内容。




#### 2.3 各广告位详细说明

点击下方信息,了解各个位置包含的的详细配置参数,和实现建议。

* [开屏广告:EasyAdSplash](docs/splash.md)

* [插屏广告:EasyAdInterstitial](docs/interstital.md)

* [横幅广告:EasyAdBanner](docs/banner.md)

* [原生模板、信息流广告:EasyAdNativeExpress](docs/nativeExpress.md)

* [激励视频广告:EasyAdRewardVideo](docs/reward.md)

* [全屏视频广告:EasyAdFullScreenVideo](docs/full.md)

* [DRAW视频信息流广告:EasyAdDraw](docs/draw.md)


#### 2.4 SDK渠道配置详细说明

个性化配置参数,满足不同需求场景。

* [全局核心配置类:EasyAds](docs/easyAds.md)

* [百度渠道配置类:EasyBDManager](docs/easyBDManger.md)

* [穿山甲渠道配置类:EasyCsjManger](docs/easyCsjManger.md)

* [快手渠道配置类:EasyKSManger](docs/easyKSManger.md)


#### 2.5 自定义支持更多广告SDK渠道

**我能不能把小米广告SDK也集成进来,聚合统一管理?可以。**

如果穿山甲、优量汇、百度、快手这些SDK渠道无法满足您的需求,您可以通过自定义SDK渠道,来拓展需要支持的任意广告SDK。建议参考demo示例工程`custom`文件夹的`HuaWeiSplashAdapter`和`XiaoMiSplashAdapter`代码。

自定义步骤主要分为三步:

第一步:新建自定义支持的渠道类文件,假设命名为`ABCAdapter`,根据其广告类型,如果是开屏(已支持的广告类型),那么需要让`ABCAdapter`继承`EASplashCustomAdapter`开屏自定义基类。此时需要实现父类的下列抽象方法:

```
 /**
     * 抽象基础方法,子类仅关注对应的广告处理逻辑
     */
    //抽象方法,此方法内应执行广告加载方法
    protected abstract void doLoadAD();

    //抽象方法,此方法内应执行广告展示方法(如有)
    protected abstract void doShowAD();

    //抽象方法,此方法内应执行广告销毁操作(如有)
    protected abstract void doDestroy();
```

为保证广告正常执行,有以下注意事项:

* 1.在`doLoadAD()`方法内执行广告请求方法时,一定要保证广告SDK已经执行过初始化方法了,如需获取渠道的appId,可以通过基类的`getAppID()`方法获取到。

* 2.一定要在广告成功、曝光、点击、失败时,调用基类对应`handleXXX`方法


第二步:将`ABCAdapter`通过`EasyAdXXX`广告的`addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) `方法添加进去。注意`sdkTag`需要和json策略中的`supplier`内`tag`一致。

第三步:修改策略json,添加该自定义的渠道的`supplier`和 `rules`信息




### 3.问题排查

如果广告执行异常,可以通过`EasyAds.setDebug(boolean isDebug, EALogLevel logLevel)`方法,开启debug日志,筛选:`EasyAds-log`,查看错误码和错误信息,通过log信息来判断SDK执行情况。如果没有观测到有帮助的log信息,可以选择启用更高级别的日志配置:`EALogLevel.MAX`,打印更多SDK执行log信息来进一步排查。

#### 3.1 错误码

* com.easyads.model.EasyAdError 异常信息类,包含code、msg;各个code含义如下表所示:

|错误码 	  | 错误详情 | 排查方向
|:------------- |:---------------|  :---------------|  
|9901| 数据为空 |广告返回的数据为空,一般为渠道广告无填充。
|9902 | 加载某个SDK渠道时发生异常| 查看logcat下日志输出,寻找具体原因
|9903 |展示某个SDK渠道时发生异常| 查看logcat下日志输出,寻找具体原因
|9904|渲染某个SDK渠道时发生异常| 查看logcat下日志输出,寻找具体原因
|9905|当前策略中无有效的SDK渠道,或渠道信息为空 | 检查聚合策略配置信息,有可能是配错渠道或者没有配置
|9906| 策略调度时发生异常 | 查看logcat下日志输出,及时反馈我们帮助排查
|9907|未获取到策略 | 检查是否遗漏了`setData(String strategyJson)`策略配置,或者配置的json格式有问题导致未成功解析。
|9908|某个SDK渠道启动异常| 查看logcat下日志输出,及时反馈我们帮助排查
|9909|穿山甲渠道SDK超时且不再加载优先级更低的渠道 | 加载超时,检查网络是否正常。仅开屏中会出现,代表开屏广告位中配置了setCsjTimeOutQuit(true),低频可忽略
|9910 | 穿山甲渠道SDK加载超时 | 加载超时,检查网络是否正常
|9911 | 百度SDK加载失败 | 查看logcat下日志输出,寻找具体原因
|9912 | 快手SDK加载失败,广告位id类型转换异常 | 一般是广告位转换出错,检查配置的快手渠道下广告位id是否为纯数字,非纯数字会引起该异常。
|9913 | 当前activity已被销毁,导致广告无可用载体 | 检查广告展示方法调用时机,有可能广告载体页面已经关闭了,但是又调用了展示方法
|9914 |快手SDK初始化失败 | 查看logcat下日志输出,寻找具体原因,检查广告位id信息配置是否正确
|9915 |广告渲染失败 |可能是网络缓慢导致素材未成功加载,或者页面实现问题,有布局遮挡了广告布局展示
|99_XXX | 某个SDK渠道返回的错误,其中XXX为该SDK渠道返回的具体错误码 | 翻阅各个平台下的错误码说明查找具体原因: <br/>穿山甲: [查看官方线上文档,点击跳转](https://www.pangle.cn/union/media/union/download/detail?id=4&docId=5de8d9b925b16b00113af0ed&osType=android)<br/>优量汇(广点通): [查看官方线上文档,点击跳转](https://developers.adnet.qq.com/doc/android/union/union_debug#sdk%20%E9%94%99%E8%AF%AF%E7%A0%81) <br/> [查看官方线上文档,点击跳转;错误码详见19.2](https://union.baidu.com/miniappblog/2020/06/16/AndroidSDK/) <br/>快手: [查看官方线上文档,查看详细错误信息](https://static.yximgs.com/udata/pkg/KS-Android-KSAdSDk/doc/4701b963d40a77bc0f45fd71d30b57da.pdf)



#### 3.2 常见问题FAQ

[点击查看常见问题FAQ](docs/faq.md)

#### 3.3 联系我们


### 4.版本更新记录

|版本|日期|更新内容
|:------|:------|:-----|
|v1.0 |   |SDK发布,主要支持内容:<br/>1.统一聚合穿山甲、优量汇、百度、快手广告SDK<br/>2.支持本地导入策略配置,极简调用<br/>3.支持自定义支持更多广告SDK



================================================
FILE: docs/interstital.md
================================================
# 插屏(弹窗)广告

集成最佳实践:

- 适用场景:一般暂停时(多见于视频类 APP 节目暂停);页面间跳转、切换时(比如游戏类 APP 过关、工具类 APP 页面转换);APP 退出时;返回上一级时等场景,均可适当植入插屏广告。
- 常见尺寸:插屏广告尺寸通常等于或大于手机屏幕的一半,多设计 600x600、600x500 等规格。
- 一些建议:不要突然展示广告,最好在用户完成应用内操作后自然而然的植入,比如游戏通关后、视频播放结束后;
无论是插屏广告植入场景,还是展示频次,媒体均需要反复测试,以达到最佳变现效果;
- 插屏支持提前加载广告(注意控制时机,不可过早提前),但要注意,一次展示需对应一个广告实例,切忌复用广告实例。


### 请求广告

请求广告核心方法,详细请参考demo中代码:

```java
public class InterstitialActivity extends BaseActivity {
    EasyAdInterstitial interstitialAD;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_interstitial);

    }

    public void loadAd(View view) {
        interstitialAD = new EasyADController(this).initInterstitial("interstitial_config.json");
        interstitialAD.loadOnly();
    }

    public void showAd(View view) {
        if (interstitialAD != null) {
            interstitialAD.show();
        } else {
            EasyADController.logAndToast(this, "需要先调用loadOnly()");
        }
    }

    public void loadAndShowAd(View view) {
        new EasyADController(this).initInterstitial("interstitial_config.json").loadAndShow();
    }
}
```

EasyADController中相关处理代码:

```java
/**
     * 初始话插屏广告。
     * 可以选择性先提前加载,然后在合适的时机再调用展示方法
     * 或者直接调用加载并展示广告
     * <p>
     * 注意!!!:穿山甲默认为"新插屏广告"
     */
    public EasyAdInterstitial initInterstitial(String jsonFileName) {
        //必须:核心事件监听回调
        EAInterstitialListener listener = new EAInterstitialListener() {

            @Override
            public void onAdSucceed() {
                logAndToast(mActivity, "广告就绪");
            }

            @Override
            public void onAdClose() {
                logAndToast(mActivity, "广告关闭");
            }


            @Override
            public void onAdExposure() {
                logAndToast(mActivity, "广告展示");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }


            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");
            }
        };
        //初始化
        EasyAdInterstitial easyInterstitial = new EasyAdInterstitial(mActivity, listener);
        baseAD = easyInterstitial;
        //注意:穿山甲默认为"新插屏广告",如果要使用旧版请打开这条设置
//        easyInterstitial.setCsjNew(false);
        //必须:设置策略信息
        easyInterstitial.setData(getJson(mActivity, jsonFileName));
        return easyInterstitial;
    }
```


### 主要API

* EasyAdInterstitial


|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdInterstitial(Activity activity, EAInterstitialListener listener)|构造方法
|setYlhMediaListener(UnifiedInterstitialMediaListener mediaListener) |**优量汇特有设置**,监听广告资源的运行情况
|setCsjNew(boolean csjNew)|**穿山甲特有设置**,是否为'新插屏广告',不设置默认true
|setCsjExpressViewAcceptedSize(float expressViewWidth, float expressViewHeight)| **穿山甲特有设置**,期望模板广告view的size,单位dp;注意:参数请按照平台勾选的比例去进行请求。现有1:1,3:2 ,2:3 三种比例可供选择。
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告




* EAInterstitialListener


|方法名 | 方法介绍
|:------------- |:---------------|  
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 

================================================
FILE: docs/nativeExpress.md
================================================
# 原生模板广告

### 集成最佳实践:

- 适用场景:适用于有内容输出的 APP,比如新闻资讯类、视频类、音频类、社区类等,通常在内容流中或内容详情页中植入。在内容流中植入广告,需对广告展现位置、展现频次等反复测试,避免过度干扰的同时,确保高可见性和效果性。
- 建议广告承载布局高度自适应,如要设置固定**高度须知**:穿山甲模板有最低高度限制,已知为最低125dp,Mercury最低80dp,优量汇(广点通)最低约100dp。
- **瀑布流式内容信息流需单独设置广告宽度**,否则广点通可能展示异常,需增加如下设置代码:

```java
//需要特别注意广告父布局宽度要和自定义的宽度dp值一致,否则优量汇可能出现展示问题。
advanceNativeExpress.setExpressViewAcceptedSize(自定义宽度dp值, 0);
```
 
- 支持提前加载广告(注意**控制时机**,不可过早提前),但要注意,一次展示需对应一个广告实例,切忌复用广告实例。
- RecyclerView中使用的话请参考示例工程中的**NativeExpressRecyclerViewActivity**,建议在列表中每5-10个条目展示一条广告,且**每次只请求一条广告**,如果一定要请求多条请注意穿山甲支持的条数上限为3条。
- 如果在**LstView中**使用,需要同一位置广告不可重复请求,当在**getView**方法中执行广告加载方法时,需标记同一位置广告**是否已经请求过**,如果已请求过不再进行请求步骤,否则会出现重复无效请求导致页面闪烁。
- 列表数据刷新后,也需要**同步刷新广告**。


### 请求广告
请求广告核心方法,详细请参考demo中代码:

```java
public class NativeExpressActivity extends BaseActivity {
    private FrameLayout container;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_native_express);
        container = findViewById(R.id.native_express_container);

        new EasyADController(this).loadNativeExpress("native_config.json",container);
    }

    public void loadNEAD(View view) {
        new EasyADController(this).loadNativeExpress("native_config.json",container);
    }
}
```

EasyADController中相关处理代码:

```java
    public boolean hasNativeShow = false;
    boolean isNativeLoading = false;

    /**
     * 加载并展示原生模板信息流广告
     *
     * @param adContainer 广告的承载布局
     */
    public void loadNativeExpress(String jsonFileName, ViewGroup adContainer) {

        if (hasNativeShow) {//同一位置广告,已展示过不再重复发起请求
            EALog.d("loadNativeExpress hasNativeShow");
            return;
        }

        if (isNativeLoading) {//同一位置广告,正在请求中,不再重复请求
            EALog.d("loadNativeExpress isNativeLoading");
            return;
        }
        isNativeLoading = true;

        if (adContainer.getChildCount() > 0) {
            adContainer.removeAllViews();
        }


        //推荐:核心事件监听回调
        EANativeExpressListener listener = new EANativeExpressListener() {
            @Override
            public void onAdSucceed() {
                logAndToast(mActivity, "广告加载成功");

            }

            @Override
            public void onAdRenderSuccess() {
                logAndToast(mActivity, "广告渲染成功");

            }


            @Override
            public void onAdClose() {
                logAndToast(mActivity, "广告关闭");
            }

            @Override
            public void onAdExposure() {
                hasNativeShow = true;
                isNativeLoading = false;
                logAndToast(mActivity, "广告展示");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                isNativeLoading = false;
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }


            @Override
            public void onAdRenderFailed() {
                isNativeLoading = false;
                logAndToast(mActivity, "广告渲染失败");
            }

            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");
            }

        };
        //初始化
        final EasyAdNativeExpress easyNativeExpress = new EasyAdNativeExpress(mActivity, listener);
        baseAD = easyNativeExpress;
        easyNativeExpress.setAdContainer(adContainer);
        //必须:设置策略信息
        easyNativeExpress.setData(getJson(mActivity, jsonFileName));
        //必须:请求并展示广告
        easyNativeExpress.loadAndShow();
        logAndToast(mActivity, "广告请求中");
    }
```



### 主要API

* EasyAdNativeExpress


|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdNativeExpress(Activity activity, EANativeExpressListener listener)|构造方法
|setAdContainer(ViewGroup container)|设置广告展示承载布局
|setVideoMute(boolean mute)|设置视频静音,默认true,仅优量汇生效,穿山甲在后台中配置
|setYlhMaxVideoDuration(int ylhMaxVideoDuration)|**优量汇特有设置**,设置视频最大时长,单位秒
|View getExpressADView()| 获取广告的实际展示view信息,数据来源于广告SDK回调
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告

* EANativeExpressListener


|方法名 | 方法介绍
|:------------- |:---------------|  
|onAdRenderFailed | 广告渲染失败
|onAdRenderSuccess| 广告渲染成功
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 

================================================
FILE: docs/reward.md
================================================
# 激励视频广告

集成最佳实践:

- 适用场景:激励视频广告在游戏 APP 使用较多,比如通关失败后通过观看激励视频广告,用户可获取复活机会。此外,一些非游戏类 APP,也可通过植入 5-15 秒(甚至更长)的激励视频广告,让用户通过主动观看来享受到一些福利奖励、付费功能/权限等——比如网盘类 APP 通过观看激励视频广告来获取空间;视频、音频、音乐类 APP 通过观看激励视频广告来获取视频/音频/音乐免费观看或收听特权;图片类 APP 通过观看激励视频广告来获取图片下载特权;阅读类 APP 通过观看激励视频广告来获取书籍/漫画阅读特权等。
- 常见尺寸:激励视频广告常见为竖屏,比例 9:16,尺寸 720x1280;也有些 APP 采用横版样式,比例 16:9,尺寸 1280x720。
- 一些建议:广告植入密度不要过于频繁,以免拉低媒体调性和用户好感度;
将广告植入在既能刺激用户主动观看,同时又兼顾不对用户正常使用体验产生影响的位置。
- 激励达成事件请在广告激励回调`onAdReward `中进行,如需服务器回调,需要翻阅个平台中文档说明来了解,本SDK不参与服务端回调功能。
- 支持提前加载广告(注意控制时机,不可过早提前),但要注意,一次展示需对应一个广告实例,切忌复用广告实例。


### 请求广告

加载广告核心方法,详细请参考demo中代码:

```java
public class RewardVideoActivity extends BaseActivity {
    EasyAdRewardVideo rewardVideo;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_reward_video);

    }

    public void onLoad(View view) {
        rewardVideo = new EasyADController(this).initReward("reward_config.json");
        rewardVideo.loadOnly();

    }

    public void onShow(View view) {
        if (rewardVideo != null) {
            rewardVideo.show();
        } else {
            EasyADController.logAndToast(this, "需要先调用loadOnly()");
        }
    }

    public void loadAndShow(View view) {
        new EasyADController(this).initReward("reward_config.json").loadAndShow();
    }
}
```

EasyADController中相关处理代码:

```java
 /**
     * 加载并展示激励视频广告。
     * 也可以选择性先提前加载,然后在合适的时机再调用展示方法
     */
    public EasyAdRewardVideo initReward(String jsonFileName) {
        //必须:核心事件监听回调
        EARewardVideoListener listener = new EARewardVideoListener() {
            @Override
            public void onAdSucceed() {
                logAndToast(mActivity, "广告加载成功");
            }


            @Override
            public void onAdExposure() {
                logAndToast(mActivity, "广告展示");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }

            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");
            }


            @Override
            public void onVideoCached() {
                logAndToast(mActivity, "广告缓存成功");
            }

            @Override
            public void onVideoComplete() {
                logAndToast(mActivity, "视频播放完毕");
            }

            @Override
            public void onVideoSkip() {

            }

            @Override
            public void onAdClose() {
                logAndToast(mActivity, "广告关闭");
            }

            @Override
            public void onAdReward() {
                logAndToast(mActivity, "激励发放");
            }

            @Override
            public void onRewardServerInf(EARewardServerCallBackInf inf) {
                //优量汇和穿山甲支持回调服务端激励验证信息,详见RewardServerCallBackInf中字段信息
                logAndToast(mActivity, "onRewardServerInf" + inf);
            }
        };
        //初始化,注意需要时再初始化,不要复用。
        EasyAdRewardVideo easyRewardVideo = new EasyAdRewardVideo(mActivity, listener);
        baseAD = easyRewardVideo;
        //必须:设置策略信息
        easyRewardVideo.setData(getJson(mActivity, jsonFileName));
        return easyRewardVideo;
    }

```


### 主要API

* EasyAdRewardVideo


|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdRewardVideo(Activity activity, EARewardVideoListener listener)|构造方法
|setYlhVolumeOn(boolean vo)|**优量汇特有设置**,是否开启声音,默认false不开启
|setYlhSSVO(ServerSideVerificationOptions options)|**优量汇特有设置**,设置服务器检验选项,具体参考优量汇官方说明文档
|setCsjOrientation(int csjOrientation)|**穿山甲特有设置**,设置广告展示的屏幕方向,默认竖屏
|setCsjMediaExtra(String mediaExtra)|**穿山甲特有设置**,媒体补充信息,用于和服务端检验使用
|setCsjUserId(String userId)|**穿山甲特有设置**,用户id
|setCsjRewardName(String rewardName)| **穿山甲特有设置**,穿山甲奖励名称
|setCsjRewardAmount(int rewardAmount) |**穿山甲特有设置**,穿山甲奖励数量
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告

* EARewardVideoListener

|方法名 | 方法介绍
|:------------- |:---------------|  
|onVideoCached()|视频缓存成功
|onVideoComplete()|视频播放完毕
|onVideoSkip()|视频跳过,部分SDK会回调此方法
|onAdReward()|广告激励达成     
|onRewardServerInf(EARewardServerCallBackInf inf)|激励视频返回的服务器回调信息,穿山甲一直支持,优量汇自v4.330.1200 开始支持,百度9.13开始支持
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 


================================================
FILE: docs/splash.md
================================================
# 开屏广告

### 集成最佳实践建议:

- 理论上开屏广告应该在**用户阅读并同意隐私政策授权之后**展示。
- 展示区域最好**大于整体画面 75%且高度不得低于400dp**,全屏效果更佳;
- 开屏请求、展示时机:**使用单独的页面展示开屏**,并且加载广告时尽量不要进行其他的网络请求或耗时操作,这类操作可以在广告曝光或加载失败回调事件以后再进行。
- 开屏**冷启动和热启动**区分设置策略json。

### 代码示例

开屏页面调用

```
        //初始化广告处理封装类
        EasyADController ad = new EasyADController(this);
        ad.loadSplash(jsonName, adContainer, logo, true, new EasyADController.SplashCallBack() {
            @Override
            public void jumpMain() {
                goToMainActivity();
            }
        });

```

EasyADController中相关处理代码:

```
    /**
     * 加载开屏广告
     *
     * @param adContainer    广告承载布局,不可为空
     * @param logoContainer  底部logo布局,可以为空
     * @param singleActivity 是否为单独activity中展示开屏广告
     * @param callBack       跳转回调,在回调中进行跳转主页或其他操作
     */
    public void loadSplash(String jsonFileName, final ViewGroup adContainer, final ViewGroup logoContainer, boolean singleActivity, final SplashCallBack callBack) {
        //必须:设置开屏核心回调事件的监听器。
        EASplashListener listener = new EASplashListener() {

            @Override
            public void onAdClose() {
                if (callBack != null)
                    callBack.jumpMain();

                logAndToast(mActivity, "广告关闭");
            }

            @Override
            public void onAdSucceed() {
                logAndToast(mActivity, "广告加载成功");
                if (EasyAdsConstant.SDK_TAG_CSJ.equals(baseAD.getSupplierInf().tag)) {
                    if (logoContainer != null)
                        logoContainer.setVisibility(View.VISIBLE);
                }

            }

            @Override
            public void onAdExposure() {
                //设置开屏父布局背景色为白色
                if (adContainer != null)
                    adContainer.setBackgroundColor(Color.WHITE);
                //logo展示建议:广告展示的时候再展示logo,其他时刻都是展示的全屏的background图片
                if (logoContainer != null)
                    logoContainer.setVisibility(View.VISIBLE);


                logAndToast(mActivity, "广告展示成功");
            }

            @Override
            public void onAdFailed(EasyAdError error) {
                logAndToast(mActivity, "广告加载失败 code=" + error.code + " msg=" + error.msg);
            }

            @Override
            public void onAdClicked() {
                logAndToast(mActivity, "广告点击");
            }


        };
        EasyAdSplash easySplash = new EasyAdSplash(mActivity, adContainer, listener);
        baseAD = easySplash;
        //注意:如果开屏页是fragment或者dialog实现,这里需要置为false。默认为true,代表开屏和首页为两个不同的activity
        easySplash.setShowInSingleActivity(singleActivity);
        //必须:设置策略信息
        easySplash.setData(FileUtil.getJson(mActivity, jsonFileName));
        //必须:请求并展示广告
        easySplash.loadAndShow();
        logAndToast(mActivity, "广告请求中");
    }

    /**
     * 开屏跳转回调
     */
    public interface SplashCallBack {
        void jumpMain();
    }

```

### 主要API

* EasyAdSplash

|方法名 | 方法介绍
|:------------- |:---------------|  
|EasyAdSplash(Activity activity, ViewGroup adContainer, EASplashListener listener) | 构造方法,需要传入广告载体布局adContainer|
|setCsjShowAsExpress(boolean isExpress) |设置穿山甲为模板广告类型请求广告(需在穿山甲后台申请),默认为非模板类型
|setShowInSingleActivity(boolean single) |开屏是否在单独的activity中,默认true。
|isADSkip | 当回调了onAdClose事件时,可以获取此值来区分是否为用户点击了跳过
|addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) | 通用方法,添加自定义SDK的适配器
|getSupplierInf() | 通用方法,获取当前正在执行的渠道信息,可以在Listener的任意事件回调中获取,方便统计执行情况。
|getReqId() |通用方法,获取当前策略执行的唯一id,方便统计
|setData(String strategyJson)|通用方法,设置策略执行数据,为固定格式的json字符串
|loadOnly() |通用方法,仅拉取广告
|show() | 通用方法,展示广告,和loadOnly()方法搭配使用
|loadAndShow() | 通用方法,拉取并展示广告
|destroy()|通用方法, 销毁广告


* EASplashListener


|方法名 | 方法介绍
|:------------- |:---------------|  
|onAdSucceed() |通用回调方法,成功加载到广告
|onAdExposure() |通用回调方法,广告曝光
|onAdClicked() |通用回调方法,广告点击
|onAdClose() |通用回调方法,广告关闭
|onAdFailed(EasyAdError easyAdError) |通用回调方法,广告失败,easyAdError包含了具体的失败原因,easyAdError可能为null
 

================================================
FILE: docs/strategyJsonFormat.md
================================================
# 策略Json配置说明

每个聚合广告位均可通过`setData(String strategyJson) `方法设置策略信息,其中 `strategyJson`参数为SDK的策略配置信息,其json结构示例如下:

```
{
  "rules": [
    {
      "tag": "A",
      "sort": [
        1,
        3
      ],
      "percent": 30
    },
    {
      "tag": "B",
      "sort": [
        2,
        4
      ],
      "percent": 70
    }
  ],
  "suppliers": [
    {
      "tag": "csj",
      "adspotId": "887477661",
      "appId": "5051624",
      "index": 1
    },
    {
      "tag": "ylh",
      "adspotId": "2001447730515391",
      "appId": "1101152570",
      "index": 2
    },
    {
      "tag": "ks",
      "adspotId": "4000000042",
      "appId": "90009",
      "index": 3
    },
    {
      "tag": "bd",
      "adspotId": "2058622",
      "appId": "e866cfb0",
      "index": 4
    }
  ]
}
```


* strategyJson包含内容


|字段名	| 字段类型 |含义
|:--- |:--- |:--- |
|suppliers | List&lt;Supplier> | **SDK渠道详细信息**,相当于“广告池”,Supplier对象含义见下表
|rules | List&lt;Rule> | **策略规则配置数组**,将suppliers“广告池”中的广告以约定的规则进行排序和分发。可分为多组执行广告策略,组内变量主要是SDK顺序排序方式和切分比例。Rule对象含义见下表


* Rule 对象包含内容

|字段名	| 字段类型 |含义
|:--- |:--- |:--- |
|tag	|String	|**策略组唯一标记**,用于区分标记不同组的执行情况
| sort | List&lt;Integer> | **广告SDK执行顺序表**,依照组内顺序,优先级从高到低,组内成员对应suppliers字段中的index变量
|percent | int | **流量占比值**,SDK内部会根据多组内配置的值,自动计算比例,执行流量百分比的分发模式,**建议使用百分值**。<br/>比如上述json示例中配置的含义为:在发起请求后,有**30%**的概率执行策略组A中配置,按照1->3的顺序依次执行广告加载;**70%**的概率执行策略组A中配置,按照2->4的顺序依次执行广告加载。<br/>如果A、B两组中percent配置值分别为**201、799**,代表**20.1%**的概率执行A,**79.9%**的概率执行B。<br/>如果A、B两组中percent配置值分别为**2、3**,代表**40%**的概率执行A,**60%**的概率执行B。<br/>如果**仅有一组A**,不论percent按照多少设置,都默认**100%**的流量执行A


* Supplier 对象包含内容

字段名	| 字段类型 |含义
|:--- |:--- |:--- |
|index	|int|**唯一坐标**,用来和rules信息内sort字段关联,确定广告执行顺序
|tag | String | **SDK类别标识**,<br/>"csj"代表头条-穿山甲SDK<br/>"ylh"代表腾讯-优量汇SDK(前广点通)<br/>"ks"代表快手-快手联盟SDK<br/>"bd"代表百度-百青藤SDK
|adspotId | String | **广告位id**,在变现SDK后台申请到的具体广告位id
|appId | String | **应用id**,在变现SDK后台申请到的应用id





================================================
FILE: easyads/.gitignore
================================================
/build


================================================
FILE: easyads/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'com.kezong.fat-aar'

// JitPack Maven
apply plugin: 'com.github.dcendents.android-maven'
// Your Group
group = 'com.github.bayescom'

//maven依赖的项目名称
def pomName = "easyads-core"
def extVersionName = ""
def VersionName = "${rootProject.ext.EasyAds_version}${extVersionName}"
def VersionCode = 1

def outputName = pomName + "_" + VersionName + ".aar"

android {
    compileSdkVersion 29


    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 29
        versionCode VersionCode
        versionName VersionName

//        混淆配置自动同步到接入方
        consumerProguardFiles 'proguard-rules.pro'
    }

    buildTypes {
        debug {
            minifyEnabled false
        }
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
    println pomName + " VersionName = " + VersionName

}

tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    options.addStringOption('charSet', 'UTF-8')
}


repositories {
    flatDir {
        dirs 'libs'
    }
}

dependencies {
    compileOnly 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
    //   the needed aars are here
    compileOnly(name: 'Baidu_MobAds_SDK_9352', ext: 'aar')
    compileOnly(name: 'kssdk-ad-3363', ext: 'aar')

    compileOnly "com.pangle.cn:mediation-sdk:6.1.2.5"
    compileOnly "com.qq.e.union:union:4.575.1445"


}


//android.libraryVariants.all { variant ->
//    variant.outputs.all {
//        outputFileName = outputName
//    }
//}




================================================
FILE: easyads/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

-keep class com.bytedance.sdk.openadsdk.** { *; }
-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*;}
-keep class com.ss.sys.ces.* {*;}
-keep class com.ss.android.**{*;}
-keep class com.pgl.sys.ces.* {*;}

-keep class com.qq.e.** {
    public protected *;
}
-keep class android.support.v4.app.NotificationCompat**{
    public *;
}
-keep class com.bun.miitmdid.core.** {*;}
-keep class com.easyads.supplier.** {*;}

#oaid 混淆部分
-keep class com.bun.miitmdid.** {*;}
-dontwarn XI.**
-keep class  XI.** {*;}

================================================
FILE: easyads/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.easyads.core" >

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>


================================================
FILE: easyads/src/main/java/com/easyads/EasyAds.java
================================================
package com.easyads;

import com.easyads.core.BuildConfig;
import com.easyads.model.EALogLevel;

public class EasyAds {

    //获取聚合SDK版本号
    public static String getVersion() {
        return BuildConfig.VERSION_NAME;
    }

    //设置debug状态,同时可设置log打印等级
    public static void setDebug(boolean isDebug, EALogLevel logLevel) {
        EasyAdsManger.getInstance().debug = isDebug;
        EasyAdsManger.getInstance().logLevel = logLevel;
    }


    //设置开屏v+ 小窗口自动关闭时间,单位毫秒,不设置使用默认各个渠道默认展示逻辑
    public static void setSplashPlusAutoClose(int time) {
        EasyAdsManger.getInstance().splashPlusAutoClose = time;
    }


}


================================================
FILE: easyads/src/main/java/com/easyads/EasyAdsConstant.java
================================================
package com.easyads;

public class EasyAdsConstant {
    public static final String NOT_SUPPORT_SUPPLIER_TIPS = "未支持的SDK渠道,跳过该渠道加载。请先检查是否引入了该渠道处理依赖,如已引入,检查下发渠道信息,如未在渠道已支持列表中,请请查看文档使用自定义渠道来完成广告加载";

    /**
     * SDK的tag标记
     */
    //腾讯优量汇(原优量汇)
    public static final String SDK_TAG_YLH = "ylh";
    //头条穿山甲
    public static final String SDK_TAG_CSJ = "csj";
    //百度百青藤
    public static final String SDK_TAG_BAIDU = "bd";
    //快手
    public static final String SDK_TAG_KS = "ks";


    /**
     * 策略分发占比默认值,默认100 代表100%执行
     */
    public static final double DEFAULT_PERCENT = 0d;


    /**
     * 广告状态记录,主要是用户调用广告展示时,分析广告状态,来执行不同操作
     */
    //默认状态
    public static final int AD_STATUS_DEFAULT = -1;
    //广告请求中
    public static final int AD_STATUS_LOADING = 0;
    //广告请求成功了
    public static final int AD_STATUS_LOAD_SUCCESS = 1;
    //广告失败了
    public static final int AD_STATUS_LOAD_FAILED = 2;
    //广告需要被展示
    public static final int AD_STATUS_NEED_SHOW = 3;
}


================================================
FILE: easyads/src/main/java/com/easyads/EasyAdsManger.java
================================================
package com.easyads;

import com.easyads.model.EALogLevel;

/**
 * 单例处理一些全局配置信息
 */
public class EasyAdsManger {
    private static EasyAdsManger instance;

    private EasyAdsManger() {
    }

    public static synchronized EasyAdsManger getInstance() {
        if (instance == null) {
            instance = new EasyAdsManger();
        }
        return instance;
    }
    //调试状态
    public boolean debug = false;
    //dev状态代表开发者模式,会有更多日志输出
    public boolean isDev = false;

    //标记各平台是否初始化过
    public boolean hasYLHInit = false;
    public boolean hasCSJInit = false;
    public boolean hasKSInit = false;
    public boolean hasBDInit = false;

    //各平台最近一次初始化的APP_ID
    public String lastYLHAID = "";
    public String lastCSJAID = "";
    public String lastKSAID = "";
    public String lastBDAID = "";


    public String currentSupTag = "";//当前执行的SDK渠道id
    public boolean isSplashSupportZoomOut = false; //是否需要执行v+形式的缩放操作

    public int splashPlusAutoClose = -1;//开屏v+自动关闭时间,单位毫秒,默认-1不执行强制关闭
    public EALogLevel logLevel = EALogLevel.DEFAULT;

    public int getSplashPlusAutoClose() {
        try {
            if (splashPlusAutoClose <= 0) {
                return -1;
            }
            //最短3秒
            if (splashPlusAutoClose < 3000) {
                return 3000;
            }
            //最长30秒
            if (splashPlusAutoClose > 30000) {
                return 30000;
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return splashPlusAutoClose;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/core/EABaseSupplierAdapter.java
================================================
package com.easyads.core;

import android.app.Activity;

import com.easyads.EasyAdsConstant;
import com.easyads.itf.AdCoreAction;
import com.easyads.itf.BaseAdapterEvent;
import com.easyads.itf.BaseEnsureListener;
import com.easyads.model.EasyAdError;
import com.easyads.model.SdkSupplier;
import com.easyads.utils.EAUtil;
import com.easyads.utils.EALog;

import java.lang.ref.SoftReference;

import static com.easyads.model.EasyAdError.ERROR_EXCEPTION_LOAD;
import static com.easyads.model.EasyAdError.ERROR_EXCEPTION_SHOW;

public abstract class EABaseSupplierAdapter implements AdCoreAction {
    public String TAG = "[" + this.getClass().getSimpleName() + "] ";
    private BaseAdapterEvent baseListener; // 广告基础回调事件
    private boolean hasFailed = false; //广告失败标记
    private int lastFailedPri = -1;//上次广告失败对应优先级,主要是处理同时配置了两个一样SDK渠道时,防止失败回调事件异常
    private int adNum = 0;//记录广告数量,每load一次+1.每失败一次-1.如果此值为负,那么可能为回调了多次的失败回调,需抛弃处理此次回调。
    private boolean isLoadOnly = false; //标记是否为仅load广告

    protected SoftReference<Activity> softReferenceActivity; //软引用上下文,避免强引用导致内存泄漏
    protected SdkSupplier sdkSupplier; //当前adapter正在执行的渠道配置信息

    protected boolean isDestroy = false;//销毁标记
    protected boolean refreshing = false;//banner位置的特殊标记,标记广告正在进行自动刷新


    /**
     * 通用初始化方法
     *
     * @param softReferenceActivity 上下文
     * @param baseListener          基类adapter回调
     */
    public EABaseSupplierAdapter(SoftReference<Activity> softReferenceActivity, final BaseAdapterEvent baseListener) {
        this.softReferenceActivity = softReferenceActivity;
        this.baseListener = baseListener;
    }


    /**
     * 设置当前渠道处理需要的渠道数据
     *
     * @param sdkSupplier 渠道信息model
     */
    public void setSDKSupplier(SdkSupplier sdkSupplier) {
        try {
            this.sdkSupplier = sdkSupplier;
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 统一获取activity方法
     *
     * @return 页面上下文
     */
    public Activity getActivity() {
        if (softReferenceActivity != null) {
            return softReferenceActivity.get();
        }
        return null;
    }

    /**
     * 基础的核心方法,加载、展示、销毁
     */

    @Override
    public void loadOnly() {
        isLoadOnly = true;
        startAdapterADLoad();
    }

    @Override
    public void show() {
        try {
            //当使用分离的加载和展示调用时,只要广告是未成功状态,均不执行show操作
            if (isLoadOnly && sdkSupplier.adStatus != EasyAdsConstant.AD_STATUS_LOAD_SUCCESS) {
                sdkSupplier.adStatus = EasyAdsConstant.AD_STATUS_NEED_SHOW;
                EALog.simple(TAG + "广告尚未获取到,暂无法执行展示,请耐心等待,SDK会在收到广告后,立即执行广告展示。若广告一直未展示,请检查广告失败回调和对应log信息,了解展示失败原因");
                return;
            }
            //保证在主线程调用show
            EAUtil.switchMainThread(new BaseEnsureListener() {
                @Override
                public void ensure() {
                    doShowAD();
                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
            handleFailed(EasyAdError.parseErr(ERROR_EXCEPTION_SHOW, "BaseSupplierAdapter show Throwable"));
        }
    }

    @Override
    public void loadAndShow() {
        isLoadOnly = false;
        startAdapterADLoad();
    }


    @Override
    public void destroy() {
        try {
            isDestroy = true;
            doDestroy();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    /**
     * 抽象基础方法,使子类仅关注对应的广告处理逻辑
     */

    //抽象方法,此方法内应执行广告加载方法
    protected abstract void doLoadAD();

    //抽象方法,此方法内应执行广告展示方法(如有)
    protected abstract void doShowAD();

    //抽象方法,此方法内应执行广告销毁操作(如有)
    protected abstract void doDestroy();


    //开始调用加载广告方法
    public void startAdapterADLoad() {
        try {
            if (sdkSupplier != null) {
                String msg = TAG + "开始请求广告 ";
                EALog.simple(msg);
            }
            ++adNum;
            //保证在主线程调用load
            EAUtil.switchMainThread(new BaseEnsureListener() {
                @Override
                public void ensure() {
                    doLoadAD();
                }
            });
            sdkSupplier.adStatus = EasyAdsConstant.AD_STATUS_LOADING;
        } catch (Throwable e) {
            e.printStackTrace();
            handleFailed(EasyAdError.parseErr(ERROR_EXCEPTION_LOAD, "BaseSupplierAdapter load Throwable"));
        }
    }


    /**
     * banner 特有的失败处理,主要是自动刷新部分的处理比较特殊
     *
     * @param easyAdError
     */
    public void doBannerFailed(EasyAdError easyAdError) {
        try {
            if (isBannerFailed()) {
                handleFailed(easyAdError);
                //广告失败并进行销毁
                doDestroy();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * banner 广告是否算失败,因为有刷新的逻辑,如果刷新中失败,是可以按照不失败继续执行刷新的
     */
    private boolean isBannerFailed() {
        String tag = "【isBannerFailed-check】";
        //如果未在展示中,失败了需要进行销毁,否则会在后台自动进行请求
        boolean isRunning = true;
        if (sdkSupplier != null) {
            int pri = sdkSupplier.priority;
            if (baseListener != null && baseListener.getSupplierInf() != null) {
                int curPri = baseListener.getSupplierInf().priority;
                EALog.high(tag + "curPri = " + curPri + " pri = " + pri);
                isRunning = curPri == pri;
            }
        }
        EALog.high(tag + "refreshing = " + refreshing + " isRunning = " + isRunning);

        if (refreshing && isRunning) {
            EALog.high(tag + "等待刷新中,即使失败也不进行销毁操作");
            return false;
        }
        EALog.simple(tag + " 广告失败,进行销毁操作");
        return true;
    }


    /**
     * 是否优化初始化流程,默认为true代表自动优化初始化方法,多次相同appID的初始化不重复执行
     *
     * @return 优化
     */
    public boolean canOptInit() {
        return true;
    }

    /**
     * 获取策略中配置的媒体id。
     */
    public String getAppID() {
        String appID = "";
        if (sdkSupplier != null) {
            appID = sdkSupplier.appId;
        }
        return appID;
    }

    /**
     * 获取策略中配置的广告位id。
     */
    public String getPosID() {
        String posID = "";
        if (sdkSupplier != null) {
            posID = sdkSupplier.adspotId;
        }
        return posID;
    }

    /**
     * --------- 以下是公共处理核心回调事件方法  ----------
     */

    public void handleClick() {
        try {
            EALog.simple(TAG + "广告点击");
            EAUtil.switchMainThread(new BaseEnsureListener() {
                @Override
                public void ensure() {
                    if (baseListener == null) {
                        EALog.e(TAG + "baseListener is null");
                        return;
                    }
                    //这里集中处理回调事件
                    baseListener.adapterDidClicked(sdkSupplier);

                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public void handleExposure() {
        try {
            EALog.simple(TAG + "广告曝光成功");
            EAUtil.switchMainThread(new BaseEnsureListener() {
                @Override
                public void ensure() {
                    if (baseListener == null) {
                        EALog.e(TAG + "baseListener is null");
                        return;
                    }
                    //这里集中处理回调事件
                    baseListener.adapterDidExposure(sdkSupplier);

                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    public void handleSucceed() {
        try {
            EALog.simple(TAG + "广告获取成功");
            sdkSupplier.adStatus = EasyAdsConstant.AD_STATUS_LOAD_SUCCESS;
            EAUtil.switchMainThread(new BaseEnsureListener() {
                @Override
                public void ensure() {
                    if (baseListener == null) {
                        EALog.e(TAG + "baseListener is null");
                        return;
                    }
                    //这里集中处理回调事件
                    baseListener.adapterDidSucceed(sdkSupplier);

                    if (!isLoadOnly) {
                        show();
                    } else {
                        //代表调用过show方法,此时就要自动去执行展示广告流程
                        if (sdkSupplier.adStatus == EasyAdsConstant.AD_STATUS_NEED_SHOW) {
                            show();
                        }
                    }
                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
            handleFailed(EasyAdError.parseErr(EasyAdError.ERROR_EXCEPTION_LOAD));
        }
    }

    public void handleFailed(int errCode, String errMsg) {
        handleFailed(errCode + "", errMsg);
    }

    public void handleFailed(String errCode, String errMsg) {
        handleFailed(EasyAdError.parseErr(errCode, errMsg));
    }

    //统一处理,告诉基础类失败了,需要走下一优先级的渠道
    public void handleFailed(EasyAdError error) {
        try {
            if (error != null) {
                EALog.simple(TAG + "广告获取失败 , 失败信息:" + error.toString());
            }

            //避免重复执行失败任务
            checkFailed();

            sdkSupplier.adStatus = EasyAdsConstant.AD_STATUS_LOAD_FAILED;
            if (baseListener == null) {
                EALog.e(TAG + "baseListener is null");
                return;
            }
            baseListener.adapterDidFailed(error, sdkSupplier);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 检查失败唯一性,避免重复回调失败
     *
     * @throws Exception
     */
    private void checkFailed() throws Exception {
        String exInf = "  -- ad failed check --  ,  already failed , skip callback onFailed";

        --adNum;
        EALog.max(TAG + "[checkFailed] adNum = " + adNum);
        if (sdkSupplier != null) {
            //避免重复执行失败任务
            if (hasFailed && lastFailedPri == sdkSupplier.priority && adNum < 0) {
                EALog.high(TAG + exInf);
                throw new Exception(exInf);
            }
            hasFailed = true;
            lastFailedPri = sdkSupplier.priority;
        }
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/core/EasyAdBaseAdspot.java
================================================
package com.easyads.core;

import android.app.Activity;
import android.app.Application;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import com.easyads.EasyAdsConstant;
import com.easyads.EasyAdsManger;
import com.easyads.core.splash.EASplashListener;
import com.easyads.core.splash.EASplashLifeCallback;
import com.easyads.itf.AdCoreAction;
import com.easyads.itf.EABaseADListener;
import com.easyads.itf.BaseAdapterEvent;
import com.easyads.itf.BaseEnsureListener;
import com.easyads.model.EasyAdType;
import com.easyads.model.EasyAdError;
import com.easyads.model.SdkRule;
import com.easyads.model.SdkSupplier;
import com.easyads.model.StrategyModel;
import com.easyads.utils.EAAdapterLoader;
import com.easyads.utils.EAUtil;
import com.easyads.utils.BigDecimalUtil;
import com.easyads.utils.EALog;

import java.lang.ref.SoftReference;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;

/**
 * 广告处理基类,统一处理SDK渠道adapter加载、选择,adapter中基础回调事件统一处理。
 */
public abstract class EasyAdBaseAdspot implements AdCoreAction, BaseAdapterEvent {
    private String BTAG = "[" + this.getClass().getSimpleName() + "] ";
    private EABaseADListener baseADListener;
    private boolean isLoadOnly = false; //是否为仅加载广告模
    private boolean fromActivityDestroy = false;
    private String reqId = ""; //请求唯一id
    private StrategyModel mStrategyModel; //策略执行对象
    private Application.ActivityLifecycleCallbacks alcb;

    protected SoftReference<Activity> mSoftActivity;//软引用上下文
    //需要执行的广告SDK列表
    protected ArrayList<SdkSupplier> suppliers;
    //当前选中的广告SDK
    protected SdkSupplier currentSdkSupplier;
    //当前执行的广告SDK渠道
    protected SdkSupplier callBackRunningSupplier;
    //异常记录
    protected EasyAdError easyAdError;
    //各SDK渠道适配adapter集合,初始化时传入,后续渠道选择时从map中选取,
    protected HashMap<String, EABaseSupplierAdapter> supplierAdapters = new HashMap<>();
    protected String currentSdkTag = "";//当前正在执行SDK的tag
    protected EASplashLifeCallback splashLifeCallback;//适用于开屏的生命周期回调
    protected EasyAdType adType;//广告类型

    public EasyAdBaseAdspot(Activity activity, EABaseADListener listener) {
        try {
            this.mSoftActivity = new SoftReference<>(activity);
            this.baseADListener = listener;
            //初始化渠道列表
            initSupplierAdapterList();
            if (alcb != null) {
                //如果已存在,先注销
                activity.getApplication().unregisterActivityLifecycleCallbacks(alcb);
            }
            //注册Lifecycle生命周期监控,用于在合适的生命周期处理广告事件
            alcb = new Application.ActivityLifecycleCallbacks() {
                @Override
                public void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState) {

                }

                @Override
                public void onActivityStarted(@NonNull Activity activity) {

                }

                @Override
                public void onActivityResumed(@NonNull Activity mActivity) {
                    if (splashLifeCallback != null && mActivity == getActivity()) {
                        splashLifeCallback.onResume();
                    }
                }

                @Override
                public void onActivityPaused(@NonNull Activity mActivity) {
                    if (splashLifeCallback != null && mActivity == getActivity()) {
                        splashLifeCallback.onPause();
                    }
                }

                @Override
                public void onActivityStopped(@NonNull Activity activity) {

                }

                @Override
                public void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState) {

                }

                @Override
                public void onActivityDestroyed(@NonNull Activity mActivity) {
                    if (getActivity() == mActivity) {
                        fromActivityDestroy = true;
                        destroy();
                    }
                }
            };
            activity.getApplication().registerActivityLifecycleCallbacks(alcb);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 初始化
     */
    void initSupplierAdapterList() {
        try {
            if (supplierAdapters == null) {
                supplierAdapters = new HashMap<>();
            } else {
                supplierAdapters.clear();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 必须!!设置策略信息,注意json格式一定要正确,否则有可能解析策略失败导致无广告。
     *
     * @param strategyJson 策略信息json串,一定要传入指定要求的格式,具体请阅读文档对应内容了解。
     */
    public void setData(String strategyJson) {
        try {
            //解析json并转换为StrategyModel对象
            mStrategyModel = StrategyModel.covert(strategyJson);

            ArrayList<SdkRule> rules = mStrategyModel.rules;
            int ruleSize = rules.size();
            if (ruleSize <= 0) {//代表无策略规则信息,不加载广告

            } else if (ruleSize == 1) {//只有一组策略规则信息,全量加载
                suppliers = rules.get(0).sortedSuppliers;
                EALog.simple(BTAG + "策略组唯一,全量执行: " + rules.get(0).tag);
            } else { //> 1,一组策略规则信息,按照设定的percent值进行比例切分,按比例随机选择规则组。
                SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
//                以10000为基数,可以随机到0.01%精度
                int maxNum = 10000;
                //获取0-999随机数
                int randomPos = random.nextInt(maxNum);
                for (int i = 0; i < ruleSize; i++) {
                    SdkRule rule = rules.get(i);
                    //分母为各个setting内容的percent之和
                    double perResult = BigDecimalUtil.div(rule.percent, mStrategyModel.sumPercent, 4);
                    double gapNum = BigDecimalUtil.mul(perResult, maxNum);
                    if (i == 0) {
                        rule.lowLimit = 0;
                    } else {
                        rule.lowLimit = rules.get(i - 1).highLimit + 1;
                    }

                    if (i == ruleSize - 1) {
                        rule.highLimit = maxNum - 1;
                    } else {
                        rule.highLimit = rule.lowLimit + (int) gapNum - 1;
                    }
                    EALog.devDebug(BTAG + " randomPos =  " + randomPos + ", gapNum = " + gapNum + " ;rule.lowLimit = " + rule.lowLimit + ", rule.highLimit = " + rule.highLimit);

                    //命中当前rule,锁定对应排序后的渠道信息为当前执行的渠道信息
                    if (randomPos < rule.highLimit && randomPos > rule.lowLimit) {
                        suppliers = rule.sortedSuppliers;
                        EALog.simple(BTAG + "根据已配置流量切分比例,策略组随机选择,此次命中: " + rule.tag + ",流量占比:" + BigDecimalUtil.mul(perResult, 100) + "%");

                        for (SdkSupplier supplier : suppliers) {
                            EALog.devDebug(BTAG + "SDK渠道信息: " + supplier.toString());
                        }
                        break;
                    }
                }
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    public void loadOnly() {
        isLoadOnly = true;
        startLoad();
    }

    @Override
    public void loadAndShow() {
        isLoadOnly = false;
        startLoad();
    }

    /**
     * 用来统一调用adapter中的show方法
     */
    @Override
    public void show() {
        try {
            if (TextUtils.isEmpty(currentSdkTag)) {
                EALog.e("未选中任何SDK");
                return;
            }
            if (supplierAdapters == null || supplierAdapters.size() == 0) {
                EALog.e("无可用渠道");
                return;
            }
            EABaseSupplierAdapter adapter = supplierAdapters.get(currentSdkTag);
            if (adapter == null) {
                EALog.e("未找到当前渠道下adapter,渠道id:" + currentSdkTag);
                return;
            }
            if (adapter.isDestroy) {
                EALog.e("广告已销毁,无法展示,请重新初始化");
                return;
            }
            adapter.show();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 开始加载
     */
    protected void startLoad() {
        try {
            //添加各广告位初始化支持的adapter
            initSdkSupplier();
            //选择执行adapter
            dispatchSuppliers();
            //生成当前请求的唯一id
            reqId = EAUtil.getUUID();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }


    //获取此次广告的唯一请求id,值为本地生成的uuid
    public String getReqId() {
        return reqId;
    }

    /**
     * BaseAdapterEventListener中方法,在此统一进行回调处理 ----start
     * 不同广告位可能会有其他的回调listener事件,此处为共有的广告成功、展示、点击等处理
     */

    @Override
    public void adapterDidFailed(EasyAdError easyAdError, SdkSupplier supplier) {
        try {
            this.easyAdError = easyAdError;
            updateSupplier("adapterDidFailed", supplier);
            selectSdkSupplier();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    @Override
    public void adapterDidSucceed(SdkSupplier supplier) {
        updateSupplier("adapterDidSucceed", supplier);

        if (null != baseADListener) {
            baseADListener.onAdSucceed();
        }
    }

    @Override
    public void adapterDidExposure(SdkSupplier supplier) {
        updateSupplier("adapterDidExposure", supplier);

        if (null != baseADListener) {
            baseADListener.onAdExposure();
        }
    }

    @Override
    public void adapterDidClicked(SdkSupplier supplier) {
        updateSupplier("adapterDidClicked", supplier);

        if (null != baseADListener) {
            baseADListener.onAdClicked();
        }
    }


    @Override
    public SdkSupplier getSupplierInf() {
        return callBackRunningSupplier;
    }

    /**
     * BaseAdapterEventListener中方法,在此统一进行回调处理 ----end
     */

    protected void updateSupplier(String func, SdkSupplier sdkSupplier) {
        try {
            String extMsg = "";
            if (sdkSupplier != null) {
                callBackRunningSupplier = sdkSupplier;
                extMsg = ", sdkSupplier = " + sdkSupplier.toString();
            }
            EALog.high(BTAG + "_" + func + "_" + extMsg);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    /**
     * 添加自定义的渠道adapter
     *
     * @param sdkTag  自定义的渠道tag
     * @param adapter 自定义的渠道adapter
     */
    public void addCustomSupplier(String sdkTag, EABaseSupplierAdapter adapter) {
        try {
            if (supplierAdapters == null) {
                supplierAdapters = new HashMap<>();
            }
            EABaseSupplierAdapter adapter1 = supplierAdapters.get(sdkTag);
            if (adapter1 == null) {
                supplierAdapters.put(sdkTag, adapter);
            } else {
                EALog.simple("该sdkTag:" + sdkTag + "下已存在渠道adapter,无法重复添加");
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 分发获取到的策略信息
     */
    private void dispatchSuppliers() {
        //未设置策略信息,直接抛错
        if (mStrategyModel == null) {
            if (easyAdError == null) {
                easyAdError = EasyAdError.parseErr(EasyAdError.ERROR_NONE_STRATEGY);
            }
            onTotalFailed();
            return;
        }

        //确保在主线程执行策略选择逻辑
        EAUtil.switchMainThread(new BaseEnsureListener() {
            @Override
            public void ensure() {
                receivedSuppliers();
            }
        });
    }


    /**
     * 获取activity上下文实例,注意默认为软引用的Activity
     *
     * @return activity上下文
     */
    protected Activity getActivity() {
        try {
            if (mSoftActivity != null) {
                return mSoftActivity.get();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }


    private void receivedSuppliers() {
        try {
            //对当前渠道组进行排序
            Collections.sort(suppliers);

        } catch (Throwable e) {
            e.printStackTrace();
        }
        selectSdkSupplier();
    }


    /**
     * 统一处理渠道选择流程
     * 选择SDK渠道逻辑,如果渠道为空,执行策略失败方法,不为空则开始渠道选中后的广告执行逻辑
     */
    void selectSdkSupplier() {
        try {
            EALog.simple(BTAG + "策略调度执行中");

            if (suppliers == null || suppliers.size() == 0) {
                EALog.e(BTAG + "渠道信息为空");
                if (easyAdError == null) {
                    EALog.simple("None SDK: sdk suppliers is empty, callback failed");
                    easyAdError = EasyAdError.parseErr(EasyAdError.ERROR_NONE_SDK);
                }
                onTotalFailed();
                return;
            }
            currentSdkSupplier = suppliers.get(0);
            if (EAUtil.isActivityDestroyed(getActivity())) {
                try {
                    EALog.e(BTAG + "当前activity已被销毁,不再请求广告");
                    //activity被销毁也算是异常,广告流程的结束,需要回调失败,并上报整体失败时间
                    easyAdError = EasyAdError.parseErr(EasyAdError.ERROR_NO_ACTIVITY);
                    onTotalFailed();
                } catch (Throwable e) {
                    e.printStackTrace();
                }
                return;
            }


            //串行加载广告
            runOrderSuppliers();


        } catch (Throwable e) {
            e.printStackTrace();
            easyAdError = EasyAdError.parseErr(EasyAdError.ERROR_SUPPLIER_SELECT);
            onTotalFailed();
        }
    }

    /**
     * 整体失败回调,包括任意场景下的失败,可以在这里统一进行失败信息上报或者延迟上报的处理
     */
    protected void onTotalFailed() {
        try {
            //回调开发者错误信息
            if (baseADListener != null) {

                baseADListener.onAdFailed(easyAdError);
                if (baseADListener instanceof EASplashListener) {
                    final EASplashListener fListener = (EASplashListener) baseADListener;
                    EAUtil.switchMainThread(new BaseEnsureListener() {
                        @Override
                        public void ensure() {
                            fListener.onAdClose();
                        }
                    });
                }
            }

        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 串行统一处理任务,当前是串行渠道直接loadAd,不是再去选择
     */
    private void runOrderSuppliers() {
        callSDKSelected();
        if (suppliers != null && suppliers.size() > 0 && currentSdkSupplier != null) {
            String tag = currentSdkSupplier.tag;
            try {
                //移除当前正在执行的渠道
                suppliers.remove(0);

                //查找对应渠道的处理adapter
                EABaseSupplierAdapter adapter = supplierAdapters.get(tag);
                if (adapter != null) {
                    adapter.setSDKSupplier(currentSdkSupplier);
                    //区分加载模式
                    if (isLoadOnly) {
                        adapter.loadOnly();
                    } else {
                        adapter.loadAndShow();
                    }
                } else {
                    EALog.e(EasyAdsConstant.NOT_SUPPORT_SUPPLIER_TIPS);
                    //无对应渠道处理adapter,需要重新调度策略
                    selectSdkSupplier();
                }
            } catch (Throwable e) {
                e.printStackTrace();
                catchFailed();
            }
        }
    }

    private void callSDKSelected() {
        try {
            currentSdkTag = currentSdkSupplier.tag;
            EasyAdsManger.getInstance().currentSupTag = currentSdkTag;
            EasyAdsManger.getInstance().isSplashSupportZoomOut = false;//初始化开屏v+支持状态
            EALog.simple(BTAG + "即将执行SDK :" + currentSdkTag);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    //异常时的
    private void catchFailed() {
        try {
            this.easyAdError = EasyAdError.parseErr(EasyAdError.ERROR_LOAD_SDK, "");
            selectSdkSupplier();
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 销毁非正在进行的其他渠道,一般是在广告成功展示以后调用。
     *
     * @param supplier 正在进行的渠道
     */
    protected void destroyOtherSupplier(SdkSupplier supplier) {
        try {
            //遍历调用销毁
            if (supplierAdapters != null && supplierAdapters.size() > 0 && supplier != null) {
                for (String key : supplierAdapters.keySet()) {
                    String sTag = supplier.tag;
                    //如果是非当前渠道,进行销毁操作
                    if (sTag != null && !sTag.equals(key)) {
                        EABaseSupplierAdapter bad = supplierAdapters.get(key);
                        //只销毁优先级在当前渠道之上的渠道
                        if (bad != null && bad.sdkSupplier != null && bad.sdkSupplier.priority < supplier.priority) {
                            bad.destroy();
                        }
                    }
                }
            }
        } catch (Throwable e) {
            EALog.e(BTAG + "destroyOtherSupplier catch Throwable");
            e.printStackTrace();
        }
    }

    public void destroy() {
        try {
            //遍历调用销毁
            if (supplierAdapters != null && supplierAdapters.size() > 0) {
                for (String key : supplierAdapters.keySet()) {
                    // 进行销毁操作
                    EABaseSupplierAdapter bad = supplierAdapters.get(key);
                    if (bad != null) {
                        bad.destroy();
                    }
                }
            }
            if (getActivity() != null && fromActivityDestroy) {
                getActivity().getApplication().unregisterActivityLifecycleCallbacks(alcb);
            }
        } catch (Throwable e) {
            EALog.e(BTAG + " do destroy catch Throwable");
            e.printStackTrace();
        }
    }

    //反射调用各个渠道banner adapter初始化方法
    protected void initAdapter(String sdkTag, Object adObject) {
        try {
            EABaseSupplierAdapter bdAdapter = EAAdapterLoader.getSDKLoader(sdkTag, adType, mSoftActivity, adObject);
            if (bdAdapter != null && supplierAdapters != null) {
                supplierAdapters.put(sdkTag, bdAdapter);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    //在此方法里添加需要支持的adapter
    protected abstract void initSdkSupplier();

}


================================================
FILE: easyads/src/main/java/com/easyads/core/banner/EABannerListener.java
================================================
package com.easyads.core.banner;

import com.easyads.itf.EABaseADListener;

public interface EABannerListener extends EABaseADListener {
}


================================================
FILE: easyads/src/main/java/com/easyads/core/banner/EABannerSetting.java
================================================
package com.easyads.core.banner;

import android.view.ViewGroup;

import com.easyads.itf.BaseAdapterEvent;
import com.easyads.model.SdkSupplier;

/**
 * banner 位置的一些共有事件接口
 */
public interface EABannerSetting extends BaseAdapterEvent {
    void adapterDidDislike(SdkSupplier sdkSupplier);

    int getRefreshInterval();

    int getCsjExpressViewAcceptedWidth();

    int getCsjExpressViewAcceptedHeight();

    ViewGroup getContainer();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/banner/EasyAdBanner.java
================================================
package com.easyads.core.banner;

import android.app.Activity;
import android.view.ViewGroup;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.model.EasyAdType;
import com.easyads.model.SdkSupplier;
import com.easyads.utils.ScreenUtil;


public class EasyAdBanner extends EasyAdBaseAdspot implements EABannerSetting {
    private ViewGroup adContainer; //banner 父布局
    private int refreshInterval = 0; //定时刷新时间,单位为秒,仅优量汇、穿山甲生效
    private EABannerListener listener;//广告事件回调

    public int csjExpressViewAcceptedWidth = 360; //穿山甲模板尺寸宽度,单位dp,一定要和穿山甲后台配置的尺寸匹配
    public int csjExpressViewAcceptedHeight = 0;

    /**
     * 构造方法
     *
     * @param activity    上下文
     * @param adContainer 广告父布局
     * @param listener    广告事件回调
     */
    public EasyAdBanner(Activity activity, final ViewGroup adContainer, EABannerListener listener) {
        super(activity, listener);
        try {
            adType = EasyAdType.BANNER;//赋值广告类型
            this.adContainer = adContainer;
            this.listener = listener;

            //默认设置为全屏宽度
            csjExpressViewAcceptedWidth = ScreenUtil.px2dip(activity, ScreenUtil.getScreenWidth(activity));
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    protected void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_YLH, this);
            initAdapter(EasyAdsConstant.SDK_TAG_BAIDU, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    public void adapterDidExposure(SdkSupplier supplier) {
        super.adapterDidExposure(supplier);

        //一旦有渠道展示成功了 则将其他渠道进行销毁操作,避免定时器触发问题
        if (currentSdkSupplier != null) {
            destroyOtherSupplier(currentSdkSupplier);
        }
    }


    public void adapterDidDislike(SdkSupplier supplier) {
        updateSupplier("adapterDidDislike", supplier);
        if (null != listener) {
            listener.onAdClose();
        }
    }

    public EasyAdBanner setRefreshInterval(int refreshInterval) {
        this.refreshInterval = refreshInterval;
        return this;
    }

    public void setCsjExpressSize(int width, int height) {
        csjExpressViewAcceptedWidth = width;
        csjExpressViewAcceptedHeight = height;
    }

    public ViewGroup getContainer() {
        return adContainer;
    }

    public int getRefreshInterval() {
        return this.refreshInterval;
    }

    public int getCsjExpressViewAcceptedWidth() {
        return this.csjExpressViewAcceptedWidth;
    }

    public int getCsjExpressViewAcceptedHeight() {
        return this.csjExpressViewAcceptedHeight;
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/core/draw/EADrawListener.java
================================================
package com.easyads.core.draw;


import com.easyads.itf.EABaseADListener;

public interface EADrawListener extends EABaseADListener {

}


================================================
FILE: easyads/src/main/java/com/easyads/core/draw/EADrawSetting.java
================================================
package com.easyads.core.draw;

import android.view.ViewGroup;

import com.easyads.itf.BaseAdapterEvent;

public interface EADrawSetting extends BaseAdapterEvent {
    ViewGroup getContainer();

    int getCsjExpressHeight();

    int getCsjExpressWidth();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/draw/EasyAdDraw.java
================================================
package com.easyads.core.draw;

import android.app.Activity;
import android.view.ViewGroup;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.model.EasyAdType;
import com.easyads.utils.EALog;
import com.easyads.utils.ScreenUtil;

public class EasyAdDraw extends EasyAdBaseAdspot implements EADrawSetting {

    EADrawListener listener;//广告事件回调
    ViewGroup adContainer;//广告父布局
    private int csjExpressWidth;//穿山甲模板尺寸宽度,单位dp
    private int csjExpressHeight;

    public EasyAdDraw(Activity activity, EADrawListener listener) {
        super(activity, listener);
        try {
            //赋值广告类型
            adType = EasyAdType.DRAW;

            this.listener = listener;
            //默认赋值为屏幕宽高
            csjExpressWidth = ScreenUtil.px2dip(activity, ScreenUtil.getScreenWidth(activity));
            csjExpressHeight = ScreenUtil.px2dip(activity, ScreenUtil.getScreenHeight(activity));
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    protected void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_KS, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 以下为setting回调项处理
     */

    public void setAdContainer(final ViewGroup adContainer) {
        try {
            this.adContainer = adContainer;
            //将模板尺寸宽高,自动赋值为父布局的宽高属性
            adContainer.post(new Runnable() {
                @Override
                public void run() {
                    csjExpressWidth = ScreenUtil.px2dip(getActivity(), adContainer.getWidth());
                    csjExpressHeight = ScreenUtil.px2dip(getActivity(), adContainer.getHeight());
                    EALog.devDebug("set csjExpressView as adContainer Width= " + csjExpressWidth + " Height= " + csjExpressHeight);
                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    @Override
    public ViewGroup getContainer() {
        return adContainer;
    }


    @Override
    public int getCsjExpressHeight() {
        return csjExpressHeight;
    }

    @Override
    public int getCsjExpressWidth() {
        return csjExpressWidth;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/core/full/EAFullScreenVideoListener.java
================================================
package com.easyads.core.full;

import com.easyads.itf.EABaseADListener;

public interface EAFullScreenVideoListener extends EABaseADListener {
    void onVideoComplete();

    void onVideoSkipped();

    void onVideoCached();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/full/EAFullScreenVideoSetting.java
================================================
package com.easyads.core.full;

import com.easyads.itf.BaseAdapterEvent;
import com.easyads.model.SdkSupplier;
import com.qq.e.ads.cfg.VideoOption;
import com.qq.e.ads.interstitial2.UnifiedInterstitialMediaListener;

public interface EAFullScreenVideoSetting extends BaseAdapterEvent {

    void adapterVideoCached(SdkSupplier sdkSupplier);

    void adapterVideoComplete(SdkSupplier sdkSupplier);

    void adapterClose(SdkSupplier sdkSupplier);

    void adapterVideoSkipped(SdkSupplier sdkSupplier);

    UnifiedInterstitialMediaListener getYlhMediaListener();

    VideoOption getYlhVideoOption();

}


================================================
FILE: easyads/src/main/java/com/easyads/core/full/EasyAdFullScreenVideo.java
================================================
package com.easyads.core.full;

import android.app.Activity;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.model.EasyAdType;
import com.easyads.model.SdkSupplier;
import com.qq.e.ads.cfg.VideoOption;
import com.qq.e.ads.interstitial2.UnifiedInterstitialMediaListener;

public class EasyAdFullScreenVideo extends EasyAdBaseAdspot implements EAFullScreenVideoSetting {
    private EAFullScreenVideoListener listener;//广告事件回调
    private UnifiedInterstitialMediaListener ylhMediaListener;//优量汇视频加载情况监听器
    private VideoOption ylhVideoOption;//优量汇视频广告设置项

    public EasyAdFullScreenVideo(Activity activity, EAFullScreenVideoListener listener) {
        super(activity, listener);
        adType = EasyAdType.FULL;//赋值广告类型

        this.listener = listener;
    }

    @Override
    public void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_YLH, this);
            initAdapter(EasyAdsConstant.SDK_TAG_BAIDU, this);
            initAdapter(EasyAdsConstant.SDK_TAG_KS, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    public UnifiedInterstitialMediaListener getYlhMediaListener() {
        return ylhMediaListener;
    }

    @Override
    public VideoOption getYlhVideoOption() {
        return ylhVideoOption;
    }

    public void setYlhMediaListener(UnifiedInterstitialMediaListener mediaListener) {
        this.ylhMediaListener = mediaListener;
    }

    public void setYlhVideoOption(VideoOption videoOption) {
        this.ylhVideoOption = videoOption;
    }

    public void adapterVideoCached(SdkSupplier supplier) {
        updateSupplier("adapterVideoCached", supplier);
        if (null != listener) {
            listener.onVideoCached();
        }
    }

    public void adapterVideoComplete(SdkSupplier supplier) {
        updateSupplier("adapterVideoComplete", supplier);
        if (null != listener) {
            listener.onVideoComplete();
        }
    }

    public void adapterClose(SdkSupplier supplier) {
        updateSupplier("adapterClose", supplier);
        if (null != listener) {
            listener.onAdClose();
        }
    }

    public void adapterVideoSkipped(SdkSupplier supplier) {
        updateSupplier("adapterVideoSkipped", supplier);
        if (null != listener) {
            listener.onVideoSkipped();
        }
    }


}


================================================
FILE: easyads/src/main/java/com/easyads/core/inter/EAInterstitialListener.java
================================================
package com.easyads.core.inter;

import com.easyads.itf.EABaseADListener;

public interface EAInterstitialListener extends EABaseADListener {
}


================================================
FILE: easyads/src/main/java/com/easyads/core/inter/EAInterstitialSetting.java
================================================
package com.easyads.core.inter;

import com.easyads.itf.BaseAdapterEvent;
import com.easyads.model.SdkSupplier;
import com.qq.e.ads.interstitial2.UnifiedInterstitialMediaListener;

public interface EAInterstitialSetting extends BaseAdapterEvent {
    void adapterDidClosed(SdkSupplier sdkSupplier);

    float getCsjExpressViewWidth();

    float getCsjExpressViewHeight();

    UnifiedInterstitialMediaListener getYlhMediaListener();

    boolean isCsjNew();

}


================================================
FILE: easyads/src/main/java/com/easyads/core/inter/EasyAdInterstitial.java
================================================
package com.easyads.core.inter;

import android.app.Activity;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.model.EasyAdType;
import com.easyads.model.SdkSupplier;
import com.qq.e.ads.interstitial2.UnifiedInterstitialMediaListener;

public class EasyAdInterstitial extends EasyAdBaseAdspot implements EAInterstitialSetting {
    private EAInterstitialListener listener;
    private UnifiedInterstitialMediaListener ylhlistener;//优量汇视频加载情况监听器
    private float csjExpressViewWidth = 300;//穿山甲模板尺寸设置,单位dp
    private float csjExpressViewHeight = 300;
    private boolean isCsjNew = true;//是否为穿山甲"新插屏广告"


    public EasyAdInterstitial(Activity activity, EAInterstitialListener listener) {
        super(activity, listener);
        adType = EasyAdType.INTR;

        this.listener = listener;
    }

    @Override
    public void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_YLH, this);
            initAdapter(EasyAdsConstant.SDK_TAG_BAIDU, this);
            initAdapter(EasyAdsConstant.SDK_TAG_KS, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public void adapterDidClosed(SdkSupplier supplier) {
        updateSupplier("adapterDidClosed", supplier);
        if (null != listener) {
            listener.onAdClose();
        }
        destroy();
    }


    //期望模板广告view的size,单位dp;注意:参数请按照平台勾选的比例去进行请求。现有1:1,3:2 ,2:3 三种比例可供选择。
    public void setCsjExpressViewAcceptedSize(float expressViewWidth, float expressViewHeight) {
        this.csjExpressViewWidth = expressViewWidth;
        this.csjExpressViewHeight = expressViewHeight;
    }

    @Deprecated
    public void setCsjNew(boolean csjNew) {
        isCsjNew = csjNew;
    }

    public void setYlhMediaListener(UnifiedInterstitialMediaListener listener) {
        ylhlistener = listener;
    }

    public UnifiedInterstitialMediaListener getYlhMediaListener() {
        return ylhlistener;
    }


    public float getCsjExpressViewWidth() {
        return csjExpressViewWidth;
    }

    public float getCsjExpressViewHeight() {
        return csjExpressViewHeight;
    }


    @Override
    public boolean isCsjNew() {
        return isCsjNew;
    }


}


================================================
FILE: easyads/src/main/java/com/easyads/core/nati/EANativeExpressListener.java
================================================
package com.easyads.core.nati;

import com.easyads.itf.EABaseADListener;

public interface EANativeExpressListener extends EABaseADListener {
    void onAdRenderFailed();

    void onAdRenderSuccess();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/nati/EANativeExpressSetting.java
================================================
package com.easyads.core.nati;

import android.view.View;
import android.view.ViewGroup;

import com.easyads.itf.BaseAdapterEvent;
import com.easyads.model.SdkSupplier;

public interface EANativeExpressSetting extends BaseAdapterEvent {

    int getExpressViewWidth();

    int getExpressViewHeight();

    boolean isVideoMute();

    void adapterRenderFailed(SdkSupplier sdkSupplier);

    void adapterRenderSuccess(SdkSupplier sdkSupplier);

    void adapterDidClosed(SdkSupplier sdkSupplier);

    void setNativeExpressADView(View expressADView);

    int getYlhMaxVideoDuration();

    ViewGroup getAdContainer();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/nati/EasyAdNativeExpress.java
================================================
package com.easyads.core.nati;

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.model.EasyAdType;
import com.easyads.model.SdkSupplier;
import com.easyads.utils.EALog;
import com.easyads.utils.ScreenUtil;

public class EasyAdNativeExpress extends EasyAdBaseAdspot implements EANativeExpressSetting {
    private EANativeExpressListener listener;
    private int expressViewWidth = 600;//模板尺寸设置,单位dp
    private int expressViewHeight = 0;//模板尺寸设置,单位dp,高度为0 代表自适应高度
    private boolean videoMute = true; //视频静音,仅优量汇生效,穿山甲在后台中配置
    private int ylhMaxVideoDuration = 60;//优量汇最大视频时长,单位秒
    private ViewGroup adContainer; //广告承载布局
    private View expressADView; //广告的实际展示view信息,数据来源于广告SDK回调


    public EasyAdNativeExpress(Activity activity, EANativeExpressListener listener) {
        super(activity, listener);
        adType = EasyAdType.NATIV;

        this.listener = listener;
    }


    @Override
    public void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_YLH, this);
            initAdapter(EasyAdsConstant.SDK_TAG_BAIDU, this);
            initAdapter(EasyAdsConstant.SDK_TAG_KS, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    public void adapterDidClosed(SdkSupplier supplier) {
        updateSupplier("adapterDidClosed", supplier);
        if (null != listener) {
            listener.onAdClose();
        }
    }

    public void adapterRenderFailed(SdkSupplier supplier) {
        updateSupplier("adapterRenderFailed", supplier);
        if (null != listener) {
            listener.onAdRenderFailed();
        }
    }

    public void adapterRenderSuccess(SdkSupplier supplier) {
        updateSupplier("adapterRenderSuccess", supplier);
        if (null != listener) {
            listener.onAdRenderSuccess();
        }
    }

    @Override
    public void destroy() {
        super.destroy();
        try {
            if (adContainer != null) {
                adContainer.removeAllViews();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 个性化配置类参数设置
     */


    //   设置用来展示广告的父布局
    public void setAdContainer(ViewGroup container) {
        adContainer = container;

        try {
            adContainer.post(new Runnable() {
                @Override
                public void run() {
                    expressViewWidth = ScreenUtil.px2dip(getActivity(), adContainer.getWidth());
                    expressViewHeight = ScreenUtil.px2dip(getActivity(), adContainer.getHeight());
                    EALog.devDebug("set expressViewWidth as adContainer Width= " + expressViewWidth + " Height= " + expressViewHeight);
                }
            });
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    // 设置视频类广告是否默认静音,默认true
    public EasyAdNativeExpress setVideoMute(boolean mute) {
        this.videoMute = mute;
        return this;
    }

    public EasyAdNativeExpress setYlhMaxVideoDuration(int ylhMaxVideoDuration) {
        this.ylhMaxVideoDuration = ylhMaxVideoDuration;
        return this;
    }

    @Override
    public ViewGroup getAdContainer() {
        return adContainer;
    }

    @Override
    public void setNativeExpressADView(View expressADView) {
        this.expressADView = expressADView;
    }


    public int getExpressViewWidth() {
        return expressViewWidth;
    }

    public int getExpressViewHeight() {
        return expressViewHeight;
    }


    @Override
    public boolean isVideoMute() {
        return videoMute;
    }

    public int getYlhMaxVideoDuration() {
        return ylhMaxVideoDuration;
    }


    public View getExpressADView() {
        return expressADView;
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/core/reward/EARewardServerCallBackInf.java
================================================
package com.easyads.core.reward;

import java.util.Map;

public class EARewardServerCallBackInf {
    public boolean bdRewardVerify;
    public Map<String, Object> ylhRewardMap;

    public CsjRewardInf csjInf;

      public static class CsjRewardInf {
        public boolean rewardVerify;
        public int rewardAmount;
        public String rewardName;
        public int errorCode;
        public String errMsg;
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/core/reward/EARewardVideoListener.java
================================================
package com.easyads.core.reward;

import com.easyads.itf.EABaseADListener;

public interface EARewardVideoListener extends EABaseADListener {

    void onVideoCached();

    void onVideoComplete();

    void onVideoSkip();

    void onAdReward();

    //激励视频返回的服务器回调信息,穿山甲一直支持,优量汇自v4.330.1200 开始支持,百度9.13开始支持
    void onRewardServerInf(EARewardServerCallBackInf inf);
}


================================================
FILE: easyads/src/main/java/com/easyads/core/reward/EARewardVideoSetting.java
================================================
package com.easyads.core.reward;

import com.easyads.itf.BaseAdapterEvent;
import com.easyads.model.SdkSupplier;
import com.qq.e.ads.rewardvideo.ServerSideVerificationOptions;

public interface EARewardVideoSetting extends BaseAdapterEvent {

    void adapterVideoCached(SdkSupplier sdkSupplier);

    void adapterAdReward(SdkSupplier sdkSupplier);

    void adapterVideoSkipped(SdkSupplier sdkSupplier);

    void postRewardServerInf(EARewardServerCallBackInf inf, SdkSupplier sdkSupplier);

    void adapterVideoComplete(SdkSupplier sdkSupplier);

    void adapterDidClosed(SdkSupplier sdkSupplier);


    String getCsjRewardName();

    int getCsjRewardAmount();

    String getCsjUserId();

    int getCsjOrientation();

    String getCsjMediaExtra();

    boolean isYlhVolumeOn();


    ServerSideVerificationOptions getYlhSSVO();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/reward/EasyAdRewardVideo.java
================================================
package com.easyads.core.reward;

import android.app.Activity;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.model.EasyAdType;
import com.easyads.model.SdkSupplier;
import com.qq.e.ads.rewardvideo.ServerSideVerificationOptions;

public class EasyAdRewardVideo extends EasyAdBaseAdspot implements EARewardVideoSetting {
    private EARewardVideoListener listener;
    private int csjOrientation = ORIENTATION_VERTICAL; //屏幕方向,仅穿山甲支持
    private String csjRewardName = ""; //穿山甲奖励名称
    private String csjUserId = "";//穿山甲用户id
    private int csjRewardAmount = 1;//穿山甲奖励数量
    private String csjMediaExtra = "";//穿山甲媒体补充信息

    private boolean isYlhVO = false; //优量汇是否开启声音
    private ServerSideVerificationOptions ylhSSVO = null;  //优量汇服务端校验配置信息

    public static final int ORIENTATION_VERTICAL = 1;
    public static final int ORIENTATION_HORIZONTAL = 2;


    public EasyAdRewardVideo(Activity activity, EARewardVideoListener listener) {
        super(activity, listener);
        adType = EasyAdType.REWARD;

        this.listener = listener;
    }

    @Override
    public void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_YLH, this);
            initAdapter(EasyAdsConstant.SDK_TAG_BAIDU, this);
            initAdapter(EasyAdsConstant.SDK_TAG_KS, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    public void adapterVideoCached(SdkSupplier supplier) {
        updateSupplier("adapterVideoCached", supplier);
        if (null != listener) {
            listener.onVideoCached();
        }
    }

    public void adapterVideoComplete(SdkSupplier supplier) {
        updateSupplier("adapterVideoComplete", supplier);
        if (null != listener) {
            listener.onVideoComplete();
        }
    }

    public void adapterDidClosed(SdkSupplier supplier) {
        updateSupplier("adapterDidClosed", supplier);
        if (null != listener) {
            listener.onAdClose();
        }
    }

    public void adapterAdReward(SdkSupplier supplier) {
        updateSupplier("adapterAdReward", supplier);
        if (null != listener) {
            listener.onAdReward();
        }
    }

    public void adapterVideoSkipped(SdkSupplier supplier) {
        updateSupplier("adapterVideoSkipped", supplier);
        if (null != listener) {
            listener.onVideoSkip();
        }
    }

    @Override
    public void postRewardServerInf(EARewardServerCallBackInf inf, SdkSupplier supplier) {
        updateSupplier("postRewardServerInf", supplier);
        if (null != listener) {
            listener.onRewardServerInf(inf);
        }
    }

    public void setCsjRewardName(String rewardName) {
        this.csjRewardName = rewardName;

    }

    public void setCsjUserId(String userId) {
        this.csjUserId = userId;

    }

    public void setCsjRewardAmount(int rewardAmount) {
        this.csjRewardAmount = rewardAmount;

    }

    public void setCsjOrientation(int csjOrientation) {
        this.csjOrientation = csjOrientation;

    }

    public void setCsjMediaExtra(String mediaExtra) {
        this.csjMediaExtra = mediaExtra;
    }


    public void setYlhVolumeOn(boolean vo) {
        isYlhVO = vo;
    }

    public void setYlhSSVO(ServerSideVerificationOptions options){
        ylhSSVO = options;
    }

    @Override
    public boolean isYlhVolumeOn() {
        return isYlhVO;
    }

    public String getCsjMediaExtra() {
        return csjMediaExtra;
    }

    @Override
    public ServerSideVerificationOptions getYlhSSVO() {
        return ylhSSVO;
    }

    public int getCsjOrientation() {
        return csjOrientation;
    }

    public int getCsjRewardAmount() {
        return csjRewardAmount;
    }

    public String getCsjRewardName() {
        return csjRewardName;
    }

    public String getCsjUserId() {
        return csjUserId;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/core/splash/EASplashLifeCallback.java
================================================
package com.easyads.core.splash;

public interface EASplashLifeCallback {
    void onResume();

    void onPause();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/splash/EASplashListener.java
================================================
package com.easyads.core.splash;

import com.easyads.itf.EABaseADListener;

public interface EASplashListener extends EABaseADListener {

}


================================================
FILE: easyads/src/main/java/com/easyads/core/splash/EASplashSetting.java
================================================
package com.easyads.core.splash;

import android.view.ViewGroup;

import com.easyads.itf.BaseAdapterEvent;
import com.easyads.model.SdkSupplier;

public interface EASplashSetting extends BaseAdapterEvent {

    int getCsjAcceptedSizeWidth();

    int getCsjAcceptedSizeHeight();

    float getCsjExpressViewWidth();

    float getCsjExpressViewHeight();

    boolean getCsjShowAsExpress();

    void adapterDidSkip(SdkSupplier sdkSupplier);

    void adapterDidTimeOver(SdkSupplier sdkSupplier);

    ViewGroup getAdContainer();

    boolean isShowInSingleActivity();
}


================================================
FILE: easyads/src/main/java/com/easyads/core/splash/EasyAdSplash.java
================================================
package com.easyads.core.splash;

import android.app.Activity;
import android.text.TextUtils;
import android.view.ViewGroup;

import com.easyads.EasyAdsConstant;
import com.easyads.core.EasyAdBaseAdspot;
import com.easyads.itf.BaseEnsureListener;
import com.easyads.model.EasyAdType;
import com.easyads.model.SdkSupplier;
import com.easyads.utils.EAUtil;
import com.easyads.utils.EALog;
import com.easyads.utils.ScreenUtil;


public class EasyAdSplash extends EasyAdBaseAdspot implements EASplashSetting {
    private EASplashListener listener;
    private ViewGroup adContainer;
    //穿山甲尺寸,单位px
    private int csjAcceptedSizeWidth = 1080;
    private int csjAcceptedSizeHeight = 1920;
    //穿山甲模板宽高,单位dp
    private float csjExpressViewWidth = 360;
    private float csjExpressViewHeight = 640;
    private String failed_waring = "当前渠道(%1$s)已失败,等待后续渠道结果";

    private boolean csjShowAsExpress = false; //设置穿山甲广告是否以个性化模板形式加载广告
    private boolean canJump = false; //内部控制变量,是否可以进行广告跳转
    private boolean showInSingleActivity = true;//APP实现是否为单独activity中展示开屏广告

    public boolean isADSkip = false;//用来判断用户是否选择了跳过广告


    public EasyAdSplash(final Activity activity, final ViewGroup adContainer, EASplashListener listener) {
        super(activity, listener);
        this.adContainer = adContainer;
        this.listener = listener;
        try {
            //赋值ad类型
            adType = EasyAdType.SPLASH;
            splashLifeCallback = new EASplashLifeCallback() {
                @Override
                public void onResume() {
                    if (canJump) {
                        doJump();
                    }
                    canJump = true;
                }

                @Override
                public void onPause() {
                    canJump = TextUtils.equals(currentSdkTag, EasyAdsConstant.SDK_TAG_CSJ);
                }
            };


            adContainer.post(new Runnable() {
                @Override
                public void run() {
                    csjAcceptedSizeWidth = adContainer.getWidth();
                    csjAcceptedSizeHeight = adContainer.getHeight();

                    csjExpressViewWidth = ScreenUtil.px2dip(activity, adContainer.getWidth());
                    csjExpressViewHeight = ScreenUtil.px2dip(activity, adContainer.getHeight());
                    EALog.devDebug("set expressViewWidth as adContainer Width= " + csjExpressViewWidth + " Height= " + csjExpressViewHeight);

                }
            });

        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    public void initSdkSupplier() {
        try {
            initAdapter(EasyAdsConstant.SDK_TAG_CSJ, this);
            initAdapter(EasyAdsConstant.SDK_TAG_YLH, this);
            initAdapter(EasyAdsConstant.SDK_TAG_BAIDU, this);
            initAdapter(EasyAdsConstant.SDK_TAG_KS, this);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    @Override
    public void startLoad() {
        canJump = false;
        super.startLoad();
    }


    /**
     * 统一处理跳转逻辑
     */
    private void doJump() {
        try {
            BaseEnsureListener ensureListener = new BaseEnsureListener() {
                @Override
                public void ensure() {
                    EALog.high("[EasyAdSplash] canJump = " + canJump);
                    if (canJump) {
                        if (listener != null)
                            listener.onAdClose();
                    } else {
                        canJump = true;
                    }
                }
            };
            EAUtil.switchMainThread(ensureListener);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    @Override
    public void adapterDidExposure(SdkSupplier supplier) {
        super.adapterDidExposure(supplier);
        //防止无法跳转
        canJump = true;
    }

    public void adapterDidSkip(SdkSupplier supplier) {
        updateSupplier("adapterDidSkip", supplier);

        if (supplier != null && supplier.adStatus == EasyAdsConstant.AD_STATUS_LOAD_FAILED) {
            EALog.w(String.format(failed_waring,supplier.tag));
            return;
        }
        isADSkip = true;
        doJump();
    }

    public void adapterDidTimeOver(SdkSupplier supplier) {
        updateSupplier("adapterDidTimeOver", supplier);

        if (supplier != null && supplier.adStatus == EasyAdsConstant.AD_STATUS_LOAD_FAILED) {
            EALog.w(String.format(failed_waring,supplier.tag));
            return;
        }
        isADSkip = false;
        doJump();
    }


    /**
     * 开屏位置公共属性的获取和赋值
     */
    public boolean isShowInSingleActivity() {
        return showInSingleActivity;
    }

    public void setShowInSingleActivity(boolean single) {
        showInSingleActivity = single;
        canJump = single;
    }

    /**
     * 设置穿山甲是否为模板开屏类型
     *
     * @param isExpress 模板标志,true为模板
     */
    public void setCsjShowAsExpress(boolean isExpress) {
        csjShowAsExpress = isExpress;
    }

    public boolean getCsjShowAsExpress() {
        return csjShowAsExpress;
    }

    public int getCsjAcceptedSizeWidth() {
        return csjAcceptedSizeWidth;
    }

    public int getCsjAcceptedSizeHeight() {
        return csjAcceptedSizeHeight;
    }

    public float getCsjExpressViewWidth() {
        return csjExpressViewWidth;
    }

    public float getCsjExpressViewHeight() {
        return csjExpressViewHeight;
    }

    @Override
    public ViewGroup getAdContainer() {
        return adContainer;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EABannerCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.itf.BaseAdapterEvent;

import java.lang.ref.SoftReference;

public abstract class EABannerCustomAdapter extends EABaseSupplierAdapter {

    public EABannerCustomAdapter(SoftReference<Activity> softReferenceActivity, BaseAdapterEvent baseListener) {
        super(softReferenceActivity, baseListener);
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EADrawCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.draw.EADrawSetting;
import com.easyads.model.EasyAdError;
import com.easyads.utils.EALog;

import java.lang.ref.SoftReference;

public abstract class EADrawCustomAdapter extends EABaseSupplierAdapter {
    protected EADrawSetting mDrawSetting;

    public EADrawCustomAdapter(SoftReference<Activity> activity, EADrawSetting setting) {
        super(activity, setting);
        this.mDrawSetting = setting;
    }


    public boolean addADView(View adView) {
        boolean hasAdded = false;
        try {
            if (mDrawSetting != null) {
                ViewGroup adC = mDrawSetting.getContainer();
                if (adC != null) {
                    adC.removeAllViews();
                    if (adView != null) {
                        ViewParent parent = adView.getParent();
                        if (parent != null) {
                            ((ViewGroup) parent).removeView(adView);
                        }
                    }
                    adC.addView(adView);
                    hasAdded = true;
                } else {
                    EALog.e(TAG + "无法展示广告,原因:未设置广告承载布局,请检查 setAdContainer(ViewGroup adContainer) 方法是否有赋值");
                }
            } else {
                EALog.e(TAG + "无法展示广告,原因:内部处理异常,mDrawSetting 为空");
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
        if (!hasAdded) {
            handleFailed(EasyAdError.ERROR_RENDER_FAILED, "添加广告视图操作失败");
        } else {
            EALog.simple(TAG + "ADView has Added");
        }
        return hasAdded;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EAFullScreenCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.full.EAFullScreenVideoSetting;

import java.lang.ref.SoftReference;

public abstract class EAFullScreenCustomAdapter extends EABaseSupplierAdapter {
    EAFullScreenVideoSetting mFullSetting;

    public EAFullScreenCustomAdapter(SoftReference<Activity> activity, EAFullScreenVideoSetting setting) {
        super(activity, setting);
        mFullSetting = setting;
    }

    public void handleCached() {
        try {
            if (null != mFullSetting) {
                mFullSetting.adapterVideoCached(sdkSupplier);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EAInterstitialCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.inter.EAInterstitialSetting;

import java.lang.ref.SoftReference;

public abstract class EAInterstitialCustomAdapter extends EABaseSupplierAdapter {
    EAInterstitialSetting mInterSetting;

    public EAInterstitialCustomAdapter(SoftReference<Activity> activity, EAInterstitialSetting setting) {
        super(activity, setting);
        mInterSetting = setting;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EANativeExpressCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.nati.EANativeExpressSetting;
import com.easyads.utils.EALog;

import java.lang.ref.SoftReference;

public abstract class EANativeExpressCustomAdapter extends EABaseSupplierAdapter {
    EANativeExpressSetting mNativeSetting;

    public EANativeExpressCustomAdapter(SoftReference<Activity> activity, EANativeExpressSetting baseSetting) {
        super(activity, baseSetting);
        mNativeSetting = baseSetting;
    }

    public void addADView(View adView) {
        try {
            ViewGroup adContainer = mNativeSetting.getAdContainer();
            if (adContainer == null) {
                EALog.e("adContainer 不存在,请先调用setAdContainer() 方法设置adContainer");
                return;
            }
            if (adContainer.getChildCount() > 0
                    && adContainer.getChildAt(0) == adView) {
                EALog.high("已添加的布局");
                return;
            }
            if (adContainer.getChildCount() > 0) {
                adContainer.removeAllViews();
            }
            if (adView != null) {
                if (adView.getParent() != null) {
                    ((ViewGroup) adView.getParent()).removeView(adView);
                }
                adContainer.setVisibility(View.VISIBLE);
                EALog.max("add adContainer = " + adContainer.toString());
                // 广告可见才会产生曝光,否则将无法产生收益。
                adContainer.addView(adView);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public void removeADView() {
        try {
            ViewGroup adContainer = mNativeSetting.getAdContainer();
            if (adContainer == null) {
                EALog.e("adContainer 不存在");
                return;
            }
            EALog.max("remove adContainer = " + adContainer.toString());

            adContainer.removeAllViews();
            setNEView(null);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public void setNEView(View view) {
        try {
            if (view == null) {
                return;
            }
            mNativeSetting.setNativeExpressADView(view);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EARewardCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.reward.EARewardVideoSetting;

import java.lang.ref.SoftReference;

public abstract class EARewardCustomAdapter extends EABaseSupplierAdapter {
    public EARewardVideoSetting rewardSetting;

    public EARewardCustomAdapter(SoftReference<Activity> softReferenceActivity, EARewardVideoSetting setting) {
        super(softReferenceActivity, setting);
        this.rewardSetting = setting;
    }


    public void handleCached() {
        try {
            if (null != rewardSetting) {
                rewardSetting.adapterVideoCached(sdkSupplier);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/custom/EASplashCustomAdapter.java
================================================
package com.easyads.custom;

import android.app.Activity;
import android.view.ViewGroup;

import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.splash.EASplashSetting;

import java.lang.ref.SoftReference;

public abstract class EASplashCustomAdapter extends EABaseSupplierAdapter {
    public EASplashSetting mSplashSetting;
    public ViewGroup adContainer;

    public EASplashCustomAdapter(SoftReference<Activity> activity, final EASplashSetting setting) {
        super(activity, setting);
        this.mSplashSetting = setting;
        try {
            if (setting != null) {
                adContainer = setting.getAdContainer();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }



}


================================================
FILE: easyads/src/main/java/com/easyads/itf/AdCoreAction.java
================================================
package com.easyads.itf;

/**
 * 广告加载核心调用方法,对外聚合调用和内部adapter调用,方法命名一致
 */
public interface AdCoreAction {
    void loadOnly();

    void show();

    void loadAndShow();

    void destroy();
}


================================================
FILE: easyads/src/main/java/com/easyads/itf/BaseAdapterEvent.java
================================================
package com.easyads.itf;

import com.easyads.model.EasyAdError;
import com.easyads.model.SdkSupplier;

/**
 * adapter 处理基类,所有的广告adapter必须实现的方法
 */
public interface BaseAdapterEvent {
    void adapterDidSucceed(SdkSupplier supplier);

    void adapterDidExposure(SdkSupplier supplier);

    void adapterDidClicked(SdkSupplier supplier);

    void adapterDidFailed(EasyAdError easyAdError, SdkSupplier sdkSupplier);//聚合失败回调,回传sdkSupplier信息

    SdkSupplier getSupplierInf(); //获取当前的渠道策略信息
}


================================================
FILE: easyads/src/main/java/com/easyads/itf/BaseEnsureListener.java
================================================
package com.easyads.itf;

public interface BaseEnsureListener {
    void ensure();
}


================================================
FILE: easyads/src/main/java/com/easyads/itf/EABaseADListener.java
================================================
package com.easyads.itf;

import com.easyads.model.EasyAdError;

public interface EABaseADListener {
    void onAdSucceed();//成功加载到广告

    void onAdExposure();//广告曝光

    void onAdClicked();//广告点击

    void onAdClose();//广告关闭

    void onAdFailed(EasyAdError easyAdError);//广告失败
}


================================================
FILE: easyads/src/main/java/com/easyads/model/EALogLevel.java
================================================
package com.easyads.model;

public enum EALogLevel {
    /**
     * 可以自定义级别,level值越大,打印的信息越多。
     */
    CUSTOM(-1),
    /**
     * 不打印任何log
     */
    NONE(0),
    /**
     * 默认等级,等于SIMPLE等级,打印SDK核心方法日志信息
     */
    DEFAULT(1),
    /**
     * 基础等级,打印SDK核心方法日志信息,方便普通的接入者查看接入效果
     */
    SIMPLE(2),
    /**
     * 高级模式,可打印一些辅助判断的执行信息,方便排查问题
     */
    HIGH(3),
    /**
     * 最大等级,可打印全部信息,比较详细的看到SDK执行信息,用来定位错误信息
     */
    MAX(10),
    ;


    EALogLevel(int ni) {
        level = ni;
    }

    public int level; //日志级别
}


================================================
FILE: easyads/src/main/java/com/easyads/model/EasyAdError.java
================================================
package com.easyads.model;

import android.support.annotation.NonNull;

public class EasyAdError {

    public static final String ERROR_DEFAULT = "99";

    public static final String ERROR_DATA_NULL = "9901"; //广告返回的数据为空
    public static final String ERROR_EXCEPTION_LOAD = "9902";
    public static final String ERROR_EXCEPTION_SHOW = "9903";
    public static final String ERROR_EXCEPTION_RENDER = "9904";//
    public static final String ERROR_NONE_SDK = "9905";//未配置SDK渠道
    public static final String ERROR_SUPPLIER_SELECT = "9906"; //执行SDK渠道选择是发生异常
    public static final String ERROR_NONE_STRATEGY = "9907";
    public static final String ERROR_LOAD_SDK = "9908";
    public static final String ERROR_CSJ_SKIP = "9909";
    public static final String ERROR_CSJ_TIMEOUT = "9910";
    public static final String ERROR_BD_FAILED = "9911";
    public static final String ERROR_PARAM_FORMAT = "9912"; //参数异常
    public static final String ERROR_NO_ACTIVITY = "9913"; //无activity异常
    public static final String ERROR_KS_INIT = "9914"; //快手初始化异常
    public static final String ERROR_RENDER_FAILED = "9915"; //渲染失败异常
    public static final String ERROR_CSJ_INIT_FAILED = "9916"; //穿山甲初始化失败异常


    public EasyAdError(String code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public String code;
    public String msg;


    public static EasyAdError parseErr(int code) {
        return parseErr(code + "");
    }

    public static EasyAdError parseErr(String code) {
        return parseErr(code, "");
    }

    public static EasyAdError parseErr(int code, String extMsg) {
        return parseErr(code + "", extMsg);
    }

    public static EasyAdError parseErr(String code, String extMsg) {
        EasyAdError error;
        switch (code) {
            case ERROR_DATA_NULL:
                error = new EasyAdError(code, "data null ;" + extMsg);
                break;
            case ERROR_EXCEPTION_LOAD:
                error = new EasyAdError(code, "exception when load ;view System.err log for more " + extMsg);
                break;
            case ERROR_EXCEPTION_SHOW:
                error = new EasyAdError(code, "exception when show ;view System.err log for more  " + extMsg);
                break;
            case ERROR_EXCEPTION_RENDER:
                error = new EasyAdError(code, "exception when render ;view System.err log for more  " + extMsg);
                break;
            case ERROR_NONE_STRATEGY:
                error = new EasyAdError(code, "None Strategy Info: please check setData() function.  " + extMsg);
                break;
            case ERROR_NONE_SDK:
                error = new EasyAdError(code, "none sdk to show ;" + extMsg);
                break;
            case ERROR_SUPPLIER_SELECT:
                error = new EasyAdError(code, "策略调度异常,selectSdkSupplier Throwable ;" + extMsg);
                break;
            case ERROR_LOAD_SDK:
                error = new EasyAdError(code, "sdk 启动异常  " + extMsg);
                break;
            case ERROR_CSJ_SKIP:
                error = new EasyAdError(code, "穿山甲SDK加载超时,不再加载后续SDK渠道  " + extMsg);
                break;
            case ERROR_CSJ_TIMEOUT:
                error = new EasyAdError(code, "穿山甲SDK加载超时  " + extMsg);
                break;
            case ERROR_BD_FAILED:
                error = new EasyAdError(code, "百度SDK加载失败  " + extMsg);
                break;
            case ERROR_PARAM_FORMAT:
                error = new EasyAdError(code, "快手SDK加载失败,广告位id类型转换异常  " + extMsg);
                break;
            case ERROR_NO_ACTIVITY:
                error = new EasyAdError(code, "当前activity已被销毁,不再请求广告  " + extMsg);
                break;
            case ERROR_KS_INIT:
                error = new EasyAdError(code, "快手SDK初始化失败  " + extMsg);
                break;
            case ERROR_RENDER_FAILED:
                error = new EasyAdError(code, "广告渲染失败  " + extMsg);
                break;
            case ERROR_CSJ_INIT_FAILED:
                error = new EasyAdError(code, "穿山甲SDK初始化失败  " + extMsg);
                break;

            default:
                //优量汇的详细异常码
                String extCode = "";
                try {
                    if ("6000".equals(code) && !extMsg.isEmpty()) {
                        int startIndex = extMsg.lastIndexOf("详细码") + 4;
                        extCode = extMsg.substring(startIndex, startIndex + 6);
                    }
                } catch (Throwable e) {
                    e.printStackTrace();
                }
                error = new EasyAdError(ERROR_DEFAULT + "_" + code + extCode, "err from sdk callback : [" + code + "] " + extMsg);
        }


        return error;
    }

    @NonNull
    @Override
    public String toString() {
        return "[EasyAdError] errorCode = " + code + " ; errorMsg = " + msg;
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/model/EasyAdType.java
================================================
package com.easyads.model;

/**
 * 广告类型
 */
public enum EasyAdType {

    SPLASH("Splash"),
    BANNER("Banner"),
    INTR("Interstitial"),
    NATIV("NativeExpress"),
    REWARD("RewardVideo"),
    DRAW("Draw"),
    FULL("FullScreenVideo");

    EasyAdType(String ni) {
        name = ni;
    }

    public String name;
}


================================================
FILE: easyads/src/main/java/com/easyads/model/SdkRule.java
================================================
package com.easyads.model;

import com.easyads.EasyAdsConstant;

import java.io.Serializable;
import java.util.ArrayList;

//SDK的加载规则
public class SdkRule implements Serializable {

    public String tag = ""; // 策略组标记
    public ArrayList<Integer> sort = new ArrayList<>();//广告加载index排序组,优先级由高到低依次排序
    public double percent = EasyAdsConstant.DEFAULT_PERCENT;//使用当前规则的概率,建议使用百分值

    public int lowLimit = 0;//下限,用来计算是否命中当前策略组
    public int highLimit = 0;//上限,用来计算是否命中当前策略组

    public ArrayList<SdkSupplier> sortedSuppliers = new ArrayList<>(); //排序后的可执行的渠道列表

}


================================================
FILE: easyads/src/main/java/com/easyads/model/SdkSupplier.java
================================================
package com.easyads.model;

import com.easyads.EasyAdsConstant;

import java.io.Serializable;

public class SdkSupplier implements Comparable<SdkSupplier>, Serializable {
    public String adspotId; //SDK广告位id
    public String appId; //SDK应用id
    public String tag = ""; //SDK标记

    public int index = -1;//坐标标记
    public int versionTag = -1;//版本标记,预留字段,主要为了区分相同广告类型的不同版本

    public String ruleTag = "";//当前渠道所在的策略组标记
    public int priority = 1; //优先级,根据策略设定,进行优先级概念的定义,值越小代表优先级越靠前

    public int adStatus = EasyAdsConstant.AD_STATUS_DEFAULT; //广告加载状态标记

    @Override
    public int compareTo(SdkSupplier o) {
        if (this.priority < o.priority) {
            return -1;
        } else if (this.priority == o.priority) {
            return 0;
        } else {
            return 1;
        }
    }

    @Override
    public String toString() {
        return "SdkSupplier{" +
                "ruleTag='" + ruleTag + '\'' +
                ", tag='" + tag + '\'' +
                ", priority=" + priority +
                ", adspotid='" + adspotId + '\'' +
                ", appid='" + appId + '\'' +
                ", versionTag=" + versionTag +
                ", adStatus=" + adStatus +
                '}';
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/model/StrategyModel.java
================================================
package com.easyads.model;

import com.easyads.EasyAdsConstant;
import com.easyads.utils.BigDecimalUtil;
import com.easyads.utils.EALog;

import org.json.JSONArray;
import org.json.JSONObject;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;

/**
 * 所有策略信息model,包含所有的广告渠道信息和加载策略
 */
public class StrategyModel implements Serializable {
    public HashMap<Integer, SdkSupplier> supplierMap = new HashMap<>();
    public ArrayList<SdkRule> rules = new ArrayList<>();
    public double sumPercent = 0;//概率值总和


    /**
     * 将约定格式的json结构转换为当前model,解析成可执行的策略信息,用于后续策略执行、调度
     *
     * @param json 一定要完全参考demo示例中的json格式
     * @return SDK可执行的策略信息
     */
    public static StrategyModel covert(String json) {
        StrategyModel strategyModel = new StrategyModel();
        try {
            JSONObject result = new JSONObject(json);

            JSONArray suppliers = result.getJSONArray("suppliers");
            JSONArray setting = result.getJSONArray("rules");

            strategyModel.rules = new ArrayList<>();
            strategyModel.supplierMap = new HashMap<>();

            for (int i = 0; i < suppliers.length(); i++) {
                SdkSupplier supplier = new SdkSupplier();
                JSONObject impObject = suppliers.getJSONObject(i);
                supplier.tag = impObject.optString("tag");
                supplier.adspotId = impObject.optString("adspotId");
                supplier.appId = impObject.optString("appId");
                supplier.index = impObject.optInt("index");
                strategyModel.supplierMap.put(supplier.index, supplier);
            }

            for (int i = 0; i < setting.length(); i++) {
                SdkRule rule = new SdkRule();
                JSONObject impObject = setting.getJSONObject(i);
                rule.tag = impObject.optString("tag");
                rule.percent = impObject.optDouble("percent", EasyAdsConstant.DEFAULT_PERCENT);
                //累加百分值
                strategyModel.sumPercent = BigDecimalUtil.add(strategyModel.sumPercent, rule.percent);

                JSONArray sortList = impObject.optJSONArray("sort");
                if (sortList != null) {
                    rule.sort = new ArrayList<>();
                    //存放排好序后的广告组
                    rule.sortedSuppliers = new ArrayList<>();

                    //依次查找sort中元素
                    for (int j = 0; j < sortList.length(); j++) {
                        int index = sortList.optInt(j);
                        rule.sort.add(index);

                        //从已有的渠道map中找到对应index的渠道,依次添加至排序列表中
                        SdkSupplier sourceSupplier = strategyModel.supplierMap.get(index);
                        if (sourceSupplier != null) {
                            //需要新建对象,不可直接使用sourceSupplier内容,否则如果相同的index在不同的rule组时,会出现引用源错乱问题。
                            SdkSupplier supplier = new SdkSupplier();
                            //赋值优先级,按照for循环执行顺序,起始值1
                            supplier.priority = j + 1;
                            supplier.ruleTag = rule.tag;

                            //需要依次把对应值重新赋值
                            supplier.tag = sourceSupplier.tag;
                            supplier.adspotId = sourceSupplier.adspotId;
                            supplier.appId = sourceSupplier.appId;
                            supplier.index = sourceSupplier.index;
                            supplier.versionTag = sourceSupplier.versionTag;
                            EALog.max("[StrategyModel_covert] 已完成解析的渠道:" + supplier.toString());
                            rule.sortedSuppliers.add(supplier);
                        }
                    }
                }
                strategyModel.rules.add(rule);
            }

        } catch (Throwable e) {
            e.printStackTrace();
        }
        return strategyModel;
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/utils/BigDecimalUtil.java
================================================
package com.easyads.utils;

import java.math.BigDecimal;

public class BigDecimalUtil {
    /**
     * 提供精确加法计算的add方法
     *
     * @param value1 被加数
     * @param value2 加数
     * @return 两个参数的和
     */
    public static double add(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确减法运算的sub方法
     *
     * @param value1 被减数
     * @param value2 减数
     * @return 两个参数的差
     */
    public static double sub(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确乘法运算的mul方法
     *
     * @param value1 被乘数
     * @param value2 乘数
     * @return 两个参数的积,结果保留两位小数
     */
    public static double mul(double value1, double value2) {
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.multiply(b2).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
    }


    public static double div(double value1, double value2) {
        return div(value1, value2, 0);
    }

    /**
     * 提供精确的除法运算方法div
     *
     * == value1(分子)除以value2(分母)
     *
     * @param value1 被除数
     * @param value2 除数
     * @param scale  精确范围
     * @return 两个参数的商
     */
    public static double div(double value1, double value2, int scale) {
        //如果精确范围小于0,抛出异常信息
        if (scale < 0) {
            scale = 0;
        }
        BigDecimal b1 = new BigDecimal(value1);
        BigDecimal b2 = new BigDecimal(value2);
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}

================================================
FILE: easyads/src/main/java/com/easyads/utils/EAAdapterLoader.java
================================================
package com.easyads.utils;

import android.app.Activity;

import com.easyads.EasyAdsConstant;
import com.easyads.core.draw.EADrawSetting;
import com.easyads.core.banner.EABannerSetting;
import com.easyads.core.EABaseSupplierAdapter;
import com.easyads.core.full.EAFullScreenVideoSetting;
import com.easyads.core.inter.EAInterstitialSetting;
import com.easyads.core.nati.EANativeExpressSetting;
import com.easyads.core.reward.EARewardVideoSetting;
import com.easyads.core.splash.EASplashSetting;
import com.easyads.model.EasyAdType;

import java.lang.ref.SoftReference;
import java.lang.reflect.Constructor;

/**
 * 通过反射的方式获取对应渠道的各个广告位初始化方法,
 */
public class EAAdapterLoader {


    public static String BASE_ADAPTER_PKG_PATH = "com.easyads.supplier.";

    /**
     * 利用反射获取渠道adapter
     *
     * @param sdkTag         渠道标志
     * @param adType         广告类型
     * @param activity       软引用上下文
     * @param parameterTypes 实体类
     * @return 渠道adapter适配器
     */
    public static EABaseSupplierAdapter getSDKLoader(String sdkTag, EasyAdType adType, SoftReference<Activity> activity, Object parameterTypes) {
        try {
            Class sdkClz = null;
            String namePath = "";
            //根据tag添加对应adapter类信息的路径
            switch (sdkTag) {
                case EasyAdsConstant.SDK_TAG_CSJ:
                    namePath = "csj.Csj";
                    break;
                case EasyAdsConstant.SDK_TAG_YLH:
                    namePath = "ylh.Ylh";
                    break;
                case EasyAdsConstant.SDK_TAG_BAIDU:
                    namePath = "baidu.BD";
                    break;
                case EasyAdsConstant.SDK_TAG_KS:
                    namePath = "ks.KS";
                    break;
            }
            namePath = namePath + adType.name + "Adapter";

            //根据广告类型使用对应的接口参数
            switch (adType) {
                case DRAW:
                    sdkClz = EADrawSetting.class;
                    break;
                case FULL:
                    sdkClz = EAFullScreenVideoSetting.class;
                    break;
                case SPLASH:
                    sdkClz = EASplashSetting.class;
                    break;
                case BANNER:
                    sdkClz = EABannerSetting.class;
                    break;
                case REWARD:
                    sdkClz = EARewardVideoSetting.class;
                    break;
                case INTR:
                    sdkClz = EAInterstitialSetting.class;
                    break;
                case NATIV:
                    sdkClz = EANativeExpressSetting.class;
                    break;
            }

            return getSDKAdapter(namePath, activity, sdkClz, parameterTypes);
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;

    }


    /**
     * 弱引用初始化广告的反射获取方法
     *
     * @param clzName
     * @param activity
     * @param parClz
     * @param parameterTypes
     * @return
     */
    private static EABaseSupplierAdapter getSDKAdapter(String clzName, SoftReference<Activity> activity, Class parClz, Object... parameterTypes) {
        EABaseSupplierAdapter result = null;
        try {
            String fullClzName = BASE_ADAPTER_PKG_PATH + clzName;
            Class clz = Class.forName(fullClzName);
            Object par1;
            if (parameterTypes.length > 0) {
                par1 = parameterTypes[0];
                Constructor cons1 = clz.getConstructor(SoftReference.class, parClz);
                result = (EABaseSupplierAdapter) cons1.newInstance(activity, par1);
                if (result != null)
                    EALog.devDebug("反射获取SDK渠道adapter类,已完成: " + result.toString());
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }

        return result;
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/utils/EALog.java
================================================
package com.easyads.utils;

import android.util.Log;

import com.easyads.EasyAdsManger;
import com.easyads.model.EALogLevel;

import java.io.PrintWriter;
import java.io.StringWriter;

public class EALog {
    private static String LOG = "EasyAds-log";

    public static void d(String s) {
        if (isDebug()) {
            Log.d(LOG, s);
        }
    }

    //打印核心信息
    public static void simple(String s) {
        if (isDebug() && showSimpleLog()) {
            Log.d(LOG, "" + s);
        }
    }

    //打印调试用信息
    public static void high(String s) {
        if (isDebug() && showHighLog()) {
            Log.d(LOG, "[H] " + s);
        }
    }

    //打印全部可用信息
    public static void max(String s) {
        if (isDebug() && showAllLog()) {
            Log.d(LOG, "[A] " + s);
        }
    }

    public static void devDebug(String devText) {
        if (EasyAdsManger.getInstance().isDev && EasyAdsManger.getInstance().debug) {
            Log.d(LOG, "[dev] " + devText);
        }
    }

    public static void devDebugAuto(String devText, String debugText) {
        try {
            if (isDebug()) {
                String lt;
                if (EasyAdsManger.getInstance().isDev) {
                    lt = "[dev] " + devText + debugText;
                } else {
                    lt = debugText;
                }
                Log.d(LOG, lt);
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }

    }

    public static void w(String s) {
        if (isDebug()) {
            Log.w(LOG, s);
        }
    }

    public static void e(String s) {
        if (isDebug()) {
            Log.e(LOG, s);
        }
    }

    public static boolean isDebug() {
        return EasyAdsManger.getInstance().debug;
    }

    //是否可以显示基础等级log
    public static boolean showSimpleLog() {
        return EasyAdsManger.getInstance().logLevel.level >= EALogLevel.DEFAULT.level;
    }

    //是否可以显示高级log信息
    public static boolean showHighLog() {
        return EasyAdsManger.getInstance().logLevel.level >= EALogLevel.HIGH.level;
    }

    //是否可以显示全部log
    public static boolean showAllLog() {
        return EasyAdsManger.getInstance().logLevel.level >= EALogLevel.MAX.level;
    }

    //打印错误信息
    public static String getThrowableLog(Throwable paramThrowable) {
        StringWriter localStringWriter = null;
        PrintWriter localPrintWriter = null;
        try {
            localStringWriter = new StringWriter();
            localPrintWriter = new PrintWriter(localStringWriter);
            paramThrowable.printStackTrace(localPrintWriter);
            for (Throwable localThrowable = paramThrowable.getCause(); localThrowable != null; localThrowable = localThrowable.getCause())
                localThrowable.printStackTrace(localPrintWriter);
            String str = localStringWriter.toString();
            localPrintWriter.close();
            return str;
        } catch (Throwable e2) {
            return "";
        } finally {
            try {
                if (localStringWriter != null)
                    localStringWriter.close();
                if (localPrintWriter != null)
                    localPrintWriter.close();
            } catch (Throwable ignored) {
            }
        }
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/utils/EASplashPlusManager.java
================================================
package com.easyads.utils;

import android.app.Activity;

import com.easyads.EasyAdsConstant;
import com.easyads.EasyAdsManger;

public class EASplashPlusManager {

    public static void startZoom(Activity activity) {
        try {
            if (EasyAdsManger.getInstance().isSplashSupportZoomOut) {
                String sdkId = EasyAdsManger.getInstance().currentSupTag;
                ZoomCall call = null;
                switch (sdkId) {
                    case EasyAdsConstant.SDK_TAG_YLH:
                        call = reflectZoomMethod("ylh.YlhUtil");
                        break;
                    case EasyAdsConstant.SDK_TAG_CSJ:
                        call = reflectZoomMethod("csj.CsjUtil");
                        break;
                    case EasyAdsConstant.SDK_TAG_KS:
                        call = reflectZoomMethod("ks.KSUtil");
                        break;
                    case EasyAdsConstant.SDK_TAG_BAIDU:
                        call = reflectZoomMethod("baidu.BDUtil");
                        break;
                }

                if (call != null) {
                    call.zoomOut(activity);
                }
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    private static ZoomCall reflectZoomMethod(String supClzName) {
        ZoomCall zoomCall = null;
        try {
            Class clz = Class.forName(EAAdapterLoader.BASE_ADAPTER_PKG_PATH + supClzName);
            zoomCall = (ZoomCall) clz.newInstance();
            if (zoomCall != null)
                EALog.devDebug("reflectZoomMethod result = " + zoomCall.toString());
        } catch (Throwable e) {
            e.printStackTrace();
        }

        return zoomCall;
    }


    public interface ZoomCall {
        void zoomOut(Activity activity);
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/utils/EASplashZoomOutLayout.java
================================================
package com.easyads.utils;

import android.content.Context;
import android.graphics.drawable.GradientDrawable;
import android.os.Build;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;

public class EASplashZoomOutLayout extends FrameLayout {
    private float dX, dY;
    private int margin;
    private int maxX;
    private int maxY;

    private float moveAccumulateX, moveAccumulateY;
    private final int touchSlop;//拖动和点击的触发阈值,采用系统的参数,超过该值认为是拖动,低于认为是点击

    public EASplashZoomOutLayout(Context context, int m) {
        super(context);
        //设置悬浮窗的圆角
        GradientDrawable gd = new GradientDrawable();
        gd.setCornerRadius(10);
        this.setBackgroundDrawable(gd);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            setClipToOutline(true);
        }
        this.margin = m;
        touchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        this.post(new Runnable() {
            @Override
            public void run() {
                View parent = (View) getParent();
                if (parent == null) {
                    return;
                }
                int parentWidth = parent.getWidth();
                int parentHeight = parent.getHeight();
                maxY = parentHeight - EASplashZoomOutLayout.this.getHeight() - margin;
                maxX = parentWidth - EASplashZoomOutLayout.this.getWidth() - margin;
            }
        });
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                dX = getX() - event.getRawX();
                dY = getY() - event.getRawY();
                moveAccumulateX = 0;
                moveAccumulateY = 0;
                break;

            case MotionEvent.ACTION_MOVE:
                float newX = event.getRawX() + dX;
                float newY = event.getRawY() + dY;

                //这里采用累积,防止转一圈回到起点的情况也触发点击
                moveAccumulateX += Math.abs(newX - getX());
                moveAccumulateY += Math.abs(newY - getY());
                //限制浮窗不会超出父布局
                newX = newX < margin ? margin : newX > maxX ? maxX : newX;
                newY = newY < margin ? margin : newY > maxY ? maxY : newY;
                animate()
                        .x(newX)
                        .y(newY)
                        .setDuration(0)
                        .start();
                break;
            case MotionEvent.ACTION_UP:
                //拖动吸附,放开手时自动吸附到左右两边
                float animationX;
                float upX = event.getRawX() + dX;
                if (upX * 2 > maxX) {
                    animationX = maxX;
                } else {
                    animationX = margin;
                }
                animate()
                        .x(animationX)
                        .setDuration(0)
                        .start();
                //如果拖动超过一定距离拦截发向子view的点击事件
                if (moveAccumulateX > touchSlop || moveAccumulateY > touchSlop) {
                    return true;
                }
                //Log.d("fgt","x:"+getX()+" y:"+getY()+ " height:"+parentHeight+" width:"+parentWidth);
            default:
        }
        return super.onInterceptTouchEvent(event);
    }
}


================================================
FILE: easyads/src/main/java/com/easyads/utils/EAUtil.java
================================================
package com.easyads.utils;

import android.app.Activity;
import android.app.ActivityManager;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.Looper;
import android.os.Process;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;

import com.easyads.EasyAdsManger;
import com.easyads.itf.BaseEnsureListener;

import java.lang.ref.SoftReference;
import java.util.List;
import java.util.UUID;

public class EAUtil {
    public static String getUUID() {
        try {
            return UUID.randomUUID().toString().replace("-", "");
        } catch (Throwable e) {
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 判断页面是否被销毁了
     *
     * @param activity
     * @return
     */
    public static boolean isActivityDestroyed(Activity activity) {
        try {
            if (activity == null) {
                return true;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                return activity.isDestroyed() || activity.isFinishing();
            } else {
                return activity.isFinishing();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    public static boolean isActivityDestroyed(SoftReference<Activity> activity) {
        try {
            if (activity == null || activity.get() == null) {
                return true;
            }
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                return activity.get().isDestroyed() || activity.get().isFinishing();
            } else {
                return activity.get().isFinishing();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }


    public static void switchMainThread(final BaseEnsureListener ensureListener) {
        try {
            boolean isMainThread = Looper.myLooper() == Looper.getMainLooper();
            if (isMainThread) {
                ensureListener.ensure();
            } else {
                //如果是非主线程,需要强制切换到主线程来进行初始化
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            EALog.high("[switchMainThread] force to main thread");
                            ensureListener.ensure();
                        } catch (Throwable e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void switchMainThreadDelay(final BaseEnsureListener ensureListener, long delayTime) {
        try {
            EALog.high("[switchMainThreadDelay] " + delayTime + "ms later force to main thread");

            //如果是非主线程,需要强制切换到主线程来进行初始化
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    try {
                        ensureListener.ensure();
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            }, delayTime);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    public static void removeFromParent(View view) {
        try {
            if (view != null) {
                ViewParent vp = view.getParent();
                if (vp instanceof ViewGroup) {
                    ((ViewGroup) vp).removeView(view);
                }
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

    /**
     * 标记开发者身份
     *
     * @return 是否为开发者
     */
    public static boolean isDev() {
        return EasyAdsManger.getInstance().isDev && EasyAdsManger.getInstance().debug;
    }

    public static void autoClose(final View view) {
        try {
            //不执行自动关闭
            int closeDur = EasyAdsManger.getInstance().getSplashPlusAutoClose();
            if (closeDur < 0) {
                return;
            }
            //延迟给定时间,执行移除布局操作
            new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
                @Override
                public void run() {
                    EAUtil.removeFromParent(view);
                }
            }, closeDur);
        } catch (Throwable e) {
            e.printStackTrace();
        }

    }

    public static boolean isMainProcess(Context context) {
        boolean result;
        try {
            result = context.getPackageName().equals(getCurrentProcessName(context));
        } catch (Throwable e) {
            e.printStackTrace();
            result = false;
        }
        return result;

    }

    public static String getCurrentProcessName(Context context) {
        try {
            int pid = Process.myPid();
            String currentProcessName = "";
            ActivityManager activityManager = (ActivityManager) context.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
            List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager.getRunningAppProcesses();
            for (ActivityManager.RunningAppProcessInfo processInfo : runningAppProcesses) {
                if (pid == processInfo.pid) {
                    currentProcessName = processInfo.processName;
                }
            }
            return currentProcessName;
        } catch (Throwable e) {
            e.printStackTrace();
            return "";
        }
    }

}


================================================
FILE: easyads/src/main/java/com/easyads/utils/ScreenUtil.java
================================================
package com.easyads.utils;

import android.app.Activity;
import android.content.Context;

public class ScreenUtil {
    public ScreenUtil() {

    }

    public static int dip2px(Activity activity, float dpValue) {
        return dip2pxC(activity, dpValue);
    }

    public static int dip2pxC(Context context, float dpValue) {
        try {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue * scale + 0.5f);
        } catch (Throwable e) {
            e.printStackTrace();
            return -1;
        }
    }

    public static int px2dip(Activity activity, float pxValue) {
        return px2dipC(activity, pxValue);
    }

    public static int px2dipC(Context context, float pxValue) {
        try {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (pxValue / scale + 0.5f);
        } catch (Throwable e) {
            e.printStackTrace();
            return -1;
        }
    }

    public static int getScreenWidth(Activity activity) {
        return getScreenWidthC(activity);
    }

    public static int getScreenWidthC(Context context) {
        try {
            return context.getResources()
                    .getDisplayMetrics().widthPixels;
        } catch (Throwable e) {
            e.printStackTrace();
            return -1;
        }
    }

    public static int getScreenHeight(Activity activity) {
        return getScreenHeightC(activity);
    }

    public static int getScreenHeightC(Context context) {
        try {
            return context.getResources()
                    .getDisplayMetrics().heightPixels;
        } catch (Throwable e) {
            e.printStackTrace();
            return -1;
        }
    }
}


================================================
FILE: easybd/.gitignore
================================================
/build


================================================
FILE: easybd/build.gradle
================================================
apply plugin: 'com.android.library'
apply plugin: 'com.kezong.fat-aar'

// JitPack Maven
apply plugin: 'com.github.dcendents.android-maven'
// Your Group
group = 'com.github.bayescom'

//maven依赖的项目名称
def pomName = "easyads-bd"
def VersionCode = 9352
def VersionName = "${rootProject.ext.EasyAds_version}_" + VersionCode

def outputName = pomName + "_" + VersionName + ".aar"

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 29
        versionCode VersionCode
        versionName VersionName

        consumerProguardFiles 'consumer-rules.pro'
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        abortOnError false
    }
    println pomName + " VersionName = " + VersionName

}

repositories {
    flatDir {
        dirs 'libs'
    }
}

// If the value is changed to true, the dependencies of the remote dependency will also be embedded in the final aar.
// the default value of transitive is false
configurations.embed.transitive = true

dependencies {

    compileOnly 'com.android.support:appcompat-v7:28.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

    def aarName = "Baidu_MobAds_SDK_${VersionCode}"
    //发布时用embed捆绑aar包
    if (rootProject.ext.releaseSDK) {
        embed(name: aarName, ext: 'aar')
    } else {
        api fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
    }

    compileOnly project(path: ':easyads')

}

//android.libraryVariants.all { variant ->
//    variant.outputs.all {
//        outputFileName = outputName
//    }
//}


================================================
FILE: easybd/consumer-rules.pro
================================================

-ignorewarnings
-dontwarn com.baidu.mobads.sdk.api.**
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class com.baidu.mobads.** { *; }
-keep class com.style.widget.** {*;}
-keep class com.component.** {*;}
-keep class com.baidu.ad.magic.flute.** {*;}
-keep class com.baidu.mobstat.forbes.** {*;}

================================================
FILE: easybd/proguard-rules.pro
================================================
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
#   public *;
#}

# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable

# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile


================================================
FILE: easybd/src/androidTest/java/com/easyads/supplier/baidu/ExampleInstrumentedTest.java
================================================
package com.easyads.supplier.baidu;

import android.content.Context;
import android.support.test.InstrumentationRegistry;
import android.support.test.runner.AndroidJUnit4;


import org.junit.Test;
import org.junit.runner.RunWith;

import static org.junit.Assert.*;

/**
 * Instrumented test, which will execute on an Android device.
 *
 * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
 */
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
    @Test
    public void useAppContext() {
        // Context of the app under test.
        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();

        assertEquals("com.easyads.supplier.baidu.test", appContext.getPackageName());
    }
}


================================================
FILE: easybd/src/main/AndroidManifest.xml
================================================
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.easyads.supplier.baidu">


</manifest>

================================================
FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDBannerAdapter.java
================================================
package com.easyads.supplier.baidu;

import android.app.Activity;
import android.view.ViewGroup;
import android.widget.RelativeLayout;

import com.easyads.core.banner.EABannerSetting;
import com.easyads.custom.EABannerCustomAdapter;
import com.easyads.model.EasyAdError;
import com.easyads.utils.EALog;
import com.baidu.mobads.sdk.api.AdView;
import com.baidu.mobads.sdk.api.AdViewListener;

import org.json.JSONObject;

import java.lang.ref.SoftReference;

/**
 * 横幅会自动刷新,刷新间隔30秒。如果网络异常,下一次加载将回调加载失败,网络恢复,不再执行刷新。故失败逻辑直接进入下一优先级的加载
 */
public class BDBannerAdapter extends EABannerCustomAdapter implements AdViewListener {

    private EABannerSetting setting;
    private AdView adView;

    public BDBannerAdapter(SoftReference<Activity> activity, EABannerSetting baseSetting) {
        super(activity, baseSetting);
        setting = baseSetting;
    }

    @Override
    protected void doLoadAD() {

        if (sdkSupplier != null) {
            BDUtil.initBDAccount(this);
            adView = new AdView(getActivity(), sdkSupplier.adspotId);
            adView.setListener(this);
        }

        //必须要添加布局后,才会返回广告
        if (null != setting) {
            ViewGroup adContainer = setting.getContainer();
            if (adContainer != null) {
                adContainer.removeAllViews();
                int width = adContainer.getWidth();
                EALog.max(TAG + "adContainer width = " + width);
                if (width <= 0) {
                    width = ViewGroup.LayoutParams.MATCH_PARENT;
                }
                adContainer.addView(adView, new RelativeLayout.LayoutParams(width, ViewGroup.LayoutParams.WRAP_CONTENT));
            }
        }
    }

    @Override
    protected void doShowAD() {

    }


    @Override
    protected void doDestroy() {
        try {
            if (adView != null) {
                adView.destroy();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    public void onAdReady(AdView adView) {
        EALog.high(TAG + "onAdReady" + adView);

        handleSucceed();
    }

    @Override
    public void onAdShow(JSONObject jsonObject) {
        EALog.high(TAG + "onAdShow " + jsonObject);

        handleExposure();
    }

    @Override
    public void onAdClick(JSONObject jsonObject) {
        EALog.high(TAG + "onAdClick " + jsonObject);

        handleClick();
    }

    @Override
    public void onAdFailed(String s) {
        EALog.e(TAG + "onAdFailed " + s);

        handleFailed(EasyAdError.ERROR_BD_FAILED, s);
    }

    @Override
    public void onAdSwitch() {
        EALog.high(TAG + "onAdSwitch");

    }

    @Override
    public void onAdClose(JSONObject jsonObject) {
        EALog.high(TAG + "onAdClose " + jsonObject);

        if (null != setting) {
            setting.adapterDidDislike(sdkSupplier);
        }
    }
}


================================================
FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDFullScreenVideoAdapter.java
================================================
package com.easyads.supplier.baidu;

import android.app.Activity;

import com.easyads.core.full.EAFullScreenVideoSetting;
import com.easyads.custom.EAFullScreenCustomAdapter;
import com.easyads.model.EasyAdError;
import com.easyads.utils.EALog;
import com.baidu.mobads.sdk.api.FullScreenVideoAd;

import java.lang.ref.SoftReference;

public class BDFullScreenVideoAdapter extends EAFullScreenCustomAdapter implements FullScreenVideoAd.FullScreenVideoAdListener {
    private EAFullScreenVideoSetting setting;

    private FullScreenVideoAd mFullScreenVideoAd;

    public BDFullScreenVideoAdapter(SoftReference<Activity> activity, EAFullScreenVideoSetting setting) {
        super(activity, setting);
        this.setting = setting;
    }

    @Override
    protected void doLoadAD() {
        BDUtil.initBDAccount(this);

        // 全屏视频产品可以选择是否使用SurfaceView进行渲染视频
        mFullScreenVideoAd = new FullScreenVideoAd(getActivity(), sdkSupplier.adspotId
                , this, EasyBDManager.getInstance().fullScreenUseSurfaceView);
        mFullScreenVideoAd.load();

    }

    @Override
    protected void doShowAD() {
        try {
            boolean isReady = mFullScreenVideoAd != null && mFullScreenVideoAd.isReady();
            EALog.simple(TAG + "-doShowAD- isReady = " + isReady);
            if (mFullScreenVideoAd != null) {
                mFullScreenVideoAd.show();
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }


    @Override
    public void doDestroy() {
    }


    /**
     * 广告事件回调
     */

    @Override
    public void onAdShow() {
        EALog.high(TAG + "onAdShow");

        handleExposure();
    }

    @Override
    public void onAdClick() {
        EALog.high(TAG + "onAdClick");

        handleExposure();
    }

    @Override
    public void onAdClose(float playScale) {
        // 用户关闭了广告
        // 说明:关闭按钮在mssp上可以动态配置,媒体通过mssp配置,可以选择广告一开始就展示关闭按钮,还是播放结束展示关闭按钮
        // 建议:收到该回调之后,可以重新load下一条广告,最好限制load次数(4-5次即可)
        // playScale[0.0-1.0],1.0表示播放完成,媒体可以按照自己的设计给予奖励
        EALog.high(TAG + "onAdClose,playScale = " + playScale);


        if (setting != null)
            setting.adapterClose(sdkSupplier);
    }

    @Override
    public void onAdFailed(String s) {
        String msg = "onAdFailed" + s;

        handleFailed(EasyAdError.ERROR_BD_FAILED, msg);
    }

    @Override
    public void onVideoDownloadSuccess() {
        EALog.high(TAG + "onVideoDownloadSuccess");

        handleCached();
    }

    @Override
    public void onVideoDownloadFailed() {
        EALog.e(TAG + "onVideoDownloadFailed");
    }

    @Override
    public void playCompletion() {
        EALog.high(TAG + "playCompletion");

        if (setting != null)
            setting.adapterVideoComplete(sdkSupplier);
    }

    @Override
    public void onAdSkip(float playScale) {
        // 用户跳过了广告
        // playScale[0.0-1.0],1.0表示播放完成,媒体可以按照自己的设计给予奖励
        EALog.high(TAG + "onAdSkip,playScale = " + playScale);
        if (setting != null)
            setting.adapterVideoSkipped(sdkSupplier);
    }

    @Override
    public void onAdLoaded() {
        EALog.high(TAG + "onAdLoaded");
        handleSucceed();
        try {
            if (mFullScreenVideoAd != null) {
                String ecpm = mFullScreenVideoAd.getECPMLevel();
                EALog.high(TAG + "mFullScreenVideoAd ECPMLevel = " + ecpm);
            }
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }
}


================================================
FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDInterstitialAdapter.java
================================================
package com.easyads.supplier.baidu;

import android.app.Activity;
import android.widget.RelativeLayout;

import com.easyads.core.inter.EAInterstitialSetting;
import com.easyads.custom.EAInterstitialCustomAdapter;
import com.easyads.model.EasyAdError;
import com.easyads.utils.EALog;
import com.baidu.mobads.sdk.api.AdSize;
import com.baidu.mobads.sdk.api.InterstitialAd;
import com.baidu.mobads.sdk.api.InterstitialAdListener;

import java.lang.ref.SoftReference;

public class BDInterstitialAdapter extends EAInterstitialCustomAdapter implements InterstitialAdListener {
    private EAInterstitialSetting setting;
    private InterstitialAd mInterAd;            // 插屏广告实例,支持单例模式
    private AdSize adSize;
    private RelativeLayout videoLayout;
    private boolean isAdForVideo = false;

    public BDInterstitialAdapter(SoftReference<Activity> activity, EAInterstitialSetting baseSetting) {
        super(activity, baseSetting);
        this.setting = baseSetting;
        adSize = EasyBDManager.getInstance().interstitialType;
        videoLayout = EasyBDManager.getInstance().interstitialVideoLayout;
    }

    @Override
    protected void doLoadAD() {
        if (sdkSupplier != null) {
            BDUtil.initBDAccount(this);

            String adPlaceId = sdkSupplier.adspotId;
            if (adSize == null) {
                mInterAd = new InterstitialAd(getActivity(), adPlaceId);
            } else {
                mInterAd = new InterstitialAd(getActivity(), adSize, adPlaceId);
            }
            mInterAd.setListener(this);
        }


        if (adSize != null) {
            isAdForVideo = adSize == AdSize.InterstitialForVideoBeforePlay || adSize == AdSize.InterstitialForVideoPausePlay;
            if (isAdForVideo && videoLayout != null) {
                RelativeLayout.LayoutParams reLayoutParams = (RelativeLayout.LayoutParams) videoLayout.getLayoutParams();
                mInterAd.loadAdForVideoApp(reLayoutParams.width, reLayoutParams.height);
            } else {
                mInterAd.loadAd();
            }
        } else {
            mInterAd.loadAd();
        }
    }

    @Override
    protected void doShowAD() {
        if (mInterAd != null) {
            if (videoLayout != null && isAdForVideo) {
                mInterAd.showAdInParentForVideoApp(  videoLayout);
            } else {
                mInterAd.showAd();
            }
        }
    }


    @Override
    public void doDestroy() {
        if (mInterAd != null) {
            mInterAd.destroy();
        }
    }


    //广告的回调事件
    @Override
    public void onAdReady() {
        EALog.high(TAG + "onAdReady");
        handleSucceed();
    }

    @Override
    public void onAdPresent() {
        EALog.high(TAG + "onAdPresent");
        handleExposure();
    }

    @Override
    public void onAdClick(InterstitialAd interstitialAd) {
        EALog.high(TAG + "onAdClick");
        handleClick();
    }

    @Override
    public void onAdDismissed() {
        EALog.high(TAG + "onAdDismissed");
        if (null != setting) {
            setting.adapterDidClosed(sdkSupplier);
        }
    }

    @Override
    public void onAdFailed(String s) {
        EALog.high(TAG + "onAdFailed ,reason:" + s);
        handleFailed(EasyAdError.ERROR_BD_FAILED, s);
    }


}


================================================
FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDNativeExpressAdapter.java
================================================
package com.easyads.supplier.baidu;

import android.app.Activity;
import android.view.View;

import com.easyads.core.nati.EANativeExpressSetting;
import com.easyads.custom.EANativeExpressCustomAdapter;
import com.easyads.model.EasyAdError;
import com.easyads.utils.EALog;
import com.baidu.mobads.sdk.api.BaiduNativeManager;
import com.baidu.mobads.sdk.api.FeedNativeView;
import com.baidu.mobads.sdk.api.NativeResponse;
import com.baidu.mobads.sdk.api.RequestParameters;
import com.baidu.mobads.sdk.api.StyleParams;
import com.baidu.mobads.sdk.api.XAdNativeResponse;

import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List;

/**
 * 模板信息流 对应了百度的智能优选信息流广告位
 */
public class BDNativeExpressAdapter extends EANativeExpressCustomAdapter implements BaiduNativeManager.FeedAdListener, NativeResponse.AdInteractionListener {
    private EANativeExpressSetting setting;
    private RequestParameters parameters;
    NativeResponse nativeResponse = null;
    FeedNativeView feedNativeView;

    public BDNativeExpressAdapter(SoftReference<Activity> activity, EANativeExpressSetting baseSetting) {
        super(activity, baseSetting);
        setting = baseSetting;
        parameters = EasyBDManager.getInstance().nativeExpressParameters;
    }

    @Override
    protected void doLoadAD() {

        if (sdkSupplier != null) {
            BDUtil.initBDAccount(this);

            /**
             * Step 1. 创建BaiduNative对象,参数分别为: 上下文context,广告位ID
             * 注意:请将adPlaceId替换为自己的广告位ID
             * 注意:信息流广告对象,与广告位id一一对应,同一个对象可以多次发起请求
             */
            BaiduNativeManager mBaiduNativeManager = new BaiduNativeManager(getActivity(), sdkSupplier.adspotId);

            mBaiduNativeManager.loadFeedAd(parameters, this);
        }

    }


    @Override
    protected void doShowAD() {
        try {
            StyleParams styleParams;
            styleParams = EasyBDManager.getInstance().nativeExpressSmartStyle;

            if (nativeResponse != null) {
                feedNativeView.setAdData((XAdNativeResponse) nativeResponse);
                if (styleParams != null) {
                    feedNativeView.changeViewLayoutParams(styleParams);
                }
                feedNativeView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        nativeResponse.unionLogoClick();
                    }
                });
                if (nativeResponse != null) {
                    EALog.max("getImageUrl = " + nativeResponse.getImageUrl());
                    XAdNativeResponse xad = (XAdNativeResponse) nativeResponse;
                    xad.setAdDislikeListener(new NativeResponse.AdDislikeListener() {
                        @Override
                        public void onDislikeClick() {
                            try {
                                onADClose();
                                // 点击了负反馈渠道的回调
    
Download .txt
gitextract_wasj5s9r/

├── .gitignore
├── LICENSE
├── README.md
├── build.gradle
├── docs/
│   ├── banner.md
│   ├── draw.md
│   ├── easyAds.md
│   ├── easyBDManger.md
│   ├── easyCsjManger.md
│   ├── easyKSManger.md
│   ├── faq.md
│   ├── full.md
│   ├── home.md
│   ├── interstital.md
│   ├── nativeExpress.md
│   ├── reward.md
│   ├── splash.md
│   └── strategyJsonFormat.md
├── easyads/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── Baidu_MobAds_SDK_9352.aar
│   │   └── kssdk-ad-3363.aar
│   ├── proguard-rules.pro
│   └── src/
│       └── main/
│           ├── AndroidManifest.xml
│           └── java/
│               └── com/
│                   └── easyads/
│                       ├── EasyAds.java
│                       ├── EasyAdsConstant.java
│                       ├── EasyAdsManger.java
│                       ├── core/
│                       │   ├── EABaseSupplierAdapter.java
│                       │   ├── EasyAdBaseAdspot.java
│                       │   ├── banner/
│                       │   │   ├── EABannerListener.java
│                       │   │   ├── EABannerSetting.java
│                       │   │   └── EasyAdBanner.java
│                       │   ├── draw/
│                       │   │   ├── EADrawListener.java
│                       │   │   ├── EADrawSetting.java
│                       │   │   └── EasyAdDraw.java
│                       │   ├── full/
│                       │   │   ├── EAFullScreenVideoListener.java
│                       │   │   ├── EAFullScreenVideoSetting.java
│                       │   │   └── EasyAdFullScreenVideo.java
│                       │   ├── inter/
│                       │   │   ├── EAInterstitialListener.java
│                       │   │   ├── EAInterstitialSetting.java
│                       │   │   └── EasyAdInterstitial.java
│                       │   ├── nati/
│                       │   │   ├── EANativeExpressListener.java
│                       │   │   ├── EANativeExpressSetting.java
│                       │   │   └── EasyAdNativeExpress.java
│                       │   ├── reward/
│                       │   │   ├── EARewardServerCallBackInf.java
│                       │   │   ├── EARewardVideoListener.java
│                       │   │   ├── EARewardVideoSetting.java
│                       │   │   └── EasyAdRewardVideo.java
│                       │   └── splash/
│                       │       ├── EASplashLifeCallback.java
│                       │       ├── EASplashListener.java
│                       │       ├── EASplashSetting.java
│                       │       └── EasyAdSplash.java
│                       ├── custom/
│                       │   ├── EABannerCustomAdapter.java
│                       │   ├── EADrawCustomAdapter.java
│                       │   ├── EAFullScreenCustomAdapter.java
│                       │   ├── EAInterstitialCustomAdapter.java
│                       │   ├── EANativeExpressCustomAdapter.java
│                       │   ├── EARewardCustomAdapter.java
│                       │   └── EASplashCustomAdapter.java
│                       ├── itf/
│                       │   ├── AdCoreAction.java
│                       │   ├── BaseAdapterEvent.java
│                       │   ├── BaseEnsureListener.java
│                       │   └── EABaseADListener.java
│                       ├── model/
│                       │   ├── EALogLevel.java
│                       │   ├── EasyAdError.java
│                       │   ├── EasyAdType.java
│                       │   ├── SdkRule.java
│                       │   ├── SdkSupplier.java
│                       │   └── StrategyModel.java
│                       └── utils/
│                           ├── BigDecimalUtil.java
│                           ├── EAAdapterLoader.java
│                           ├── EALog.java
│                           ├── EASplashPlusManager.java
│                           ├── EASplashZoomOutLayout.java
│                           ├── EAUtil.java
│                           └── ScreenUtil.java
├── easybd/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── libs/
│   │   └── Baidu_MobAds_SDK_9352.aar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── baidu/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── baidu/
│       │   │                   ├── BDBannerAdapter.java
│       │   │                   ├── BDFullScreenVideoAdapter.java
│       │   │                   ├── BDInterstitialAdapter.java
│       │   │                   ├── BDNativeExpressAdapter.java
│       │   │                   ├── BDRewardVideoAdapter.java
│       │   │                   ├── BDSplashAdapter.java
│       │   │                   ├── BDUtil.java
│       │   │                   └── EasyBDManager.java
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── baidu/
│                               └── ExampleUnitTest.java
├── easycsj/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── csj/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── csj/
│       │   │                   ├── CSJSplashClickEyeManager.java
│       │   │                   ├── CsjBannerAdapter.java
│       │   │                   ├── CsjDrawAdapter.java
│       │   │                   ├── CsjFullScreenVideoAdapter.java
│       │   │                   ├── CsjInterstitialAdapter.java
│       │   │                   ├── CsjNativeExpressAdapter.java
│       │   │                   ├── CsjRewardVideoAdapter.java
│       │   │                   ├── CsjSplashAdapter.java
│       │   │                   ├── CsjUtil.java
│       │   │                   └── EasyCsjManger.java
│       │   └── res/
│       │       ├── values/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           └── ea_csj_file_paths.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── csj/
│                               └── ExampleUnitTest.java
├── easyks/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── libs/
│   │   └── kssdk-ad-3363.aar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── ks/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── ks/
│       │   │                   ├── EasyKSManager.java
│       │   │                   ├── KSDrawAdapter.java
│       │   │                   ├── KSFullScreenVideoAdapter.java
│       │   │                   ├── KSInterstitialAdapter.java
│       │   │                   ├── KSNativeExpressAdapter.java
│       │   │                   ├── KSRewardVideoAdapter.java
│       │   │                   ├── KSSplashAdapter.java
│       │   │                   └── KSUtil.java
│       │   └── res/
│       │       └── values/
│       │           └── strings.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── ks/
│                               └── ExampleUnitTest.java
├── easyylh/
│   ├── .gitignore
│   ├── build.gradle
│   ├── consumer-rules.pro
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── supplier/
│       │                   └── ylh/
│       │                       └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── supplier/
│       │   │               └── ylh/
│       │   │                   ├── SplashZoomOutManager.java
│       │   │                   ├── YlhBannerAdapter.java
│       │   │                   ├── YlhFullScreenVideoAdapter.java
│       │   │                   ├── YlhInterstitialAdapter.java
│       │   │                   ├── YlhNativeExpressAdapter.java
│       │   │                   ├── YlhRewardVideoAdapter.java
│       │   │                   ├── YlhSplashAdapter.java
│       │   │                   └── YlhUtil.java
│       │   └── res/
│       │       ├── values/
│       │       │   └── strings.xml
│       │       └── xml/
│       │           └── ea_ylh_file_path.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── supplier/
│                           └── ylh/
│                               └── ExampleUnitTest.java
├── example/
│   ├── .gitignore
│   ├── build.gradle
│   ├── libs/
│   │   ├── Baidu_MobAds_SDK_9352.aar
│   │   ├── circleimageview-2.2.0.aar
│   │   ├── kssdk-ad-3363.aar
│   │   └── mimo-ad-sdk.aar
│   ├── proguard-rules.pro
│   └── src/
│       ├── androidTest/
│       │   └── java/
│       │       └── com/
│       │           └── easyads/
│       │               └── demo/
│       │                   └── ExampleInstrumentedTest.java
│       ├── main/
│       │   ├── AndroidManifest.xml
│       │   ├── assets/
│       │   │   ├── banner_config.json
│       │   │   ├── draw_config.json
│       │   │   ├── full_config.json
│       │   │   ├── interstitial_config.json
│       │   │   ├── native_config.json
│       │   │   ├── reward_config.json
│       │   │   ├── splash_config.json
│       │   │   └── splash_cus_config.json
│       │   ├── java/
│       │   │   └── com/
│       │   │       └── easyads/
│       │   │           └── demo/
│       │   │               ├── BannerActivity.java
│       │   │               ├── BaseActivity.java
│       │   │               ├── DrawActivity.java
│       │   │               ├── EasyADController.java
│       │   │               ├── FullScreenVideoActivity.java
│       │   │               ├── InterstitialActivity.java
│       │   │               ├── MainActivity.java
│       │   │               ├── MyApplication.java
│       │   │               ├── NativeExpressActivity.java
│       │   │               ├── NativeExpressRecyclerViewActivity.java
│       │   │               ├── RewardVideoActivity.java
│       │   │               ├── SplashActivity.java
│       │   │               ├── SplashDialog.java
│       │   │               ├── SplashToMainActivity.java
│       │   │               ├── custom/
│       │   │               │   ├── CustomActivity.java
│       │   │               │   ├── HuaWeiSplashAdapter.java
│       │   │               │   └── XiaoMiSplashAdapter.java
│       │   │               ├── draw/
│       │   │               │   ├── FullScreenVideoView.java
│       │   │               │   ├── OnViewPagerListener.java
│       │   │               │   └── ViewPagerLayoutManager.java
│       │   │               └── utils/
│       │   │                   ├── BaseCallBack.java
│       │   │                   ├── Constant.java
│       │   │                   ├── DialogLogcat.java
│       │   │                   ├── NormalSetting.java
│       │   │                   ├── UIUtils.java
│       │   │                   └── UserPrivacyDialog.java
│       │   └── res/
│       │       ├── drawable/
│       │       │   ├── circle_big_red.xml
│       │       │   ├── dialog_white_radius_bg.xml
│       │       │   ├── ic_launcher_background.xml
│       │       │   └── play_arrow.xml
│       │       ├── drawable-v24/
│       │       │   └── ic_launcher_foreground.xml
│       │       ├── layout/
│       │       │   ├── activity_banner.xml
│       │       │   ├── activity_custom.xml
│       │       │   ├── activity_draw.xml
│       │       │   ├── activity_full_screen_video.xml
│       │       │   ├── activity_interstitial.xml
│       │       │   ├── activity_main.xml
│       │       │   ├── activity_native_express.xml
│       │       │   ├── activity_native_express_recycler_view.xml
│       │       │   ├── activity_reward_video.xml
│       │       │   ├── activity_splash_custom_logo.xml
│       │       │   ├── activity_splash_to_main.xml
│       │       │   ├── dialog_logcat.xml
│       │       │   ├── dialog_user_privacy.xml
│       │       │   ├── item_data.xml
│       │       │   ├── item_express_ad.xml
│       │       │   └── item_view_pager.xml
│       │       ├── mipmap-anydpi-v26/
│       │       │   ├── ic_launcher.xml
│       │       │   └── ic_launcher_round.xml
│       │       ├── values/
│       │       │   ├── colors.xml
│       │       │   ├── dimens.xml
│       │       │   ├── ic_launcher_background.xml
│       │       │   ├── strings.xml
│       │       │   └── styles.xml
│       │       └── xml/
│       │           ├── netwc.xml
│       │           └── xm_file_paths.xml
│       └── test/
│           └── java/
│               └── com/
│                   └── easyads/
│                       └── demo/
│                           └── ExampleUnitTest.java
├── gradle/
│   └── wrapper/
│       └── gradle-wrapper.properties
├── gradle.properties
├── gradlew
├── gradlew.bat
└── settings.gradle
Download .txt
SYMBOL INDEX (904 symbols across 122 files)

FILE: easyads/src/main/java/com/easyads/EasyAds.java
  class EasyAds (line 6) | public class EasyAds {
    method getVersion (line 9) | public static String getVersion() {
    method setDebug (line 14) | public static void setDebug(boolean isDebug, EALogLevel logLevel) {
    method setSplashPlusAutoClose (line 21) | public static void setSplashPlusAutoClose(int time) {

FILE: easyads/src/main/java/com/easyads/EasyAdsConstant.java
  class EasyAdsConstant (line 3) | public class EasyAdsConstant {

FILE: easyads/src/main/java/com/easyads/EasyAdsManger.java
  class EasyAdsManger (line 8) | public class EasyAdsManger {
    method EasyAdsManger (line 11) | private EasyAdsManger() {
    method getInstance (line 14) | public static synchronized EasyAdsManger getInstance() {
    method getSplashPlusAutoClose (line 44) | public int getSplashPlusAutoClose() {

FILE: easyads/src/main/java/com/easyads/core/EABaseSupplierAdapter.java
  class EABaseSupplierAdapter (line 19) | public abstract class EABaseSupplierAdapter implements AdCoreAction {
    method EABaseSupplierAdapter (line 40) | public EABaseSupplierAdapter(SoftReference<Activity> softReferenceActi...
    method setSDKSupplier (line 51) | public void setSDKSupplier(SdkSupplier sdkSupplier) {
    method getActivity (line 64) | public Activity getActivity() {
    method loadOnly (line 75) | @Override
    method show (line 81) | @Override
    method loadAndShow (line 103) | @Override
    method destroy (line 110) | @Override
    method doLoadAD (line 126) | protected abstract void doLoadAD();
    method doShowAD (line 129) | protected abstract void doShowAD();
    method doDestroy (line 132) | protected abstract void doDestroy();
    method startAdapterADLoad (line 136) | public void startAdapterADLoad() {
    method doBannerFailed (line 163) | public void doBannerFailed(EasyAdError easyAdError) {
    method isBannerFailed (line 178) | private boolean isBannerFailed() {
    method canOptInit (line 206) | public boolean canOptInit() {
    method getAppID (line 213) | public String getAppID() {
    method getPosID (line 224) | public String getPosID() {
    method handleClick (line 236) | public void handleClick() {
    method handleExposure (line 256) | public void handleExposure() {
    method handleSucceed (line 277) | public void handleSucceed() {
    method handleFailed (line 307) | public void handleFailed(int errCode, String errMsg) {
    method handleFailed (line 311) | public void handleFailed(String errCode, String errMsg) {
    method handleFailed (line 316) | public void handleFailed(EasyAdError error) {
    method checkFailed (line 341) | private void checkFailed() throws Exception {

FILE: easyads/src/main/java/com/easyads/core/EasyAdBaseAdspot.java
  class EasyAdBaseAdspot (line 37) | public abstract class EasyAdBaseAdspot implements AdCoreAction, BaseAdap...
    method EasyAdBaseAdspot (line 61) | public EasyAdBaseAdspot(Activity activity, EABaseADListener listener) {
    method initSupplierAdapterList (line 124) | void initSupplierAdapterList() {
    method setData (line 141) | public void setData(String strategyJson) {
    method loadOnly (line 195) | @Override
    method loadAndShow (line 201) | @Override
    method show (line 210) | @Override
    method startLoad (line 239) | protected void startLoad() {
    method getReqId (line 254) | public String getReqId() {
    method adapterDidFailed (line 263) | @Override
    method adapterDidSucceed (line 274) | @Override
    method adapterDidExposure (line 283) | @Override
    method adapterDidClicked (line 292) | @Override
    method getSupplierInf (line 302) | @Override
    method updateSupplier (line 311) | protected void updateSupplier(String func, SdkSupplier sdkSupplier) {
    method addCustomSupplier (line 331) | public void addCustomSupplier(String sdkTag, EABaseSupplierAdapter ada...
    method dispatchSuppliers (line 350) | private void dispatchSuppliers() {
    method getActivity (line 375) | protected Activity getActivity() {
    method receivedSuppliers (line 387) | private void receivedSuppliers() {
    method selectSdkSupplier (line 403) | void selectSdkSupplier() {
    method onTotalFailed (line 444) | protected void onTotalFailed() {
    method runOrderSuppliers (line 469) | private void runOrderSuppliers() {
    method callSDKSelected (line 499) | private void callSDKSelected() {
    method catchFailed (line 511) | private void catchFailed() {
    method destroyOtherSupplier (line 525) | protected void destroyOtherSupplier(SdkSupplier supplier) {
    method destroy (line 547) | public void destroy() {
    method initAdapter (line 569) | protected void initAdapter(String sdkTag, Object adObject) {
    method initSdkSupplier (line 581) | protected abstract void initSdkSupplier();

FILE: easyads/src/main/java/com/easyads/core/banner/EABannerListener.java
  type EABannerListener (line 5) | public interface EABannerListener extends EABaseADListener {

FILE: easyads/src/main/java/com/easyads/core/banner/EABannerSetting.java
  type EABannerSetting (line 11) | public interface EABannerSetting extends BaseAdapterEvent {
    method adapterDidDislike (line 12) | void adapterDidDislike(SdkSupplier sdkSupplier);
    method getRefreshInterval (line 14) | int getRefreshInterval();
    method getCsjExpressViewAcceptedWidth (line 16) | int getCsjExpressViewAcceptedWidth();
    method getCsjExpressViewAcceptedHeight (line 18) | int getCsjExpressViewAcceptedHeight();
    method getContainer (line 20) | ViewGroup getContainer();

FILE: easyads/src/main/java/com/easyads/core/banner/EasyAdBanner.java
  class EasyAdBanner (line 13) | public class EasyAdBanner extends EasyAdBaseAdspot implements EABannerSe...
    method EasyAdBanner (line 28) | public EasyAdBanner(Activity activity, final ViewGroup adContainer, EA...
    method initSdkSupplier (line 43) | @Override
    method adapterDidExposure (line 55) | @Override
    method adapterDidDislike (line 66) | public void adapterDidDislike(SdkSupplier supplier) {
    method setRefreshInterval (line 73) | public EasyAdBanner setRefreshInterval(int refreshInterval) {
    method setCsjExpressSize (line 78) | public void setCsjExpressSize(int width, int height) {
    method getContainer (line 83) | public ViewGroup getContainer() {
    method getRefreshInterval (line 87) | public int getRefreshInterval() {
    method getCsjExpressViewAcceptedWidth (line 91) | public int getCsjExpressViewAcceptedWidth() {
    method getCsjExpressViewAcceptedHeight (line 95) | public int getCsjExpressViewAcceptedHeight() {

FILE: easyads/src/main/java/com/easyads/core/draw/EADrawListener.java
  type EADrawListener (line 6) | public interface EADrawListener extends EABaseADListener {

FILE: easyads/src/main/java/com/easyads/core/draw/EADrawSetting.java
  type EADrawSetting (line 7) | public interface EADrawSetting extends BaseAdapterEvent {
    method getContainer (line 8) | ViewGroup getContainer();
    method getCsjExpressHeight (line 10) | int getCsjExpressHeight();
    method getCsjExpressWidth (line 12) | int getCsjExpressWidth();

FILE: easyads/src/main/java/com/easyads/core/draw/EasyAdDraw.java
  class EasyAdDraw (line 12) | public class EasyAdDraw extends EasyAdBaseAdspot implements EADrawSetting {
    method EasyAdDraw (line 19) | public EasyAdDraw(Activity activity, EADrawListener listener) {
    method initSdkSupplier (line 35) | @Override
    method setAdContainer (line 49) | public void setAdContainer(final ViewGroup adContainer) {
    method getContainer (line 66) | @Override
    method getCsjExpressHeight (line 72) | @Override
    method getCsjExpressWidth (line 77) | @Override

FILE: easyads/src/main/java/com/easyads/core/full/EAFullScreenVideoListener.java
  type EAFullScreenVideoListener (line 5) | public interface EAFullScreenVideoListener extends EABaseADListener {
    method onVideoComplete (line 6) | void onVideoComplete();
    method onVideoSkipped (line 8) | void onVideoSkipped();
    method onVideoCached (line 10) | void onVideoCached();

FILE: easyads/src/main/java/com/easyads/core/full/EAFullScreenVideoSetting.java
  type EAFullScreenVideoSetting (line 8) | public interface EAFullScreenVideoSetting extends BaseAdapterEvent {
    method adapterVideoCached (line 10) | void adapterVideoCached(SdkSupplier sdkSupplier);
    method adapterVideoComplete (line 12) | void adapterVideoComplete(SdkSupplier sdkSupplier);
    method adapterClose (line 14) | void adapterClose(SdkSupplier sdkSupplier);
    method adapterVideoSkipped (line 16) | void adapterVideoSkipped(SdkSupplier sdkSupplier);
    method getYlhMediaListener (line 18) | UnifiedInterstitialMediaListener getYlhMediaListener();
    method getYlhVideoOption (line 20) | VideoOption getYlhVideoOption();

FILE: easyads/src/main/java/com/easyads/core/full/EasyAdFullScreenVideo.java
  class EasyAdFullScreenVideo (line 12) | public class EasyAdFullScreenVideo extends EasyAdBaseAdspot implements E...
    method EasyAdFullScreenVideo (line 17) | public EasyAdFullScreenVideo(Activity activity, EAFullScreenVideoListe...
    method initSdkSupplier (line 24) | @Override
    method getYlhMediaListener (line 37) | @Override
    method getYlhVideoOption (line 42) | @Override
    method setYlhMediaListener (line 47) | public void setYlhMediaListener(UnifiedInterstitialMediaListener media...
    method setYlhVideoOption (line 51) | public void setYlhVideoOption(VideoOption videoOption) {
    method adapterVideoCached (line 55) | public void adapterVideoCached(SdkSupplier supplier) {
    method adapterVideoComplete (line 62) | public void adapterVideoComplete(SdkSupplier supplier) {
    method adapterClose (line 69) | public void adapterClose(SdkSupplier supplier) {
    method adapterVideoSkipped (line 76) | public void adapterVideoSkipped(SdkSupplier supplier) {

FILE: easyads/src/main/java/com/easyads/core/inter/EAInterstitialListener.java
  type EAInterstitialListener (line 5) | public interface EAInterstitialListener extends EABaseADListener {

FILE: easyads/src/main/java/com/easyads/core/inter/EAInterstitialSetting.java
  type EAInterstitialSetting (line 7) | public interface EAInterstitialSetting extends BaseAdapterEvent {
    method adapterDidClosed (line 8) | void adapterDidClosed(SdkSupplier sdkSupplier);
    method getCsjExpressViewWidth (line 10) | float getCsjExpressViewWidth();
    method getCsjExpressViewHeight (line 12) | float getCsjExpressViewHeight();
    method getYlhMediaListener (line 14) | UnifiedInterstitialMediaListener getYlhMediaListener();
    method isCsjNew (line 16) | boolean isCsjNew();

FILE: easyads/src/main/java/com/easyads/core/inter/EasyAdInterstitial.java
  class EasyAdInterstitial (line 11) | public class EasyAdInterstitial extends EasyAdBaseAdspot implements EAIn...
    method EasyAdInterstitial (line 19) | public EasyAdInterstitial(Activity activity, EAInterstitialListener li...
    method initSdkSupplier (line 26) | @Override
    method adapterDidClosed (line 38) | public void adapterDidClosed(SdkSupplier supplier) {
    method setCsjExpressViewAcceptedSize (line 48) | public void setCsjExpressViewAcceptedSize(float expressViewWidth, floa...
    method setCsjNew (line 53) | @Deprecated
    method setYlhMediaListener (line 58) | public void setYlhMediaListener(UnifiedInterstitialMediaListener liste...
    method getYlhMediaListener (line 62) | public UnifiedInterstitialMediaListener getYlhMediaListener() {
    method getCsjExpressViewWidth (line 67) | public float getCsjExpressViewWidth() {
    method getCsjExpressViewHeight (line 71) | public float getCsjExpressViewHeight() {
    method isCsjNew (line 76) | @Override

FILE: easyads/src/main/java/com/easyads/core/nati/EANativeExpressListener.java
  type EANativeExpressListener (line 5) | public interface EANativeExpressListener extends EABaseADListener {
    method onAdRenderFailed (line 6) | void onAdRenderFailed();
    method onAdRenderSuccess (line 8) | void onAdRenderSuccess();

FILE: easyads/src/main/java/com/easyads/core/nati/EANativeExpressSetting.java
  type EANativeExpressSetting (line 9) | public interface EANativeExpressSetting extends BaseAdapterEvent {
    method getExpressViewWidth (line 11) | int getExpressViewWidth();
    method getExpressViewHeight (line 13) | int getExpressViewHeight();
    method isVideoMute (line 15) | boolean isVideoMute();
    method adapterRenderFailed (line 17) | void adapterRenderFailed(SdkSupplier sdkSupplier);
    method adapterRenderSuccess (line 19) | void adapterRenderSuccess(SdkSupplier sdkSupplier);
    method adapterDidClosed (line 21) | void adapterDidClosed(SdkSupplier sdkSupplier);
    method setNativeExpressADView (line 23) | void setNativeExpressADView(View expressADView);
    method getYlhMaxVideoDuration (line 25) | int getYlhMaxVideoDuration();
    method getAdContainer (line 27) | ViewGroup getAdContainer();

FILE: easyads/src/main/java/com/easyads/core/nati/EasyAdNativeExpress.java
  class EasyAdNativeExpress (line 14) | public class EasyAdNativeExpress extends EasyAdBaseAdspot implements EAN...
    method EasyAdNativeExpress (line 24) | public EasyAdNativeExpress(Activity activity, EANativeExpressListener ...
    method initSdkSupplier (line 32) | @Override
    method adapterDidClosed (line 45) | public void adapterDidClosed(SdkSupplier supplier) {
    method adapterRenderFailed (line 52) | public void adapterRenderFailed(SdkSupplier supplier) {
    method adapterRenderSuccess (line 59) | public void adapterRenderSuccess(SdkSupplier supplier) {
    method destroy (line 66) | @Override
    method setAdContainer (line 84) | public void setAdContainer(ViewGroup container) {
    method setVideoMute (line 102) | public EasyAdNativeExpress setVideoMute(boolean mute) {
    method setYlhMaxVideoDuration (line 107) | public EasyAdNativeExpress setYlhMaxVideoDuration(int ylhMaxVideoDurat...
    method getAdContainer (line 112) | @Override
    method setNativeExpressADView (line 117) | @Override
    method getExpressViewWidth (line 123) | public int getExpressViewWidth() {
    method getExpressViewHeight (line 127) | public int getExpressViewHeight() {
    method isVideoMute (line 132) | @Override
    method getYlhMaxVideoDuration (line 137) | public int getYlhMaxVideoDuration() {
    method getExpressADView (line 142) | public View getExpressADView() {

FILE: easyads/src/main/java/com/easyads/core/reward/EARewardServerCallBackInf.java
  class EARewardServerCallBackInf (line 5) | public class EARewardServerCallBackInf {
    class CsjRewardInf (line 11) | public static class CsjRewardInf {

FILE: easyads/src/main/java/com/easyads/core/reward/EARewardVideoListener.java
  type EARewardVideoListener (line 5) | public interface EARewardVideoListener extends EABaseADListener {
    method onVideoCached (line 7) | void onVideoCached();
    method onVideoComplete (line 9) | void onVideoComplete();
    method onVideoSkip (line 11) | void onVideoSkip();
    method onAdReward (line 13) | void onAdReward();
    method onRewardServerInf (line 16) | void onRewardServerInf(EARewardServerCallBackInf inf);

FILE: easyads/src/main/java/com/easyads/core/reward/EARewardVideoSetting.java
  type EARewardVideoSetting (line 7) | public interface EARewardVideoSetting extends BaseAdapterEvent {
    method adapterVideoCached (line 9) | void adapterVideoCached(SdkSupplier sdkSupplier);
    method adapterAdReward (line 11) | void adapterAdReward(SdkSupplier sdkSupplier);
    method adapterVideoSkipped (line 13) | void adapterVideoSkipped(SdkSupplier sdkSupplier);
    method postRewardServerInf (line 15) | void postRewardServerInf(EARewardServerCallBackInf inf, SdkSupplier sd...
    method adapterVideoComplete (line 17) | void adapterVideoComplete(SdkSupplier sdkSupplier);
    method adapterDidClosed (line 19) | void adapterDidClosed(SdkSupplier sdkSupplier);
    method getCsjRewardName (line 22) | String getCsjRewardName();
    method getCsjRewardAmount (line 24) | int getCsjRewardAmount();
    method getCsjUserId (line 26) | String getCsjUserId();
    method getCsjOrientation (line 28) | int getCsjOrientation();
    method getCsjMediaExtra (line 30) | String getCsjMediaExtra();
    method isYlhVolumeOn (line 32) | boolean isYlhVolumeOn();
    method getYlhSSVO (line 35) | ServerSideVerificationOptions getYlhSSVO();

FILE: easyads/src/main/java/com/easyads/core/reward/EasyAdRewardVideo.java
  class EasyAdRewardVideo (line 11) | public class EasyAdRewardVideo extends EasyAdBaseAdspot implements EARew...
    method EasyAdRewardVideo (line 26) | public EasyAdRewardVideo(Activity activity, EARewardVideoListener list...
    method initSdkSupplier (line 33) | @Override
    method adapterVideoCached (line 46) | public void adapterVideoCached(SdkSupplier supplier) {
    method adapterVideoComplete (line 53) | public void adapterVideoComplete(SdkSupplier supplier) {
    method adapterDidClosed (line 60) | public void adapterDidClosed(SdkSupplier supplier) {
    method adapterAdReward (line 67) | public void adapterAdReward(SdkSupplier supplier) {
    method adapterVideoSkipped (line 74) | public void adapterVideoSkipped(SdkSupplier supplier) {
    method postRewardServerInf (line 81) | @Override
    method setCsjRewardName (line 89) | public void setCsjRewardName(String rewardName) {
    method setCsjUserId (line 94) | public void setCsjUserId(String userId) {
    method setCsjRewardAmount (line 99) | public void setCsjRewardAmount(int rewardAmount) {
    method setCsjOrientation (line 104) | public void setCsjOrientation(int csjOrientation) {
    method setCsjMediaExtra (line 109) | public void setCsjMediaExtra(String mediaExtra) {
    method setYlhVolumeOn (line 114) | public void setYlhVolumeOn(boolean vo) {
    method setYlhSSVO (line 118) | public void setYlhSSVO(ServerSideVerificationOptions options){
    method isYlhVolumeOn (line 122) | @Override
    method getCsjMediaExtra (line 127) | public String getCsjMediaExtra() {
    method getYlhSSVO (line 131) | @Override
    method getCsjOrientation (line 136) | public int getCsjOrientation() {
    method getCsjRewardAmount (line 140) | public int getCsjRewardAmount() {
    method getCsjRewardName (line 144) | public String getCsjRewardName() {
    method getCsjUserId (line 148) | public String getCsjUserId() {

FILE: easyads/src/main/java/com/easyads/core/splash/EASplashLifeCallback.java
  type EASplashLifeCallback (line 3) | public interface EASplashLifeCallback {
    method onResume (line 4) | void onResume();
    method onPause (line 6) | void onPause();

FILE: easyads/src/main/java/com/easyads/core/splash/EASplashListener.java
  type EASplashListener (line 5) | public interface EASplashListener extends EABaseADListener {

FILE: easyads/src/main/java/com/easyads/core/splash/EASplashSetting.java
  type EASplashSetting (line 8) | public interface EASplashSetting extends BaseAdapterEvent {
    method getCsjAcceptedSizeWidth (line 10) | int getCsjAcceptedSizeWidth();
    method getCsjAcceptedSizeHeight (line 12) | int getCsjAcceptedSizeHeight();
    method getCsjExpressViewWidth (line 14) | float getCsjExpressViewWidth();
    method getCsjExpressViewHeight (line 16) | float getCsjExpressViewHeight();
    method getCsjShowAsExpress (line 18) | boolean getCsjShowAsExpress();
    method adapterDidSkip (line 20) | void adapterDidSkip(SdkSupplier sdkSupplier);
    method adapterDidTimeOver (line 22) | void adapterDidTimeOver(SdkSupplier sdkSupplier);
    method getAdContainer (line 24) | ViewGroup getAdContainer();
    method isShowInSingleActivity (line 26) | boolean isShowInSingleActivity();

FILE: easyads/src/main/java/com/easyads/core/splash/EasyAdSplash.java
  class EasyAdSplash (line 17) | public class EasyAdSplash extends EasyAdBaseAdspot implements EASplashSe...
    method EasyAdSplash (line 35) | public EasyAdSplash(final Activity activity, final ViewGroup adContain...
    method initSdkSupplier (line 77) | @Override
    method startLoad (line 89) | @Override
    method doJump (line 99) | private void doJump() {
    method adapterDidExposure (line 119) | @Override
    method adapterDidSkip (line 126) | public void adapterDidSkip(SdkSupplier supplier) {
    method adapterDidTimeOver (line 137) | public void adapterDidTimeOver(SdkSupplier supplier) {
    method isShowInSingleActivity (line 152) | public boolean isShowInSingleActivity() {
    method setShowInSingleActivity (line 156) | public void setShowInSingleActivity(boolean single) {
    method setCsjShowAsExpress (line 166) | public void setCsjShowAsExpress(boolean isExpress) {
    method getCsjShowAsExpress (line 170) | public boolean getCsjShowAsExpress() {
    method getCsjAcceptedSizeWidth (line 174) | public int getCsjAcceptedSizeWidth() {
    method getCsjAcceptedSizeHeight (line 178) | public int getCsjAcceptedSizeHeight() {
    method getCsjExpressViewWidth (line 182) | public float getCsjExpressViewWidth() {
    method getCsjExpressViewHeight (line 186) | public float getCsjExpressViewHeight() {
    method getAdContainer (line 190) | @Override

FILE: easyads/src/main/java/com/easyads/custom/EABannerCustomAdapter.java
  class EABannerCustomAdapter (line 10) | public abstract class EABannerCustomAdapter extends EABaseSupplierAdapter {
    method EABannerCustomAdapter (line 12) | public EABannerCustomAdapter(SoftReference<Activity> softReferenceActi...

FILE: easyads/src/main/java/com/easyads/custom/EADrawCustomAdapter.java
  class EADrawCustomAdapter (line 15) | public abstract class EADrawCustomAdapter extends EABaseSupplierAdapter {
    method EADrawCustomAdapter (line 18) | public EADrawCustomAdapter(SoftReference<Activity> activity, EADrawSet...
    method addADView (line 24) | public boolean addADView(View adView) {

FILE: easyads/src/main/java/com/easyads/custom/EAFullScreenCustomAdapter.java
  class EAFullScreenCustomAdapter (line 10) | public abstract class EAFullScreenCustomAdapter extends EABaseSupplierAd...
    method EAFullScreenCustomAdapter (line 13) | public EAFullScreenCustomAdapter(SoftReference<Activity> activity, EAF...
    method handleCached (line 18) | public void handleCached() {

FILE: easyads/src/main/java/com/easyads/custom/EAInterstitialCustomAdapter.java
  class EAInterstitialCustomAdapter (line 10) | public abstract class EAInterstitialCustomAdapter extends EABaseSupplier...
    method EAInterstitialCustomAdapter (line 13) | public EAInterstitialCustomAdapter(SoftReference<Activity> activity, E...

FILE: easyads/src/main/java/com/easyads/custom/EANativeExpressCustomAdapter.java
  class EANativeExpressCustomAdapter (line 13) | public abstract class EANativeExpressCustomAdapter extends EABaseSupplie...
    method EANativeExpressCustomAdapter (line 16) | public EANativeExpressCustomAdapter(SoftReference<Activity> activity, ...
    method addADView (line 21) | public void addADView(View adView) {
    method removeADView (line 50) | public void removeADView() {
    method setNEView (line 66) | public void setNEView(View view) {

FILE: easyads/src/main/java/com/easyads/custom/EARewardCustomAdapter.java
  class EARewardCustomAdapter (line 10) | public abstract class EARewardCustomAdapter extends EABaseSupplierAdapter {
    method EARewardCustomAdapter (line 13) | public EARewardCustomAdapter(SoftReference<Activity> softReferenceActi...
    method handleCached (line 19) | public void handleCached() {

FILE: easyads/src/main/java/com/easyads/custom/EASplashCustomAdapter.java
  class EASplashCustomAdapter (line 11) | public abstract class EASplashCustomAdapter extends EABaseSupplierAdapter {
    method EASplashCustomAdapter (line 15) | public EASplashCustomAdapter(SoftReference<Activity> activity, final E...

FILE: easyads/src/main/java/com/easyads/itf/AdCoreAction.java
  type AdCoreAction (line 6) | public interface AdCoreAction {
    method loadOnly (line 7) | void loadOnly();
    method show (line 9) | void show();
    method loadAndShow (line 11) | void loadAndShow();
    method destroy (line 13) | void destroy();

FILE: easyads/src/main/java/com/easyads/itf/BaseAdapterEvent.java
  type BaseAdapterEvent (line 9) | public interface BaseAdapterEvent {
    method adapterDidSucceed (line 10) | void adapterDidSucceed(SdkSupplier supplier);
    method adapterDidExposure (line 12) | void adapterDidExposure(SdkSupplier supplier);
    method adapterDidClicked (line 14) | void adapterDidClicked(SdkSupplier supplier);
    method adapterDidFailed (line 16) | void adapterDidFailed(EasyAdError easyAdError, SdkSupplier sdkSupplier);
    method getSupplierInf (line 18) | SdkSupplier getSupplierInf();

FILE: easyads/src/main/java/com/easyads/itf/BaseEnsureListener.java
  type BaseEnsureListener (line 3) | public interface BaseEnsureListener {
    method ensure (line 4) | void ensure();

FILE: easyads/src/main/java/com/easyads/itf/EABaseADListener.java
  type EABaseADListener (line 5) | public interface EABaseADListener {
    method onAdSucceed (line 6) | void onAdSucceed();
    method onAdExposure (line 8) | void onAdExposure();
    method onAdClicked (line 10) | void onAdClicked();
    method onAdClose (line 12) | void onAdClose();
    method onAdFailed (line 14) | void onAdFailed(EasyAdError easyAdError);

FILE: easyads/src/main/java/com/easyads/model/EALogLevel.java
  type EALogLevel (line 3) | public enum EALogLevel {
    method EALogLevel (line 31) | EALogLevel(int ni) {

FILE: easyads/src/main/java/com/easyads/model/EasyAdError.java
  class EasyAdError (line 5) | public class EasyAdError {
    method EasyAdError (line 27) | public EasyAdError(String code, String msg) {
    method parseErr (line 36) | public static EasyAdError parseErr(int code) {
    method parseErr (line 40) | public static EasyAdError parseErr(String code) {
    method parseErr (line 44) | public static EasyAdError parseErr(int code, String extMsg) {
    method parseErr (line 48) | public static EasyAdError parseErr(String code, String extMsg) {
    method toString (line 118) | @NonNull

FILE: easyads/src/main/java/com/easyads/model/EasyAdType.java
  type EasyAdType (line 6) | public enum EasyAdType {
    method EasyAdType (line 16) | EasyAdType(String ni) {

FILE: easyads/src/main/java/com/easyads/model/SdkRule.java
  class SdkRule (line 9) | public class SdkRule implements Serializable {

FILE: easyads/src/main/java/com/easyads/model/SdkSupplier.java
  class SdkSupplier (line 7) | public class SdkSupplier implements Comparable<SdkSupplier>, Serializable {
    method compareTo (line 20) | @Override
    method toString (line 31) | @Override

FILE: easyads/src/main/java/com/easyads/model/StrategyModel.java
  class StrategyModel (line 17) | public class StrategyModel implements Serializable {
    method covert (line 29) | public static StrategyModel covert(String json) {

FILE: easyads/src/main/java/com/easyads/utils/BigDecimalUtil.java
  class BigDecimalUtil (line 5) | public class BigDecimalUtil {
    method add (line 13) | public static double add(double value1, double value2) {
    method sub (line 26) | public static double sub(double value1, double value2) {
    method mul (line 39) | public static double mul(double value1, double value2) {
    method div (line 46) | public static double div(double value1, double value2) {
    method div (line 60) | public static double div(double value1, double value2, int scale) {

FILE: easyads/src/main/java/com/easyads/utils/EAAdapterLoader.java
  class EAAdapterLoader (line 22) | public class EAAdapterLoader {
    method getSDKLoader (line 36) | public static EABaseSupplierAdapter getSDKLoader(String sdkTag, EasyAd...
    method getSDKAdapter (line 100) | private static EABaseSupplierAdapter getSDKAdapter(String clzName, Sof...

FILE: easyads/src/main/java/com/easyads/utils/EALog.java
  class EALog (line 11) | public class EALog {
    method d (line 14) | public static void d(String s) {
    method simple (line 21) | public static void simple(String s) {
    method high (line 28) | public static void high(String s) {
    method max (line 35) | public static void max(String s) {
    method devDebug (line 41) | public static void devDebug(String devText) {
    method devDebugAuto (line 47) | public static void devDebugAuto(String devText, String debugText) {
    method w (line 64) | public static void w(String s) {
    method e (line 70) | public static void e(String s) {
    method isDebug (line 76) | public static boolean isDebug() {
    method showSimpleLog (line 81) | public static boolean showSimpleLog() {
    method showHighLog (line 86) | public static boolean showHighLog() {
    method showAllLog (line 91) | public static boolean showAllLog() {
    method getThrowableLog (line 96) | public static String getThrowableLog(Throwable paramThrowable) {

FILE: easyads/src/main/java/com/easyads/utils/EASplashPlusManager.java
  class EASplashPlusManager (line 8) | public class EASplashPlusManager {
    method startZoom (line 10) | public static void startZoom(Activity activity) {
    method reflectZoomMethod (line 39) | private static ZoomCall reflectZoomMethod(String supClzName) {
    type ZoomCall (line 54) | public interface ZoomCall {
      method zoomOut (line 55) | void zoomOut(Activity activity);

FILE: easyads/src/main/java/com/easyads/utils/EASplashZoomOutLayout.java
  class EASplashZoomOutLayout (line 11) | public class EASplashZoomOutLayout extends FrameLayout {
    method EASplashZoomOutLayout (line 20) | public EASplashZoomOutLayout(Context context, int m) {
    method onAttachedToWindow (line 33) | @Override
    method onInterceptTouchEvent (line 51) | @Override

FILE: easyads/src/main/java/com/easyads/utils/EAUtil.java
  class EAUtil (line 21) | public class EAUtil {
    method getUUID (line 22) | public static String getUUID() {
    method isActivityDestroyed (line 37) | public static boolean isActivityDestroyed(Activity activity) {
    method isActivityDestroyed (line 53) | public static boolean isActivityDestroyed(SoftReference<Activity> acti...
    method switchMainThread (line 70) | public static void switchMainThread(final BaseEnsureListener ensureLis...
    method switchMainThreadDelay (line 94) | public static void switchMainThreadDelay(final BaseEnsureListener ensu...
    method removeFromParent (line 114) | public static void removeFromParent(View view) {
    method isDev (line 132) | public static boolean isDev() {
    method autoClose (line 136) | public static void autoClose(final View view) {
    method isMainProcess (line 156) | public static boolean isMainProcess(Context context) {
    method getCurrentProcessName (line 168) | public static String getCurrentProcessName(Context context) {

FILE: easyads/src/main/java/com/easyads/utils/ScreenUtil.java
  class ScreenUtil (line 6) | public class ScreenUtil {
    method ScreenUtil (line 7) | public ScreenUtil() {
    method dip2px (line 11) | public static int dip2px(Activity activity, float dpValue) {
    method dip2pxC (line 15) | public static int dip2pxC(Context context, float dpValue) {
    method px2dip (line 25) | public static int px2dip(Activity activity, float pxValue) {
    method px2dipC (line 29) | public static int px2dipC(Context context, float pxValue) {
    method getScreenWidth (line 39) | public static int getScreenWidth(Activity activity) {
    method getScreenWidthC (line 43) | public static int getScreenWidthC(Context context) {
    method getScreenHeight (line 53) | public static int getScreenHeight(Activity activity) {
    method getScreenHeightC (line 57) | public static int getScreenHeightC(Context context) {

FILE: easybd/src/androidTest/java/com/easyads/supplier/baidu/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDBannerAdapter.java
  class BDBannerAdapter (line 21) | public class BDBannerAdapter extends EABannerCustomAdapter implements Ad...
    method BDBannerAdapter (line 26) | public BDBannerAdapter(SoftReference<Activity> activity, EABannerSetti...
    method doLoadAD (line 31) | @Override
    method doShowAD (line 55) | @Override
    method doDestroy (line 61) | @Override
    method onAdReady (line 73) | @Override
    method onAdShow (line 80) | @Override
    method onAdClick (line 87) | @Override
    method onAdFailed (line 94) | @Override
    method onAdSwitch (line 101) | @Override
    method onAdClose (line 107) | @Override

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDFullScreenVideoAdapter.java
  class BDFullScreenVideoAdapter (line 13) | public class BDFullScreenVideoAdapter extends EAFullScreenCustomAdapter ...
    method BDFullScreenVideoAdapter (line 18) | public BDFullScreenVideoAdapter(SoftReference<Activity> activity, EAFu...
    method doLoadAD (line 23) | @Override
    method doShowAD (line 34) | @Override
    method doDestroy (line 48) | @Override
    method onAdShow (line 57) | @Override
    method onAdClick (line 64) | @Override
    method onAdClose (line 71) | @Override
    method onAdFailed (line 84) | @Override
    method onVideoDownloadSuccess (line 91) | @Override
    method onVideoDownloadFailed (line 98) | @Override
    method playCompletion (line 103) | @Override
    method onAdSkip (line 111) | @Override
    method onAdLoaded (line 120) | @Override

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDInterstitialAdapter.java
  class BDInterstitialAdapter (line 16) | public class BDInterstitialAdapter extends EAInterstitialCustomAdapter i...
    method BDInterstitialAdapter (line 23) | public BDInterstitialAdapter(SoftReference<Activity> activity, EAInter...
    method doLoadAD (line 30) | @Override
    method doShowAD (line 58) | @Override
    method doDestroy (line 70) | @Override
    method onAdReady (line 79) | @Override
    method onAdPresent (line 85) | @Override
    method onAdClick (line 91) | @Override
    method onAdDismissed (line 97) | @Override
    method onAdFailed (line 105) | @Override

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDNativeExpressAdapter.java
  class BDNativeExpressAdapter (line 24) | public class BDNativeExpressAdapter extends EANativeExpressCustomAdapter...
    method BDNativeExpressAdapter (line 30) | public BDNativeExpressAdapter(SoftReference<Activity> activity, EANati...
    method doLoadAD (line 36) | @Override
    method doShowAD (line 55) | @Override
    method doDestroy (line 129) | @Override
    method onNativeLoad (line 133) | @Override
    method onNativeFail (line 153) | @Override
    method onNoAd (line 158) | @Override
    method onVideoDownloadSuccess (line 164) | @Override
    method onVideoDownloadFailed (line 170) | @Override
    method onLpClosed (line 176) | @Override
    method onADClose (line 183) | public void onADClose() {
    method onAdClick (line 191) | @Override
    method onADExposed (line 202) | @Override
    method onADExposureFailed (line 213) | @Override
    method onADStatusChanged (line 221) | @Override
    method onAdUnionClick (line 227) | @Override
    method getBtnText (line 235) | private String getBtnText(NativeResponse nrAd) {

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDRewardVideoAdapter.java
  class BDRewardVideoAdapter (line 15) | public class BDRewardVideoAdapter extends EARewardCustomAdapter implemen...
    method BDRewardVideoAdapter (line 18) | public BDRewardVideoAdapter(SoftReference<Activity> activity, EAReward...
    method doLoadAD (line 22) | @Override
    method doShowAD (line 32) | @Override
    method doDestroy (line 44) | @Override
    method onAdShow (line 51) | @Override
    method onAdClick (line 57) | @Override
    method onAdClose (line 63) | @Override
    method onAdFailed (line 72) | @Override
    method onVideoDownloadSuccess (line 78) | @Override
    method onVideoDownloadFailed (line 85) | @Override
    method playCompletion (line 90) | @Override
    method onAdSkip (line 98) | @Override
    method onRewardVerify (line 109) | @Override
    method onAdLoaded (line 128) | @Override

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDSplashAdapter.java
  class BDSplashAdapter (line 16) | public class BDSplashAdapter extends EASplashCustomAdapter implements Sp...
    method BDSplashAdapter (line 22) | public BDSplashAdapter(SoftReference<Activity> softReferenceActivity, ...
    method doLoadAD (line 28) | @Override
    method initSplash (line 34) | private void initSplash() {
    method doShowAD (line 39) | @Override
    method doDestroy (line 44) | @Override
    method onLpClosed (line 57) | @Override
    method onAdPresent (line 63) | @Override
    method onAdExposed (line 83) | @Override
    method onADLoaded (line 103) | @Override
    method onAdClick (line 110) | @Override
    method onAdCacheSuccess (line 116) | @Override
    method onAdCacheFailed (line 122) | @Override
    method onAdDismissed (line 128) | @Override
    method onAdSkip (line 141) | @Override
    method onAdFailed (line 149) | @Override

FILE: easybd/src/main/java/com/easyads/supplier/baidu/BDUtil.java
  class BDUtil (line 17) | public class BDUtil implements EASplashPlusManager.ZoomCall {
    method initBDAccount (line 20) | public static void initBDAccount(EABaseSupplierAdapter adapter) {
    method getProcessName (line 85) | private static String getProcessName(Context context) {
    method zoomOut (line 100) | @Override

FILE: easybd/src/main/java/com/easyads/supplier/baidu/EasyBDManager.java
  class EasyBDManager (line 14) | public class EasyBDManager {
    method EasyBDManager (line 17) | private EasyBDManager() {
    method getInstance (line 20) | public static synchronized EasyBDManager getInstance() {

FILE: easybd/src/test/java/com/easyads/supplier/baidu/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: easycsj/src/androidTest/java/com/easyads/supplier/csj/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CSJSplashClickEyeManager.java
  class CSJSplashClickEyeManager (line 19) | public class CSJSplashClickEyeManager {
    type AnimationCallBack (line 39) | public interface AnimationCallBack {
      method animationStart (line 40) | void animationStart(int animationTime);
      method animationEnd (line 42) | void animationEnd();
    method getInstance (line 50) | public static CSJSplashClickEyeManager getInstance() {
    method CSJSplashClickEyeManager (line 61) | private CSJSplashClickEyeManager() {
    method init (line 66) | public void init(Context context) {
    method initClickEyeViewData (line 73) | private void initClickEyeViewData(Context context) {
    method setSplashInfo (line 89) | public void setSplashInfo(TTSplashAd splashAd, View splashView, View d...
    method clearSplashStaticData (line 98) | public void clearSplashStaticData() {
    method getSplashAd (line 103) | public TTSplashAd getSplashAd() {
    method startSplashClickEyeAnimationInTwoActivity (line 107) | public ViewGroup startSplashClickEyeAnimationInTwoActivity(final ViewG...
    method startSplashClickEyeAnimation (line 124) | public ViewGroup startSplashClickEyeAnimation(final View splash, final...
    method removeFromParent (line 206) | public static void removeFromParent(View view) {
    method isSupportSplashClickEye (line 215) | public boolean isSupportSplashClickEye() {
    method setSupportSplashClickEye (line 219) | public void setSupportSplashClickEye(boolean isSupportSplashClickEye) {

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjBannerAdapter.java
  class CsjBannerAdapter (line 23) | public class CsjBannerAdapter extends EABannerCustomAdapter implements T...
    method CsjBannerAdapter (line 28) | public CsjBannerAdapter(SoftReference<Activity> activity, final EABann...
    method onError (line 34) | @Override
    method onNativeExpressAdLoad (line 40) | @Override
    method bindAdListener (line 63) | private void bindAdListener(TTNativeExpressAd ad) {
    method doDestroy (line 136) | @Override
    method doLoadAD (line 146) | @Override
    method startLoadAD (line 162) | private void startLoadAD() {
    method doShowAD (line 178) | @Override

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjDrawAdapter.java
  class CsjDrawAdapter (line 18) | public class CsjDrawAdapter extends EADrawCustomAdapter implements TTAdN...
    method CsjDrawAdapter (line 21) | public CsjDrawAdapter(SoftReference<Activity> activity, EADrawSetting ...
    method doLoadAD (line 25) | @Override
    method doDestroy (line 42) | @Override
    method doShowAD (line 48) | @Override
    method startLoadAD (line 56) | private void startLoadAD() {
    method onError (line 72) | @Override
    method onNativeExpressAdLoad (line 79) | @Override

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjFullScreenVideoAdapter.java
  class CsjFullScreenVideoAdapter (line 18) | public class CsjFullScreenVideoAdapter extends EAFullScreenCustomAdapter...
    method CsjFullScreenVideoAdapter (line 22) | public CsjFullScreenVideoAdapter(SoftReference<Activity> activity, EAF...
    method doLoadAD (line 27) | @Override
    method startLoadAD (line 43) | private void startLoadAD() {
    method doShowAD (line 70) | @Override
    method doDestroy (line 77) | @Override
    method onError (line 86) | @Override
    method onFullScreenVideoAdLoad (line 92) | @Override
    method onFullScreenVideoCached (line 104) | @Override
    method onFullScreenVideoCached (line 109) | @Override
    method onAdShow (line 128) | @Override
    method onAdVideoBarClick (line 135) | @Override
    method onAdClose (line 142) | @Override
    method onVideoComplete (line 151) | @Override
    method onSkippedVideo (line 160) | @Override

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjInterstitialAdapter.java
  class CsjInterstitialAdapter (line 18) | public class CsjInterstitialAdapter extends EAInterstitialCustomAdapter  {
    method CsjInterstitialAdapter (line 25) | public CsjInterstitialAdapter(SoftReference<Activity> activity, EAInte...
    method doDestroy (line 30) | @Override
    method doLoadAD (line 35) | @Override
    method doShowAD (line 52) | @Override
    method startLoadAD (line 74) | private void startLoadAD() {

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjNativeExpressAdapter.java
  class CsjNativeExpressAdapter (line 19) | public class CsjNativeExpressAdapter extends EANativeExpressCustomAdapte...
    method CsjNativeExpressAdapter (line 25) | public CsjNativeExpressAdapter(SoftReference<Activity> activity, EANat...
    method doLoadAD (line 31) | @Override
    method startLoadAD (line 47) | private void startLoadAD() {
    method doDestroy (line 60) | @Override
    method onError (line 66) | @Override
    method onNativeExpressAdLoad (line 72) | @Override
    method doShowAD (line 93) | @Override

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjRewardVideoAdapter.java
  class CsjRewardVideoAdapter (line 17) | public class CsjRewardVideoAdapter extends EARewardCustomAdapter impleme...
    method CsjRewardVideoAdapter (line 22) | public CsjRewardVideoAdapter(SoftReference<Activity> activity, EARewar...
    method onError (line 27) | @Override
    method onRewardVideoAdLoad (line 34) | @Override
    method onRewardVideoCached (line 48) | @Override
    method onRewardVideoCached (line 54) | @Override
    method doLoadAD (line 69) | @Override
    method startLoadAD (line 85) | private void startLoadAD() {
    method doDestroy (line 105) | @Override
    method doShowAD (line 110) | @Override
    method onAdItemRewardVerify (line 182) | public void onAdItemRewardVerify(boolean rewardVerify, int rewardType,...

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjSplashAdapter.java
  class CsjSplashAdapter (line 26) | public class CsjSplashAdapter extends EASplashCustomAdapter {
    method CsjSplashAdapter (line 29) | public CsjSplashAdapter(SoftReference<Activity> activity, EASplashSett...
    method doDestroy (line 33) | @Override
    method doShowAD (line 38) | @Override
    method doLoadAD (line 54) | @Override
    method startLoadAD (line 70) | private void startLoadAD() {
    method newApiAdFailed (line 177) | private void newApiAdFailed(CSJAdError csjAdError, String errCodeDefau...
    method switchSplashClickShow (line 196) | private void switchSplashClickShow() {
    class SplashClickEyeListener (line 233) | public static class SplashClickEyeListener implements ISplashClickEyeL...
      method SplashClickEyeListener (line 239) | public SplashClickEyeListener(Activity activity, TTSplashAd splashAd...
      method onSplashClickEyeAnimationStart (line 249) | @Override
      method onSplashClickEyeAnimationFinish (line 255) | @Override
      method isSupportSplashClickEye (line 270) | @Override
      method finishActivity (line 287) | private void finishActivity() {
      method startSplashAnimationStart (line 298) | private void startSplashAnimationStart() {

FILE: easycsj/src/main/java/com/easyads/supplier/csj/CsjUtil.java
  class CsjUtil (line 29) | public class CsjUtil implements EASplashPlusManager.ZoomCall {
    method getADManger (line 37) | public static TTAdManager getADManger(EABaseSupplierAdapter adapter) {
    method initCsj (line 56) | public static void initCsj(final EABaseSupplierAdapter adapter, final ...
    method doInit (line 137) | private static void doInit(Context context, TTAdConfig config, final I...
    method getCPMInfNew (line 199) | public static void getCPMInfNew(String TAG, CSJSplashAd newSplashAd) {
    method zoomOut (line 223) | @Override
    method addSplashClickEyeView (line 246) | private View addSplashClickEyeView(Activity activity) {
    class HomeSplashClickEyeListener (line 262) | static class HomeSplashClickEyeListener implements ISplashClickEyeList...
      method HomeSplashClickEyeListener (line 267) | public HomeSplashClickEyeListener(View splashView, TTSplashAd splash...
      method onSplashClickEyeAnimationStart (line 272) | @Override
      method onSplashClickEyeAnimationFinish (line 276) | @Override
      method isSupportSplashClickEye (line 290) | @Override
    type InitListener (line 296) | interface InitListener {
      method success (line 297) | void success();
      method fail (line 299) | void fail(String code, String msg);

FILE: easycsj/src/main/java/com/easyads/supplier/csj/EasyCsjManger.java
  class EasyCsjManger (line 6) | public class EasyCsjManger {
    method EasyCsjManger (line 9) | private EasyCsjManger() {
    method getInstance (line 12) | public static synchronized EasyCsjManger getInstance() {

FILE: easycsj/src/test/java/com/easyads/supplier/csj/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: easyks/src/androidTest/java/com/easyads/supplier/ks/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: easyks/src/main/java/com/easyads/supplier/ks/EasyKSManager.java
  class EasyKSManager (line 8) | public class EasyKSManager {
    method EasyKSManager (line 11) | private EasyKSManager() {
    method getInstance (line 14) | public static synchronized EasyKSManager getInstance() {

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSDrawAdapter.java
  class KSDrawAdapter (line 19) | public class KSDrawAdapter extends EADrawCustomAdapter implements KsDraw...
    method KSDrawAdapter (line 22) | public KSDrawAdapter(SoftReference<Activity> activity, EADrawSetting s...
    method doLoadAD (line 27) | @Override
    method startLoad (line 44) | private void startLoad() {
    method doDestroy (line 80) | @Override
    method doShowAD (line 85) | @Override
    method onAdClicked (line 97) | @Override
    method onAdShow (line 104) | @Override
    method onVideoPlayStart (line 111) | @Override
    method onVideoPlayPause (line 117) | @Override
    method onVideoPlayResume (line 123) | @Override
    method onVideoPlayEnd (line 129) | @Override
    method onVideoPlayError (line 135) | @Override

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSFullScreenVideoAdapter.java
  class KSFullScreenVideoAdapter (line 18) | public class KSFullScreenVideoAdapter extends EAFullScreenCustomAdapter ...
    method KSFullScreenVideoAdapter (line 25) | public KSFullScreenVideoAdapter(SoftReference<Activity> activity, EAFu...
    method doLoadAD (line 30) | @Override
    method startLoad (line 47) | private void startLoad() {
    method doShowAD (line 87) | @Override
    method doDestroy (line 92) | @Override
    method onAdClicked (line 99) | @Override
    method onPageDismiss (line 105) | @Override
    method onVideoPlayError (line 113) | @Override
    method onVideoPlayEnd (line 121) | @Override
    method onVideoPlayStart (line 129) | @Override
    method onSkippedVideo (line 135) | @Override

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSInterstitialAdapter.java
  class KSInterstitialAdapter (line 18) | public class KSInterstitialAdapter extends EAInterstitialCustomAdapter i...
    method KSInterstitialAdapter (line 23) | public KSInterstitialAdapter(SoftReference<Activity> activity, EAInter...
    method doShowAD (line 28) | @Override
    method doLoadAD (line 33) | @Override
    method startLoad (line 51) | private void startLoad() {
    method doDestroy (line 95) | @Override
    method onAdClicked (line 104) | @Override
    method onAdShow (line 110) | @Override
    method onAdClosed (line 116) | @Override
    method onPageDismiss (line 124) | @Override
    method onVideoPlayError (line 132) | @Override
    method onVideoPlayEnd (line 145) | @Override
    method onVideoPlayStart (line 150) | @Override
    method onSkippedAd (line 155) | @Override

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSNativeExpressAdapter.java
  class KSNativeExpressAdapter (line 19) | public class KSNativeExpressAdapter extends EANativeExpressCustomAdapter {
    method KSNativeExpressAdapter (line 23) | public KSNativeExpressAdapter(SoftReference<Activity> activity, EANati...
    method doLoadAD (line 28) | @Override
    method startLoad (line 45) | private void startLoad() {
    method doDestroy (line 118) | @Override
    method doShowAD (line 123) | @Override

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSRewardVideoAdapter.java
  class KSRewardVideoAdapter (line 19) | public class KSRewardVideoAdapter extends EARewardCustomAdapter implemen...
    method KSRewardVideoAdapter (line 23) | public KSRewardVideoAdapter(SoftReference<Activity> activity, EAReward...
    method doLoadAD (line 28) | @Override
    method startLoad (line 45) | private void startLoad() {
    method doDestroy (line 88) | @Override
    method onAdClicked (line 95) | @Override
    method onPageDismiss (line 102) | @Override
    method onVideoPlayError (line 110) | @Override
    method onVideoPlayEnd (line 118) | @Override
    method onVideoSkipToEnd (line 126) | @Override
    method onVideoPlayStart (line 131) | @Override
    method onRewardVerify (line 138) | @Override
    method onRewardStepVerify (line 156) | @Override
    method onExtraRewardVerify (line 162) | @Override
    method doShowAD (line 170) | @Override

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSSplashAdapter.java
  class KSSplashAdapter (line 20) | public class KSSplashAdapter extends EASplashCustomAdapter implements Ks...
    method KSSplashAdapter (line 23) | public KSSplashAdapter(SoftReference<Activity> softReferenceActivity, ...
    method doLoadAD (line 28) | @Override
    method startLoad (line 45) | private void startLoad() {
    method doShowAD (line 84) | @Override
    method doDestroy (line 103) | @Override
    method onAdClicked (line 111) | @Override
    method onAdShowError (line 118) | @Override
    method onAdShowEnd (line 129) | @Override
    method onAdShowStart (line 138) | @Override
    method onSkippedAd (line 145) | @Override
    method onDownloadTipsDialogShow (line 153) | @Override
    method onDownloadTipsDialogDismiss (line 159) | @Override
    method onDownloadTipsDialogCancel (line 165) | @Override

FILE: easyks/src/main/java/com/easyads/supplier/ks/KSUtil.java
  class KSUtil (line 18) | public class KSUtil implements EASplashPlusManager.ZoomCall {
    method initAD (line 20) | public static synchronized void initAD(EABaseSupplierAdapter adapter, ...
    method getADID (line 142) | public static long getADID(SdkSupplier supplier) {
    method zoomOut (line 153) | @Override
    type InitListener (line 158) | interface InitListener {
      method success (line 159) | void success();
      method fail (line 161) | void fail(String code, String msg);

FILE: easyks/src/test/java/com/easyads/supplier/ks/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: easyylh/src/androidTest/java/com/easyads/supplier/ylh/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 18) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 20) | @Test

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/SplashZoomOutManager.java
  class SplashZoomOutManager (line 17) | public class SplashZoomOutManager {
    type AnimationCallBack (line 38) | public interface AnimationCallBack {
      method animationStart (line 39) | void animationStart(int animationTime);
      method animationEnd (line 41) | void animationEnd();
    class Holder (line 44) | private static final class Holder {
    method getInstance (line 48) | public static SplashZoomOutManager getInstance() {
    method SplashZoomOutManager (line 52) | private SplashZoomOutManager() {
    method initSize (line 57) | public void initSize(Context context) {
    method setSplashInfo (line 81) | public void setSplashInfo(SplashAD splashAD, View splashView, View dec...
    method clearStaticData (line 91) | public void clearStaticData() {
    method getSplashAD (line 96) | public SplashAD getSplashAD() {
    method startZoomOut (line 108) | public ViewGroup startZoomOut(final ViewGroup animationContainer,
    method startZoomOut (line 153) | public ViewGroup startZoomOut(final View splash, final ViewGroup anima...

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhBannerAdapter.java
  class YlhBannerAdapter (line 17) | public class YlhBannerAdapter extends EABannerCustomAdapter implements U...
    method YlhBannerAdapter (line 21) | public YlhBannerAdapter(SoftReference<Activity> activity, EABannerSett...
    method onNoAD (line 27) | @Override
    method onADReceive (line 45) | @Override
    method onADExposure (line 67) | @Override
    method onADClosed (line 74) | @Override
    method onADClicked (line 83) | @Override
    method onADLeftApplication (line 91) | @Override
    method doLoadAD (line 97) | @Override
    method doShowAD (line 109) | @Override
    method doDestroy (line 120) | @Override

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhFullScreenVideoAdapter.java
  class YlhFullScreenVideoAdapter (line 17) | public class YlhFullScreenVideoAdapter extends EAFullScreenCustomAdapter...
    method YlhFullScreenVideoAdapter (line 24) | public YlhFullScreenVideoAdapter(SoftReference<Activity> activity, EAF...
    method onADReceive (line 29) | @Override
    method onVideoCached (line 42) | @Override
    method onNoAD (line 50) | @Override
    method onADOpened (line 66) | @Override
    method onADExposure (line 72) | @Override
    method onADClicked (line 79) | @Override
    method onADLeftApplication (line 85) | @Override
    method onADClosed (line 92) | @Override
    method onRenderSuccess (line 109) | @Override
    method onRenderFail (line 115) | @Override
    method doLoadAD (line 122) | @Override
    method doDestroy (line 235) | @Override
    method doShowAD (line 240) | @Override

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhInterstitialAdapter.java
  class YlhInterstitialAdapter (line 16) | public class YlhInterstitialAdapter extends EAInterstitialCustomAdapter ...
    method YlhInterstitialAdapter (line 21) | public YlhInterstitialAdapter(SoftReference<Activity> activity, EAInte...
    method doDestroy (line 26) | @Override
    method doLoadAD (line 33) | @Override
    method doShowAD (line 40) | @Override
    method onADReceive (line 48) | @Override
    method onVideoCached (line 60) | @Override
    method onNoAD (line 66) | @Override
    method onADOpened (line 83) | @Override
    method onADExposure (line 89) | @Override
    method onADClicked (line 96) | @Override
    method onADLeftApplication (line 103) | @Override
    method onADClosed (line 109) | @Override
    method onRenderSuccess (line 118) | @Override
    method onRenderFail (line 123) | @Override

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhNativeExpressAdapter.java
  class YlhNativeExpressAdapter (line 22) | public class YlhNativeExpressAdapter extends EANativeExpressCustomAdapter {
    method YlhNativeExpressAdapter (line 27) | public YlhNativeExpressAdapter(SoftReference<Activity> activity, EANat...
    method doLoadAD (line 37) | @Override
    method onADLoadedEV (line 100) | public void onADLoadedEV(List<NativeExpressADView> list) {
    method onRenderFailEV (line 125) | public void onRenderFailEV(View nativeExpressADView) {
    method onRenderSuccessEV (line 136) | public void onRenderSuccessEV(View nativeExpressADView) {
    method onADExposureEV (line 145) | public void onADExposureEV(View nativeExpressADView) {
    method onADClickedEV (line 152) | public void onADClickedEV(View nativeExpressADView) {
    method onADClosedEV (line 159) | public void onADClosedEV(View nativeExpressADView) {
    method onNoADEV (line 170) | public void onNoADEV(AdError adError) {
    method doDestroy (line 181) | @Override
    method doShowAD (line 186) | @Override

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhRewardVideoAdapter.java
  class YlhRewardVideoAdapter (line 21) | public class YlhRewardVideoAdapter extends EARewardCustomAdapter impleme...
    method YlhRewardVideoAdapter (line 26) | public YlhRewardVideoAdapter(SoftReference<Activity> activity, EARewar...
    method onADLoad (line 31) | @Override
    method onVideoCached (line 38) | @Override
    method onADShow (line 45) | @Override
    method onADExpose (line 51) | @Override
    method onReward (line 58) | @Override
    method onADClick (line 75) | @Override
    method onVideoComplete (line 82) | @Override
    method onADClose (line 91) | @Override
    method onError (line 99) | @Override
    method doLoadAD (line 115) | @Override
    method doShowAD (line 133) | @Override
    method doDestroy (line 142) | @Override
    method checkRewardOk (line 148) | public boolean checkRewardOk() {

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhSplashAdapter.java
  class YlhSplashAdapter (line 17) | public class YlhSplashAdapter extends EASplashCustomAdapter {
    method YlhSplashAdapter (line 23) | public YlhSplashAdapter(SoftReference<Activity> activity, EASplashSett...
    method doShowAD (line 27) | @Override
    method doLoadAD (line 32) | @Override
    method doDestroy (line 38) | @Override
    method initAD (line 43) | private void initAD() {
    method zoomOut (line 145) | private void zoomOut() {
    method preLoad (line 165) | private void preLoad() {

FILE: easyylh/src/main/java/com/easyads/supplier/ylh/YlhUtil.java
  class YlhUtil (line 16) | public class YlhUtil implements EASplashPlusManager.ZoomCall {
    method initAD (line 19) | public static void initAD(EABaseSupplierAdapter adapter) {
    method zoomOut (line 68) | @Override

FILE: easyylh/src/test/java/com/easyads/supplier/ylh/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test

FILE: example/src/androidTest/java/com/easyads/demo/ExampleInstrumentedTest.java
  class ExampleInstrumentedTest (line 19) | @RunWith(AndroidJUnit4.class)
    method useAppContext (line 21) | @Test

FILE: example/src/main/java/com/easyads/demo/BannerActivity.java
  class BannerActivity (line 7) | public class BannerActivity extends BaseActivity {
    method onCreate (line 11) | @Override
    method loadBanner (line 23) | public void loadBanner(View view) {

FILE: example/src/main/java/com/easyads/demo/BaseActivity.java
  class BaseActivity (line 14) | public class BaseActivity extends Activity {
    method onCreate (line 17) | @Override
    method isRunning (line 33) | public boolean isRunning() {
    method onResume (line 38) | @Override
    method onPause (line 44) | @Override

FILE: example/src/main/java/com/easyads/demo/DrawActivity.java
  class DrawActivity (line 34) | public class DrawActivity extends BaseActivity {
    method onCreate (line 50) | @Override
    method initListener (line 89) | private void initListener() {
    method playVideo (line 135) | private void playVideo() {
    method releaseVideo (line 209) | private void releaseVideo(int index) {
    method changeBottomTopLayoutVisibility (line 230) | private void changeBottomTopLayoutVisibility(boolean visibility) {
    class DrawRecyclerAdapter (line 236) | public class DrawRecyclerAdapter extends RecyclerView.Adapter<DrawRecy...
      method DrawRecyclerAdapter (line 240) | DrawRecyclerAdapter(Context context, List<TestItem> dataList) {
      method onCreateViewHolder (line 245) | @NonNull
      method onBindViewHolder (line 252) | @Override
      method getItemCount (line 279) | @Override
      method getItemViewType (line 284) | @Override
      class ViewHolder (line 291) | public class ViewHolder extends RecyclerView.ViewHolder {
        method ViewHolder (line 299) | public ViewHolder(View itemView) {
    method getView (line 313) | private View getView() {
    method changeUIVisibility (line 320) | private void changeUIVisibility(DrawRecyclerAdapter.ViewHolder holder,...
    class TestItem (line 331) | private static class TestItem {
      method TestItem (line 339) | public TestItem(int type) {
      method isNormal (line 344) | boolean isNormal() {

FILE: example/src/main/java/com/easyads/demo/EasyADController.java
  class EasyADController (line 43) | public class EasyADController {
    method EasyADController (line 57) | public EasyADController(Activity activity) {
    method loadSplash (line 70) | public void loadSplash(String jsonFileName, final ViewGroup adContaine...
    type SplashCallBack (line 134) | public interface SplashCallBack {
      method jumpMain (line 135) | void jumpMain();
    method loadBanner (line 143) | public void loadBanner(String jsonFileName, ViewGroup adContainer) {
    method initInterstitial (line 195) | public EasyAdInterstitial initInterstitial(String jsonFileName) {
    method initReward (line 240) | public EasyAdRewardVideo initReward(String jsonFileName) {
    method initFullVideo (line 308) | public EasyAdFullScreenVideo initFullVideo(String jsonFileName) {
    method loadNativeExpress (line 372) | public void loadNativeExpress(String jsonFileName, ViewGroup adContain...
    method loadDraw (line 449) | public void loadDraw(String jsonFileName, ViewGroup adContainer) {
    method destroy (line 497) | public void destroy() {
    method logAndToast (line 510) | public static void logAndToast(Context context, String msg) {
    method getJson (line 518) | public static String getJson(Context context, String fileName) {

FILE: example/src/main/java/com/easyads/demo/FullScreenVideoActivity.java
  class FullScreenVideoActivity (line 9) | public class FullScreenVideoActivity extends BaseActivity {
    method onCreate (line 12) | @Override
    method loadFull (line 19) | public void loadFull(View view) {
    method showFull (line 25) | public void showFull(View view) {
    method loadAndShowFull (line 33) | public void loadAndShowFull(View view) {

FILE: example/src/main/java/com/easyads/demo/InterstitialActivity.java
  class InterstitialActivity (line 8) | public class InterstitialActivity extends BaseActivity {
    method onCreate (line 11) | @Override
    method loadAd (line 18) | public void loadAd(View view) {
    method showAd (line 23) | public void showAd(View view) {
    method loadAndShowAd (line 31) | public void loadAndShowAd(View view) {

FILE: example/src/main/java/com/easyads/demo/MainActivity.java
  class MainActivity (line 29) | public class MainActivity extends BaseActivity {
    method onCreate (line 33) | @Override
    method checkAndRequestPermission (line 77) | @TargetApi(Build.VERSION_CODES.M)
    method onBanner (line 98) | public void onBanner(View view) {
    method onSplash (line 102) | public void onSplash(View view) {
    method onNativeExpress (line 107) | public void onNativeExpress(View view) {
    method onRewardVideo (line 111) | public void onRewardVideo(View view) {
    method onNativeExpressRecyclerView (line 115) | public void onNativeExpressRecyclerView(View view) {
    method onInterstitial (line 119) | public void onInterstitial(View view) {
    method onFullVideo (line 123) | public void onFullVideo(View view) {
    method onSplashDialog (line 128) | public void onSplashDialog(View view) {
    method draw (line 133) | public void draw(View view) {
    method customChannel (line 137) | public void customChannel(View view) {

FILE: example/src/main/java/com/easyads/demo/MyApplication.java
  class MyApplication (line 13) | public class MyApplication extends Application {
    method getInstance (line 17) | public static MyApplication getInstance() {
    method onCreate (line 24) | @Override
    method initSDK (line 36) | public void initSDK() {
    method attachBaseContext (line 47) | @Override

FILE: example/src/main/java/com/easyads/demo/NativeExpressActivity.java
  class NativeExpressActivity (line 7) | public class NativeExpressActivity extends BaseActivity {
    method onCreate (line 10) | @Override
    method loadNEAD (line 19) | public void loadNEAD(View view) {

FILE: example/src/main/java/com/easyads/demo/NativeExpressRecyclerViewActivity.java
  class NativeExpressRecyclerViewActivity (line 21) | public class NativeExpressRecyclerViewActivity extends BaseActivity {
    method onCreate (line 30) | @Override
    method initData (line 41) | private void initData() {
    class CustomAdapter (line 71) | static class CustomAdapter extends RecyclerView.Adapter<CustomAdapter....
      method CustomAdapter (line 78) | public CustomAdapter(Activity activity, List<RycItem> list) {
      method getItemCount (line 83) | @Override
      method getItemViewType (line 92) | @Override
      method onBindViewHolder (line 98) | @Override
      method onCreateViewHolder (line 110) | @Override
      class CustomViewHolder (line 118) | static class CustomViewHolder extends RecyclerView.ViewHolder {
        method CustomViewHolder (line 122) | public CustomViewHolder(View view) {
    class RycItem (line 131) | public static class RycItem {
      method RycItem (line 136) | public RycItem(String title) {
      method getTitle (line 140) | public String getTitle() {
      method setTitle (line 144) | public void setTitle(String title) {

FILE: example/src/main/java/com/easyads/demo/RewardVideoActivity.java
  class RewardVideoActivity (line 8) | public class RewardVideoActivity extends BaseActivity {
    method onCreate (line 11) | @Override
    method onLoad (line 18) | public void onLoad(View view) {
    method onShow (line 24) | public void onShow(View view) {
    method loadAndShow (line 32) | public void loadAndShow(View view) {

FILE: example/src/main/java/com/easyads/demo/SplashActivity.java
  class SplashActivity (line 14) | public class SplashActivity extends BaseActivity {
    method onCreate (line 18) | @Override
    method goToMainActivity (line 60) | private void goToMainActivity() {

FILE: example/src/main/java/com/easyads/demo/SplashDialog.java
  class SplashDialog (line 12) | public class SplashDialog extends Dialog {
    method SplashDialog (line 17) | public SplashDialog(@NonNull final Activity context) {

FILE: example/src/main/java/com/easyads/demo/SplashToMainActivity.java
  class SplashToMainActivity (line 8) | public class SplashToMainActivity extends BaseActivity {
    method onCreate (line 9) | @Override

FILE: example/src/main/java/com/easyads/demo/custom/CustomActivity.java
  class CustomActivity (line 13) | public class CustomActivity extends Activity {
    method onCreate (line 14) | @Override
    method cusHW (line 20) | public void cusHW(View view) {
    method cusXM (line 26) | public void cusXM(View view) {

FILE: example/src/main/java/com/easyads/demo/custom/HuaWeiSplashAdapter.java
  class HuaWeiSplashAdapter (line 18) | public class HuaWeiSplashAdapter extends EASplashCustomAdapter {
    method HuaWeiSplashAdapter (line 24) | public HuaWeiSplashAdapter(SoftReference<Activity> activity, EASplashS...
    method doLoadAD (line 78) | @Override
    method doShowAD (line 84) | @Override
    method doDestroy (line 89) | @Override
    method loadAD (line 101) | private void loadAD() {

FILE: example/src/main/java/com/easyads/demo/custom/XiaoMiSplashAdapter.java
  class XiaoMiSplashAdapter (line 17) | public class XiaoMiSplashAdapter extends EASplashCustomAdapter {
    method XiaoMiSplashAdapter (line 21) | public XiaoMiSplashAdapter(SoftReference<Activity> activity, EASplashS...
    method doLoadAD (line 26) | @Override
    method doDestroy (line 31) | @Override
    method doShowAD (line 38) | @Override
    method loadAndShowXM (line 46) | private void loadAndShowXM() {

FILE: example/src/main/java/com/easyads/demo/draw/FullScreenVideoView.java
  class FullScreenVideoView (line 8) | public class FullScreenVideoView extends VideoView {
    method FullScreenVideoView (line 9) | public FullScreenVideoView(Context context) {
    method FullScreenVideoView (line 13) | public FullScreenVideoView(Context context, AttributeSet attrs) {
    method FullScreenVideoView (line 17) | public FullScreenVideoView(Context context, AttributeSet attrs, int de...
    method onMeasure (line 21) | @Override

FILE: example/src/main/java/com/easyads/demo/draw/OnViewPagerListener.java
  type OnViewPagerListener (line 4) | public interface OnViewPagerListener {
    method onInitComplete (line 7) | void onInitComplete();
    method onPageRelease (line 10) | void onPageRelease(boolean isNext, int position);
    method onPageSelected (line 13) | void onPageSelected(int position, boolean isBottom);

FILE: example/src/main/java/com/easyads/demo/draw/ViewPagerLayoutManager.java
  class ViewPagerLayoutManager (line 10) | public class ViewPagerLayoutManager extends LinearLayoutManager
    method ViewPagerLayoutManager (line 21) | public ViewPagerLayoutManager(Context context, int orientation) {
    method ViewPagerLayoutManager (line 25) | public ViewPagerLayoutManager(Context context, int orientation, boolea...
    method onAttachedToWindow (line 29) | @Override
    method onScrollStateChanged (line 36) | @Override
    method scrollVerticallyBy (line 53) | @Override
    method scrollHorizontallyBy (line 63) | @Override
    method setOnViewPagerListener (line 73) | public void setOnViewPagerListener(OnViewPagerListener listener) {
    method onChildViewAttachedToWindow (line 77) | @Override
    method onChildViewDetachedFromWindow (line 84) | @Override

FILE: example/src/main/java/com/easyads/demo/utils/BaseCallBack.java
  type BaseCallBack (line 3) | public interface BaseCallBack {
    method call (line 4) | void call();

FILE: example/src/main/java/com/easyads/demo/utils/Constant.java
  class Constant (line 3) | public class Constant {

FILE: example/src/main/java/com/easyads/demo/utils/DialogLogcat.java
  class DialogLogcat (line 17) | public class DialogLogcat extends Dialog {
    method DialogLogcat (line 20) | public DialogLogcat(@NonNull Context context) {
    method show (line 44) | @Override

FILE: example/src/main/java/com/easyads/demo/utils/NormalSetting.java
  class NormalSetting (line 3) | public class NormalSetting {
    method getInstance (line 7) | public static NormalSetting getInstance() {

FILE: example/src/main/java/com/easyads/demo/utils/UIUtils.java
  class UIUtils (line 26) | public class UIUtils {
    method getScreenWidthDp (line 28) | public static float getScreenWidthDp(Context context){
    method getHeight (line 35) | public static float getHeight(Activity activity) {
    method hideBottomUIMenu (line 47) | public static void hideBottomUIMenu(Activity activity) {
    method getRealHeight (line 74) | public static int getRealHeight(Context context) {
    method getStatusBarHeight (line 88) | public static float getStatusBarHeight(Context context) {
    method px2dip (line 97) | public static int px2dip(Context context, float pxValue) {
    method dp2px (line 102) | public static int dp2px(Context context, float dp) {
    method hasNotchScreen (line 111) | public static boolean hasNotchScreen(Activity activity){
    method isAndroidPHasNotch (line 124) | public static boolean isAndroidPHasNotch(Activity activity){
    method getInt (line 148) | public static int getInt(String key, Activity activity) {
    method hasNotchAtHuawei (line 186) | public static boolean hasNotchAtHuawei(Context context) {
    method hasNotchAtVivo (line 208) | public static boolean hasNotchAtVivo(Context context) {
    method hasNotchAtOPPO (line 226) | public static boolean hasNotchAtOPPO(Context context) {
    method isMiui (line 232) | public static boolean isMiui() {
    method getKllkDecryptString (line 250) | public static String getKllkDecryptString(String encryptionString) {
    method setViewSize (line 267) | public static void setViewSize(View view, int width, int height) {
    method getScreenWidthInPx (line 289) | public static int getScreenWidthInPx(Context context) {
    method getScreenHeightInPx (line 294) | public static int getScreenHeightInPx(Context context) {
    method removeFromParent (line 299) | public static void removeFromParent(View view) {
    method getScreenSize (line 313) | public static int[] getScreenSize(Context context) {

FILE: example/src/main/java/com/easyads/demo/utils/UserPrivacyDialog.java
  class UserPrivacyDialog (line 12) | public class UserPrivacyDialog extends Dialog {
    method UserPrivacyDialog (line 16) | public UserPrivacyDialog(@NonNull final Context context) {

FILE: example/src/test/java/com/easyads/demo/ExampleUnitTest.java
  class ExampleUnitTest (line 12) | public class ExampleUnitTest {
    method addition_isCorrect (line 13) | @Test
Condensed preview — 225 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (585K chars).
[
  {
    "path": ".gitignore",
    "chars": 1232,
    "preview": "# Built application 文件\n*.apk\n*.ap_\n\n# ART/Dalvik VM 文件\n*.dex\n\n# Java class 文件\n*.class\n\n# Generated 文件夹\nbin/\ngen/\nout/\n\n#"
  },
  {
    "path": "LICENSE",
    "chars": 18092,
    "preview": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Fr"
  },
  {
    "path": "README.md",
    "chars": 5284,
    "preview": "![levelup](levelup.jpg)\n\n# 🚀🚀EasyAds项目全面升级,Pro版本全面开源,搭建媒体属于自己的聚合SDK管理平台。\n# 了解更多请点击: [EasyAds Pro 主页](http://easyads-pro."
  },
  {
    "path": "build.gradle",
    "chars": 1556,
    "preview": "// Top-level build file where you can add configuration options common to all sub-projects/modules.\n\ndef version = '1.2."
  },
  {
    "path": "docs/banner.md",
    "chars": 3440,
    "preview": "# 横幅广告\n\n### 集成最佳实践:\n\n- 适用场景:一般会在 APP 页面的底部或中部呈现。\n- 常见尺寸:640*100\n- 穿山甲横幅**不支持在列表中展示**,具体表现为,当在列表上下滑动时,原本正常展示的banner广告,会变成"
  },
  {
    "path": "docs/draw.md",
    "chars": 3255,
    "preview": "# Draw视频信息流广告\n\n集成最佳实践:\n\n- 适用场景:短视频类APP,上划切换时展示广告\n- 支持提前加载广告(注意控制时机,不可过早提前),但要注意,一次展示需对应一个广告实例,切忌复用广告实例。\n\n加载广告核心方法,详细请参考d"
  },
  {
    "path": "docs/easyAds.md",
    "chars": 519,
    "preview": "# EasyAds\n\n| 方法名| \t方法介绍|  \n|:------------- |:---------------|  \n|getVersion() | 获取EasyAds SDK的版本号信息\n|setDebug(boolean is"
  },
  {
    "path": "docs/easyBDManger.md",
    "chars": 1005,
    "preview": "# EasyBDManager\n\n百度个性化配置信息API方法介绍\n\n| 参数名| 参数类型|\t基本介绍|  \n|:------------- |:---------------|:---------------|  \n|splashPar"
  },
  {
    "path": "docs/easyCsjManger.md",
    "chars": 574,
    "preview": "# EasyCsjManager\n\n穿山甲个性化配置API方法介绍\n\n| 参数名| 参数类型|\t基本介绍|  \n|:------------- |:---------------|:---------------|  \n|csj_splas"
  },
  {
    "path": "docs/easyKSManger.md",
    "chars": 304,
    "preview": "# EasyKSManager\n\n快手广告SDK个性化配置API方法介绍\n\n\n| 参数名| 参数类型|\t基本介绍|  \n|:------------- |:---------------|:---------------|  \n|rewar"
  },
  {
    "path": "docs/faq.md",
    "chars": 1325,
    "preview": "# 常见问题处理\n\n## 提要\n\n聚合SDK主要负责加载策略的分发逻辑和各广告SDK调用逻辑,不负责具体的广告展示,广告的展示逻辑主要是由各个广告SDK来负责。\n\n\n---\n\nQ: 项目构建时出现 “unexpected element <"
  },
  {
    "path": "docs/full.md",
    "chars": 3782,
    "preview": "# 全屏视频广告\n\n集成最佳实践:\n\n- 使用场景基本类似激励视频,广告展示样式也和激励视频基本一致,区别是对于用户来说强制性更低,用户可以提前“跳过”广告。\n- 支持提前加载广告(注意控制时机,不可过早提前),但要注意,一次展示需对应一个"
  },
  {
    "path": "docs/home.md",
    "chars": 5265,
    "preview": "# EasyAds \n\nAPP开发者一般不会在广告集成上进行过多得探索,各种第三方服务又玩法五花八门,如何能使得APP即自由又放心得管理广告SDK?\n\nEasyAds可以让APP开发者在利用广告变现时,做到高效、透明、简洁、安全,真正属于你"
  },
  {
    "path": "docs/interstital.md",
    "chars": 3680,
    "preview": "# 插屏(弹窗)广告\n\n集成最佳实践:\n\n- 适用场景:一般暂停时(多见于视频类 APP 节目暂停);页面间跳转、切换时(比如游戏类 APP 过关、工具类 APP 页面转换);APP 退出时;返回上一级时等场景,均可适当植入插屏广告。\n- "
  },
  {
    "path": "docs/nativeExpress.md",
    "chars": 4744,
    "preview": "# 原生模板广告\n\n### 集成最佳实践:\n\n- 适用场景:适用于有内容输出的 APP,比如新闻资讯类、视频类、音频类、社区类等,通常在内容流中或内容详情页中植入。在内容流中植入广告,需对广告展现位置、展现频次等反复测试,避免过度干扰的同时"
  },
  {
    "path": "docs/reward.md",
    "chars": 4781,
    "preview": "# 激励视频广告\n\n集成最佳实践:\n\n- 适用场景:激励视频广告在游戏 APP 使用较多,比如通关失败后通过观看激励视频广告,用户可获取复活机会。此外,一些非游戏类 APP,也可通过植入 5-15 秒(甚至更长)的激励视频广告,让用户通过主"
  },
  {
    "path": "docs/splash.md",
    "chars": 3935,
    "preview": "# 开屏广告\n\n### 集成最佳实践建议:\n\n- 理论上开屏广告应该在**用户阅读并同意隐私政策授权之后**展示。\n- 展示区域最好**大于整体画面 75%且高度不得低于400dp**,全屏效果更佳;\n- 开屏请求、展示时机:**使用单独的"
  },
  {
    "path": "docs/strategyJsonFormat.md",
    "chars": 1905,
    "preview": "# 策略Json配置说明\n\n每个聚合广告位均可通过`setData(String strategyJson) `方法设置策略信息,其中 `strategyJson`参数为SDK的策略配置信息,其json结构示例如下:\n\n```\n{\n  \"r"
  },
  {
    "path": "easyads/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "easyads/build.gradle",
    "chars": 1900,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.kezong.fat-aar'\n\n// JitPack Maven\napply plugin: 'com.github.dcend"
  },
  {
    "path": "easyads/proguard-rules.pro",
    "chars": 1273,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "easyads/src/main/AndroidManifest.xml",
    "chars": 194,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.easyads.core\" >\n\n    <uses-permiss"
  },
  {
    "path": "easyads/src/main/java/com/easyads/EasyAds.java",
    "chars": 623,
    "preview": "package com.easyads;\n\nimport com.easyads.core.BuildConfig;\nimport com.easyads.model.EALogLevel;\n\npublic class EasyAds {\n"
  },
  {
    "path": "easyads/src/main/java/com/easyads/EasyAdsConstant.java",
    "chars": 984,
    "preview": "package com.easyads;\n\npublic class EasyAdsConstant {\n    public static final String NOT_SUPPORT_SUPPLIER_TIPS = \"未支持的SDK"
  },
  {
    "path": "easyads/src/main/java/com/easyads/EasyAdsManger.java",
    "chars": 1543,
    "preview": "package com.easyads;\n\nimport com.easyads.model.EALogLevel;\n\n/**\n * 单例处理一些全局配置信息\n */\npublic class EasyAdsManger {\n    pri"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/EABaseSupplierAdapter.java",
    "chars": 10078,
    "preview": "package com.easyads.core;\n\nimport android.app.Activity;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.itf.AdCo"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/EasyAdBaseAdspot.java",
    "chars": 18368,
    "preview": "package com.easyads.core;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.os.Bundle;\nimport"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/banner/EABannerListener.java",
    "chars": 139,
    "preview": "package com.easyads.core.banner;\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EABannerListener extends EA"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/banner/EABannerSetting.java",
    "chars": 440,
    "preview": "package com.easyads.core.banner;\n\nimport android.view.ViewGroup;\n\nimport com.easyads.itf.BaseAdapterEvent;\nimport com.ea"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/banner/EasyAdBanner.java",
    "chars": 2759,
    "preview": "package com.easyads.core.banner;\n\nimport android.app.Activity;\nimport android.view.ViewGroup;\n\nimport com.easyads.EasyAd"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/draw/EADrawListener.java",
    "chars": 137,
    "preview": "package com.easyads.core.draw;\n\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EADrawListener extends EABas"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/draw/EADrawSetting.java",
    "chars": 259,
    "preview": "package com.easyads.core.draw;\n\nimport android.view.ViewGroup;\n\nimport com.easyads.itf.BaseAdapterEvent;\n\npublic interfa"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/draw/EasyAdDraw.java",
    "chars": 2314,
    "preview": "package com.easyads.core.draw;\n\nimport android.app.Activity;\nimport android.view.ViewGroup;\n\nimport com.easyads.EasyAdsC"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/full/EAFullScreenVideoListener.java",
    "chars": 229,
    "preview": "package com.easyads.core.full;\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EAFullScreenVideoListener ext"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/full/EAFullScreenVideoSetting.java",
    "chars": 605,
    "preview": "package com.easyads.core.full;\n\nimport com.easyads.itf.BaseAdapterEvent;\nimport com.easyads.model.SdkSupplier;\nimport co"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/full/EasyAdFullScreenVideo.java",
    "chars": 2476,
    "preview": "package com.easyads.core.full;\n\nimport android.app.Activity;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.cor"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/inter/EAInterstitialListener.java",
    "chars": 144,
    "preview": "package com.easyads.core.inter;\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EAInterstitialListener exten"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/inter/EAInterstitialSetting.java",
    "chars": 463,
    "preview": "package com.easyads.core.inter;\n\nimport com.easyads.itf.BaseAdapterEvent;\nimport com.easyads.model.SdkSupplier;\nimport c"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/inter/EasyAdInterstitial.java",
    "chars": 2312,
    "preview": "package com.easyads.core.inter;\n\nimport android.app.Activity;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.co"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/nati/EANativeExpressListener.java",
    "chars": 204,
    "preview": "package com.easyads.core.nati;\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EANativeExpressListener exten"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/nati/EANativeExpressSetting.java",
    "chars": 620,
    "preview": "package com.easyads.core.nati;\n\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimport com.easyads.itf.BaseAda"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/nati/EasyAdNativeExpress.java",
    "chars": 3934,
    "preview": "package com.easyads.core.nati;\n\nimport android.app.Activity;\nimport android.view.View;\nimport android.view.ViewGroup;\n\ni"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/reward/EARewardServerCallBackInf.java",
    "chars": 425,
    "preview": "package com.easyads.core.reward;\n\nimport java.util.Map;\n\npublic class EARewardServerCallBackInf {\n    public boolean bdR"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/reward/EARewardVideoListener.java",
    "chars": 370,
    "preview": "package com.easyads.core.reward;\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EARewardVideoListener exten"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/reward/EARewardVideoSetting.java",
    "chars": 838,
    "preview": "package com.easyads.core.reward;\n\nimport com.easyads.itf.BaseAdapterEvent;\nimport com.easyads.model.SdkSupplier;\nimport "
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/reward/EasyAdRewardVideo.java",
    "chars": 3991,
    "preview": "package com.easyads.core.reward;\n\nimport android.app.Activity;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.c"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/splash/EASplashLifeCallback.java",
    "chars": 118,
    "preview": "package com.easyads.core.splash;\n\npublic interface EASplashLifeCallback {\n    void onResume();\n\n    void onPause();\n}\n"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/splash/EASplashListener.java",
    "chars": 140,
    "preview": "package com.easyads.core.splash;\n\nimport com.easyads.itf.EABaseADListener;\n\npublic interface EASplashListener extends EA"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/splash/EASplashSetting.java",
    "chars": 570,
    "preview": "package com.easyads.core.splash;\n\nimport android.view.ViewGroup;\n\nimport com.easyads.itf.BaseAdapterEvent;\nimport com.ea"
  },
  {
    "path": "easyads/src/main/java/com/easyads/core/splash/EasyAdSplash.java",
    "chars": 5578,
    "preview": "package com.easyads.core.splash;\n\nimport android.app.Activity;\nimport android.text.TextUtils;\nimport android.view.ViewGr"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EABannerCustomAdapter.java",
    "chars": 435,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\n\nimport com.easyads.core.EABaseSupplierAdapter;\nimport com.eas"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EADrawCustomAdapter.java",
    "chars": 1789,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\nimport android.view.View;\nimport android.view.ViewGroup;\nimpor"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EAFullScreenCustomAdapter.java",
    "chars": 749,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\n\nimport com.easyads.core.EABaseSupplierAdapter;\nimport com.eas"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EAInterstitialCustomAdapter.java",
    "chars": 503,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\n\nimport com.easyads.core.EABaseSupplierAdapter;\nimport com.eas"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EANativeExpressCustomAdapter.java",
    "chars": 2402,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\nimport android.view.View;\nimport android.view.ViewGroup;\n\nimpo"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EARewardCustomAdapter.java",
    "chars": 774,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\n\nimport com.easyads.core.EABaseSupplierAdapter;\nimport com.eas"
  },
  {
    "path": "easyads/src/main/java/com/easyads/custom/EASplashCustomAdapter.java",
    "chars": 755,
    "preview": "package com.easyads.custom;\n\nimport android.app.Activity;\nimport android.view.ViewGroup;\n\nimport com.easyads.core.EABase"
  },
  {
    "path": "easyads/src/main/java/com/easyads/itf/AdCoreAction.java",
    "chars": 193,
    "preview": "package com.easyads.itf;\n\n/**\n * 广告加载核心调用方法,对外聚合调用和内部adapter调用,方法命名一致\n */\npublic interface AdCoreAction {\n    void loadO"
  },
  {
    "path": "easyads/src/main/java/com/easyads/itf/BaseAdapterEvent.java",
    "chars": 489,
    "preview": "package com.easyads.itf;\n\nimport com.easyads.model.EasyAdError;\nimport com.easyads.model.SdkSupplier;\n\n/**\n * adapter 处理"
  },
  {
    "path": "easyads/src/main/java/com/easyads/itf/BaseEnsureListener.java",
    "chars": 85,
    "preview": "package com.easyads.itf;\n\npublic interface BaseEnsureListener {\n    void ensure();\n}\n"
  },
  {
    "path": "easyads/src/main/java/com/easyads/itf/EABaseADListener.java",
    "chars": 281,
    "preview": "package com.easyads.itf;\n\nimport com.easyads.model.EasyAdError;\n\npublic interface EABaseADListener {\n    void onAdSuccee"
  },
  {
    "path": "easyads/src/main/java/com/easyads/model/EALogLevel.java",
    "chars": 531,
    "preview": "package com.easyads.model;\n\npublic enum EALogLevel {\n    /**\n     * 可以自定义级别,level值越大,打印的信息越多。\n     */\n    CUSTOM(-1),\n  "
  },
  {
    "path": "easyads/src/main/java/com/easyads/model/EasyAdError.java",
    "chars": 4869,
    "preview": "package com.easyads.model;\n\nimport android.support.annotation.NonNull;\n\npublic class EasyAdError {\n\n    public static fi"
  },
  {
    "path": "easyads/src/main/java/com/easyads/model/EasyAdType.java",
    "chars": 323,
    "preview": "package com.easyads.model;\n\n/**\n * 广告类型\n */\npublic enum EasyAdType {\n\n    SPLASH(\"Splash\"),\n    BANNER(\"Banner\"),\n    IN"
  },
  {
    "path": "easyads/src/main/java/com/easyads/model/SdkRule.java",
    "chars": 567,
    "preview": "package com.easyads.model;\n\nimport com.easyads.EasyAdsConstant;\n\nimport java.io.Serializable;\nimport java.util.ArrayList"
  },
  {
    "path": "easyads/src/main/java/com/easyads/model/SdkSupplier.java",
    "chars": 1234,
    "preview": "package com.easyads.model;\n\nimport com.easyads.EasyAdsConstant;\n\nimport java.io.Serializable;\n\npublic class SdkSupplier "
  },
  {
    "path": "easyads/src/main/java/com/easyads/model/StrategyModel.java",
    "chars": 3869,
    "preview": "package com.easyads.model;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.utils.BigDecimalUtil;\nimport com.easy"
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/BigDecimalUtil.java",
    "chars": 1735,
    "preview": "package com.easyads.utils;\n\nimport java.math.BigDecimal;\n\npublic class BigDecimalUtil {\n    /**\n     * 提供精确加法计算的add方法\n  "
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/EAAdapterLoader.java",
    "chars": 3842,
    "preview": "package com.easyads.utils;\n\nimport android.app.Activity;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.core.dr"
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/EALog.java",
    "chars": 3277,
    "preview": "package com.easyads.utils;\n\nimport android.util.Log;\n\nimport com.easyads.EasyAdsManger;\nimport com.easyads.model.EALogLe"
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/EASplashPlusManager.java",
    "chars": 1830,
    "preview": "package com.easyads.utils;\n\nimport android.app.Activity;\n\nimport com.easyads.EasyAdsConstant;\nimport com.easyads.EasyAds"
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/EASplashZoomOutLayout.java",
    "chars": 3478,
    "preview": "package com.easyads.utils;\n\nimport android.content.Context;\nimport android.graphics.drawable.GradientDrawable;\nimport an"
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/EAUtil.java",
    "chars": 5724,
    "preview": "package com.easyads.utils;\n\nimport android.app.Activity;\nimport android.app.ActivityManager;\nimport android.content.Cont"
  },
  {
    "path": "easyads/src/main/java/com/easyads/utils/ScreenUtil.java",
    "chars": 1779,
    "preview": "package com.easyads.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\n\npublic class ScreenUtil {\n    "
  },
  {
    "path": "easybd/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "easybd/build.gradle",
    "chars": 1871,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.kezong.fat-aar'\n\n// JitPack Maven\napply plugin: 'com.github.dcend"
  },
  {
    "path": "easybd/consumer-rules.pro",
    "chars": 462,
    "preview": "\n-ignorewarnings\n-dontwarn com.baidu.mobads.sdk.api.**\n-keepclassmembers class * extends android.app.Activity {\n   publi"
  },
  {
    "path": "easybd/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "easybd/src/androidTest/java/com/easyads/supplier/baidu/ExampleInstrumentedTest.java",
    "chars": 763,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry"
  },
  {
    "path": "easybd/src/main/AndroidManifest.xml",
    "chars": 124,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    package=\"com.easyads.supplier.baidu\">\n\n\n</manif"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDBannerAdapter.java",
    "chars": 2874,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\nimport android.view.ViewGroup;\nimport android.widget.R"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDFullScreenVideoAdapter.java",
    "chars": 3506,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\n\nimport com.easyads.core.full.EAFullScreenVideoSetting"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDInterstitialAdapter.java",
    "chars": 3285,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\nimport android.widget.RelativeLayout;\n\nimport com.easy"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDNativeExpressAdapter.java",
    "chars": 7882,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\nimport android.view.View;\n\nimport com.easyads.core.nat"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDRewardVideoAdapter.java",
    "chars": 3592,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\n\nimport com.easyads.core.reward.EARewardServerCallBack"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDSplashAdapter.java",
    "chars": 3617,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\nimport android.os.Handler;\n\nimport com.easyads.core.sp"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/BDUtil.java",
    "chars": 4048,
    "preview": "package com.easyads.supplier.baidu;\n\nimport android.app.Activity;\nimport android.app.ActivityManager;\nimport android.con"
  },
  {
    "path": "easybd/src/main/java/com/easyads/supplier/baidu/EasyBDManager.java",
    "chars": 1216,
    "preview": "package com.easyads.supplier.baidu;\n\n\nimport android.widget.RelativeLayout;\n\nimport com.baidu.mobads.sdk.api.AdSize;\nimp"
  },
  {
    "path": "easybd/src/main/res/values/strings.xml",
    "chars": 25,
    "preview": "<resources>\n</resources>\n"
  },
  {
    "path": "easybd/src/test/java/com/easyads/supplier/baidu/ExampleUnitTest.java",
    "chars": 387,
    "preview": "package com.easyads.supplier.baidu;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local uni"
  },
  {
    "path": "easycsj/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "easycsj/build.gradle",
    "chars": 2007,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.kezong.fat-aar'\n\n// JitPack Maven\napply plugin: 'com.github.dcend"
  },
  {
    "path": "easycsj/consumer-rules.pro",
    "chars": 1710,
    "preview": "#-keep class com.bytedance.sdk.openadsdk.** { *; }\n#-keep public interface com.bytedance.sdk.openadsdk.downloadnew.** {*"
  },
  {
    "path": "easycsj/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "easycsj/src/androidTest/java/com/easyads/supplier/csj/ExampleInstrumentedTest.java",
    "chars": 759,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\n"
  },
  {
    "path": "easycsj/src/main/AndroidManifest.xml",
    "chars": 1055,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CSJSplashClickEyeManager.java",
    "chars": 9132,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.animation.Animator;\nimport android.content.Context;\nimport android.vie"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjBannerAdapter.java",
    "chars": 6039,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.view.View;\nimport android.view.ViewGroup;"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjDrawAdapter.java",
    "chars": 3911,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.view.View;\n\nimport com.easyads.core.draw."
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjFullScreenVideoAdapter.java",
    "chars": 4769,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.content.res.Configuration;\n\nimport com.ea"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjInterstitialAdapter.java",
    "chars": 5494,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\n\nimport com.bytedance.sdk.openadsdk.AdSlot;\nimport com.b"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjNativeExpressAdapter.java",
    "chars": 5014,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.view.View;\n\nimport com.easyads.EasyAdsMan"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjRewardVideoAdapter.java",
    "chars": 7193,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.os.Bundle;\n\nimport com.easyads.core.rewar"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjSplashAdapter.java",
    "chars": 11492,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.support.annotation.MainThread;\nimport and"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/CsjUtil.java",
    "chars": 11635,
    "preview": "package com.easyads.supplier.csj;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Looper"
  },
  {
    "path": "easycsj/src/main/java/com/easyads/supplier/csj/EasyCsjManger.java",
    "chars": 877,
    "preview": "package com.easyads.supplier.csj;\n\n/**\n * 穿山甲全局属性配置管理类\n */\npublic class EasyCsjManger {\n    private static EasyCsjManger"
  },
  {
    "path": "easycsj/src/main/res/values/strings.xml",
    "chars": 25,
    "preview": "<resources>\n</resources>\n"
  },
  {
    "path": "easycsj/src/main/res/xml/ea_csj_file_paths.xml",
    "chars": 492,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<paths xmlns:android=\"http://schemas.android.com/apk/res/android\">\n     <!--为了适配所"
  },
  {
    "path": "easycsj/src/test/java/com/easyads/supplier/csj/ExampleUnitTest.java",
    "chars": 385,
    "preview": "package com.easyads.supplier.csj;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit "
  },
  {
    "path": "easyks/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "easyks/build.gradle",
    "chars": 1878,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.kezong.fat-aar'\n\n// JitPack Maven\napply plugin: 'com.github.dcend"
  },
  {
    "path": "easyks/consumer-rules.pro",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "easyks/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "easyks/src/androidTest/java/com/easyads/supplier/ks/ExampleInstrumentedTest.java",
    "chars": 757,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\ni"
  },
  {
    "path": "easyks/src/main/AndroidManifest.xml",
    "chars": 428,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/EasyKSManager.java",
    "chars": 812,
    "preview": "package com.easyads.supplier.ks;\n\nimport com.kwad.sdk.api.KsVideoPlayConfig;\n\n/**\n * 快手SDK特殊配置管理\n */\npublic class EasyKS"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSDrawAdapter.java",
    "chars": 3554,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.support.annotation.Nullable;\nimport androi"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSFullScreenVideoAdapter.java",
    "chars": 4419,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.support.annotation.Nullable;\n\nimport com.e"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSInterstitialAdapter.java",
    "chars": 5001,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.support.annotation.Nullable;\n\nimport com.e"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSNativeExpressAdapter.java",
    "chars": 4290,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.support.annotation.Nullable;\nimport androi"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSRewardVideoAdapter.java",
    "chars": 5364,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.support.annotation.Nullable;\n\nimport com.e"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSSplashAdapter.java",
    "chars": 4727,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.support.annotation.NonNull;\nimport android"
  },
  {
    "path": "easyks/src/main/java/com/easyads/supplier/ks/KSUtil.java",
    "chars": 5636,
    "preview": "package com.easyads.supplier.ks;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.text.TextU"
  },
  {
    "path": "easyks/src/main/res/values/strings.xml",
    "chars": 25,
    "preview": "<resources>\n</resources>\n"
  },
  {
    "path": "easyks/src/test/java/com/easyads/supplier/ks/ExampleUnitTest.java",
    "chars": 384,
    "preview": "package com.easyads.supplier.ks;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit t"
  },
  {
    "path": "easyylh/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "easyylh/build.gradle",
    "chars": 1899,
    "preview": "apply plugin: 'com.android.library'\napply plugin: 'com.kezong.fat-aar'\n\n// JitPack Maven\napply plugin: 'com.github.dcend"
  },
  {
    "path": "easyylh/consumer-rules.pro",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "easyylh/proguard-rules.pro",
    "chars": 751,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "easyylh/src/androidTest/java/com/easyads/supplier/ylh/ExampleInstrumentedTest.java",
    "chars": 759,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\n"
  },
  {
    "path": "easyylh/src/main/AndroidManifest.xml",
    "chars": 841,
    "preview": "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com/tools\"\n"
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/SplashZoomOutManager.java",
    "chars": 10928,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.animation.Animator;\nimport android.content.Context;\nimport android.vie"
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhBannerAdapter.java",
    "chars": 3390,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\nimport android.view.ViewGroup;\nimport android.widget.Rel"
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhFullScreenVideoAdapter.java",
    "chars": 7417,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\n\nimport com.easyads.core.full.EAFullScreenVideoSetting;\n"
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhInterstitialAdapter.java",
    "chars": 3232,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\n\nimport com.easyads.core.inter.EAInterstitialSetting;\nim"
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhNativeExpressAdapter.java",
    "chars": 5513,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\nimport android.view.View;\n\nimport com.easyads.core.nati."
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhRewardVideoAdapter.java",
    "chars": 3876,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\nimport android.os.SystemClock;\n\nimport com.easyads.core."
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhSplashAdapter.java",
    "chars": 5081,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\nimport android.os.SystemClock;\n\nimport com.easyads.EasyA"
  },
  {
    "path": "easyylh/src/main/java/com/easyads/supplier/ylh/YlhUtil.java",
    "chars": 3570,
    "preview": "package com.easyads.supplier.ylh;\n\nimport android.app.Activity;\nimport android.text.TextUtils;\nimport android.view.ViewG"
  },
  {
    "path": "easyylh/src/main/res/values/strings.xml",
    "chars": 25,
    "preview": "<resources>\n</resources>\n"
  },
  {
    "path": "easyylh/src/main/res/xml/ea_ylh_file_path.xml",
    "chars": 634,
    "preview": "<paths xmlns:tools=\"http://schemas.android.com/tools\"\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n   "
  },
  {
    "path": "easyylh/src/test/java/com/easyads/supplier/ylh/ExampleUnitTest.java",
    "chars": 385,
    "preview": "package com.easyads.supplier.ylh;\n\nimport org.junit.Test;\n\nimport static org.junit.Assert.*;\n\n/**\n * Example local unit "
  },
  {
    "path": "example/.gitignore",
    "chars": 7,
    "preview": "/build\n"
  },
  {
    "path": "example/build.gradle",
    "chars": 3182,
    "preview": "apply plugin: 'com.android.application'\n\nandroid {\n    compileSdkVersion 28\n    defaultConfig {\n        applicationId \"c"
  },
  {
    "path": "example/proguard-rules.pro",
    "chars": 5684,
    "preview": "# Add project specific ProGuard rules here.\n# You can control the set of applied configuration files using the\n# proguar"
  },
  {
    "path": "example/src/androidTest/java/com/easyads/demo/ExampleInstrumentedTest.java",
    "chars": 757,
    "preview": "package com.easyads.demo;\n\nimport android.content.Context;\nimport android.support.test.InstrumentationRegistry;\nimport a"
  },
  {
    "path": "example/src/main/AndroidManifest.xml",
    "chars": 3378,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:to"
  },
  {
    "path": "example/src/main/assets/banner_config.json",
    "chars": 552,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1,\n        2\n      ],\n      \"percent\": 50\n    },\n    {\n  "
  },
  {
    "path": "example/src/main/assets/draw_config.json",
    "chars": 425,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1\n      ],\n      \"percent\": 50\n    },\n    {\n      \"tag\": "
  },
  {
    "path": "example/src/main/assets/full_config.json",
    "chars": 666,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1,\n        3\n      ],\n      \"percent\": 50\n    },\n    {\n  "
  },
  {
    "path": "example/src/main/assets/interstitial_config.json",
    "chars": 668,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1,\n        3\n      ],\n      \"percent\": 50\n    },\n    {\n  "
  },
  {
    "path": "example/src/main/assets/native_config.json",
    "chars": 668,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1,\n        3\n      ],\n      \"percent\": 50\n    },\n    {\n  "
  },
  {
    "path": "example/src/main/assets/reward_config.json",
    "chars": 666,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1,\n        3\n      ],\n      \"percent\": 50\n    },\n    {\n  "
  },
  {
    "path": "example/src/main/assets/splash_config.json",
    "chars": 668,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        1,\n        3\n      ],\n      \"percent\": 50\n    },\n    {\n  "
  },
  {
    "path": "example/src/main/assets/splash_cus_config.json",
    "chars": 916,
    "preview": "{\n  \"rules\": [\n    {\n      \"tag\": \"A\",\n      \"sort\": [\n        5,\n        1,\n        3\n      ],\n      \"percent\": 50\n    "
  },
  {
    "path": "example/src/main/java/com/easyads/demo/BannerActivity.java",
    "chars": 731,
    "preview": "package com.easyads.demo;\n\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.RelativeLayout;\n\npu"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/BaseActivity.java",
    "chars": 1378,
    "preview": "package com.easyads.demo;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.hardware.SensorMa"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/DrawActivity.java",
    "chars": 12900,
    "preview": "package com.easyads.demo;\n\nimport android.content.Context;\nimport android.media.MediaPlayer;\nimport android.net.Uri;\nimp"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/EasyADController.java",
    "chars": 15547,
    "preview": "package com.easyads.demo;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.content.res.Asset"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/FullScreenVideoActivity.java",
    "chars": 996,
    "preview": "package com.easyads.demo;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\nimport android.view.Vie"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/InterstitialActivity.java",
    "chars": 939,
    "preview": "package com.easyads.demo;\n\nimport android.os.Bundle;\nimport android.view.View;\n\nimport com.easyads.core.inter.EasyAdInte"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/MainActivity.java",
    "chars": 4814,
    "preview": "package com.easyads.demo;\n\nimport android.Manifest;\nimport android.annotation.TargetApi;\nimport android.content.Context;"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/MyApplication.java",
    "chars": 1311,
    "preview": "package com.easyads.demo;\n\nimport android.app.Application;\nimport android.content.Context;\nimport android.support.multid"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/NativeExpressActivity.java",
    "chars": 673,
    "preview": "package com.easyads.demo;\n\nimport android.os.Bundle;\nimport android.view.View;\nimport android.widget.FrameLayout;\n\npubli"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/NativeExpressRecyclerViewActivity.java",
    "chars": 4708,
    "preview": "package com.easyads.demo;\n\nimport android.app.Activity;\nimport android.os.Bundle;\nimport android.support.v7.widget.Linea"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/RewardVideoActivity.java",
    "chars": 897,
    "preview": "package com.easyads.demo;\n\nimport android.os.Bundle;\nimport android.view.View;\n\nimport com.easyads.core.reward.EasyAdRew"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/SplashActivity.java",
    "chars": 1863,
    "preview": "package com.easyads.demo;\n\nimport android.app.ActionBar;\nimport android.content.Intent;\nimport android.os.Bundle;\nimport"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/SplashDialog.java",
    "chars": 1210,
    "preview": "package com.easyads.demo;\n\nimport android.app.Activity;\nimport android.app.Dialog;\nimport android.graphics.Color;\nimport"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/SplashToMainActivity.java",
    "chars": 498,
    "preview": "package com.easyads.demo;\n\nimport android.os.Bundle;\nimport android.support.annotation.Nullable;\n\nimport com.easyads.uti"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/custom/CustomActivity.java",
    "chars": 897,
    "preview": "package com.easyads.demo.custom;\n\nimport android.app.Activity;\nimport android.content.Intent;\nimport android.os.Bundle;\n"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/custom/HuaWeiSplashAdapter.java",
    "chars": 5105,
    "preview": "package com.easyads.demo.custom;\n\nimport android.app.Activity;\nimport android.app.Application;\nimport android.content.pm"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/custom/XiaoMiSplashAdapter.java",
    "chars": 2751,
    "preview": "package com.easyads.demo.custom;\n\nimport android.app.Activity;\nimport android.os.Handler;\n\nimport com.easyads.core.splas"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/draw/FullScreenVideoView.java",
    "chars": 732,
    "preview": "package com.easyads.demo.draw;\n\nimport android.content.Context;\nimport android.util.AttributeSet;\nimport android.widget."
  },
  {
    "path": "example/src/main/java/com/easyads/demo/draw/OnViewPagerListener.java",
    "chars": 263,
    "preview": "package com.easyads.demo.draw;\n\n\npublic interface OnViewPagerListener {\n\n  /* 初始化完成 */\n  void onInitComplete();\n\n  /* 释放"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/draw/ViewPagerLayoutManager.java",
    "chars": 2716,
    "preview": "package com.easyads.demo.draw;\n\nimport android.content.Context;\nimport android.support.annotation.NonNull;\nimport androi"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/utils/BaseCallBack.java",
    "chars": 84,
    "preview": "package com.easyads.demo.utils;\n\npublic interface BaseCallBack {\n    void call();\n}\n"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/utils/Constant.java",
    "chars": 294,
    "preview": "package com.easyads.demo.utils;\n\npublic class Constant {\n    public static final String SP_AGREE_PRIVACY = \"agree_privac"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/utils/DialogLogcat.java",
    "chars": 1876,
    "preview": "package com.easyads.demo.utils;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.graphics.Poin"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/utils/NormalSetting.java",
    "chars": 305,
    "preview": "package com.easyads.demo.utils;\n\npublic class NormalSetting {\n\n    static NormalSetting instance;\n\n    public static Nor"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/utils/UIUtils.java",
    "chars": 11647,
    "preview": "package com.easyads.demo.utils;\n\nimport android.app.Activity;\nimport android.content.Context;\nimport android.os.Build;\ni"
  },
  {
    "path": "example/src/main/java/com/easyads/demo/utils/UserPrivacyDialog.java",
    "chars": 1601,
    "preview": "package com.easyads.demo.utils;\n\nimport android.app.Dialog;\nimport android.content.Context;\nimport android.support.annot"
  },
  {
    "path": "example/src/main/res/drawable/circle_big_red.xml",
    "chars": 308,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "example/src/main/res/drawable/dialog_white_radius_bg.xml",
    "chars": 284,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<shape xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    android:sha"
  },
  {
    "path": "example/src/main/res/drawable/ic_launcher_background.xml",
    "chars": 4867,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<vector\n    android:height=\"108dp\"\n    android:width=\"108dp\"\n    android:viewport"
  },
  {
    "path": "example/src/main/res/drawable/play_arrow.xml",
    "chars": 285,
    "preview": "<vector android:alpha=\"0.61\" android:height=\"24dp\"\n    android:viewportHeight=\"24.0\" android:viewportWidth=\"24.0\"\n    an"
  },
  {
    "path": "example/src/main/res/drawable-v24/ic_launcher_foreground.xml",
    "chars": 1880,
    "preview": "<vector xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:aapt=\"http://schemas.android.com/aapt\"\n    "
  },
  {
    "path": "example/src/main/res/layout/activity_banner.xml",
    "chars": 921,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "example/src/main/res/layout/activity_custom.xml",
    "chars": 596,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "example/src/main/res/layout/activity_draw.xml",
    "chars": 3669,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  },
  {
    "path": "example/src/main/res/layout/activity_full_screen_video.xml",
    "chars": 832,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "example/src/main/res/layout/activity_interstitial.xml",
    "chars": 986,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "example/src/main/res/layout/activity_main.xml",
    "chars": 3903,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<ScrollView xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:"
  },
  {
    "path": "example/src/main/res/layout/activity_native_express.xml",
    "chars": 658,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    and"
  },
  {
    "path": "example/src/main/res/layout/activity_native_express_recycler_view.xml",
    "chars": 439,
    "preview": "<LinearLayout\n    xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmlns:tools=\"http://schemas.android.com"
  },
  {
    "path": "example/src/main/res/layout/activity_reward_video.xml",
    "chars": 944,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "example/src/main/res/layout/activity_splash_custom_logo.xml",
    "chars": 1069,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    xmln"
  },
  {
    "path": "example/src/main/res/layout/activity_splash_to_main.xml",
    "chars": 444,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "example/src/main/res/layout/dialog_logcat.xml",
    "chars": 1356,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    andr"
  },
  {
    "path": "example/src/main/res/layout/dialog_user_privacy.xml",
    "chars": 2682,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<android.support.constraint.ConstraintLayout xmlns:android=\"http://schemas.androi"
  },
  {
    "path": "example/src/main/res/layout/item_data.xml",
    "chars": 466,
    "preview": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<RelativeLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"\n    an"
  }
]

// ... and 25 more files (download for full content)

About this extraction

This page contains the full source code of the bayescom/EasyAds-Android GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 225 files (490.2 KB), approximately 131.9k tokens, and a symbol index with 904 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!