add qq ad
This commit is contained in:
		
							parent
							
								
									bd12f6f74f
								
							
						
					
					
						commit
						7d2a6467db
					
				|  | @ -13,7 +13,7 @@ android { | ||||||
|     compileSdkVersion 28 |     compileSdkVersion 28 | ||||||
|     buildToolsVersion "28.0.3" |     buildToolsVersion "28.0.3" | ||||||
|     defaultConfig { |     defaultConfig { | ||||||
|         applicationId "com.novelbook.android" |         applicationId "com.qq.e.union.demo" | ||||||
|         minSdkVersion 19  //target 19 Android 4.4 以下版本仅占比4.1% |         minSdkVersion 19  //target 19 Android 4.4 以下版本仅占比4.1% | ||||||
|         targetSdkVersion 28 |         targetSdkVersion 28 | ||||||
|         versionCode 5 |         versionCode 5 | ||||||
|  |  | ||||||
|  | @ -66,7 +66,10 @@ | ||||||
|             android:launchMode="singleTop" |             android:launchMode="singleTop" | ||||||
|             android:screenOrientation="portrait" |             android:screenOrientation="portrait" | ||||||
|             android:theme="@style/ToolBarTheme.NoActionBar"> |             android:theme="@style/ToolBarTheme.NoActionBar"> | ||||||
| 
 |             <intent-filter> | ||||||
|  |                 <action android:name="android.intent.action.MAIN" /> | ||||||
|  |                 <category android:name="android.intent.category.LAUNCHER" /> | ||||||
|  |             </intent-filter> | ||||||
|         </activity> |         </activity> | ||||||
|         <activity |         <activity | ||||||
|             android:name=".FileActivity" |             android:name=".FileActivity" | ||||||
|  | @ -103,7 +106,17 @@ | ||||||
|             android:name=".service.ServiceDownload" |             android:name=".service.ServiceDownload" | ||||||
|             android:exported="false" /> |             android:exported="false" /> | ||||||
|         <!-- qq ad --> |         <!-- qq ad --> | ||||||
|    <!--     <service |         <!-- chuanshanjia ad --> | ||||||
|  |         <activity | ||||||
|  |             android:name=".AD.qq.SplashActivity" | ||||||
|  |             android:configChanges="keyboard|orientation|screenSize" | ||||||
|  |             android:screenOrientation="portrait" | ||||||
|  |             android:theme="@style/Theme.Splash"> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         </activity> | ||||||
|  | 
 | ||||||
|  |       <service | ||||||
|             android:name="com.qq.e.comm.DownloadService" |             android:name="com.qq.e.comm.DownloadService" | ||||||
|             android:exported="false" /> |             android:exported="false" /> | ||||||
| 
 | 
 | ||||||
|  | @ -121,7 +134,7 @@ | ||||||
| 
 | 
 | ||||||
|         <uses-library |         <uses-library | ||||||
|             android:name="org.apache.http.legacy" |             android:name="org.apache.http.legacy" | ||||||
|             android:required="false" />--> |             android:required="false" /> | ||||||
| 
 | 
 | ||||||
|         <provider |         <provider | ||||||
|             android:name="android.support.v4.content.FileProvider" |             android:name="android.support.v4.content.FileProvider" | ||||||
|  | @ -140,10 +153,7 @@ | ||||||
|             android:screenOrientation="portrait" |             android:screenOrientation="portrait" | ||||||
|             android:theme="@style/Theme.Splash"> |             android:theme="@style/Theme.Splash"> | ||||||
| 
 | 
 | ||||||
|             <intent-filter> | 
 | ||||||
|                 <action android:name="android.intent.action.MAIN" /> |  | ||||||
|                 <category android:name="android.intent.category.LAUNCHER" /> |  | ||||||
|             </intent-filter> |  | ||||||
|         </activity> |         </activity> | ||||||
| 
 | 
 | ||||||
|         <uses-library |         <uses-library | ||||||
|  |  | ||||||
|  | @ -15,6 +15,9 @@ import com.novelbook.android.utils.Constants; | ||||||
| 
 | 
 | ||||||
| import java.util.Date; | import java.util.Date; | ||||||
| 
 | 
 | ||||||
|  | import static com.novelbook.android.utils.Constants.AD_TENCENT_QQ; | ||||||
|  | import static com.novelbook.android.utils.Constants.AD_TOUTIAO; | ||||||
|  | 
 | ||||||
| public class SplashAdManager implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 { | public class SplashAdManager implements Application.ActivityLifecycleCallbacks, ComponentCallbacks2 { | ||||||
|     private boolean mIsBackground; |     private boolean mIsBackground; | ||||||
|     private static long lastAd =0; |     private static long lastAd =0; | ||||||
|  | @ -48,7 +51,7 @@ public class SplashAdManager implements Application.ActivityLifecycleCallbacks, | ||||||
|     public void onActivityCreated(Activity activity, Bundle savedInstanceState) { |     public void onActivityCreated(Activity activity, Bundle savedInstanceState) { | ||||||
|         if(activity instanceof Main2Activity){ |         if(activity instanceof Main2Activity){ | ||||||
| 
 | 
 | ||||||
|           //  showAd(activity); |             showAd(activity); | ||||||
|             Log.d("zzr", " 启动应用"); |             Log.d("zzr", " 启动应用"); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -114,12 +117,20 @@ public class SplashAdManager implements Application.ActivityLifecycleCallbacks, | ||||||
|     static void showAd(Activity activity){ |     static void showAd(Activity activity){ | ||||||
|         if(canShowAd()) { |         if(canShowAd()) { | ||||||
|             lastAd = new Date().getTime(); |             lastAd = new Date().getTime(); | ||||||
|             Intent intent = new Intent(activity, SplashActivity.class); |             Intent intent =null; | ||||||
|             intent.putExtra(SplashActivity.EXTR_LUNCHER, false); |             if(Constants.AD_SPLASH_SOURCE ==AD_TENCENT_QQ) { | ||||||
|  |                 intent =   new Intent(activity, com.novelbook.android.AD.qq.SplashActivity.class); | ||||||
|  |             }else if(Constants.AD_SPLASH_SOURCE ==AD_TOUTIAO){ | ||||||
|  |                 intent =   new Intent(activity, SplashActivity.class); | ||||||
|  |                 intent.putExtra(SplashActivity.EXTR_LUNCHER, false); | ||||||
|  |             } | ||||||
|             activity.startActivity(intent); |             activity.startActivity(intent); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     static  boolean canShowAd(){ |     static  boolean canShowAd(){ | ||||||
|  |         if(!Constants.SHOWAD){ | ||||||
|  |             return false; | ||||||
|  |         } | ||||||
|         long in = new Date().getTime() -lastAd; |         long in = new Date().getTime() -lastAd; | ||||||
|         Log.d("zzr", "canShowAd: interval is,  " +in  + ", canshow? "+ (in >interVal)); |         Log.d("zzr", "canShowAd: interval is,  " +in  + ", canshow? "+ (in >interVal)); | ||||||
|         return in >interVal; |         return in >interVal; | ||||||
|  |  | ||||||
|  | @ -0,0 +1,25 @@ | ||||||
|  | package com.novelbook.android.AD.qq; | ||||||
|  | 
 | ||||||
|  | public class Constants { | ||||||
|  |   public static final String APPID = "1101152570"; | ||||||
|  |   public static final String BannerPosID = "9079537218417626401"; | ||||||
|  |   public static final String InterteristalPosID = "8575134060152130849"; | ||||||
|  |   public static final String SplashPosID = "8863364436303842593"; | ||||||
|  |   public static final String NativePosID = "5010320697302671"; | ||||||
|  |   public static final String NativeVideoPosID = "5090421627704602"; | ||||||
|  |   public static final String NativeExpressPosID = "7030020348049331"; //如果选择支持视频的模版样式,请使用NativeExpressSupportVideoPosID测试广告位拉取 | ||||||
|  |   public static final String NativeUnifiedPosID = "6040749702835933"; | ||||||
|  |   public static final String NativeExpressSupportVideoPosID = "2000629911207832"; //支持视频模版样式的广告位 | ||||||
|  |   public static final String ContentADPosID = "5060323935699523"; | ||||||
|  |   public static final String RewardVideoADPosIDSupportH = "2090845242931421";//支持竖版出横版视频 | ||||||
|  |   public static final String RewardVideoADPosIDUnsupportH = "5040942242835423";//不支持竖版出横版视频 | ||||||
|  |   public static final String IEGRewardVideoADPosID = "6000625736289442";//内广激励视频广告位id | ||||||
|  |   public static final String UNIFIED_BANNER_POS_ID = "4080052898050840"; | ||||||
|  |   public static final String UNIFIED_INTERSTITIAL_ID_LARGE_SMALL = "3040652898151811";// 大小规格 | ||||||
|  |   public static final String UNIFIED_INTERSTITIAL_ID_ONLY_SMALL = "8020259898964453";// 只小规格 | ||||||
|  | 
 | ||||||
|  |   public static final String POS_ID = "pos_id"; | ||||||
|  |   public static final String MAX_VIDEO_DURATION = "maxVideoDuration"; | ||||||
|  |   public static final int VIDEO_DURATION_SETTING_MIN = 5; | ||||||
|  |   public static final int VIDEO_DURATION_SETTING_MAX = 60; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,290 @@ | ||||||
|  | package com.novelbook.android.AD.qq; | ||||||
|  | 
 | ||||||
|  | import android.Manifest; | ||||||
|  | import android.annotation.TargetApi; | ||||||
|  | import android.app.Activity; | ||||||
|  | import android.content.Intent; | ||||||
|  | import android.content.pm.PackageManager; | ||||||
|  | import android.net.Uri; | ||||||
|  | import android.os.Build; | ||||||
|  | import android.os.Bundle; | ||||||
|  | import android.os.Handler; | ||||||
|  | import android.os.Looper; | ||||||
|  | import android.provider.Settings; | ||||||
|  | import android.text.TextUtils; | ||||||
|  | import android.util.Log; | ||||||
|  | import android.view.KeyEvent; | ||||||
|  | import android.view.View; | ||||||
|  | import android.view.ViewGroup; | ||||||
|  | import android.widget.ImageView; | ||||||
|  | import android.widget.TextView; | ||||||
|  | import android.widget.Toast; | ||||||
|  | 
 | ||||||
|  | import com.novelbook.android.Main2Activity; | ||||||
|  | import com.novelbook.android.R; | ||||||
|  | import com.qq.e.ads.splash.SplashAD; | ||||||
|  | import com.qq.e.ads.splash.SplashADListener; | ||||||
|  | import com.qq.e.comm.util.AdError; | ||||||
|  | 
 | ||||||
|  | import java.util.ArrayList; | ||||||
|  | import java.util.HashMap; | ||||||
|  | import java.util.List; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * 这是demo工程的入口Activity,在这里会首次调用广点通的SDK。 | ||||||
|  |  * | ||||||
|  |  * 在调用SDK之前,如果您的App的targetSDKVersion >= 23,那么一定要把"READ_PHONE_STATE"、"WRITE_EXTERNAL_STORAGE"、"ACCESS_FINE_LOCATION"这几个权限申请到,否则SDK将不会工作。 | ||||||
|  |  */ | ||||||
|  | public class SplashActivity extends Activity implements SplashADListener { | ||||||
|  | 
 | ||||||
|  |   private SplashAD splashAD; | ||||||
|  |   private ViewGroup container; | ||||||
|  |   private TextView skipView; | ||||||
|  |   //private ImageView splashHolder; | ||||||
|  |   private TextView splashHolder; | ||||||
|  |   private TextView tvTitle; | ||||||
|  |   private static final String SKIP_TEXT = "点击跳过 %d"; | ||||||
|  |    | ||||||
|  |   public boolean canJump = false; | ||||||
|  |   private boolean needStartDemoList = true; | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 为防止无广告时造成视觉上类似于"闪退"的情况,设定无广告时页面跳转根据需要延迟一定时间,demo | ||||||
|  |    * 给出的延时逻辑是从拉取广告开始算开屏最少持续多久,仅供参考,开发者可自定义延时逻辑,如果开发者采用demo | ||||||
|  |    * 中给出的延时逻辑,也建议开发者考虑自定义minSplashTimeWhenNoAD的值(单位ms) | ||||||
|  |    **/ | ||||||
|  |   private int minSplashTimeWhenNoAD = 2000; | ||||||
|  |   /** | ||||||
|  |    * 记录拉取广告的时间 | ||||||
|  |    */ | ||||||
|  |   private long fetchSplashADTime = 0; | ||||||
|  |   private Handler handler = new Handler(Looper.getMainLooper()); | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   protected void onCreate(Bundle savedInstanceState) { | ||||||
|  |     super.onCreate(savedInstanceState); | ||||||
|  |     setContentView(R.layout.ad_qq_activity_splash ); | ||||||
|  |     container = (ViewGroup) this.findViewById(R.id.splash_container); | ||||||
|  |     skipView = (TextView) findViewById(R.id.skip_view); | ||||||
|  |     tvTitle = (TextView) findViewById(R.id.textTile); | ||||||
|  |     splashHolder = (TextView) findViewById(R.id.splash_holder); | ||||||
|  | 
 | ||||||
|  |     tvTitle.setText(R.string.app_name); | ||||||
|  |     getWindow().getDecorView().setSystemUiVisibility( | ||||||
|  |             View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||||
|  |                     | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||||
|  |                     | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | ||||||
|  |                     | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar | ||||||
|  |                     | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | ||||||
|  |                     | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | ||||||
|  |             //  | View.SYSTEM_UI_FLAG_IMMERSIVE | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|  |    /* boolean needLogo = getIntent().getBooleanExtra("need_logo", true); | ||||||
|  |     needStartDemoList = getIntent().getBooleanExtra("need_start_demo_list", true); | ||||||
|  |     if (!needLogo) { | ||||||
|  |       findViewById(R.id.app_logo).setVisibility(View.GONE); | ||||||
|  |     }*/ | ||||||
|  |     // 如果targetSDKVersion >= 23,就要申请好权限。如果您的App没有适配到Android6.0(即targetSDKVersion < 23),那么只需要在这里直接调用fetchSplashAD接口。 | ||||||
|  |     if (Build.VERSION.SDK_INT >= 23) { | ||||||
|  |       checkAndRequestPermission(); | ||||||
|  |     } else { | ||||||
|  |       // 如果是Android6.0以下的机器,默认在安装时获得了所有权限,可以直接调用SDK | ||||||
|  |       fetchSplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private String getPosId() { | ||||||
|  |     String posId = getIntent().getStringExtra("pos_id"); | ||||||
|  |     return TextUtils.isEmpty(posId) ? Constants.SplashPosID : posId; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * | ||||||
|  |    * ----------非常重要---------- | ||||||
|  |    * | ||||||
|  |    * Android6.0以上的权限适配简单示例: | ||||||
|  |    * | ||||||
|  |    * 如果targetSDKVersion >= 23,那么必须要申请到所需要的权限,再调用广点通SDK,否则广点通SDK不会工作。 | ||||||
|  |    * | ||||||
|  |    * Demo代码里是一个基本的权限申请示例,请开发者根据自己的场景合理地编写这部分代码来实现权限申请。 | ||||||
|  |    * 注意:下面的`checkSelfPermission`和`requestPermissions`方法都是在Android6.0的SDK中增加的API,如果您的App还没有适配到Android6.0以上,则不需要调用这些方法,直接调用广点通SDK即可。 | ||||||
|  |    */ | ||||||
|  |   @TargetApi(Build.VERSION_CODES.M) | ||||||
|  |   private void checkAndRequestPermission() { | ||||||
|  |     List<String> lackedPermission = new ArrayList<String>(); | ||||||
|  |     if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) { | ||||||
|  |       lackedPermission.add(Manifest.permission.READ_PHONE_STATE); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { | ||||||
|  |       lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { | ||||||
|  |       lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     // 权限都已经有了,那么直接调用SDK | ||||||
|  |     if (lackedPermission.size() == 0) { | ||||||
|  |       fetchSplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0); | ||||||
|  |     } else { | ||||||
|  |       // 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用SDK,否则不要调用SDK。 | ||||||
|  |       String[] requestPermissions = new String[lackedPermission.size()]; | ||||||
|  |       lackedPermission.toArray(requestPermissions); | ||||||
|  |       requestPermissions(requestPermissions, 1024); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   private boolean hasAllPermissionsGranted(int[] grantResults) { | ||||||
|  |     for (int grantResult : grantResults) { | ||||||
|  |       if (grantResult == PackageManager.PERMISSION_DENIED) { | ||||||
|  |         return false; | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |     return true; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { | ||||||
|  |     super.onRequestPermissionsResult(requestCode, permissions, grantResults); | ||||||
|  |     if (requestCode == 1024 && hasAllPermissionsGranted(grantResults)) { | ||||||
|  |       fetchSplashAD(this, container, skipView, Constants.APPID, getPosId(), this, 0); | ||||||
|  |     } else { | ||||||
|  |       // 如果用户没有授权,那么应该说明意图,引导用户去设置里面授权。 | ||||||
|  |       Toast.makeText(this, "应用缺少必要的权限!请点击\"权限\",打开所需要的权限。", Toast.LENGTH_LONG).show(); | ||||||
|  |       Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); | ||||||
|  |       intent.setData(Uri.parse("package:" + getPackageName())); | ||||||
|  |       startActivity(intent); | ||||||
|  |       finish(); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 拉取开屏广告,开屏广告的构造方法有3种,详细说明请参考开发者文档。 | ||||||
|  |    * | ||||||
|  |    * @param activity        展示广告的activity | ||||||
|  |    * @param adContainer     展示广告的大容器 | ||||||
|  |    * @param skipContainer   自定义的跳过按钮:传入该view给SDK后,SDK会自动给它绑定点击跳过事件。SkipView的样式可以由开发者自由定制,其尺寸限制请参考activity_splash.xml或者接入文档中的说明。 | ||||||
|  |    * @param appId           应用ID | ||||||
|  |    * @param posId           广告位ID | ||||||
|  |    * @param adListener      广告状态监听器 | ||||||
|  |    * @param fetchDelay      拉取广告的超时时长:取值范围[3000, 5000],设为0表示使用广点通SDK默认的超时时长。 | ||||||
|  |    */ | ||||||
|  |   private void fetchSplashAD(Activity activity, ViewGroup adContainer, View skipContainer, | ||||||
|  |                              String appId, String posId, SplashADListener adListener, int fetchDelay) { | ||||||
|  |     fetchSplashADTime = System.currentTimeMillis(); | ||||||
|  |     Map<String, String> tags = new HashMap<>(); | ||||||
|  |     tags.put("tag_s1", "value_s1"); | ||||||
|  |     tags.put("tag_s2", "value_s2"); | ||||||
|  | 
 | ||||||
|  |     splashAD = new SplashAD(activity, adContainer, skipContainer, appId, posId, adListener, | ||||||
|  |         fetchDelay, tags); | ||||||
|  |     // 如果不需要传tag,使用如下构造函数 | ||||||
|  |     // splashAD = new SplashAD(activity, adContainer, skipContainer, appId, posId, adListener, fetchDelay); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void onADPresent() { | ||||||
|  |     Log.i("AD_DEMO", "SplashADPresent"); | ||||||
|  |     splashHolder.setVisibility(View.INVISIBLE); // 广告展示后一定要把预设的开屏图片隐藏起来 | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void onADClicked() { | ||||||
|  |     Log.i("AD_DEMO", "SplashADClicked clickUrl: " | ||||||
|  |         + (splashAD.getExt() != null ? splashAD.getExt().get("clickUrl") : "")); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 倒计时回调,返回广告还将被展示的剩余时间。 | ||||||
|  |    * 通过这个接口,开发者可以自行决定是否显示倒计时提示,或者还剩几秒的时候显示倒计时 | ||||||
|  |    * | ||||||
|  |    * @param millisUntilFinished 剩余毫秒数 | ||||||
|  |    */ | ||||||
|  |   @Override | ||||||
|  |   public void onADTick(long millisUntilFinished) { | ||||||
|  |     Log.i("AD_DEMO", "SplashADTick " + millisUntilFinished + "ms"); | ||||||
|  |     skipView.setText(String.format(SKIP_TEXT, Math.round(millisUntilFinished / 1000f))); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void onADExposure() { | ||||||
|  |     Log.i("AD_DEMO", "SplashADExposure"); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void onADDismissed() { | ||||||
|  |     Log.i("AD_DEMO", "SplashADDismissed"); | ||||||
|  |     next(); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   public void onNoAD(AdError error) { | ||||||
|  |     Log.i( | ||||||
|  |         "AD_DEMO", | ||||||
|  |         String.format("LoadSplashADFail, eCode=%d, errorMsg=%s", error.getErrorCode(), | ||||||
|  |             error.getErrorMsg())); | ||||||
|  |     /** | ||||||
|  |      * 为防止无广告时造成视觉上类似于"闪退"的情况,设定无广告时页面跳转根据需要延迟一定时间,demo | ||||||
|  |      * 给出的延时逻辑是从拉取广告开始算开屏最少持续多久,仅供参考,开发者可自定义延时逻辑,如果开发者采用demo | ||||||
|  |      * 中给出的延时逻辑,也建议开发者考虑自定义minSplashTimeWhenNoAD的值 | ||||||
|  |      **/ | ||||||
|  |     long alreadyDelayMills = System.currentTimeMillis() - fetchSplashADTime;//从拉广告开始到onNoAD已经消耗了多少时间 | ||||||
|  |     long shouldDelayMills = alreadyDelayMills > minSplashTimeWhenNoAD ? 0 : minSplashTimeWhenNoAD | ||||||
|  |         - alreadyDelayMills;//为防止加载广告失败后立刻跳离开屏可能造成的视觉上类似于"闪退"的情况,根据设置的minSplashTimeWhenNoAD | ||||||
|  |     // 计算出还需要延时多久 | ||||||
|  |     handler.postDelayed(new Runnable() { | ||||||
|  |       @Override | ||||||
|  |       public void run() { | ||||||
|  | 
 | ||||||
|  |         SplashActivity.this.finish(); | ||||||
|  |       } | ||||||
|  |     }, shouldDelayMills); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** | ||||||
|  |    * 设置一个变量来控制当前开屏页面是否可以跳转,当开屏广告为普链类广告时,点击会打开一个广告落地页,此时开发者还不能打开自己的App主页。当从广告落地页返回以后, | ||||||
|  |    * 才可以跳转到开发者自己的App主页;当开屏广告是App类广告时只会下载App。 | ||||||
|  |    */ | ||||||
|  |   private void next() { | ||||||
|  |     if (canJump) { | ||||||
|  | 
 | ||||||
|  |       this.finish(); | ||||||
|  |     } else { | ||||||
|  |       canJump = true; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   protected void onPause() { | ||||||
|  |     super.onPause(); | ||||||
|  |     canJump = false; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   protected void onResume() { | ||||||
|  |     super.onResume(); | ||||||
|  |     if (canJump) { | ||||||
|  |       next(); | ||||||
|  |     } | ||||||
|  |     canJump = true; | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   @Override | ||||||
|  |   protected void onDestroy() { | ||||||
|  |     super.onDestroy(); | ||||||
|  |     handler.removeCallbacksAndMessages(null); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   /** 开屏页一定要禁止用户对返回按钮的控制,否则将可能导致用户手动退出了App而广告无法正常曝光和计费 */ | ||||||
|  |   @Override | ||||||
|  |   public boolean onKeyDown(int keyCode, KeyEvent event) { | ||||||
|  |     if (keyCode == KeyEvent.KEYCODE_BACK || keyCode == KeyEvent.KEYCODE_HOME) { | ||||||
|  |       return true; | ||||||
|  |     } | ||||||
|  |     return super.onKeyDown(keyCode, event); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -183,8 +183,8 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler { | ||||||
|      */ |      */ | ||||||
|     private void goToMainActivity() { |     private void goToMainActivity() { | ||||||
| 
 | 
 | ||||||
|          Intent  intent = new Intent(SplashActivity.this, Main2Activity.class); |        /*  Intent  intent = new Intent(SplashActivity.this, Main2Activity.class); | ||||||
|         startActivity(intent); |         startActivity(intent);*/ | ||||||
|         if(mSplashContainer!=null) { |         if(mSplashContainer!=null) { | ||||||
|             mSplashContainer.removeAllViews(); |             mSplashContainer.removeAllViews(); | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -44,7 +44,7 @@ public class Activity_Search extends Activity_base { | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     protected void initViews() { |     protected void initViews() { | ||||||
|         loadNativeBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID); |         loadNativeBannerAd(mBannerContainer); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,9 +1,13 @@ | ||||||
| package com.novelbook.android; | package com.novelbook.android; | ||||||
| 
 | 
 | ||||||
|  | import android.Manifest; | ||||||
|  | import android.annotation.TargetApi; | ||||||
| import android.app.Activity; | import android.app.Activity; | ||||||
| import android.app.ProgressDialog; | import android.app.ProgressDialog; | ||||||
| import android.content.Intent; | import android.content.Intent; | ||||||
| import android.content.pm.ActivityInfo; | import android.content.pm.ActivityInfo; | ||||||
|  | import android.content.pm.PackageManager; | ||||||
|  | import android.os.Build; | ||||||
| import android.os.Bundle; | import android.os.Bundle; | ||||||
| import android.os.Handler; | import android.os.Handler; | ||||||
| import android.os.Message; | import android.os.Message; | ||||||
|  | @ -23,6 +27,7 @@ import android.widget.ImageView; | ||||||
| import android.widget.TextView; | import android.widget.TextView; | ||||||
| import android.widget.Toast; | import android.widget.Toast; | ||||||
| 
 | 
 | ||||||
|  | import com.androidquery.AQuery; | ||||||
| import com.androidquery.callback.AQuery2; | import com.androidquery.callback.AQuery2; | ||||||
| import com.androidquery.callback.ImageOptions; | import com.androidquery.callback.ImageOptions; | ||||||
| import com.bytedance.sdk.openadsdk.AdSlot; | import com.bytedance.sdk.openadsdk.AdSlot; | ||||||
|  | @ -59,15 +64,40 @@ import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.concurrent.ConcurrentHashMap; | import java.util.concurrent.ConcurrentHashMap; | ||||||
| 
 | 
 | ||||||
|  | import com.qq.e.ads.banner.AbstractBannerADListener; | ||||||
|  | import com.qq.e.ads.banner.BannerView; | ||||||
|  | import com.qq.e.ads.cfg.VideoOption; | ||||||
|  | import com.qq.e.ads.nativ.ADSize; | ||||||
|  | import com.qq.e.ads.nativ.NativeADUnifiedListener; | ||||||
|  | import com.qq.e.ads.nativ.NativeExpressAD; | ||||||
|  | import com.qq.e.ads.nativ.NativeExpressADView; | ||||||
|  | import com.qq.e.ads.nativ.NativeExpressMediaListener; | ||||||
|  | import com.qq.e.ads.nativ.NativeUnifiedAD; | ||||||
|  | import com.qq.e.ads.nativ.NativeUnifiedADData; | ||||||
|  | import com.qq.e.comm.constants.AdPatternType; | ||||||
|  | import com.qq.e.comm.pi.AdData; | ||||||
|  | import com.qq.e.comm.util.AdError; | ||||||
|  | 
 | ||||||
|  | import org.litepal.util.Const; | ||||||
|  | 
 | ||||||
| import butterknife.BindView; | import butterknife.BindView; | ||||||
| import butterknife.ButterKnife; | import butterknife.ButterKnife; | ||||||
| 
 | 
 | ||||||
| public abstract  class Activity_base extends AppCompatActivity { | import static com.novelbook.android.utils.Constants.AD_TENCENT_QQ; | ||||||
|  | import static com.novelbook.android.utils.Constants.AD_TOUTIAO; | ||||||
|  | 
 | ||||||
|  | public abstract  class Activity_base extends AppCompatActivity implements NativeExpressAD.NativeExpressADListener { | ||||||
|  | 
 | ||||||
|     private static String TAG ="Activity_base"; |     private static String TAG ="Activity_base"; | ||||||
|     private ProgressDialog mProgressDialog; |     private ProgressDialog mProgressDialog; | ||||||
|     private MyApp application; |     private MyApp application; | ||||||
|     private Activity_base oContext; |     private Activity_base oContext; | ||||||
|     protected Gson gson = new Gson(); |     protected Gson gson = new Gson(); | ||||||
|  | 
 | ||||||
|  |    //---qq ad----> | ||||||
|  |     private NativeExpressAD nativeExpressAD; | ||||||
|  |     private NativeExpressADView nativeExpressADView; | ||||||
|  |     //---qq ad end---- | ||||||
|     @Nullable |     @Nullable | ||||||
|     @BindView(R.id.toolbar) |     @BindView(R.id.toolbar) | ||||||
|     Toolbar toolbar; |     Toolbar toolbar; | ||||||
|  | @ -77,9 +107,6 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|    /* @Nullable |    /* @Nullable | ||||||
|     @BindView(R.id.banner_native_container) |     @BindView(R.id.banner_native_container) | ||||||
|     FrameLayout mNativeBannerContainer;*/ |     FrameLayout mNativeBannerContainer;*/ | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     @Nullable |     @Nullable | ||||||
|     @BindView(R.id.recycleViewBookList) |     @BindView(R.id.recycleViewBookList) | ||||||
|     RecyclerView rvshudan; |     RecyclerView rvshudan; | ||||||
|  | @ -111,19 +138,47 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|         ButterKnife.bind(this); |         ButterKnife.bind(this); | ||||||
|         setupToolbar(); |         setupToolbar(); | ||||||
|         // 初始化View注入 |         // 初始化View注入 | ||||||
| 
 |         this.mAQuery = new AQuery2(this); | ||||||
|         initAD_TouTiao(); |         initAD_TouTiao(); | ||||||
|         setTitle(); |         setTitle(); | ||||||
|         initData(); |         initData(); | ||||||
|         initViews(); |         initViews(); | ||||||
|         initNaviBanner(); |         initNaviBanner(); | ||||||
|  |         if (Build.VERSION.SDK_INT >= 23) { | ||||||
|  |             checkAndRequestPermission(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     @TargetApi(Build.VERSION_CODES.M) | ||||||
|  |     private void checkAndRequestPermission() { | ||||||
|  |         List<String> lackedPermission = new ArrayList<String>(); | ||||||
|  |         if (!(checkSelfPermission(Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED)) { | ||||||
|  |             lackedPermission.add(Manifest.permission.READ_PHONE_STATE); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!(checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED)) { | ||||||
|  |             lackedPermission.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (!(checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED)) { | ||||||
|  |             lackedPermission.add(Manifest.permission.ACCESS_FINE_LOCATION); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             // 请求所缺少的权限,在onRequestPermissionsResult中再看是否获得权限,如果获得权限就可以调用SDK,否则不要调用SDK。 | ||||||
|  |             String[] requestPermissions = new String[lackedPermission.size()]; | ||||||
|  |             if(requestPermissions.length>0) { | ||||||
|  |                 lackedPermission.toArray(requestPermissions); | ||||||
|  |                 requestPermissions(requestPermissions, 1024); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
|     void initNaviBanner(){ |     void initNaviBanner(){ | ||||||
|         if(mBannerContainer==null){ |         if(mBannerContainer==null){ | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         if(Constants.SHOWAD){ |         if(Constants.SHOWAD){ | ||||||
|             loadNativeBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID); |             loadNativeBannerAd(); | ||||||
|             mBannerContainer.setVisibility(View.VISIBLE); |             mBannerContainer.setVisibility(View.VISIBLE); | ||||||
|         }else{ |         }else{ | ||||||
|             mBannerContainer.setVisibility(View.GONE); |             mBannerContainer.setVisibility(View.GONE); | ||||||
|  | @ -258,6 +313,8 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     class MyViewHolder extends RecyclerView.ViewHolder { |     class MyViewHolder extends RecyclerView.ViewHolder { | ||||||
|         @BindView(R.id.title) |         @BindView(R.id.title) | ||||||
|         TextView tvTitle; |         TextView tvTitle; | ||||||
|  | @ -343,6 +400,45 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|         super.finish(); |         super.finish(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |    public void loadNativeBannerAd(FrameLayout bannerContainer ) { | ||||||
|  |             mBannerContainer =bannerContainer; | ||||||
|  |             loadNativeBannerAd( )  ; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |    private void loadNativeBannerAd() { | ||||||
|  |      /*   if (mBannerContainer .getVisibility() != View.VISIBLE) { | ||||||
|  |             mBannerContainer.setVisibility(View.VISIBLE); | ||||||
|  |         } | ||||||
|  |     */ | ||||||
|  |         if (mBannerContainer.getChildCount() > 0) { | ||||||
|  |             mBannerContainer.removeAllViews(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if(!Constants.SHOWAD  ){return;} | ||||||
|  |         if(Constants.AD_NATIVE_BANNER_SOURCE == AD_TENCENT_QQ) { | ||||||
|  |             loadNativeBanner_qq(-1, 388); | ||||||
|  |         }else if(Constants.AD_NATIVE_BANNER_SOURCE == AD_TOUTIAO) { | ||||||
|  |             loadNativeBanner_toutiao(mBannerContainer ,690,388); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void loadBanner(FrameLayout bannerContainer, int width, int height) { | ||||||
|  |         mBannerContainer =bannerContainer; | ||||||
|  |         loadBanner(  width,   height); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void loadBanner( int width, int height){ | ||||||
|  |         if(Constants.AD_BANNER_SOURCE == AD_TENCENT_QQ) { | ||||||
|  |             getBanner_qq(); | ||||||
|  |             //  loadNativeBanner_qq(-1, 388); | ||||||
|  |         }else if(Constants.AD_BANNER_SOURCE == AD_TOUTIAO) { | ||||||
|  |             loadBanner_toutiao(mBannerContainer, width,height); | ||||||
|  | 
 | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| //------ 头条 ad ----- | //------ 头条 ad ----- | ||||||
|     AQuery2 mAQuery; |     AQuery2 mAQuery; | ||||||
|     Button mCreativeButton; |     Button mCreativeButton; | ||||||
|  | @ -353,7 +449,7 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|             mTTAdNative = TTAdManagerHolder.get().createAdNative(this); |             mTTAdNative = TTAdManagerHolder.get().createAdNative(this); | ||||||
|             //step3:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。 |             //step3:(可选,强烈建议在合适的时机调用):申请部分权限,如read_phone_state,防止获取不了imei时候,下载类广告没有填充的问题。 | ||||||
|             TTAdManagerHolder.get().requestPermissionIfNecessary(this); |             TTAdManagerHolder.get().requestPermissionIfNecessary(this); | ||||||
|             this.mAQuery = new AQuery2(this); |             //this.mAQuery = new AQuery2(this); | ||||||
|         }catch (Exception er){ |         }catch (Exception er){ | ||||||
|             Log.e(TAG, "initAD_TouTiao: ", er); |             Log.e(TAG, "initAD_TouTiao: ", er); | ||||||
|         } |         } | ||||||
|  | @ -369,12 +465,16 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|         return mTTAdNative; |         return mTTAdNative; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| //----toutiao ad ---- | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     //----toutiao ad ---- | ||||||
| //    boolean mShowAd =false; | //    boolean mShowAd =false; | ||||||
|      public void loadBannerAd(FrameLayout bannerContainer, String codeId, int width, int height) { |        void loadBanner_toutiao(FrameLayout bannerContainer,int width, int height) { | ||||||
|         //step4:创建广告请求参数AdSlot,具体参数含义参考文档 |         //step4:创建广告请求参数AdSlot,具体参数含义参考文档 | ||||||
|          if(!Constants.SHOWAD || getTTAdNative()==null ){return;} |          if(!Constants.SHOWAD || getTTAdNative()==null ){return;} | ||||||
| 
 |            String codeId =BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID; | ||||||
|        /* if(height >390){ |        /* if(height >390){ | ||||||
|             width =(int)(height*1.78); |             width =(int)(height*1.78); | ||||||
|             if(width > Constants.SCREEN_WIDTH_PIX-50 ){ |             if(width > Constants.SCREEN_WIDTH_PIX-50 ){ | ||||||
|  | @ -511,21 +611,19 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     //-------------native toutiao ad |     //-------------native toutiao ad | ||||||
|     void loadNativeBannerAd(FrameLayout bannerContainer,String codeId) { |  | ||||||
| 
 | 
 | ||||||
|         loadNativeBannerAd(bannerContainer,codeId,690,388); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  //   List<TTNativeAd> toutiaoNati_Banner_AdCache = new ArrayList<TTNativeAd>(); |  //   List<TTNativeAd> toutiaoNati_Banner_AdCache = new ArrayList<TTNativeAd>(); | ||||||
|     Map<String, List<TTNativeAd> > toutiaoNati_Banner_AdCache = new ConcurrentHashMap<String, List<TTNativeAd>>(); |     Map<String, List<TTNativeAd> > toutiaoNati_Banner_AdCache = new ConcurrentHashMap<String, List<TTNativeAd>>(); | ||||||
|      void loadNativeBannerAd(FrameLayout bannerContainer,String codeId,int width,int height) { |      void loadNativeBanner_toutiao(FrameLayout bannerContainer,int width,int height) { | ||||||
|          //step4:创建广告请求参数AdSlot,注意其中的setNativeAdtype方法,具体参数含义参考文档 |          //step4:创建广告请求参数AdSlot,注意其中的setNativeAdtype方法,具体参数含义参考文档 | ||||||
| 
 | 
 | ||||||
|          if (!Constants.SHOWAD || getTTAdNative() == null) { |          if (!Constants.SHOWAD || getTTAdNative() == null) { | ||||||
|              return; |              return; | ||||||
|          } |          } | ||||||
| 
 | 
 | ||||||
|  |          String codeId =BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID; | ||||||
| 
 | 
 | ||||||
|          final   String key =width+"_"+height; |          final   String key =width+"_"+height; | ||||||
|          List<TTNativeAd> adCache =null; |          List<TTNativeAd> adCache =null; | ||||||
|  | @ -585,7 +683,7 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|                  if (isfillAd1) { |                  if (isfillAd1) { | ||||||
|                      setNativeBanner(bannerContainer, key); |                      setNativeBanner(bannerContainer, key); | ||||||
|                  }else{ |                  }else{ | ||||||
|                      loadNativeBannerAd(bannerContainer,  codeId,  width,  height); |                      loadNativeBanner_toutiao(mBannerContainer, width,  height); | ||||||
|                      Log.d(TAG, String.format("loadNativeBannerAd:  load again ...  containsKey(key) ? %s,ads size %s",toutiaoNati_Banner_AdCache.containsKey(key), |                      Log.d(TAG, String.format("loadNativeBannerAd:  load again ...  containsKey(key) ? %s,ads size %s",toutiaoNati_Banner_AdCache.containsKey(key), | ||||||
|                              toutiaoNati_Banner_AdCache.containsKey(key)?toutiaoNati_Banner_AdCache.get(key).size() :0 |                              toutiaoNati_Banner_AdCache.containsKey(key)?toutiaoNati_Banner_AdCache.get(key).size() :0 | ||||||
|                      )); |                      )); | ||||||
|  | @ -909,7 +1007,7 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|     /** |     /** | ||||||
|      * 加载 toutiao feed广告 |      * 加载 toutiao feed广告 | ||||||
|      */ |      */ | ||||||
|     public void loadListAd(BookListAdapter adapter, int adCnt, boolean addFooter) { |     public void loadListAd_toutiao(BookListAdapter adapter, int adCnt, boolean addFooter) { | ||||||
|         //feed广告请求类型参数 |         //feed广告请求类型参数 | ||||||
|         AdSlot adSlot = new AdSlot.Builder() |         AdSlot adSlot = new AdSlot.Builder() | ||||||
|                 .setCodeId(BuildConfig.AD_SLOT_TOUTIAO_FEEDAD_ID) |                 .setCodeId(BuildConfig.AD_SLOT_TOUTIAO_FEEDAD_ID) | ||||||
|  | @ -942,4 +1040,262 @@ public abstract  class Activity_base extends AppCompatActivity { | ||||||
|             } |             } | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     // qq ad ------------------------------begin | ||||||
|  |     //private AQuery mAQuery; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     BannerView bv; | ||||||
|  |     private void getBanner_qq() { | ||||||
|  | 
 | ||||||
|  |         if(this.bv != null){ | ||||||
|  |           mBannerContainer.removeView(bv); | ||||||
|  |             bv.destroy(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         this.bv = new BannerView(this, com.qq.e.ads.banner.ADSize.BANNER,com.novelbook.android.AD.qq.Constants. APPID,com.novelbook.android.AD.qq.Constants.BannerPosID); | ||||||
|  |         // 注意:如果开发者的banner不是始终展示在屏幕中的话,请关闭自动刷新,否则将导致曝光率过低。 | ||||||
|  |         // 并且应该自行处理:当banner广告区域出现在屏幕后,再手动loadAD。 | ||||||
|  |       //  bv.setRefresh(0); | ||||||
|  |         bv.setADListener(new AbstractBannerADListener() { | ||||||
|  | 
 | ||||||
|  |             @Override | ||||||
|  |             public void onNoAD(AdError error) { | ||||||
|  |                 Log.i( | ||||||
|  |                         "AD_DEMO", | ||||||
|  |                         String.format("Banner onNoAD,eCode = %d, eMsg = %s", error.getErrorCode(), | ||||||
|  |                                 error.getErrorMsg())); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             @Override | ||||||
|  |             public void onADReceiv() { | ||||||
|  |                 Log.i("AD_DEMO", "ONBannerReceive"); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |         mBannerContainer.addView(bv); | ||||||
|  |         this.bv.loadAD(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     private void loadNativeBanner_qq(int adWidth,int adHeight) { | ||||||
|  |         try { | ||||||
|  | 
 | ||||||
|  |       /*      if(mAdList!=null && mAdList.size()>1){ | ||||||
|  |                 nativeExpressADView = mAdList.get(0); | ||||||
|  |             //    bindAD(); | ||||||
|  |                 Log.d(TAG, "loadNativeBanner_qq: mAdList.size()" +mAdList.size()); | ||||||
|  |                 if(mAdList.size()>1){ | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |             }*/ | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |             nativeExpressAD = new NativeExpressAD(this, getMyADSize(adWidth, adHeight), com.novelbook.android.AD.qq.Constants.APPID, com.novelbook.android.AD.qq.Constants.NativeExpressPosID, this); // 这里的Context必须为Activity | ||||||
|  |            /* nativeExpressAD.setVideoOption(new VideoOption.Builder() | ||||||
|  |                     .setAutoPlayPolicy(VideoOption.AutoPlayPolicy.WIFI) // 设置什么网络环境下可以自动播放视频 | ||||||
|  |                     .setAutoPlayMuted(true) // 设置自动播放视频时,是否静音 | ||||||
|  |                     .build()); // setVideoOption是可选的,开发者可根据需要选择是否配置 | ||||||
|  |             nativeExpressAD.setMaxVideoDuration(com.novelbook.android.AD.qq.Constants.VIDEO_DURATION_SETTING_MAX);*/ | ||||||
|  |             nativeExpressAD.loadAD(1); | ||||||
|  | 
 | ||||||
|  |         } catch (NumberFormatException e) { | ||||||
|  |             Log.w(TAG, "ad size invalid."); | ||||||
|  |             Toast.makeText(this, "请输入合法的宽高数值", Toast.LENGTH_SHORT).show(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private ADSize getMyADSize(int adWidth,int adHeight) { | ||||||
|  | 
 | ||||||
|  |         return new ADSize(adWidth, adHeight); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 获取广告数据 | ||||||
|  |      * | ||||||
|  |      * @param nativeExpressADView | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     private String getAdInfo(NativeExpressADView nativeExpressADView) { | ||||||
|  |         AdData adData = nativeExpressADView.getBoundData(); | ||||||
|  |         if (adData != null) { | ||||||
|  |             StringBuilder infoBuilder = new StringBuilder(); | ||||||
|  |             infoBuilder.append("title:").append(adData.getTitle()).append(",") | ||||||
|  |                     .append("desc:").append(adData.getDesc()).append(",") | ||||||
|  |                     .append("patternType:").append(adData.getAdPatternType()); | ||||||
|  |             if (adData.getAdPatternType() == AdPatternType.NATIVE_VIDEO) { | ||||||
|  |                 infoBuilder.append(", video info: ").append(getVideoInfo(adData.getProperty(AdData.VideoPlayer.class))); | ||||||
|  |             } | ||||||
|  |             return infoBuilder.toString(); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  |     /** | ||||||
|  |      * 获取播放器实例 | ||||||
|  |      * | ||||||
|  |      * 仅当视频回调{@link NativeExpressMediaListener#onVideoInit(NativeExpressADView)}调用后才会有返回值 | ||||||
|  |      * | ||||||
|  |      * @param videoPlayer | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |     private String getVideoInfo(AdData.VideoPlayer videoPlayer) { | ||||||
|  |         if (videoPlayer != null) { | ||||||
|  |             StringBuilder videoBuilder = new StringBuilder(); | ||||||
|  |             videoBuilder.append("{state:").append(videoPlayer.getVideoState()).append(",") | ||||||
|  |                     .append("duration:").append(videoPlayer.getDuration()).append(",") | ||||||
|  |                     .append("position:").append(videoPlayer.getCurrentPosition()).append("}"); | ||||||
|  |             return videoBuilder.toString(); | ||||||
|  |         } | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     FrameLayout getNativeContainer(){ | ||||||
|  |        return mBannerContainer; | ||||||
|  |     } | ||||||
|  |     List<NativeExpressADView> mAdList; | ||||||
|  |     @Override | ||||||
|  |     public void onADLoaded(List<NativeExpressADView> adList){ | ||||||
|  |         // 释放前一个展示的NativeExpressADView的资源 | ||||||
|  | 
 | ||||||
|  |         if(mAdList==null){ | ||||||
|  |             mAdList = new ArrayList<NativeExpressADView>(); | ||||||
|  |         } | ||||||
|  |         boolean toBind = mAdList.size()==0; | ||||||
|  |         mAdList.addAll(0,adList); | ||||||
|  |         for(NativeExpressADView ad :mAdList){ | ||||||
|  |             Log.d(TAG, "onADLoaded: ad is " +ad); | ||||||
|  |         } | ||||||
|  |        /* if(toBind ){ | ||||||
|  |             bindAD(adList); | ||||||
|  |         }*/ | ||||||
|  |         bindAD(adList); | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     void bindAD(List<NativeExpressADView> adList){ | ||||||
|  |         if (nativeExpressADView != null) { | ||||||
|  |             nativeExpressADView.destroy(); | ||||||
|  |         } | ||||||
|  |         FrameLayout bannerContainer = getNativeContainer(); | ||||||
|  | 
 | ||||||
|  |         if (bannerContainer .getVisibility() != View.VISIBLE) { | ||||||
|  |             return; | ||||||
|  |             //  bannerContainer.setVisibility(View.VISIBLE); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         if (bannerContainer.getChildCount() > 0) { | ||||||
|  |             bannerContainer.removeAllViews(); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         nativeExpressADView = adList.get(0); | ||||||
|  | 
 | ||||||
|  |      /*   Log.i(TAG, "onADLoaded, video info: " + getAdInfo(nativeExpressADView)); | ||||||
|  |         if (nativeExpressADView.getBoundData().getAdPatternType() == AdPatternType.NATIVE_VIDEO) { | ||||||
|  |             nativeExpressADView.setMediaListener(mediaListener); | ||||||
|  |         }*/ | ||||||
|  |         // 广告可见才会产生曝光,否则将无法产生收益。 | ||||||
|  |         bannerContainer.addView(nativeExpressADView); | ||||||
|  |         nativeExpressADView.render(); | ||||||
|  |      //   mAdList.remove(0); | ||||||
|  |     } | ||||||
|  |     @Override | ||||||
|  |     public void onNoAD(AdError adError) { | ||||||
|  |         Log.i( | ||||||
|  |                 TAG, | ||||||
|  |                 String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(), | ||||||
|  |                         adError.getErrorMsg())); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onRenderFail(NativeExpressADView adView) { | ||||||
|  |         Log.i(TAG, "onRenderFail"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onRenderSuccess(NativeExpressADView adView) { | ||||||
|  |         Log.i(TAG, "onRenderSuccess"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onADExposure(NativeExpressADView adView) { | ||||||
|  |         Log.i(TAG, "onADExposure"); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onADClicked(NativeExpressADView var1){ | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onADClosed(NativeExpressADView var1) { | ||||||
|  |         FrameLayout bannerContainer = getNativeContainer(); | ||||||
|  |         if (bannerContainer != null && bannerContainer.getChildCount() > 0) { | ||||||
|  |             bannerContainer.removeAllViews(); | ||||||
|  |            // bannerContainer.setVisibility(View.GONE); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     @Override | ||||||
|  |     public void onADLeftApplication(NativeExpressADView var1){ | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public  void onADOpenOverlay(NativeExpressADView var1){ | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void onADCloseOverlay(NativeExpressADView var1){ | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  |     private NativeExpressMediaListener mediaListener = new NativeExpressMediaListener() { | ||||||
|  |         @Override | ||||||
|  |         public void onVideoInit(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoInit: " | ||||||
|  |                     + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoLoading(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoLoading"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoReady(NativeExpressADView nativeExpressADView, long l) { | ||||||
|  |             Log.i(TAG, "onVideoReady"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoStart(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoStart: " | ||||||
|  |                     + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoPause(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoPause: " | ||||||
|  |                     + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoComplete(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoComplete: " | ||||||
|  |                     + getVideoInfo(nativeExpressADView.getBoundData().getProperty(AdData.VideoPlayer.class))); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoError(NativeExpressADView nativeExpressADView, AdError adError) { | ||||||
|  |             Log.i(TAG, "onVideoError"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoPageOpen(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoPageOpen"); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         @Override | ||||||
|  |         public void onVideoPageClose(NativeExpressADView nativeExpressADView) { | ||||||
|  |             Log.i(TAG, "onVideoPageClose"); | ||||||
|  |         } | ||||||
|  |     }; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -94,6 +94,10 @@ public class Activity_cate_books extends Activity_base { | ||||||
|     } |     } | ||||||
|     void initTabs2() { |     void initTabs2() { | ||||||
| 
 | 
 | ||||||
|  |         if(Constants.lstProgressType==null){ | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         if (mFragments == null ) { |         if (mFragments == null ) { | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -251,7 +251,7 @@ public class BookActivity extends   Activity_base { | ||||||
|         rvBooklistAuthor.setLayoutManager(new LinearLayoutManager(this)); |         rvBooklistAuthor.setLayoutManager(new LinearLayoutManager(this)); | ||||||
| 
 | 
 | ||||||
|         rvBooklistAuthor.setAdapter(mAdapterAuthor); |         rvBooklistAuthor.setAdapter(mAdapterAuthor); | ||||||
|         loadListAd(mAdapterAuthor, 1 ,false); |         loadListAd_toutiao(mAdapterAuthor, 1 ,false); | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|     private void setNovelsRelated(){ |     private void setNovelsRelated(){ | ||||||
|  | @ -270,7 +270,7 @@ public class BookActivity extends   Activity_base { | ||||||
|         rvBooklistRelated.setLayoutManager(new LinearLayoutManager(this)); |         rvBooklistRelated.setLayoutManager(new LinearLayoutManager(this)); | ||||||
|         rvBooklistRelated.setAdapter(mAdapterRelated); |         rvBooklistRelated.setAdapter(mAdapterRelated); | ||||||
| 
 | 
 | ||||||
|          loadListAd(mAdapterRelated, 1 ,false); |          loadListAd_toutiao(mAdapterRelated, 1 ,false); | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|     /** |     /** | ||||||
|  |  | ||||||
|  | @ -65,6 +65,11 @@ import com.novelbook.android.utils.ImageUtil; | ||||||
| import com.novelbook.android.utils.MyImageLoader; | import com.novelbook.android.utils.MyImageLoader; | ||||||
| import com.novelbook.android.utils.OnItemClickListener; | import com.novelbook.android.utils.OnItemClickListener; | ||||||
| import com.novelbook.android.utils.PageFactory; | import com.novelbook.android.utils.PageFactory; | ||||||
|  | import com.qq.e.ads.nativ.NativeADUnifiedListener; | ||||||
|  | import com.qq.e.ads.nativ.NativeExpressAD; | ||||||
|  | import com.qq.e.ads.nativ.NativeUnifiedAD; | ||||||
|  | import com.qq.e.ads.nativ.NativeUnifiedADData; | ||||||
|  | import com.qq.e.comm.util.AdError; | ||||||
| import com.umeng.analytics.MobclickAgent; | import com.umeng.analytics.MobclickAgent; | ||||||
| import com.youth.banner.loader.ImageLoader; | import com.youth.banner.loader.ImageLoader; | ||||||
| 
 | 
 | ||||||
|  | @ -84,7 +89,7 @@ import butterknife.ButterKnife; | ||||||
| /** | /** | ||||||
|  * A simple {@link Fragment} subclass. |  * A simple {@link Fragment} subclass. | ||||||
|  */ |  */ | ||||||
| public abstract class BasicFragment extends Fragment { | public abstract class BasicFragment extends Fragment implements   NativeADUnifiedListener { | ||||||
| 
 | 
 | ||||||
|    private static String TAG = BasicFragment.class.getSimpleName(); |    private static String TAG = BasicFragment.class.getSimpleName(); | ||||||
|     protected View rootView; |     protected View rootView; | ||||||
|  | @ -157,6 +162,7 @@ public abstract class BasicFragment extends Fragment { | ||||||
|                 mBannerContainer.setVisibility(View.GONE); |                 mBannerContainer.setVisibility(View.GONE); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | 
 | ||||||
|         return view; |         return view; | ||||||
|         // Inflate the layout for this fragment |         // Inflate the layout for this fragment | ||||||
| 
 | 
 | ||||||
|  | @ -474,15 +480,59 @@ void initTabs(){ | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|        activity .loadBannerAd(bannerContainer, BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID,(int)(adHeight*5.9), adHeight); |        activity .loadBanner(bannerContainer, (int)(adHeight*5.9), adHeight); | ||||||
|        if( mBannerContainer.getVisibility() !=View.VISIBLE) |        if( mBannerContainer.getVisibility() !=View.VISIBLE) | ||||||
|         mBannerContainer.setVisibility(View.VISIBLE); |         mBannerContainer.setVisibility(View.VISIBLE); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     // qq ad ------------------------------begin | ||||||
|  |     private NativeUnifiedAD mAdManager; | ||||||
|  |     private List<NativeUnifiedADData> mAds = new ArrayList<>(); | ||||||
|  |     public void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) { | ||||||
|  |       if(mAdManager==null) { | ||||||
|  |           mAdManager = new NativeUnifiedAD(activity, com.novelbook.android.AD.qq.Constants.APPID, | ||||||
|  |                   com.novelbook.android.AD.qq.Constants.UNIFIED_INTERSTITIAL_ID_ONLY_SMALL, this); | ||||||
|  |       } | ||||||
|  |         mAdManager.loadData(adCnt); | ||||||
|  |         qqAdapter =adapter; | ||||||
|  |         qqAddFooter=addFooter; | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private boolean qqAddFooter; | ||||||
|  |     private BookListAdapter qqAdapter; | ||||||
|  |     @Override | ||||||
|  |     public void onADLoaded(List<NativeUnifiedADData> ads) { | ||||||
|  |         // mIsLoading = false; | ||||||
|  |         // 防止在onDestory后网络回包 | ||||||
|  |        if(qqAdapter==null){ | ||||||
|  |            return; | ||||||
|  |        } | ||||||
|  |         if(qqAddFooter) { | ||||||
|  |             qqAdapter.AddFooterItem(ads); | ||||||
|  |         }else{ | ||||||
|  |             qqAdapter.AddHeaderItem(ads); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     @Override | ||||||
|  |     public void onNoAD(AdError adError) { | ||||||
|  |         Log.i( | ||||||
|  |                 TAG, | ||||||
|  |                 String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(), | ||||||
|  |                         adError.getErrorMsg())); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     //qq ad end<------------- | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * 加载 toutiao feed广告 |      * 加载 toutiao feed广告 | ||||||
|      */ |      */ | ||||||
|      void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) { |      void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) { | ||||||
|           activity.loadListAd(adapter, adCnt ,addFooter); |          if(Constants.AD_UNIFIED_RECYCLE_SOURCE==1) { | ||||||
|  |             loadListAd_qq(adapter, adCnt, addFooter); | ||||||
|  |          }else if(Constants.AD_UNIFIED_RECYCLE_SOURCE==2){ | ||||||
|  |              activity.loadListAd_toutiao(adapter, adCnt, addFooter); | ||||||
|  |          } | ||||||
|  | 
 | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -54,6 +54,16 @@ public class MyApp extends Application { | ||||||
|         Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = config.getAdTopBannerRate(); |         Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = config.getAdTopBannerRate(); | ||||||
|         Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT= config.getAdNativeBannerInLinesRate() ; |         Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT= config.getAdNativeBannerInLinesRate() ; | ||||||
| 
 | 
 | ||||||
|  |         Constants.AD_SPLASH_SOURCE=config.getAdSplashSource(); | ||||||
|  |         Constants.AD_UNIFIED_RECYCLE_SOURCE=config.getAdUnifiedRecycleSource(); | ||||||
|  |         Constants.AD_NATIVE_BANNER_SOURCE=config.getAdNativeBannerSource(); | ||||||
|  |         Constants.AD_BANNER_SOURCE=config.getAdBannerSource(); | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         Constants.ONE_DP_SIZE = (int)applicationContext.getResources().getDimension(R.dimen.one_dp); |         Constants.ONE_DP_SIZE = (int)applicationContext.getResources().getDimension(R.dimen.one_dp); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -137,11 +137,10 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|     @BindView(R.id.frmAD) |     @BindView(R.id.frmAD) | ||||||
|     FrameLayout frmAD; |     FrameLayout frmAD; | ||||||
| 
 | 
 | ||||||
|     @BindView(R.id.native_banner_container ) |    @BindView(R.id.native_banner_container ) | ||||||
|     FrameLayout mNative_status_banner_container; |     FrameLayout mNative_status_banner_container; | ||||||
| 
 |   @BindView(R.id.banner_container ) | ||||||
|     @BindView(R.id.native_banner_container_in_lines ) |     FrameLayout mBannerContainer; | ||||||
|     FrameLayout mNative_banner_container_in_lines; |  | ||||||
|    @BindView(R.id.llShelfBottom) |    @BindView(R.id.llShelfBottom) | ||||||
|     LinearLayout llShelf; |     LinearLayout llShelf; | ||||||
|     private Config config; |     private Config config; | ||||||
|  | @ -482,8 +481,8 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|             public void showAdAfterIni() { |             public void showAdAfterIni() { | ||||||
|              //  if(frmAD.getVisibility()== View.INVISIBLE) |              //  if(frmAD.getVisibility()== View.INVISIBLE) | ||||||
|              //    frmAD.setVisibility(View.VISIBLE); |              //    frmAD.setVisibility(View.VISIBLE); | ||||||
|                  /* if(mNative_banner_container_in_lines.getVisibility()== View.GONE) |                  /* if(mBannerContainer.getVisibility()== View.GONE) | ||||||
|                       mNative_banner_container_in_lines.setVisibility(View.VISIBLE);*/ |                       mBannerContainer.setVisibility(View.VISIBLE);*/ | ||||||
|               //  Log.d(TAG, "pageAnimation showAdAfterIni: "); |               //  Log.d(TAG, "pageAnimation showAdAfterIni: "); | ||||||
|                 pageFactory.showAd(); |                 pageFactory.showAd(); | ||||||
|             } |             } | ||||||
|  | @ -492,9 +491,9 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|             public void hideAdBeforeIni() { |             public void hideAdBeforeIni() { | ||||||
|             //    if(frmAD.getVisibility()== View.VISIBLE) |             //    if(frmAD.getVisibility()== View.VISIBLE) | ||||||
|           //      frmAD.setVisibility(View.INVISIBLE); |           //      frmAD.setVisibility(View.INVISIBLE); | ||||||
|                /* if(mNative_banner_container_in_lines.getVisibility()== View.VISIBLE) |                /* if(mBannerContainer.getVisibility()== View.VISIBLE) | ||||||
|                     mNative_banner_container_in_lines.setVisibility(View.GONE);*/ |                     mBannerContainer.setVisibility(View.GONE);*/ | ||||||
|                // mNative_banner_container_in_lines.removeAllViews(); |                // mBannerContainer.removeAllViews(); | ||||||
|                // Log.d(TAG, "pageAnimation hideAdBeforeIni: "); |                // Log.d(TAG, "pageAnimation hideAdBeforeIni: "); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1079,31 +1078,43 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|     } |     } | ||||||
|     */ |     */ | ||||||
| 
 | 
 | ||||||
|  |     FrameLayout tmpFrame =mBannerContainer; | ||||||
|  |     @Override | ||||||
|  |     FrameLayout getNativeContainer(){ | ||||||
|  |         return tmpFrame; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public void hideStatusAds(){ |     public void hideStatusAds(){ | ||||||
|         Log.d(TAG, "loadBannerAd: hideAds()"); | 
 | ||||||
|      /*   try{ |      /*   try{ | ||||||
|             throw new Exception(""); |             throw new Exception(""); | ||||||
|         }catch (Exception e){ |         }catch (Exception e){ | ||||||
|             Log.e(TAG, "loadBannerAd: ", e); |             Log.e(TAG, "loadBannerAd: ", e); | ||||||
|         }*/ |         }*/ | ||||||
|         if(mNative_status_banner_container.getVisibility() ==View.VISIBLE) { |         if(mNative_status_banner_container.getVisibility() ==View.VISIBLE) { | ||||||
|             mNative_status_banner_container.setVisibility(View.GONE); |              Log.d(TAG, "loadBannerAd: hideStatusAds()"); | ||||||
|  |              mNative_status_banner_container.setVisibility(View.GONE); | ||||||
|         } |         } | ||||||
| //        mNative_banner_container_in_lines.removeAllViews(); |         // mBannerContainer.removeAllViews(); | ||||||
| //        mNative_banner_container_in_lines.setBackgroundResource(R.color.transparent); | //        mBannerContainer.setBackgroundResource(R.color.transparent); | ||||||
|     } |     } | ||||||
|     private void hideAdSlot(ViewGroup view){ |     private void hideAdSlot(ViewGroup view){ | ||||||
|         mNative_banner_container_in_lines.removeAllViews(); | 
 | ||||||
|         if(view.getVisibility() ==View.VISIBLE) { |        if(view.getChildCount()>0) { | ||||||
|  |            view.removeAllViews(); | ||||||
|  |            Log.d(TAG, "loadBannerAd: hideAdSlot()"); | ||||||
|  |        } | ||||||
|  | 
 | ||||||
|  |        /* if(view.getVisibility() ==View.VISIBLE) { | ||||||
|             view.setVisibility(View.GONE); |             view.setVisibility(View.GONE); | ||||||
|         } |         }*/ | ||||||
| /*        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); | /*        FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); | ||||||
|         params.width =0; |         params.width =0; | ||||||
|         view.setLayoutParams(params);*/ |         view.setLayoutParams(params);*/ | ||||||
|       //  view.setBackgroundResource(R.color.transparent); |       //  view.setBackgroundResource(R.color.transparent); | ||||||
| 
 | 
 | ||||||
|         //mNative_banner_container_in_lines.removeAllViews(); |         //mBannerContainer.removeAllViews(); | ||||||
|       //  mNative_banner_container_in_lines.setBackgroundResource(R.color.transparent); |       //  mBannerContainer.setBackgroundResource(R.color.transparent); | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|     private void showAdSlot(ViewGroup view){ |     private void showAdSlot(ViewGroup view){ | ||||||
|  | @ -1120,11 +1131,11 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|     public void showNativeBannerInLines(int height,int adY){ |     public void showNativeBannerInLines(int height,int adY){ | ||||||
|        // hideSystemUI(); |        // hideSystemUI(); | ||||||
|   //      hideAdSlot(mNative_banner_container); |   //      hideAdSlot(mNative_banner_container); | ||||||
|   //      hideAdSlot(mNative_banner_container_in_lines); |   //      hideAdSlot(mBannerContainer); | ||||||
|         // mNative_banner_container_in_lines.removeAllViews(); |         // mBannerContainer.removeAllViews(); | ||||||
|      //   mNative_banner_container_in_lines.removeAllViews(); |      //   mBannerContainer.removeAllViews(); | ||||||
|       //  mNative_banner_container_in_lines.setBackgroundResource(R.color.transparent); |       //  mBannerContainer.setBackgroundResource(R.color.transparent); | ||||||
|         hideAdSlot(mNative_banner_container_in_lines); |         hideAdSlot(mBannerContainer); | ||||||
|         if(height<=0){ |         if(height<=0){ | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  | @ -1132,14 +1143,16 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|         if(  adY >390*Constants.ONE_DP_SIZE){ |         if(  adY >390*Constants.ONE_DP_SIZE){ | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |         tmpFrame =mBannerContainer; | ||||||
|  | 
 | ||||||
|         Log.d(TAG, String.format("loadBannerAd:showNativeBannerInLines width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,height,adY)); |         Log.d(TAG, String.format("loadBannerAd:showNativeBannerInLines width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,height,adY)); | ||||||
|         loadNativeBannerAd(mNative_banner_container_in_lines,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID); |         loadNativeBannerAd(mBannerContainer); | ||||||
|         FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mNative_banner_container_in_lines.getLayoutParams(); |         FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mBannerContainer.getLayoutParams(); | ||||||
|         params.setMargins(10*Constants.ONE_DP_SIZE, adY+5*Constants.ONE_DP_SIZE,  10*Constants.ONE_DP_SIZE, 0*Constants.ONE_DP_SIZE); |         params.setMargins(10*Constants.ONE_DP_SIZE, adY+5*Constants.ONE_DP_SIZE,  10*Constants.ONE_DP_SIZE, 0*Constants.ONE_DP_SIZE); | ||||||
|         params.width =-1; |         params.width =-1; | ||||||
|         params.height = (int) getResources().getDimension(R.dimen.nativeBannerHeight); |         params.height = (int) getResources().getDimension(R.dimen.nativeBannerHeight); | ||||||
|         mNative_banner_container_in_lines.setLayoutParams(params); |         mBannerContainer.setLayoutParams(params); | ||||||
|          showAdSlot(mNative_banner_container_in_lines); |          showAdSlot(mBannerContainer); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1150,19 +1163,20 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|        // mTopBannerContainer.setVisibility(View.INVISIBLE);//翻页引起抖动 |        // mTopBannerContainer.setVisibility(View.INVISIBLE);//翻页引起抖动 | ||||||
|         //mTopBannerContainer.removeAllViews(); |         //mTopBannerContainer.removeAllViews(); | ||||||
|         Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); |         Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); | ||||||
|         hideAdSlot(mNative_banner_container_in_lines); |         tmpFrame =mBannerContainer; | ||||||
|  |         hideAdSlot(mBannerContainer); | ||||||
|         if(adHeight<=0){ |         if(adHeight<=0){ | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|         Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); |         Log.d(TAG, String.format("loadBannerAd:showTopBanner width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); | ||||||
|         FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mNative_banner_container_in_lines.getLayoutParams(); |         FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mBannerContainer.getLayoutParams(); | ||||||
|         loadBannerAd(mNative_banner_container_in_lines,BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID,   Constants.SCREEN_WIDTH_PIX-50,adHeight); |         loadBanner(mBannerContainer, Constants.SCREEN_WIDTH_PIX-50,adHeight); | ||||||
|       //  loadNativeBannerAd(mTopBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID,   304,200); |       //  loadNativeBannerAd(mTopBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID,   304,200); | ||||||
|         params.setMargins(10*Constants.ONE_DP_SIZE, adY -5*Constants.ONE_DP_SIZE, 10*Constants.ONE_DP_SIZE, 0); |         params.setMargins(10*Constants.ONE_DP_SIZE, adY -5*Constants.ONE_DP_SIZE, 10*Constants.ONE_DP_SIZE, 0); | ||||||
|         params.width =-1; |         params.width =-1; | ||||||
|          params.height = (int) getResources().getDimension(R.dimen.topBannerHeight); |          params.height = (int) getResources().getDimension(R.dimen.topBannerHeight); | ||||||
|         mNative_banner_container_in_lines.setLayoutParams(params); |         mBannerContainer.setLayoutParams(params); | ||||||
|         showAdSlot(mNative_banner_container_in_lines); |         showAdSlot(mBannerContainer); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -1192,19 +1206,19 @@ public class ReadActivity extends  Activity_base implements   AdInterface { | ||||||
|         //    Log.d(TAG, String.format("loadBannerAd:width %s, height %s ,adY %s",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); |         //    Log.d(TAG, String.format("loadBannerAd:width %s, height %s ,adY %s",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); | ||||||
| 
 | 
 | ||||||
|             if(adHeight>150*Constants.ONE_DP_SIZE && adY <400*Constants.ONE_DP_SIZE){ |             if(adHeight>150*Constants.ONE_DP_SIZE && adY <400*Constants.ONE_DP_SIZE){ | ||||||
|                 Log.d(TAG, String.format("loadBannerAd:width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight/Constants.ONE_DP_SIZE,adY/Constants.ONE_DP_SIZE  )); |                 Log.d(TAG, String.format("loadBannerAd: showStatusAd width %s, height %s ,adY %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight/Constants.ONE_DP_SIZE,adY/Constants.ONE_DP_SIZE  )); | ||||||
|                  hideAdSlot(mNative_banner_container_in_lines); |                  hideAdSlot(mBannerContainer); | ||||||
| //                hideAdSlot(mTopBannerContainer); | //                hideAdSlot(mTopBannerContainer); | ||||||
| 
 |                 tmpFrame =mNative_status_banner_container; | ||||||
|                 FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mNative_status_banner_container.getLayoutParams(); |                 FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mNative_status_banner_container.getLayoutParams(); | ||||||
|                 hideAdSlot(mNative_status_banner_container); |                 hideAdSlot(mNative_status_banner_container); | ||||||
| 
 | 
 | ||||||
|               //  mNative_banner_container_in_lines.removeAllViews(); |               //  mBannerContainer.removeAllViews(); | ||||||
|              //   mNative_banner_container_in_lines.setBackgroundResource(R.color.transparent); |              //   mBannerContainer.setBackgroundResource(R.color.transparent); | ||||||
| 
 | 
 | ||||||
|                 loadNativeBannerAd(mNative_status_banner_container,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID); |                 loadNativeBannerAd(mNative_status_banner_container); | ||||||
|                 params.setMargins(10*Constants.ONE_DP_SIZE, adY-20*Constants.ONE_DP_SIZE, 10*Constants.ONE_DP_SIZE, 50*Constants.ONE_DP_SIZE); |                 params.setMargins(10*Constants.ONE_DP_SIZE, adY-20*Constants.ONE_DP_SIZE, 10*Constants.ONE_DP_SIZE, 50*Constants.ONE_DP_SIZE); | ||||||
|                 params.height=-1; |                // params.height=-1; | ||||||
|                 mNative_status_banner_container.setLayoutParams(params); |                 mNative_status_banner_container.setLayoutParams(params); | ||||||
|                 showAdSlot(mNative_status_banner_container); |                 showAdSlot(mNative_status_banner_container); | ||||||
|                // mNative_banner_container.setVisibility(View.VISIBLE); |                // mNative_banner_container.setVisibility(View.VISIBLE); | ||||||
|  |  | ||||||
|  | @ -360,55 +360,66 @@ public class NetUtil { | ||||||
| 
 | 
 | ||||||
|     static long lastUpgradCheck =0; |     static long lastUpgradCheck =0; | ||||||
|    static void initHostConstants( JSONObject jsonObject ) throws JSONException { |    static void initHostConstants( JSONObject jsonObject ) throws JSONException { | ||||||
|         Constants.announcement =jsonObject.getString("declare"); |        Constants.announcement = jsonObject.getString("declare"); | ||||||
|         Constants.email =jsonObject.getString("email"); |        Constants.email = jsonObject.getString("email"); | ||||||
|         String tmp =jsonObject.getString("upgradeUrl"); |        String tmp = jsonObject.getString("upgradeUrl"); | ||||||
|         Constants.updateUrl =TextUtils.isEmpty(tmp)?Constants.updateUrl:tmp; |        Constants.updateUrl = TextUtils.isEmpty(tmp) ? Constants.updateUrl : tmp; | ||||||
|         Constants.minVersion = jsonObject.getInt("minVersion"); |        Constants.minVersion = jsonObject.getInt("minVersion"); | ||||||
| 
 | 
 | ||||||
|         JSONObject ads = jsonObject.getJSONObject("adsenseSetting") ; |        JSONObject ads = jsonObject.getJSONObject("adsenseSetting"); | ||||||
| //        Gson gson = new Gson(); | //        Gson gson = new Gson(); | ||||||
| //        AdSetting ads = gson.fromJson(adStr, AdSetting.class); | //        AdSetting ads = gson.fromJson(adStr, AdSetting.class); | ||||||
| 
 | 
 | ||||||
|         Constants.AD_SPLASH_INVTERVAL =(long) 1000 * ads.getInt("splashInterval"); |        Constants.AD_SPLASH_INVTERVAL = (long) 1000 * ads.getInt("splashInterval"); | ||||||
|         Constants.AD_SPLASH_PAGES = ads.getInt("splashPageCount"); |        Constants.AD_SPLASH_PAGES = ads.getInt("splashPageCount"); | ||||||
|         Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT  = ads.getInt("times4ChapterTopBanner"); |        Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = ads.getInt("times4ChapterTopBanner"); | ||||||
|         Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT  = ads.getInt("times4ChapterContentBanner"); |        Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT = ads.getInt("times4ChapterContentBanner"); | ||||||
| 
 | 
 | ||||||
|         if(Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT >1 && Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT ==  Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT ){ |    /*    Constants.AD_SPLASH_SOURCE = ads.getInt("splashSource"); | ||||||
|             Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT--; //顶部广告和页内广告要错开 |        Constants.AD_UNIFIED_RECYCLE_SOURCE = ads.getInt("unifiedReceycleSource"); | ||||||
|         } |        Constants.AD_NATIVE_BANNER_SOURCE = ads.getInt("nativeBannerSource"); | ||||||
|  |        Constants.AD_BANNER_SOURCE = ads.getInt("bannerSource");*/ | ||||||
| 
 | 
 | ||||||
|        Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s",Constants.AD_SPLASH_INVTERVAL,Constants.AD_SPLASH_PAGES )); |        if (Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT > 1 && Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT == Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT) { | ||||||
|      //   try { |            Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT--; //顶部广告和页内广告要错开 | ||||||
|             Constants.version = CommonUtil.getVersionCode(MyApp.applicationContext); |        } | ||||||
|             if (lastUpgradCheck == 0 ||Constants.version <Constants.minVersion) { |  | ||||||
|                 lastUpgradCheck = new Date().getTime(); |  | ||||||
|                 checkUpdate(true); |  | ||||||
| 
 | 
 | ||||||
|             } |        Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s", Constants.AD_SPLASH_INVTERVAL, Constants.AD_SPLASH_PAGES)); | ||||||
|  |        //   try { | ||||||
|  |        Constants.version = CommonUtil.getVersionCode(MyApp.applicationContext); | ||||||
|  |        if (lastUpgradCheck == 0 || Constants.version < Constants.minVersion) { | ||||||
|  |            lastUpgradCheck = new Date().getTime(); | ||||||
|  |            checkUpdate(true); | ||||||
|  | 
 | ||||||
|  |        } | ||||||
| //        }catch (Exception er){ | //        }catch (Exception er){ | ||||||
| //            Log.e(TAG, "initHostConstants: update error ",er ); | //            Log.e(TAG, "initHostConstants: update error ",er ); | ||||||
| //        } | //        } | ||||||
| 
 | 
 | ||||||
|        if( ads.getBoolean("showAdsense")){ |        if (ads.getBoolean("showAdsense")) { | ||||||
|            if(!Constants.SHOWAD ){ |            if (!Constants.SHOWAD) { | ||||||
|                Constants.SHOWAD = ads.getBoolean("showAdsense"); |                Constants.SHOWAD = ads.getBoolean("showAdsense"); | ||||||
|                TTAdManagerHolder.init(MyApp.applicationContext); |                TTAdManagerHolder.init(MyApp.applicationContext); | ||||||
|            } |            } | ||||||
|        } |        } | ||||||
|        Config config = Config.getInstance(); |        Config config = Config.getInstance(); | ||||||
|        Constants.SHOWAD = ads.getBoolean("showAdsense"); |        Constants.SHOWAD = ads.getBoolean("showAdsense"); | ||||||
|        Constants.PRE_LOAD_CHAPT= jsonObject.getBoolean("preLoadChapter"); |        Constants.PRE_LOAD_CHAPT = jsonObject.getBoolean("preLoadChapter"); | ||||||
|        config.setShowAd(Constants.SHOWAD); |        config.setShowAd(Constants.SHOWAD); | ||||||
|        config.setPreLoadChapter(Constants.PRE_LOAD_CHAPT); |        config.setPreLoadChapter(Constants.PRE_LOAD_CHAPT); | ||||||
|        config.setAdTopBannerRate( Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT); |        config.setAdTopBannerRate(Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT); | ||||||
|        config.setAdNativeBannerInLinesRate(Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT); |        config.setAdNativeBannerInLinesRate(Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT); | ||||||
|  | 
 | ||||||
|  |        config.setAdSplashSource(Constants.AD_SPLASH_SOURCE); | ||||||
|  |        config.setAdUnifiedRecycleSource(Constants.AD_UNIFIED_RECYCLE_SOURCE); | ||||||
|  |        config.setAdNativeBannerSource(Constants.AD_NATIVE_BANNER_SOURCE); | ||||||
|  |        config.setAdBannerSource(Constants.AD_BANNER_SOURCE); | ||||||
|  | 
 | ||||||
|        Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s, Constants.SHOWAD %s,Constants.AD_PRE_LOAD_CHAPT %s " |        Log.d(TAG, String.format("initHostConstants: Constants.AD_SPLASH_INVTERVAL %s,AD_SPLASH_PAGES %s, Constants.SHOWAD %s,Constants.AD_PRE_LOAD_CHAPT %s " | ||||||
|                ,Constants.AD_SPLASH_INVTERVAL,Constants.AD_SPLASH_PAGES, Constants.SHOWAD, Constants.PRE_LOAD_CHAPT )); |                , Constants.AD_SPLASH_INVTERVAL, Constants.AD_SPLASH_PAGES, Constants.SHOWAD, Constants.PRE_LOAD_CHAPT)); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     } |    } | ||||||
|     public static void checkUpdate(boolean isSilence){ |     public static void checkUpdate(boolean isSilence){ | ||||||
| 
 | 
 | ||||||
|         UpdateManager manager = new UpdateManager(Main2Activity.activityContext); |         UpdateManager manager = new UpdateManager(Main2Activity.activityContext); | ||||||
|  |  | ||||||
|  | @ -41,10 +41,14 @@ public class Config { | ||||||
|     public final static int PAGE_MODE_SLIDE = 2; |     public final static int PAGE_MODE_SLIDE = 2; | ||||||
|     public final static int PAGE_MODE_NONE = 3; |     public final static int PAGE_MODE_NONE = 3; | ||||||
|     public final static boolean SHOW_AD = false; |     public final static boolean SHOW_AD = false; | ||||||
|     public final static String SHOW_AD_KEY = "showAd"; |     private final static String SHOW_AD_KEY = "showAd"; | ||||||
|     private static final String PRE_LOAD_CHAPT_KEY ="preloadchapt" ; |     private static final String PRE_LOAD_CHAPT_KEY ="preloadchapt" ; | ||||||
|     private static final String AD_TOP_BANNER_SEEDS_KEY ="topbannerseeds" ; |     private static final String AD_TOP_BANNER_SEEDS_KEY ="topbannerseeds" ; | ||||||
|     private static final String AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY ="nativebannerinlinesseeds" ; |     private static final String AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY ="nativebannerinlinesseeds" ; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     private Context mContext; |     private Context mContext; | ||||||
|     private static Config config; |     private static Config config; | ||||||
|     private SharedPreferences sp; |     private SharedPreferences sp; | ||||||
|  | @ -234,6 +238,48 @@ public class Config { | ||||||
|         sp.edit().putInt(AD_TOP_BANNER_SEEDS_KEY,pageCnt).commit(); |         sp.edit().putInt(AD_TOP_BANNER_SEEDS_KEY,pageCnt).commit(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     private final static String AD_NATIVE_BANNER_SOURCE_KEY = "AD_NATIVE_BANNER_SOURCE_KEY"; | ||||||
|  |     private final static String AD_BANNER_SOURCE_KEY = "AD_BANNER_SOURCE_KEY"; | ||||||
|  |     private final static String AD_UNIFIED_RECYCLE_SOURCE_KEY = "AD_UNIFIED_RECYCLE_SOURCE_KEY"; | ||||||
|  |     private final static String AD_SPLASH_SOURCE_KEY = "AD_SPLASH_SOURCE_KEY"; | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     public int getAdNativeBannerSource(){ | ||||||
|  |         return sp.getInt(AD_NATIVE_BANNER_SOURCE_KEY,Constants.AD_TENCENT_QQ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAdNativeBannerSource(int source){ | ||||||
|  |         sp.edit().putInt(AD_NATIVE_BANNER_SOURCE_KEY,source).commit(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public int getAdBannerSource(){ | ||||||
|  |         return sp.getInt(AD_BANNER_SOURCE_KEY,Constants.AD_TENCENT_QQ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAdBannerSource(int source){ | ||||||
|  |         sp.edit().putInt(AD_BANNER_SOURCE_KEY,source).commit(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public int getAdUnifiedRecycleSource(){ | ||||||
|  |         return sp.getInt(AD_UNIFIED_RECYCLE_SOURCE_KEY,Constants.AD_TENCENT_QQ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAdUnifiedRecycleSource(int source){ | ||||||
|  |         sp.edit().putInt(AD_UNIFIED_RECYCLE_SOURCE_KEY,source).commit(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public int getAdSplashSource(){ | ||||||
|  |         return sp.getInt(AD_SPLASH_SOURCE_KEY,Constants.AD_TENCENT_QQ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setAdSplashSource(int source){ | ||||||
|  |         sp.edit().putInt(AD_SPLASH_SOURCE_KEY,source).commit(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|     public int getAdNativeBannerInLinesRate(){ |     public int getAdNativeBannerInLinesRate(){ | ||||||
|         return sp.getInt(AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY,0); |         return sp.getInt(AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY,0); | ||||||
|     } |     } | ||||||
|  | @ -241,4 +287,5 @@ public class Config { | ||||||
|     public void setAdNativeBannerInLinesRate(int pageCnt){ |     public void setAdNativeBannerInLinesRate(int pageCnt){ | ||||||
|         sp.edit().putInt(AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY,pageCnt).commit(); |         sp.edit().putInt(AD_NATVIE_BANNER_IN_LINES_SEEDS_KEY,pageCnt).commit(); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -14,8 +14,16 @@ public class Constants { | ||||||
|     public static final int MAXAGE_MAX =60*60*24*28; //28 天 ; |     public static final int MAXAGE_MAX =60*60*24*28; //28 天 ; | ||||||
|     public static final int MAXAGE_MULU = 60*60*24*7*2; //2周;; |     public static final int MAXAGE_MULU = 60*60*24*7*2; //2周;; | ||||||
|     public static final String VERSION_ADDRESS ="version.xml"; |     public static final String VERSION_ADDRESS ="version.xml"; | ||||||
|  | 
 | ||||||
|  |     public static  final int AD_TENCENT_QQ =1; | ||||||
|  |     public static final int AD_TOUTIAO =2; | ||||||
|     public static boolean AD_BACKGROUND_TRANSPARENT =true ; |     public static boolean AD_BACKGROUND_TRANSPARENT =true ; | ||||||
|     public static boolean SHOWAD =false ; |     public static boolean SHOWAD =false ; | ||||||
|  |     public static   int AD_NATIVE_BANNER_SOURCE = 2 ; //1:tencent,2:toutiao | ||||||
|  |     public static   int AD_BANNER_SOURCE = 1 ; //1:tencent,2:toutiao | ||||||
|  |     public static   int AD_UNIFIED_RECYCLE_SOURCE = 2 ; //1:tencent,2:toutiao | ||||||
|  |     public static   int AD_SPLASH_SOURCE = 1 ; //1:tencent,2:toutiao | ||||||
|  |     public static int AD_SOURCE =1 ; //1:tencent,2:toutiao | ||||||
|     public static boolean PRE_LOAD_CHAPT = false; |     public static boolean PRE_LOAD_CHAPT = false; | ||||||
|     public static long AD_SPLASH_INVTERVAL =  5*60*1000;//间隔5分钟 |     public static long AD_SPLASH_INVTERVAL =  5*60*1000;//间隔5分钟 | ||||||
|     public static int AD_SPLASH_PAGES = 15; |     public static int AD_SPLASH_PAGES = 15; | ||||||
|  |  | ||||||
|  | @ -473,9 +473,10 @@ public class PageFactory implements ChangeSource{ | ||||||
|         int pageNo =0; |         int pageNo =0; | ||||||
|         long starttime = new Date().getTime(); |         long starttime = new Date().getTime(); | ||||||
|         while(length <chars.length ) { |         while(length <chars.length ) { | ||||||
|             long starttime1 = new Date().getTime(); |             //long starttime1 = new Date().getTime(); | ||||||
|             pageNo++; |             pageNo++; | ||||||
|             TRPage page  = getNextChapterPage(chaptId,length ,pageNo); |             TRPage page  = getNextChapterPage(chaptId,length ,pageNo); | ||||||
|  | 
 | ||||||
|             // Log.d(TAG,"prepare book  page.getBegin :" + page.getBegin()+ ",chapter length "+ mBookUtil.getChapterLen()); |             // Log.d(TAG,"prepare book  page.getBegin :" + page.getBegin()+ ",chapter length "+ mBookUtil.getChapterLen()); | ||||||
| 
 | 
 | ||||||
|             // if(page.getBegin() == mBookUtil.getChapterLen() ){ //最后一页空白的情况。。。 |             // if(page.getBegin() == mBookUtil.getChapterLen() ){ //最后一页空白的情况。。。 | ||||||
|  | @ -483,16 +484,22 @@ public class PageFactory implements ChangeSource{ | ||||||
|             //     break; |             //     break; | ||||||
|             //  } |             //  } | ||||||
| 
 | 
 | ||||||
|  |             length=  page.getEnd(); | ||||||
|  |             if(page.getLines().size()==0){ | ||||||
|  |                 pageNo--; | ||||||
|  |                 continue; | ||||||
|  |             } | ||||||
|             page.setChapterNo(chaptId); |             page.setChapterNo(chaptId); | ||||||
|             page.setLastPage(page.getEnd()==chars.length); |             page.setLastPage(page.getEnd()==chars.length); | ||||||
|             page.setFirstPage(pageNo==1); |             page.setFirstPage(pageNo==1); | ||||||
|             page.setPageNo(pageNo); |             page.setPageNo(pageNo); | ||||||
|             chaptPages.add(page); | 
 | ||||||
|             length=  page.getEnd(); |  | ||||||
|             if(length >=chars.length){ |             if(length >=chars.length){ | ||||||
|                 if(page.getLines().size()< mLineCount/2) |                 if(page.getLines().size()< mLineCount/2) | ||||||
|                 page.setTopBannerHeight(0); |                 page.setTopBannerHeight(0); | ||||||
|             } |             } | ||||||
|  | 
 | ||||||
|  |             chaptPages.add(page); | ||||||
|        //     Log.d(TAG, String.format("prepare book build page %s ready for chapter %s,cost %s",pageNo, chaptId,new Date().getTime()-starttime1)); |        //     Log.d(TAG, String.format("prepare book build page %s ready for chapter %s,cost %s",pageNo, chaptId,new Date().getTime()-starttime1)); | ||||||
|         } |         } | ||||||
|        // Log.d(TAG, String.format("                  prepare book build pages ready for chapter %s,cost %s", chaptId,new Date().getTime()-starttime)); |        // Log.d(TAG, String.format("                  prepare book build pages ready for chapter %s,cost %s", chaptId,new Date().getTime()-starttime)); | ||||||
|  | @ -1089,7 +1096,11 @@ private void hideSysUI(){ | ||||||
|                     } |                     } | ||||||
|                     y+=trPage.getNativeBannerHeight() +m_fontSize +lineSpace ; |                     y+=trPage.getNativeBannerHeight() +m_fontSize +lineSpace ; | ||||||
|                     Log.d(TAG, String.format("onDraw showNativeBannerInLines : lineno %s,strline %s ",lineNo,strLine)); |                     Log.d(TAG, String.format("onDraw showNativeBannerInLines : lineno %s,strline %s ",lineNo,strLine)); | ||||||
| 
 |                     space = m_fontSize + lineSpace; | ||||||
|  |                    // y-=lineSpace; | ||||||
|  |                     if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) { | ||||||
|  |                         space = m_fontSize + paragraphSpace; | ||||||
|  |                     } | ||||||
|                 }else { |                 }else { | ||||||
| 
 | 
 | ||||||
|                     if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) { |                     if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) { | ||||||
|  | @ -1105,6 +1116,7 @@ private void hideSysUI(){ | ||||||
| 
 | 
 | ||||||
|                         //  Log.d(TAG,String.format("prepare book %s,y plus is %s" ,strLine, m_fontSize + lineSpace)); |                         //  Log.d(TAG,String.format("prepare book %s,y plus is %s" ,strLine, m_fontSize + lineSpace)); | ||||||
|                     } |                     } | ||||||
|  | 
 | ||||||
|                 } |                 } | ||||||
|                 c.drawText(strLine, measureMarginWidth, y, mPaint); |                 c.drawText(strLine, measureMarginWidth, y, mPaint); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <shape xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |        android:shape="rectangle"> | ||||||
|  | 
 | ||||||
|  |     <solid android:color="#80000000"/> | ||||||
|  | 
 | ||||||
|  |     <padding | ||||||
|  |         android:bottom="3dp" | ||||||
|  |         android:left="8dp" | ||||||
|  |         android:right="8dp" | ||||||
|  |         android:top="3dp"/> | ||||||
|  | 
 | ||||||
|  |     <corners | ||||||
|  |         android:bottomLeftRadius="45dp" | ||||||
|  |         android:bottomRightRadius="45dp" | ||||||
|  |         android:topLeftRadius="45dp" | ||||||
|  |         android:topRightRadius="45dp"/> | ||||||
|  | 
 | ||||||
|  | </shape> | ||||||
|  | @ -0,0 +1,59 @@ | ||||||
|  | <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" | ||||||
|  |     xmlns:tools="http://schemas.android.com/tools" | ||||||
|  |     android:layout_width="match_parent" | ||||||
|  |     android:layout_height="match_parent" | ||||||
|  |     android:background="@android:color/white" | ||||||
|  |       > | ||||||
|  | 
 | ||||||
|  |     <!-- 广点通开屏广告支持“半屏/全屏”展示,开发者可以把Logo区域放在屏幕底部,然后在Logo上方提供一个容器来放置半开屏广告,请注意此容器高度不得小于400dp --> | ||||||
|  | 
 | ||||||
|  |     <!-- 1.Logo区域:展示半开屏广告时使用,如果想展示全开屏广告,可以不需要这个Logo区域 --> | ||||||
|  |     <!-- 注意:如需要这个Logo区域,建议开发者使用自己的Logo资源,而不是联盟的Logo资源@drawable/gdt_splash_logo,资源规格可参照@drawable/gdt_splash_logo --> | ||||||
|  | 
 | ||||||
|  |     <TextView android:id="@+id/textTile" | ||||||
|  |         android:layout_gravity="center" | ||||||
|  |         android:gravity="center" | ||||||
|  |         android:layout_width="wrap_content" | ||||||
|  |         android:layout_alignParentBottom="true" | ||||||
|  |         android:layout_centerHorizontal="true" | ||||||
|  |         android:layout_height="50dp" | ||||||
|  |         android:textSize="20sp" | ||||||
|  |         android:textStyle="bold" | ||||||
|  |         android:text="" /> | ||||||
|  |     <!-- 2.开屏广告容器区域:--> | ||||||
|  |     <!-- 注意:该区域高度不得小于400dp。在本示例中没有写死splash_container的高度值,是因为第1部分的app_logo区域是一个高度很小的图片。 --> | ||||||
|  |     <FrameLayout | ||||||
|  |         android:id="@+id/splash_container" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:layout_above="@id/textTile"/> | ||||||
|  | 
 | ||||||
|  |     <!-- 3.自定义跳过按钮区域:开发者可以根据需要自己实现不同样式的跳过按钮 --> | ||||||
|  |     <!-- 注意1:根据广告法规定,跳过按钮必须在屏幕当中出现。因此广告展示的时候,必须让将SkipView显示出来,即visible,否则将SDK将不展示广告,返回错误码608。。 --> | ||||||
|  |     <!-- 注意2:SDK除了会检查跳过按钮的可见性,还将检测它的尺寸,其尺寸不得小于3dp*3dp,否则将SDK将不展示广告,返回错误码608。 --> | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/skip_view" | ||||||
|  |         android:layout_width="96dp" | ||||||
|  |         android:layout_height="wrap_content" | ||||||
|  |         android:layout_alignParentRight="true" | ||||||
|  |         android:layout_alignParentTop="true" | ||||||
|  |         android:layout_margin="16dp" | ||||||
|  |         android:background="@drawable/background_circle" | ||||||
|  |         android:gravity="center" | ||||||
|  |         android:text="@string/click_to_skip" | ||||||
|  |         android:textColor="@android:color/white" | ||||||
|  |         android:textSize="14sp"/> | ||||||
|  |     <!-- 本示例省略了自定义的倒计时,和跳过按钮放在一起实现了。开发者也可以实现自己的倒计时View,方法是在onADTick回调中获得广告剩余的展示时间,并自由决定倒计时View的样式,SDK对倒计时的View没有要求。 --> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     <!-- 4.预设开屏图片区域: --> | ||||||
|  |     <!-- 开发者可以把自家App设计开屏图片摆放在这里,本示例中放置了一张静态图片。然后在onADPresent回调中再把这个图片隐藏起来。 !--> | ||||||
|  |     <!-- 注意1:直接将此图盖在广告容器的上面即可,始终不要将广告容器splash_container的设为invisible,否则将不会展示广告无法计费,返回错误码600。--> | ||||||
|  |     <!-- 注意2:建议开发者使用自己的开屏图片资源,而不是联盟的@drawable/splash_holder,资源规格可参照@drawable/splash_holder --> | ||||||
|  |     <TextView | ||||||
|  |         android:id="@+id/splash_holder" | ||||||
|  |         android:layout_width="match_parent" | ||||||
|  |         android:layout_height="match_parent" | ||||||
|  |         android:layout_above="@id/textTile" | ||||||
|  |         android:background="@color/black"/> | ||||||
|  | </RelativeLayout> | ||||||
|  | @ -12,8 +12,8 @@ | ||||||
|     --> |     --> | ||||||
|     <FrameLayout |     <FrameLayout | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="match_parent" |         android:layout_height="match_parent"> | ||||||
|      > | 
 | ||||||
|         <android.support.design.widget.AppBarLayout |         <android.support.design.widget.AppBarLayout | ||||||
|             android:id="@+id/appbar" |             android:id="@+id/appbar" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|  | @ -31,25 +31,25 @@ | ||||||
|                 android:background="@color/read_dialog_bg" |                 android:background="@color/read_dialog_bg" | ||||||
|                 android:fitsSystemWindows="true" |                 android:fitsSystemWindows="true" | ||||||
|                 android:minHeight="?attr/actionBarSize" |                 android:minHeight="?attr/actionBarSize" | ||||||
|                 app:popupTheme="@style/AppTheme.PopupOverlay" > |                 app:popupTheme="@style/AppTheme.PopupOverlay"></android.support.v7.widget.Toolbar> | ||||||
|             </android.support.v7.widget.Toolbar> | 
 | ||||||
|             <TextView |             <TextView | ||||||
|             android:id="@+id/tvUrl" |                 android:id="@+id/tvUrl" | ||||||
|             android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|             android:paddingLeft="10dp" |                 android:layout_gravity="bottom" | ||||||
|             android:text="http://abc.om..fd" |                 android:background="@color/read_dialog_bg" | ||||||
|             android:layout_gravity="bottom" |                 android:ellipsize="end" | ||||||
|             android:background="@color/read_dialog_bg" |                 android:gravity="bottom" | ||||||
|             android:textColor="@color/whitesmoke" |                 android:lines="1" | ||||||
|             android:gravity="bottom" |                 android:paddingLeft="10dp" | ||||||
|             android:textSize="11sp" |                 android:text="http://abc.om..fd" | ||||||
|             android:ellipsize="end" |                 android:textColor="@color/whitesmoke" | ||||||
|             android:lines="1"/> |                 android:textSize="11sp" /> | ||||||
|         </android.support.design.widget.AppBarLayout> |         </android.support.design.widget.AppBarLayout> | ||||||
|     <!--    <android.support.v7.widget.RecyclerView |         <!--    <android.support.v7.widget.RecyclerView | ||||||
|             android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|             android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>--> |                 android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>--> | ||||||
| 
 | 
 | ||||||
|         <com.novelbook.android.view.PageWidget |         <com.novelbook.android.view.PageWidget | ||||||
|             android:id="@+id/bookpage" |             android:id="@+id/bookpage" | ||||||
|  | @ -57,125 +57,126 @@ | ||||||
|             android:layout_height="match_parent" |             android:layout_height="match_parent" | ||||||
| 
 | 
 | ||||||
|             /> |             /> | ||||||
|  | 
 | ||||||
|         <pl.droidsonroids.gif.GifImageView |         <pl.droidsonroids.gif.GifImageView | ||||||
|             android:id="@+id/imgLoading" |             android:id="@+id/imgLoading" | ||||||
|             android:layout_width="30dp" |             android:layout_width="30dp" | ||||||
|             android:layout_height="30dp" |             android:layout_height="30dp" | ||||||
|             android:src="@mipmap/loading" |  | ||||||
|             android:scaleType="centerCrop" |  | ||||||
|             android:layout_gravity="center_horizontal|bottom" |             android:layout_gravity="center_horizontal|bottom" | ||||||
|             android:visibility="gone" |  | ||||||
|             android:layout_marginBottom="160dp" |             android:layout_marginBottom="160dp" | ||||||
|             android:contentDescription="TODO" /> |             android:contentDescription="TODO" | ||||||
|  |             android:scaleType="centerCrop" | ||||||
|  |             android:src="@mipmap/loading" | ||||||
|  |             android:visibility="gone" /> | ||||||
| 
 | 
 | ||||||
|         <Button |         <Button | ||||||
|             android:id="@+id/btnRefresh" |             android:id="@+id/btnRefresh" | ||||||
|  |             style="@style/buttonRound" | ||||||
|             android:layout_width="100dp" |             android:layout_width="100dp" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             style="@style/buttonRound" |  | ||||||
|             android:layout_gravity="center_horizontal|bottom" |             android:layout_gravity="center_horizontal|bottom" | ||||||
|             android:layout_marginBottom="160dp" |             android:layout_marginBottom="160dp" | ||||||
|             android:text="@string/refresh" |             android:text="@string/refresh" | ||||||
|             android:visibility="gone" |             android:visibility="gone" /> | ||||||
|             /> |         <!--   <LinearLayout | ||||||
|      <!--   <LinearLayout |                android:id="@+id/llTopAd" | ||||||
|             android:id="@+id/llTopAd" |                android:layout_width="match_parent" | ||||||
|             android:layout_width="match_parent" |                android:layout_height="150dp" | ||||||
|             android:layout_height="150dp" |  | ||||||
| 
 | 
 | ||||||
|             android:layout_marginTop="520dp" |                android:layout_marginTop="520dp" | ||||||
|             android:visibility="gone"> |                android:visibility="gone"> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         </LinearLayout>--> |            </LinearLayout>--> | ||||||
| 
 | 
 | ||||||
|         <FrameLayout |         <FrameLayout | ||||||
|             android:id="@+id/frmAD" |             android:id="@+id/frmAD" | ||||||
|             android:visibility="visible" |  | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="match_parent"> |             android:layout_height="match_parent" | ||||||
|         <FrameLayout |             android:visibility="visible"> | ||||||
|             android:id="@+id/native_banner_container_in_lines" |             <!--       <FrameLayout | ||||||
|             style="@style/frmBannerContainer" |                        android:id="@+id/native_banner_container_in_lines" | ||||||
|             android:layout_height="@dimen/nativeBannerHeight" |                        style="@style/frmBannerContainer" | ||||||
|             android:visibility="visible" |                        android:layout_height="@dimen/nativeBannerHeight" | ||||||
|          /> |                        android:visibility="visible" | ||||||
|        <!-- <FrameLayout |                     /> <FrameLayout | ||||||
|             android:id="@+id/top_banner_container" |                        android:id="@+id/top_banner_container" | ||||||
|             style="@style/frmBannerContainer" |                        style="@style/frmBannerContainer" | ||||||
|             android:layout_height="@dimen/topBannerHeight" |                        android:layout_height="@dimen/topBannerHeight" | ||||||
| 
 | 
 | ||||||
|             android:visibility="visible" |                        android:visibility="visible" | ||||||
|             /> |                        />--> | ||||||
|         <FrameLayout |             <FrameLayout | ||||||
|             android:id="@+id/banner_container" |                 android:id="@+id/banner_container" | ||||||
|         style="@style/frmBannerContainer" |                 style="@style/frmBannerContainer" | ||||||
|         android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
| 
 | 
 | ||||||
|             android:visibility="visible" |                 android:visibility="visible" /> | ||||||
|         />--> |  | ||||||
|         <FrameLayout |  | ||||||
|             android:id="@+id/native_banner_container" |  | ||||||
|             style="@style/frmBannerContainer" |  | ||||||
|             android:layout_height="wrap_content" |  | ||||||
|             android:layout_width="wrap_content" |  | ||||||
| 
 | 
 | ||||||
|             android:visibility="visible" |           <FrameLayout | ||||||
|             /> |                 android:id="@+id/native_banner_container" | ||||||
|  |                 style="@style/frmBannerContainer" | ||||||
|  |                 android:layout_width="wrap_content" | ||||||
|  |                 android:layout_height="wrap_content" | ||||||
|  | 
 | ||||||
|  |                 android:visibility="visible" /> <!-- --> | ||||||
|  | 
 | ||||||
|  |         </FrameLayout> | ||||||
| 
 | 
 | ||||||
|     </FrameLayout> |  | ||||||
|         <LinearLayout |         <LinearLayout | ||||||
|             android:id="@+id/llShelfBottom" |             android:id="@+id/llShelfBottom" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="150dp" |             android:layout_height="150dp" | ||||||
|  |             android:layout_gravity="bottom" | ||||||
|             android:layout_weight="0" |             android:layout_weight="0" | ||||||
|             android:background="@color/white" |             android:background="@color/white" | ||||||
|             android:gravity="center_vertical" |             android:gravity="center_vertical" | ||||||
|             android:layout_gravity="bottom" |  | ||||||
|             android:orientation="vertical" |             android:orientation="vertical" | ||||||
|             android:visibility="gone" |  | ||||||
|             android:paddingBottom="0dp" |             android:paddingBottom="0dp" | ||||||
|  |             android:visibility="gone" | ||||||
| 
 | 
 | ||||||
|             > |             > | ||||||
|         <TextView | 
 | ||||||
|             style="@style/TextViewTitle" |             <TextView | ||||||
|             android:layout_width="match_parent" |                 style="@style/TextViewTitle" | ||||||
|             android:layout_height="40dp" |                 android:layout_width="match_parent" | ||||||
|             android:gravity="center_vertical" |                 android:layout_height="40dp" | ||||||
|             android:text="@string/note" |                 android:gravity="center_vertical" | ||||||
|             android:textAlignment="center" |                 android:text="@string/note" | ||||||
|             /> |                 android:textAlignment="center" /> | ||||||
|             <LinearLayout    style="@style/llGraySplit.2dp"/> | 
 | ||||||
|  |             <LinearLayout style="@style/llGraySplit.2dp" /> | ||||||
|  | 
 | ||||||
|             <TextView |             <TextView | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="60dp" |                 android:layout_height="60dp" | ||||||
|                 android:text="@string/put_to_shelf" |  | ||||||
|                 android:gravity="center_vertical" |                 android:gravity="center_vertical" | ||||||
|                 android:textAlignment="center" |                 android:text="@string/put_to_shelf" | ||||||
|                 /> |                 android:textAlignment="center" /> | ||||||
|             <LinearLayout    style="@style/llGraySplit.2dp"/> | 
 | ||||||
|  |             <LinearLayout style="@style/llGraySplit.2dp" /> | ||||||
|  | 
 | ||||||
|             <LinearLayout |             <LinearLayout | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|                 android:orientation="horizontal"> |                 android:orientation="horizontal"> | ||||||
| 
 | 
 | ||||||
|             <Button |                 <Button | ||||||
|                 android:id="@+id/btnCancel" |                     android:id="@+id/btnCancel" | ||||||
|                 style="@style/buttonCates" |                     style="@style/buttonCates" | ||||||
|                 android:text="取消" |                     android:text="取消" | ||||||
|                 android:textColor="@color/colorAccent" /> |                     android:textColor="@color/colorAccent" /> | ||||||
| 
 | 
 | ||||||
|                 <Button |                 <Button | ||||||
|                 android:id="@+id/btnShelf" |                     android:id="@+id/btnShelf" | ||||||
|                 style="@style/buttonCates" |                     style="@style/buttonCates" | ||||||
|                 android:text="加入书架" |                     android:text="加入书架" | ||||||
|                 android:textColor="@color/colorAccent" /> |                     android:textColor="@color/colorAccent" /> | ||||||
|         </LinearLayout> |             </LinearLayout> | ||||||
|         </LinearLayout> |         </LinearLayout> | ||||||
|     </FrameLayout> |     </FrameLayout> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
|     <!--<LinearLayout--> |     <!--<LinearLayout--> | ||||||
|     <!--android:id="@+id/ll_status"--> |     <!--android:id="@+id/ll_status"--> | ||||||
|     <!--android:layout_width="match_parent"--> |     <!--android:layout_width="match_parent"--> | ||||||
|  |  | ||||||
|  | @ -1,5 +1,5 @@ | ||||||
| <resources> | <resources> | ||||||
|     <string name="app_name">网书助手</string> |     <string name="app_name">qqAd网书助手</string> | ||||||
|     <string name="title_home">书架</string> |     <string name="title_home">书架</string> | ||||||
|     <string name="title_dashboard">书城</string> |     <string name="title_dashboard">书城</string> | ||||||
|     <string name="title_notifications">排行榜</string> |     <string name="title_notifications">排行榜</string> | ||||||
|  | @ -141,6 +141,8 @@ | ||||||
|     <string name="note">提示</string> |     <string name="note">提示</string> | ||||||
|     <string name="put_to_shelf">喜欢就加入书架吧</string> |     <string name="put_to_shelf">喜欢就加入书架吧</string> | ||||||
|     <string name="ad_title">[推广]</string> |     <string name="ad_title">[推广]</string> | ||||||
|  |     <string name="gdtslogan">gdtslogan</string> | ||||||
|  |     <string name="click_to_skip">点击跳过</string> | ||||||
| 
 | 
 | ||||||
|     <string-array name="voicer_cloud_entries"> |     <string-array name="voicer_cloud_entries"> | ||||||
|         <item>小燕—女青、中英、普通话</item> |         <item>小燕—女青、中英、普通话</item> | ||||||
|  |  | ||||||
|  | @ -126,98 +126,99 @@ | ||||||
|     </content> |     </content> | ||||||
|     <orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" /> |     <orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" /> | ||||||
|     <orderEntry type="sourceFolder" forTests="false" /> |     <orderEntry type="sourceFolder" forTests="false" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:design:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: :open_ad_sdk:@aar" level="project" /> |     <orderEntry type="library" name="Gradle: :open_ad_sdk:@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-fragment:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:localbroadcastmanager:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: jp.wasabeef:glide-transformations:2.0.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:annotations:4.9.0@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel:1.1.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\juniversalchardet-1.0.3.jar:unspecified@jar" level="project" /> |     <orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\juniversalchardet-1.0.3.jar:unspecified@jar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource:3.0.2@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:loader:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:loader:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.core:runtime:1.1.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.lifecycle:extensions:1.1.1@aar" level="project" /> |     <orderEntry type="library" name="Gradle: android.arch.lifecycle:extensions:1.1.1@aar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner:1.0.2@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:disklrucache:4.9.0@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:disklrucache:4.9.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core:1.1.1@aar" level="project" /> |     <orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata-core:1.1.1@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.packetzoom:pz-android-sdk:3.2.43@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.packetzoom:pz-android-sdk:3.2.43@aar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:cursoradapter:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:cursoradapter:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:gifdecoder:4.9.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:gifdecoder:4.9.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.17.2@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.squareup.retrofit2:adapter-rxjava2:2.5.0@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.squareup.retrofit2:adapter-rxjava2:2.5.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core:3.0.2@aar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-core:3.0.2@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime:1.1.1@aar" level="project" /> |     <orderEntry type="library" name="Gradle: android.arch.lifecycle:runtime:1.1.1@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-compat:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:support-compat:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\android-query-full.0.26.7.jar:unspecified@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: q.rorbin:badgeview:1.1.2@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:cardview-v7:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-audience:16.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: javax.inject:javax.inject:1@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.astuetz:pagerslidingtabstrip:1.0.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.youth.banner:banner:1.4.10@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.github.chengzipi:Searchbox:v1.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: org.litepal.android:java:3.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: org.litepal.android:java:3.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-core-utils:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:recyclerview-v7:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor:1.0.2@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-annotations:28.0.0@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:support-annotations:28.0.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: __local_aars__:D.\android\sdk\build-tools\28.0.3\renderscript\lib\renderscript-v8.jar:unspecified@jar" level="project" /> |     <orderEntry type="library" name="Gradle: __local_aars__:D.\android\sdk\build-tools\28.0.3\renderscript\lib\renderscript-v8.jar:unspecified@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: io.alterac.blurkit:blurkit:1.1.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:interpolator:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:transition:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata:1.1.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:drawerlayout:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-plus:16.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-plus:16.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.flyco.tablayout:FlycoTabLayout_Lib:2.1.2@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-v4:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:support-v4:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.3@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout-solver:1.1.3@jar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: net.sf.kxml:kxml2:2.3.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: io.reactivex.rxjava2:rxandroid:2.1.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: io.reactivex.rxjava2:rxandroid:2.1.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.5@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:multidex:1.0.2@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: org.litepal.android:core:3.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: org.reactivestreams:reactive-streams:1.0.2@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.timqi.collapsibletextview:library:1.1.2@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.squareup.retrofit2:converter-gson:2.5.0@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:support-core-ui:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.squareup.okhttp3:logging-interceptor:3.14.0@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.umeng.umsdk:common:2.0.2@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout:1.1.3@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:glide:4.9.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.squareup.retrofit2:retrofit:2.5.0@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:viewpager:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\GDTSDK.union.4.40.910.jar:unspecified@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: pl.droidsonroids.gif:android-gif-drawable:1.2.16@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement:16.0.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.github.ixiaow:multilayout:1.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:customview:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:design:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:support-fragment:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:animated-vector-drawable:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: jp.wasabeef:glide-transformations:2.0.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:annotations:4.9.0@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: android.arch.lifecycle:viewmodel:1.1.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test.espresso:espresso-idling-resource:3.0.2@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: android.arch.core:runtime:1.1.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:runner:1.0.2@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" scope="TEST" name="Gradle: com.squareup:javawriter:2.1.1@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.squareup.okio:okio:1.17.2@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: __local_aars__:E.\reading\android\asProjects\zhuike\libs\android-query-full.0.26.7.jar:unspecified@jar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: q.rorbin:badgeview:1.1.2@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:cardview-v7:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-audience:16.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.astuetz:pagerslidingtabstrip:1.0.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.youth.banner:banner:1.4.10@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.github.chengzipi:Searchbox:v1.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:support-vector-drawable:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:support-core-utils:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support.test:monitor:1.0.2@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: io.alterac.blurkit:blurkit:1.1.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:interpolator:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:transition:28.0.0@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: android.arch.lifecycle:livedata:1.1.1@aar" level="project" /> | ||||||
|  |     <orderEntry type="library" name="Gradle: com.android.support:drawerlayout:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.umeng.umsdk:analytics:8.0.2@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.umeng.umsdk:analytics:8.0.2@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.jakewharton:butterknife-annotations:9.0.0@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.jakewharton:butterknife-annotations:9.0.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:documentfile:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:documentfile:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.jakewharton:butterknife:9.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.jakewharton:butterknife:9.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.google.code.gson:gson:2.8.5@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:slidingpanelayout:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:slidingpanelayout:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:appcompat-v7:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:appcompat-v7:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.14.0@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.squareup.okhttp3:okhttp:3.14.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:multidex:1.0.2@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support:multidex-instrumentation:1.0.2@aar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: com.android.support:multidex-instrumentation:1.0.2@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: org.litepal.android:core:3.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: org.reactivestreams:reactive-streams:1.0.2@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.packetzoom:pz-okhttp3-interceptor:3.2.43@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.packetzoom:pz-okhttp3-interceptor:3.2.43@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: io.reactivex.rxjava2:rxjava:2.2.7@jar" level="project" /> |     <orderEntry type="library" name="Gradle: io.reactivex.rxjava2:rxjava:2.2.7@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:collections:28.0.0@jar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:collections:28.0.0@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.timqi.collapsibletextview:library:1.1.2@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.squareup.retrofit2:converter-gson:2.5.0@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-core-ui:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.umeng.umsdk:common:2.0.2@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.squareup.okhttp3:logging-interceptor:3.14.0@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:asynclayoutinflater:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support.constraint:constraint-layout:1.1.3@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:print:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:print:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.jakewharton:butterknife-runtime:9.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.jakewharton:butterknife-runtime:9.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.github.bumptech.glide:glide:4.9.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: com.google.code.findbugs:jsr305:2.0.1@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.core:common:1.1.1@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:versionedparcelable:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:versionedparcelable:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base:16.0.1@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-base:16.0.1@aar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: junit:junit:4.12@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.squareup.retrofit2:retrofit:2.5.0@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-core:1.3@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:viewpager:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.google.android.gms:play-services-basement:16.0.1@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: pl.droidsonroids.gif:android-gif-drawable:1.2.16@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.github.ixiaow:multilayout:1.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-integration:1.3@jar" level="project" /> | ||||||
|     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" /> |     <orderEntry type="library" scope="TEST" name="Gradle: org.hamcrest:hamcrest-library:1.3@jar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: android.arch.lifecycle:common:1.1.1@jar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:coordinatorlayout:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:coordinatorlayout:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:customview:28.0.0@aar" level="project" /> |  | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:swiperefreshlayout:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:swiperefreshlayout:28.0.0@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: q.rorbin:VerticalTabLayout:1.2.5@aar" level="project" /> |     <orderEntry type="library" name="Gradle: q.rorbin:VerticalTabLayout:1.2.5@aar" level="project" /> | ||||||
|     <orderEntry type="library" name="Gradle: com.android.support:support-media-compat:28.0.0@aar" level="project" /> |     <orderEntry type="library" name="Gradle: com.android.support:support-media-compat:28.0.0@aar" level="project" /> | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue