From 577a1acf4a4a83b315508219cf2b6b2c9bc17378 Mon Sep 17 00:00:00 2001 From: mwang <8205347@qq.com> Date: Mon, 3 Jun 2019 00:32:52 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4ad?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- zhuike/build.gradle | 1 + .../android/AD/toutiao/SplashActivity.java | 9 +- .../novelbook/android/Activity_Search.java | 2 +- .../com/novelbook/android/Activity_base.java | 30 +- .../android/Fragments/BasicFragment.java | 36 ++ .../android/Fragments/Fragment_booklist.java | 27 +- .../android/Fragments/Fragment_jingxuan.java | 6 +- .../android/Fragments/Fragment_paihang.java | 4 +- .../com/novelbook/android/ReadActivity.java | 15 +- .../android/adapter/BookListAdapter.java | 529 ++++++++++++++++-- .../com/novelbook/android/utils/BookUtil.java | 38 +- .../novelbook/android/utils/Constants.java | 1 + .../novelbook/android/utils/HistoryCache.java | 3 + .../novelbook/android/utils/PageFactory.java | 60 +- zhuike/src/main/res/drawable/dislike_icon.png | Bin 0 -> 1519 bytes .../src/main/res/layout/activity_search.xml | 15 +- .../res/layout/ad_toutiao_activity_splash.xml | 12 +- .../main/res/layout/ad_toutiao_native_ad.xml | 1 + zhuike/src/main/res/layout/content_book.xml | 2 +- .../src/main/res/layout/fragment_jingxuan.xml | 9 +- .../main/res/layout/listitem_ad_group_pic.xml | 137 +++++ .../main/res/layout/listitem_ad_large_pic.xml | 109 ++++ .../res/layout/listitem_ad_large_video.xml | 109 ++++ .../main/res/layout/listitem_ad_small_pic.xml | 125 +++++ zhuike/src/main/res/layout/zactivity_read.xml | 10 +- zhuike/src/main/res/values/styles.xml | 7 +- zhuike/zhuike.iml | 1 - 27 files changed, 1177 insertions(+), 121 deletions(-) create mode 100644 zhuike/src/main/res/drawable/dislike_icon.png create mode 100644 zhuike/src/main/res/layout/listitem_ad_group_pic.xml create mode 100644 zhuike/src/main/res/layout/listitem_ad_large_pic.xml create mode 100644 zhuike/src/main/res/layout/listitem_ad_large_video.xml create mode 100644 zhuike/src/main/res/layout/listitem_ad_small_pic.xml diff --git a/zhuike/build.gradle b/zhuike/build.gradle index e69610a..d3d5fec 100644 --- a/zhuike/build.gradle +++ b/zhuike/build.gradle @@ -40,6 +40,7 @@ android { buildConfigField "String", "MAIN_HOST", '"http://xiaoshuofenxiang.com/api/"' buildConfigField "String", "API_HOST", '"{\\"master\\":[\\"http:\\\\/\\\\/g.xiaoshuofenxiang.com\\"],\\"page\\":[\\"http:\\\\/\\\\/p.xiaoshuofenxiang.com\\"],\\"report\\":[\\"http:\\\\/\\\\/r.xiaoshuofenxiang.com\\"],\\"search\\":[\\"http:\\\\/\\\\/s.xiaoshuofenxiang.com\\"],\\"novel\\":[\\"http:\\\\/\\\\/n.xiaoshuofenxiang.com\\"],\\"novelsbydot\\":[\\"http:\\\\/\\\\/nbd.xiaoshuofenxiang.com\\"],\\"user\\":[\\"http:\\\\/\\\\/u.xiaoshuofenxiang.com\\"]}"' buildConfigField "String","AD_TOUTIAO_APP_ID",'"5019267"' + buildConfigField "String","AD_SLOT_TOUTIAO_FEEDAD_ID",'"919267464"' buildConfigField "String","AD_SLOT_TOUTIAO_SPLASH_ID",'"819267134"' buildConfigField "String","AD_SLOT_TOUTIAO_BANNER_ID",'"919267016"' buildConfigField "String","AD_SLOT_TOUTIAO_BANNER_NATIVE_ID",'"919267816"' diff --git a/zhuike/src/main/java/com/novelbook/android/AD/toutiao/SplashActivity.java b/zhuike/src/main/java/com/novelbook/android/AD/toutiao/SplashActivity.java index 24c8369..b9ffeae 100644 --- a/zhuike/src/main/java/com/novelbook/android/AD/toutiao/SplashActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/AD/toutiao/SplashActivity.java @@ -9,6 +9,7 @@ import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.FrameLayout; +import android.widget.TextView; import com.bytedance.sdk.openadsdk.AdSlot; import com.bytedance.sdk.openadsdk.TTAdNative; @@ -19,6 +20,9 @@ import com.novelbook.android.Main2Activity; import com.novelbook.android.R; import com.novelbook.android.utils.Constants; +import butterknife.BindView; +import butterknife.ButterKnife; + /** * 开屏广告Activity示例 @@ -38,12 +42,15 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler { private static final int MSG_GO_MAIN = 1; //开屏广告是否已经加载 private boolean mHasLoaded; + @BindView(R.id.textTile) + TextView tvTitle; @SuppressWarnings("RedundantCast") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ad_toutiao_activity_splash); + ButterKnife.bind(this); mSplashContainer = (FrameLayout) findViewById(R.id.splash_container); //step2:创建TTAdNative对象 mTTAdNative = TTAdManagerHolder.get().createAdNative(this); @@ -61,7 +68,7 @@ public class SplashActivity extends Activity implements WeakHandler.IHandler { | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY // | View.SYSTEM_UI_FLAG_IMMERSIVE ); - + tvTitle.setText(R.string.app_name); //加载开屏广告 loadSplashAd(); } diff --git a/zhuike/src/main/java/com/novelbook/android/Activity_Search.java b/zhuike/src/main/java/com/novelbook/android/Activity_Search.java index a42a997..577a2af 100644 --- a/zhuike/src/main/java/com/novelbook/android/Activity_Search.java +++ b/zhuike/src/main/java/com/novelbook/android/Activity_Search.java @@ -44,7 +44,7 @@ public class Activity_Search extends Activity_base { @Override protected void initViews() { - + loadNativeBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID); } diff --git a/zhuike/src/main/java/com/novelbook/android/Activity_base.java b/zhuike/src/main/java/com/novelbook/android/Activity_base.java index 329004c..74f05f4 100644 --- a/zhuike/src/main/java/com/novelbook/android/Activity_base.java +++ b/zhuike/src/main/java/com/novelbook/android/Activity_base.java @@ -4,13 +4,11 @@ import android.app.Activity; import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.ActivityInfo; -import android.content.pm.PackageManager; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; -import android.support.v4.app.ActivityCompat; -import android.support.v4.content.ContextCompat; + import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; @@ -33,24 +31,24 @@ import com.bytedance.sdk.openadsdk.TTAdDislike; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTAppDownloadListener; import com.bytedance.sdk.openadsdk.TTBannerAd; + import com.bytedance.sdk.openadsdk.TTImage; import com.bytedance.sdk.openadsdk.TTNativeAd; import com.google.gson.Gson; import com.novelbook.android.AD.toutiao.TTAdManagerHolder; -import com.novelbook.android.AD.toutiao.TToast; + import com.novelbook.android.db.Novel; -import com.novelbook.android.netsubscribe.MovieSubscribe; + import com.novelbook.android.netutils.NetUtil; -import com.novelbook.android.netutils.OnSuccessAndFaultListener; -import com.novelbook.android.netutils.OnSuccessAndFaultSub; + import com.novelbook.android.upgrade.UpdateManager; import com.novelbook.android.utils.CommonUtil; -import com.novelbook.android.utils.Constants; + import com.novelbook.android.utils.ImageUtil; -import com.novelbook.android.utils.MyImageLoader; + import com.novelbook.android.utils.OnItemClickListener; import com.novelbook.android.adapter.BookListAdapter; -import com.umeng.analytics.MobclickAgent; + import java.util.ArrayList; import java.util.List; @@ -70,6 +68,12 @@ public abstract class Activity_base extends AppCompatActivity { @Nullable @BindView(R.id.banner_container) FrameLayout mBannerContainer; + /* @Nullable + @BindView(R.id.banner_native_container) + FrameLayout mNativeBannerContainer;*/ + + + @Nullable @BindView(R.id.recycleViewBookList) RecyclerView rvshudan; @@ -347,7 +351,7 @@ public abstract class Activity_base extends AppCompatActivity { }else if(height >150){ width =(int)(height*1.78); }*/ - // width =990; + width =690; //height=150; height=height > 500 ? 500: height; Log.d(TAG, String.format("loadBannerAd:finial width %s, height %s ",width,height)); @@ -661,4 +665,8 @@ public abstract class Activity_base extends AppCompatActivity { } }; + public TTAdNative getAdNative(){ + return mTTAdNative; + } + } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java b/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java index 6fd67a4..1296ed6 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java @@ -37,6 +37,7 @@ import com.bytedance.sdk.openadsdk.TTAdDislike; import com.bytedance.sdk.openadsdk.TTAdNative; import com.bytedance.sdk.openadsdk.TTAppDownloadListener; import com.bytedance.sdk.openadsdk.TTBannerAd; +import com.bytedance.sdk.openadsdk.TTFeedAd; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -461,5 +462,40 @@ void initTabs(){ mBannerContainer.setVisibility(View.VISIBLE); } + /** + * 加载 toutiao feed广告 + */ + void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) { + //feed广告请求类型参数 + AdSlot adSlot = new AdSlot.Builder() + .setCodeId(BuildConfig.AD_SLOT_TOUTIAO_FEEDAD_ID) + .setSupportDeepLink(true) + .setImageAcceptedSize(228, 150) + .setAdCount(adCnt) + .build(); + //调用feed广告异步请求接口 + ((Activity_base)getActivity()).getAdNative().loadFeedAd(adSlot, new TTAdNative.FeedAdListener() { + @Override + public void onError(int code, String message) { + Log.e(TAG, String.format("loadListAd onError: code %s,msg %s",code,message) ); + + } + + @Override + public void onFeedAdLoad(List ads) { + // myAdapter.changeMoreStatus(2); + if (ads == null || ads.isEmpty()) { + Log.e(TAG, "on FeedAdLoaded: ad is null!" ); + return; + } + if(addFooter) { + adapter.AddFooterItem(ads); + }else{ + adapter.AddHeaderItem(ads); + } + + } + }); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java index 5a57207..28127e4 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java @@ -12,11 +12,17 @@ import android.view.MenuItem; import android.view.View; import android.widget.Toast; +import com.bytedance.sdk.openadsdk.AdSlot; +import com.bytedance.sdk.openadsdk.TTAdNative; +import com.bytedance.sdk.openadsdk.TTFeedAd; import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; +import com.novelbook.android.AD.toutiao.TToast; import com.novelbook.android.Activity_Search; +import com.novelbook.android.Activity_base; +import com.novelbook.android.BuildConfig; import com.novelbook.android.Main2Activity; import com.novelbook.android.R; import com.novelbook.android.activity_cates; @@ -54,8 +60,8 @@ public class Fragment_booklist extends BasicFragment { private static final String EXTR_CID ="cid" ; private BookListAdapter mAdapter; // private BookListAdapter mAdapter; - private List mData;; - private List mMoreData; + private List mData;; + private List mMoreData; private String cate; private int progress,cid; private String keyWord ,fn,bangdan,history; @@ -182,6 +188,7 @@ public class Fragment_booklist extends BasicFragment { if (mData != null) { //下拉刷新 mData = new ArrayList(); mAdapter.setData(mData); + // loadListAd(mAdapter,1,false); } else { @@ -190,7 +197,8 @@ public class Fragment_booklist extends BasicFragment { @Override public void onItemClick(View view, int position) { - showBookDetail(mData.get(position)); + if(mData.get(position) instanceof Novel) + showBookDetail((Novel)mData.get(position)); // openBook(mData.get(position),mAdapter); } @@ -226,7 +234,9 @@ public class Fragment_booklist extends BasicFragment { pageCount = jsonObject.getInt("pageCount"); mMoreData = GsonUtil. parserJsonArray(jsonObject,Constants.BLOCK_TITLE_NOVELS); - + if(mMoreData.size()>0){ + loadListAd(mAdapter,1,mData.size()>0); + } } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "onSuccess: 解析失败",e ); } @@ -259,7 +269,9 @@ public class Fragment_booklist extends BasicFragment { pageCount = jsonObject.getJSONObject("rank").getInt("pageCount"); mMoreData = GsonUtil. parserJsonArray(resultstr,Constants.BLOCK_TITLE_NOVELS); Log.d(TAG, "排行榜详细 onSuccess: pageCount " + pageCount); - + if(mMoreData.size()>0){ + loadListAd(mAdapter,1,mData.size()>0); + } } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "onSuccess: 解析失败",e ); @@ -388,4 +400,9 @@ public class Fragment_booklist extends BasicFragment { super.onPause(); MobclickAgent.onPageEnd(TAG); } + + + + + } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java index 8d9d4bf..318c50a 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java @@ -287,7 +287,7 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener @OnClick({R.id.buttonMore1, R.id.buttonMore2, R.id.buttonMoreTuijian, R.id.buttonMore3 - , R.id.buttonCatePingfen, R.id.buttonCateRegeng, R.id.buttonCateTuijian, R.id.buttonCateShoucang, R.id.buttonCateWanjie + /* , R.id.buttonCatePingfen, R.id.buttonCateRegeng, R.id.buttonCateTuijian, R.id.buttonCateShoucang, R.id.buttonCateWanjie*/ }) void bubmitButton(View view) { @@ -307,7 +307,7 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener case R.id.buttonMore4: showPaihangbang(btnMore4.getTag()); break; - case R.id.buttonCatePingfen: + /* case R.id.buttonCatePingfen: showPaihangbang("评分"); break; case R.id.buttonCateRegeng: @@ -321,7 +321,7 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener break; case R.id.buttonCateTuijian: showPaihangbang("推荐"); - break; + break;*/ } } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java index 31e9d91..5093665 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_paihang.java @@ -195,7 +195,9 @@ public static final String TAG = Fragment_paihang.class.getSimpleName(); pageCount = jsonObject.getInt("pageCount"); mMoreData = GsonUtil. parserJsonArray(jsonObject,Constants.BLOCK_TITLE_NOVELS); - + if(mMoreData.size()>0){ + loadListAd(mAdapter,1,mData.size()>0); + } } catch (Exception e) { e.printStackTrace(); } diff --git a/zhuike/src/main/java/com/novelbook/android/ReadActivity.java b/zhuike/src/main/java/com/novelbook/android/ReadActivity.java index 1c982cb..30aecb4 100644 --- a/zhuike/src/main/java/com/novelbook/android/ReadActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/ReadActivity.java @@ -995,7 +995,7 @@ public class ReadActivity extends Activity_base implements AdInterface { - final int contentAdHight=100; + final int contentAdHight=80; @Override public void showAd(boolean showAd ,int adHeight,int adY) { @@ -1005,6 +1005,8 @@ public class ReadActivity extends Activity_base implements AdInterface { if(!Constants.SHOWAD){ return; } + Log.d(TAG, String.format("loadBannerAd:width %s, height %s ,adY %s,showAd %s",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY, showAd)); + if(!showAd){ return; } @@ -1013,14 +1015,15 @@ public class ReadActivity extends Activity_base implements AdInterface { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mBannerContainer.getLayoutParams(); - Log.d(TAG, String.format("loadBannerAd:width %s, height %s ",Constants.SCREEN_WIDTH_PIX-50,adHeight)); + // Log.d(TAG, String.format("loadBannerAd:width %s, height %s ,adY %s",Constants.SCREEN_WIDTH_PIX-50,adHeight,adY)); - if(adHeight>620){ + if(adHeight>500 && adY <500){ loadNativeBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_NATIVE_ID); - params.setMargins(20, adY-20, 20, 50); - }else{ + params.setMargins(20, adY-30, 20, 50); + }else + { loadBannerAd(mBannerContainer,BuildConfig.AD_SLOT_TOUTIAO_BANNER_ID, Constants.SCREEN_WIDTH_PIX-50,adHeight); - params.setMargins(20, adY, 20, 10); + params.setMargins(20, adY-10, 20, 15); } diff --git a/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java b/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java index 0b1e14f..89e6250 100644 --- a/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java +++ b/zhuike/src/main/java/com/novelbook/android/adapter/BookListAdapter.java @@ -1,16 +1,33 @@ package com.novelbook.android.adapter; +import android.annotation.SuppressLint; +import android.app.Activity; import android.content.Context; import android.support.annotation.NonNull; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.StaggeredGridLayoutManager; import android.text.TextUtils; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.Button; +import android.widget.FrameLayout; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ProgressBar; import android.widget.TextView; +import com.androidquery.callback.AQuery2; +import com.androidquery.callback.ImageOptions; +import com.bytedance.sdk.openadsdk.DownloadStatusController; +import com.bytedance.sdk.openadsdk.TTAdConstant; +import com.bytedance.sdk.openadsdk.TTAppDownloadListener; +import com.bytedance.sdk.openadsdk.TTFeedAd; +import com.bytedance.sdk.openadsdk.TTImage; +import com.bytedance.sdk.openadsdk.TTNativeAd; +import com.novelbook.android.AD.toutiao.TToast; import com.novelbook.android.BookActivity; import com.novelbook.android.R; import com.novelbook.android.db.Novel; @@ -23,6 +40,8 @@ import com.novelbook.android.utils.OnItemClickListener; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import java.util.WeakHashMap; import butterknife.BindView; import butterknife.ButterKnife; @@ -31,15 +50,22 @@ import okhttp3.internal.Util; import static com.novelbook.android.utils.ImageUtil.loader; public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHolder> { + private final static String TAG= BookListAdapter.class.getSimpleName(); private final int EMPTY_VIEW = 1; - private final int PROGRESS_VIEW = 2; - private final int IMAGE_VIEW = 3; - private static final int TYPE_ITEM = 4; - private static final int TYPE_FOOTER = 5; - private static final int NO_FOOTER = 6; + + private static final int TYPE_ITEM = 2; + private static final int TYPE_FOOTER = 3; + private static final int NO_FOOTER = 4; + private static final int ITEM_VIEW_TYPE_GROUP_PIC_AD =5; + private static final int ITEM_VIEW_TYPE_SMALL_PIC_AD = 6; + private static final int ITEM_VIEW_TYPE_LARGE_PIC_AD = 7; + private static final int ITEM_VIEW_TYPE_VIDEO = 8; + + + // private MyImageLoader loader = new MyImageLoader(); - private Context context; - private List mDatas ; + private Context mContext; + private List mDatas ; private OnItemClickListener mOnItemClickListener; private int listItemID; @@ -79,32 +105,34 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol this.percent = percent; } - - + private AQuery2 mAQuery; + private Map mTTAppDownloadListenerMap = new WeakHashMap<>(); public void setShowFootView(boolean showFootView) { this.showFootView = showFootView; } public BookListAdapter(Context context, List datas) { - context = context; - mInflater = LayoutInflater.from(context); + mContext = context; + mInflater = LayoutInflater.from(mContext); mDatas = datas; + this.mAQuery = new AQuery2(context); } public BookListAdapter(Context context, List mBooks, int listItemID, OnItemClickListener clickLitener) { - this.context = context; + this.mContext =context; this.mDatas = mBooks; this.mOnItemClickListener = clickLitener; this.listItemID = listItemID; - mInflater = LayoutInflater.from(context); + mInflater = LayoutInflater.from(mContext); + this.mAQuery = new AQuery2(context); } public BookListAdapter(Context context, OnItemClickListener clickLitener) { - this.context = context; + this.mContext = context; this.mOnItemClickListener = clickLitener; - + this.mAQuery = new AQuery2(context); } public void setListener(OnItemClickListener clickLitener){ @@ -119,8 +147,24 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol return EMPTY_VIEW; }else if ( position < mDatas.size()) { //最后一个item设置为footerView - return TYPE_ITEM; - } else if ( position == mDatas.size()) { + if (mDatas.get(position) instanceof Novel) { + return TYPE_ITEM; + } else if (mDatas.get(position) instanceof TTFeedAd) { + TTFeedAd ad = (TTFeedAd) mDatas.get(position); + Log.d(TAG, "getItemViewType: ad.getImageMode()= " +ad.getImageMode()); + if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_SMALL_IMG) { + return ITEM_VIEW_TYPE_SMALL_PIC_AD; + } else if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_LARGE_IMG) { + return ITEM_VIEW_TYPE_LARGE_PIC_AD; + } else if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_GROUP_IMG) { + return ITEM_VIEW_TYPE_GROUP_PIC_AD; + } else if (ad.getImageMode() == TTAdConstant.IMAGE_MODE_VIDEO) { + return ITEM_VIEW_TYPE_VIDEO; + } + return ITEM_VIEW_TYPE_SMALL_PIC_AD; + } + + }else if ( position == mDatas.size()) { //最后一个item设置为footerView if(!showFootView){ return NO_FOOTER; @@ -130,7 +174,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol return TYPE_ITEM; } - + return EMPTY_VIEW; // return super.getItemViewType(position); @@ -141,20 +185,25 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - if (viewType == TYPE_FOOTER) { - View itemView = mInflater.inflate(R.layout.load_more_footview_layout, parent, false); - return new FooterViewHolder(itemView); - }else if(viewType == EMPTY_VIEW){ - EmptyViewHolder holder = new EmptyViewHolder (LayoutInflater.from(context).inflate(R.layout.recycle_list_empty_item, parent, false)); - return holder; - }else if(viewType == NO_FOOTER){ - return new NoShowViewHolder (LayoutInflater.from(context).inflate(R.layout.recycle_list_noshow_item, parent, false)); + switch (viewType) { + case TYPE_FOOTER: + return new FooterViewHolder(mInflater.inflate(R.layout.load_more_footview_layout, parent, false)); + case EMPTY_VIEW: + return new EmptyViewHolder (mInflater.inflate(R.layout.recycle_list_empty_item, parent, false)); + case NO_FOOTER: + return new NoShowViewHolder (mInflater.inflate(R.layout.recycle_list_noshow_item, parent, false)); + case ITEM_VIEW_TYPE_SMALL_PIC_AD: + return new SmallAdViewHolder(mInflater.inflate(R.layout.listitem_ad_small_pic, parent, false)); + case ITEM_VIEW_TYPE_LARGE_PIC_AD: + return new LargeAdViewHolder(mInflater.inflate(R.layout.listitem_ad_large_pic, parent, false)); + case ITEM_VIEW_TYPE_GROUP_PIC_AD: + return new GroupAdViewHolder(mInflater.inflate(R.layout.listitem_ad_group_pic, parent, false)); + case ITEM_VIEW_TYPE_VIDEO: + return new VideoAdViewHolder(mInflater.inflate(R.layout.listitem_ad_large_video, parent, false)); + default: + return new MyViewHolder( mInflater.inflate(listItemID, parent, false)); } - - View itemView = mInflater.inflate(listItemID, parent, false); - - return new MyViewHolder(itemView); } @@ -175,7 +224,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol @Override public void onBindViewHolder(RecyclerView.ViewHolder hd, int position) { - + TTFeedAd ttFeedAd; if (hd instanceof FooterViewHolder) { @@ -208,27 +257,28 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol } - else if (hd instanceof MyViewHolder) { + else if (hd instanceof MyViewHolder && mDatas.get(position) instanceof Novel) { + Novel novel =(Novel) mDatas.get(position); MyViewHolder holder = (MyViewHolder)hd; - holder.tvTitle.setText(mDatas.get(position).getName()); - if (holder.tvAuthor != null) holder.tvAuthor.setText(mDatas.get(position).getAuthor()); - if (holder.tvCate != null) holder.tvCate.setText(mDatas.get(position).getNovelType()); - if (holder.tvDesc != null) holder.tvDesc.setText(mDatas.get(position).getDesc()); + holder.tvTitle.setText(novel.getName()); + if (holder.tvAuthor != null) holder.tvAuthor.setText(novel.getAuthor()); + if (holder.tvCate != null) holder.tvCate.setText(novel.getNovelType()); + if (holder.tvDesc != null) holder.tvDesc.setText(novel.getDesc()); - if (holder.tvLastRead != null) holder.tvLastRead.setText(CommonUtil.getDateString( mDatas.get(position).getLastVisit() )); + if (holder.tvLastRead != null) holder.tvLastRead.setText(CommonUtil.getDateString( novel.getLastVisit() )); // if (holder.tvProgress != null) holder.tvProgress.setText( String.format("上次看到第 %s 章,共%s章",mDatas.get(position).getLastReadChapt(),mDatas.get(position).getChaptCnt()) ); - if (holder.tvProgress != null) holder.tvProgress.setText( String.format("上次看到第 %s 章",mDatas.get(position).getLastReadChapt(),mDatas.get(position).getChaptCnt()) ); - if (holder.tvReadtime != null) holder.tvReadtime.setText( "总计阅读了 "+CommonUtil.getTimeCnt4Read( mDatas.get(position).getReadtime() ,true) ); + if (holder.tvProgress != null) holder.tvProgress.setText( String.format("上次看到第 %s 章",novel.getLastReadChapt(),novel.getChaptCnt()) ); + if (holder.tvReadtime != null) holder.tvReadtime.setText( "总计阅读了 "+CommonUtil.getTimeCnt4Read( novel.getReadtime() ,true) ); - if (holder.tvStatus != null) holder.tvStatus.setText(mDatas.get(position).getProgress()); + if (holder.tvStatus != null) holder.tvStatus.setText(novel.getProgress()); if (holder.imageView != null/* && !TextUtils.isEmpty(mDatas.get(position).getCover())*/) { - // ImageUtil.loadImage(context, mDatas.get(position).getCover(), holder.imageView); - loader.displayImage(context, NetUtil.getCoverUrl(mDatas.get(position).getCover()) ,holder.imageView); + // ImageUtil.loadImage(mContext, mDatas.get(position).getCover(), holder.imageView); + loader.displayImage(mContext, NetUtil.getCoverUrl(novel.getCover()) ,holder.imageView); } if (holder.imageTop != null) { - if( mDatas.get(position).isTop()){ + if( novel.isTop()){ holder.imageTop.setVisibility(View.VISIBLE); }else{ holder.imageTop.setVisibility(View.GONE); @@ -260,7 +310,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol } if (holder.imageUpdate != null) { - if( mDatas.get(position).isUpdated()){ + if( novel.isUpdated()){ holder.imageUpdate.setVisibility(View.VISIBLE); }else{ holder.imageUpdate.setVisibility(View.GONE); @@ -287,6 +337,87 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol } }); } + }else if (hd instanceof SmallAdViewHolder) { + ttFeedAd =(TTFeedAd) mDatas.get(position); + SmallAdViewHolder smallAdViewHolder = (SmallAdViewHolder) hd; + bindData(smallAdViewHolder, ttFeedAd); + if (ttFeedAd.getImageList() != null && !ttFeedAd.getImageList().isEmpty()) { + TTImage image = ttFeedAd.getImageList().get(0); + if (image != null && image.isValid()) { + mAQuery.id(smallAdViewHolder.mSmallImage).image(image.getImageUrl()); + } + } + + } else if (hd instanceof LargeAdViewHolder) { + ttFeedAd =(TTFeedAd) mDatas.get(position); + LargeAdViewHolder largeAdViewHolder = (LargeAdViewHolder) hd; + bindData(largeAdViewHolder, ttFeedAd); + if (ttFeedAd.getImageList() != null && !ttFeedAd.getImageList().isEmpty()) { + TTImage image = ttFeedAd.getImageList().get(0); + if (image != null && image.isValid()) { + mAQuery.id(largeAdViewHolder.mLargeImage).image(image.getImageUrl()); + } + } + + } else if (hd instanceof GroupAdViewHolder) { + ttFeedAd =(TTFeedAd) mDatas.get(position); + GroupAdViewHolder groupAdViewHolder = (GroupAdViewHolder) hd; + bindData(groupAdViewHolder, ttFeedAd); + if (ttFeedAd.getImageList() != null && ttFeedAd.getImageList().size() >= 3) { + TTImage image1 = ttFeedAd.getImageList().get(0); + TTImage image2 = ttFeedAd.getImageList().get(1); + TTImage image3 = ttFeedAd.getImageList().get(2); + if (image1 != null && image1.isValid()) { + mAQuery.id(groupAdViewHolder.mGroupImage1).image(image1.getImageUrl()); + } + if (image2 != null && image2.isValid()) { + mAQuery.id(groupAdViewHolder.mGroupImage2).image(image2.getImageUrl()); + } + if (image3 != null && image3.isValid()) { + mAQuery.id(groupAdViewHolder.mGroupImage3).image(image3.getImageUrl()); + } + } + + } else if (hd instanceof VideoAdViewHolder) { + ttFeedAd = (TTFeedAd)mDatas.get(position); + VideoAdViewHolder videoAdViewHolder = (VideoAdViewHolder) hd; + bindData(videoAdViewHolder, ttFeedAd); + ttFeedAd.setVideoAdListener(new TTFeedAd.VideoAdListener() { + @Override + public void onVideoLoad(TTFeedAd ad) { + + } + + @Override + public void onVideoError(int errorCode, int extraCode) { + + } + + @Override + public void onVideoAdStartPlay(TTFeedAd ad) { + + } + + @Override + public void onVideoAdPaused(TTFeedAd ad) { + + } + + @Override + public void onVideoAdContinuePlay(TTFeedAd ad) { + + } + }); + if (videoAdViewHolder.videoView != null) { + View video = ttFeedAd.getAdView(); + if (video != null) { + if (video.getParent() == null) { + videoAdViewHolder.videoView.removeAllViews(); + videoAdViewHolder.videoView.addView(video); + } + } + } + } } @@ -338,8 +469,9 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol } } - public void AddHeaderItem(List items) { - mDatas.addAll(0, items); + public void AddHeaderItem(List items) { + int p = mDatas.size()>3?3:0; + mDatas.addAll(p, items); notifyDataSetChanged(); } public void setData(List items) { @@ -347,7 +479,7 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol mDatas = items; notifyDataSetChanged(); } - public void AddFooterItem(List items) { + public void AddFooterItem(List items) { mDatas.addAll(items); notifyDataSetChanged(); } @@ -360,6 +492,309 @@ public class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol notifyDataSetChanged(); } + @Override + public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) { + super.onAttachedToRecyclerView(recyclerView); + RecyclerView.LayoutManager layout = recyclerView.getLayoutManager(); + if (layout != null && layout instanceof GridLayoutManager) { + final GridLayoutManager manager = (GridLayoutManager) layout; + manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { + @Override + public int getSpanSize(int position) { + int type = getItemViewType(position); + if (/*type == ITEM_VIEW_TYPE_LOAD_MORE ||*/ type == ITEM_VIEW_TYPE_VIDEO) { + return manager.getSpanCount(); + } + return 1; + } + }); + } + } + + @Override + public void onViewAttachedToWindow(@NonNull RecyclerView.ViewHolder holder) { + //noinspection unchecked + super.onViewAttachedToWindow(holder); + ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams(); + if (lp != null && lp instanceof StaggeredGridLayoutManager.LayoutParams) { + int position = holder.getLayoutPosition(); + int type = getItemViewType(position); + if (/*type == ITEM_VIEW_TYPE_LOAD_MORE || */type == ITEM_VIEW_TYPE_VIDEO) { + StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp; + p.setFullSpan(true); + } + } + } + + @SuppressWarnings("WeakerAccess") + private static class VideoAdViewHolder extends AdViewHolder { + @SuppressWarnings("CanBeFinal") + FrameLayout videoView; + + @SuppressWarnings("RedundantCast") + public VideoAdViewHolder(View itemView) { + super(itemView); + + mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title); + mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc); + mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source); + videoView = (FrameLayout) itemView.findViewById(R.id.iv_listitem_video); + mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon); + mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative); + // mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop); + // mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove); + + } + } + + private static class LargeAdViewHolder extends AdViewHolder { + ImageView mLargeImage; + + @SuppressWarnings("RedundantCast") + public LargeAdViewHolder(View itemView) { + super(itemView); + + mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title); + mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc); + mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source); + mLargeImage = (ImageView) itemView.findViewById(R.id.iv_listitem_image); + mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon); + mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative); + // mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop); + // mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove); + } + } + + private static class SmallAdViewHolder extends AdViewHolder { + ImageView mSmallImage; + + @SuppressWarnings("RedundantCast") + public SmallAdViewHolder(View itemView) { + super(itemView); + + mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title); + mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source); + mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc); + mSmallImage = (ImageView) itemView.findViewById(R.id.iv_listitem_image); + mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon); + mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative); + // mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop); + // mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove); + } + } + + @SuppressWarnings("CanBeFinal") + private static class GroupAdViewHolder extends AdViewHolder { + ImageView mGroupImage1; + ImageView mGroupImage2; + ImageView mGroupImage3; + + @SuppressWarnings("RedundantCast") + public GroupAdViewHolder(View itemView) { + super(itemView); + + mTitle = (TextView) itemView.findViewById(R.id.tv_listitem_ad_title); + mSource = (TextView) itemView.findViewById(R.id.tv_listitem_ad_source); + mDescription = (TextView) itemView.findViewById(R.id.tv_listitem_ad_desc); + mGroupImage1 = (ImageView) itemView.findViewById(R.id.iv_listitem_image1); + mGroupImage2 = (ImageView) itemView.findViewById(R.id.iv_listitem_image2); + mGroupImage3 = (ImageView) itemView.findViewById(R.id.iv_listitem_image3); + mIcon = (ImageView) itemView.findViewById(R.id.iv_listitem_icon); + mCreativeButton = (Button) itemView.findViewById(R.id.btn_listitem_creative); + // mStopButton = (Button) itemView.findViewById(R.id.btn_listitem_stop); + // mRemoveButton = (Button) itemView.findViewById(R.id.btn_listitem_remove); + } + } + + private static class AdViewHolder extends RecyclerView.ViewHolder { + ImageView mIcon; + Button mCreativeButton; + TextView mTitle; + TextView mDescription; + TextView mSource; + // Button mStopButton; + // Button mRemoveButton; + + public AdViewHolder(View itemView) { + super(itemView); + } + } + private void bindData(final AdViewHolder adViewHolder, TTFeedAd ad) { + //可以被点击的view, 也可以把convertView放进来意味item可被点击 + List clickViewList = new ArrayList<>(); + clickViewList.add(adViewHolder.itemView); + //触发创意广告的view(点击下载或拨打电话) + List creativeViewList = new ArrayList<>(); + creativeViewList.add(adViewHolder.mCreativeButton); + //如果需要点击图文区域也能进行下载或者拨打电话动作,请将图文区域的view传入 +// creativeViewList.add(convertView); + //重要! 这个涉及到广告计费,必须正确调用。convertView必须使用ViewGroup。 + ad.registerViewForInteraction((ViewGroup) adViewHolder.itemView, clickViewList, creativeViewList, new TTNativeAd.AdInteractionListener() { + @Override + public void onAdClicked(View view, TTNativeAd ad) { + if (ad != null) { + // TToast.show(mContext, "广告" + ad.getTitle() + "被点击"); + } + } + + @Override + public void onAdCreativeClick(View view, TTNativeAd ad) { + if (ad != null) { + // TToast.show(mContext, "广告" + ad.getTitle() + "被创意按钮被点击"); + } + } + + @Override + public void onAdShow(TTNativeAd ad) { + if (ad != null) { + // TToast.show(mContext, "广告" + ad.getTitle() + "展示"); + } + } + }); + adViewHolder.mTitle.setText(ad.getTitle()); + adViewHolder.mDescription.setText(ad.getDescription()); + adViewHolder.mSource.setText(ad.getSource() == null ? "广告来源" : ad.getSource()); + TTImage icon = ad.getIcon(); + if (icon != null && icon.isValid()) { + ImageOptions options = new ImageOptions(); + mAQuery.id(adViewHolder.mIcon).image(icon.getImageUrl(), options); + } + Button adCreativeButton = adViewHolder.mCreativeButton; + switch (ad.getInteractionType()) { + case TTAdConstant.INTERACTION_TYPE_DOWNLOAD: + //如果初始化ttAdManager.createAdNative(getApplicationContext())没有传入activity 则需要在此传activity,否则影响使用Dislike逻辑 + if (mContext instanceof Activity) { + ad.setActivityForDownloadApp((Activity) mContext); + } + adCreativeButton.setVisibility(View.VISIBLE); + // adViewHolder.mStopButton.setVisibility(View.VISIBLE); + // adViewHolder.mRemoveButton.setVisibility(View.VISIBLE); + bindDownloadListener(adCreativeButton, adViewHolder, ad); + //绑定下载状态控制器 + bindDownLoadStatusController(adViewHolder, ad); + break; + case TTAdConstant.INTERACTION_TYPE_DIAL: + adCreativeButton.setVisibility(View.VISIBLE); + adCreativeButton.setText("立即拨打"); + // adViewHolder.mStopButton.setVisibility(View.GONE); + // adViewHolder.mRemoveButton.setVisibility(View.GONE); + break; + case TTAdConstant.INTERACTION_TYPE_LANDING_PAGE: + case TTAdConstant.INTERACTION_TYPE_BROWSER: +// adCreativeButton.setVisibility(View.GONE); + adCreativeButton.setVisibility(View.VISIBLE); + adCreativeButton.setText("查看详情"); + // adViewHolder.mStopButton.setVisibility(View.GONE); + // adViewHolder.mRemoveButton.setVisibility(View.GONE); + break; + default: + adCreativeButton.setVisibility(View.GONE); + // adViewHolder.mStopButton.setVisibility(View.GONE); + // adViewHolder.mRemoveButton.setVisibility(View.GONE); + // TToast.show(mContext, "交互类型异常"); + } + } + + private void bindDownLoadStatusController(AdViewHolder adViewHolder, final TTFeedAd ad) { + final DownloadStatusController controller = ad.getDownloadStatusController(); + /* adViewHolder.mStopButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (controller != null) { + controller.changeDownloadStatus(); + // TToast.show(mContext, "改变下载状态"); + Log.d(TAG, "改变下载状态"); + } + } + }); + + adViewHolder.mRemoveButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (controller != null) { + controller.cancelDownload(); + // TToast.show(mContext, "取消下载"); + Log.d(TAG, "取消下载"); + } + } + });*/ + } + + private void bindDownloadListener(final Button adCreativeButton, final AdViewHolder adViewHolder, TTFeedAd ad) { + TTAppDownloadListener downloadListener = new TTAppDownloadListener() { + @Override + public void onIdle() { + if (!isValid()) { + return; + } + adCreativeButton.setText("开始下载"); + // adViewHolder.mStopButton.setText("开始下载"); + } + + @SuppressLint("SetTextI18n") + @Override + public void onDownloadActive(long totalBytes, long currBytes, String fileName, String appName) { + if (!isValid()) { + return; + } + if (totalBytes <= 0L) { + adCreativeButton.setText("下载中 percent: 0"); + } else { + adCreativeButton.setText("下载中 percent: " + (currBytes * 100 / totalBytes)); + } + // adViewHolder.mStopButton.setText("下载中"); + } + + @SuppressLint("SetTextI18n") + @Override + public void onDownloadPaused(long totalBytes, long currBytes, String fileName, String appName) { + if (!isValid()) { + return; + } + if (totalBytes <= 0L) { + adCreativeButton.setText("下载中 percent: 0"); + } else { + adCreativeButton.setText("下载暂停 percent: " + (currBytes * 100 / totalBytes)); + } + // adViewHolder.mStopButton.setText("下载暂停"); + } + + @Override + public void onDownloadFailed(long totalBytes, long currBytes, String fileName, String appName) { + if (!isValid()) { + return; + } + adCreativeButton.setText("重新下载"); + // adViewHolder.mStopButton.setText("重新下载"); + } + + @Override + public void onInstalled(String fileName, String appName) { + if (!isValid()) { + return; + } + adCreativeButton.setText("点击打开"); + // adViewHolder.mStopButton.setText("点击打开"); + } + + @Override + public void onDownloadFinished(long totalBytes, String fileName, String appName) { + if (!isValid()) { + return; + } + adCreativeButton.setText("点击安装"); + // adViewHolder.mStopButton.setText("点击安装"); + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private boolean isValid() { + return mTTAppDownloadListenerMap.get(adViewHolder) == this; + } + }; + //一个ViewHolder对应一个downloadListener, isValid判断当前ViewHolder绑定的listener是不是自己 + ad.setDownloadListener(downloadListener); // 注册下载监听器 + mTTAppDownloadListenerMap.put(adViewHolder, downloadListener); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java b/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java index 638a059..da3f0a1 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java @@ -1601,31 +1601,35 @@ int muluRetryCount =0; return error.toCharArray(); } - if (mChapters.size() > index && NetUtil.isNetworkConnected()) { - - if (!chaptDownStatus.containsKey(index + 1) || chaptDownStatus.get(index + 1).equals(DownloadStatus.failure)) { + if( Constants.AD_PRE_LOAD_CHAPT) { - File file2 = new File(fileChapterName(index + 1)); + if (mChapters.size() > index && NetUtil.isNetworkConnected()) { - if (!file2.exists()) { - Log.d(TAG, String.format(" prepare book to load next chapt %s,down status %s ", index + 1, chaptDownStatus.get(index + 1))); - chaptDownStatus.put(index + 1, DownloadStatus.downloading); - loadChaptContent(index + 1); + if (!chaptDownStatus.containsKey(index + 1) || chaptDownStatus.get(index + 1).equals(DownloadStatus.failure)) { + + + File file2 = new File(fileChapterName(index + 1)); + + if (!file2.exists()) { + Log.d(TAG, String.format(" prepare book to load next chapt %s,down status %s ", index + 1, chaptDownStatus.get(index + 1))); + chaptDownStatus.put(index + 1, DownloadStatus.downloading); + loadChaptContent(index + 1); + } } } - } - if (index > 1 && index - 1 < mChapters.size() && NetUtil.isNetworkConnected()) { + if (index > 1 && index - 1 < mChapters.size() && NetUtil.isNetworkConnected()) { - if (!chaptDownStatus.containsKey(index - 1) || chaptDownStatus.get(index - 1).equals(DownloadStatus.failure)) { - File file2 = new File(fileChapterName(index - 1)); + if (!chaptDownStatus.containsKey(index - 1) || chaptDownStatus.get(index - 1).equals(DownloadStatus.failure)) { + File file2 = new File(fileChapterName(index - 1)); + + if (!file2.exists()) { + Log.d(TAG, String.format(" prepare book to load pre chapt %s,down status %s ", index - 1, chaptDownStatus.get(index - 1))); + chaptDownStatus.put(index - 1, DownloadStatus.downloading); + loadChaptContent(index - 1); + } - if (!file2.exists()) { - Log.d(TAG, String.format(" prepare book to load pre chapt %s,down status %s ", index - 1, chaptDownStatus.get(index - 1))); - chaptDownStatus.put(index - 1, DownloadStatus.downloading); - loadChaptContent(index - 1); } - } } // mChangeChapId =0; diff --git a/zhuike/src/main/java/com/novelbook/android/utils/Constants.java b/zhuike/src/main/java/com/novelbook/android/utils/Constants.java index 8f755d2..7ebb398 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/Constants.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/Constants.java @@ -14,6 +14,7 @@ public class Constants { public static final int MAXAGE_MULU = 60*60*24*7*2; //2周;; public static final String VERSION_ADDRESS ="version.xml"; public static final boolean SHOWAD =true ; + public static boolean AD_PRE_LOAD_CHAPT = false; public static long AD_SPLASH_INVTERVAL = 5*60*1000;//间隔5分钟 public static int AD_SPLASH_PAGES = 15; public static int SCREEN_HEIGHT_PIX =1920 ; diff --git a/zhuike/src/main/java/com/novelbook/android/utils/HistoryCache.java b/zhuike/src/main/java/com/novelbook/android/utils/HistoryCache.java index efcba30..446dec2 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/HistoryCache.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/HistoryCache.java @@ -35,6 +35,9 @@ public class HistoryCache { Gson gson = new Gson(); List retList = (List)gson.fromJson(history, (new TypeToken>() { }).getType()); + if(retList.size()>9){ + return retList.subList(0,9); + } return retList; } diff --git a/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java b/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java index 408f470..835a48d 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java @@ -337,7 +337,7 @@ public class PageFactory implements ChangeSource{ public void run() { int slepttime =0; File file = new File(getChapterFileName(chid)); - while( !file.exists() && slepttime <60 && mBookUtil.muluRetryCount>(); } @@ -712,6 +716,8 @@ private void hideSysUI(){ } private String loadingTxt =""; private String statusChangeSource ="正在换源..."; + private boolean showingStatusAd =false; + private long showStatusAdTime =0; private void drawStatus(Bitmap bitmap){ hideSysUI(); mAd.showRefresh(View.VISIBLE); @@ -769,7 +775,7 @@ private void hideSysUI(){ // c.drawRect(targetRect, waitPaint); Paint.FontMetricsInt fontMetrics = waitPaint.getFontMetricsInt(); // 转载请注明出处:http://blog.csdn.net/hursing - int baseline = (targetRect.bottom + targetRect.top - fontMetrics.bottom - fontMetrics.top) / 2; + int baseline = (targetRect.bottom + targetRect.top - fontMetrics.bottom - fontMetrics.top) *4/5; // 下面这行是实现水平居中,drawText对应改为传入targetRect.centerX() waitPaint.setTextAlign(Paint.Align.CENTER); c.drawText(status, targetRect.centerX(), baseline, waitPaint); @@ -783,11 +789,28 @@ private void hideSysUI(){ mBookPageWidget.postInvalidate(); // hideSysUI(); + /* float adHeight = mHeight - baseline -marginHeight-statusMarginBottom-30; + float adY =targetRect.top +10;*/ + + float adHeight = baseline -100; + float adY =targetRect.top +250; + + while(!showingStatusAd || new Date().getTime() - showStatusAdTime > 2000) { + showingStatusAd =true; + showStatusAdTime = new Date().getTime(); + showAd((int) adHeight, (int) adY); + Log.d(TAG, "loadBannerAd: AD is requested"); + } + + + + } //上次翻书时间 private long lastPageTime; - public void onDraw(Bitmap bitmap,List m_lines,Boolean updateChapter) { + + public void onDraw(Bitmap bitmap,List m_lines,Boolean updateChapter,Boolean showAd) { hideSysUI(); // mAd.showRefresh(View.GONE); if(m_lines.size()==0){ @@ -801,14 +824,14 @@ private void hideSysUI(){ // Log.d(TAG, String.format(" prepare book onDraw chapter after getCurrentChapter(),currentChapter %s ",currentChapter ) ); } // Log.d(TAG, String.format(" prepare book onDraw chapter _____________ %s ",currentChapter ) ); - //更新数据库进度 + showingStatusAd =false; if(mAd!=null){ handler.sendEmptyMessage(MSG_HIDEPROGRESS); } - + //更新数据库进度 if ( mStatus ==Status.FINISH && currentPage != null && getNovel() != null) { new Thread() { @Override @@ -898,7 +921,10 @@ private void hideSysUI(){ float adHeight = mHeight -y - space -marginHeight-statusMarginBottom; float adY =y +space; - showAd((int)adHeight,(int)adY); + if(showAd) { + showAd((int) adHeight, (int) adY); + Log.d(TAG, "loadBannerAd: AD is requested"); + } // Log.d(TAG,String.format("ad + statusMarginBottom %s ",200+ statusMarginBottom)); // Log.d(TAG,String.format("adHeight %s, adY %s",adHeight,adY)); } @@ -988,9 +1014,9 @@ private void hideSysUI(){ private void showAd(int adHeight,int adY) { - boolean showAd = getCurrentPage().getPageNo() > 1 - &&NetWorkUtil.isNetworkConnected(mContext); + boolean showAd = showingStatusAd || getCurrentPage()==null || getCurrentPage().getPageNo() > 1; + // boolean showAd =true; if (mAd != null) { mAd.showAd(showAd,adHeight, adY); } @@ -1022,12 +1048,14 @@ private void hideSysUI(){ if(mBookPageWidget==null){ return; } - onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),true); + Log.d(TAG, " prePage() onDraw: mBookPageWidget.getCurPage() "); + onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),true,false); currentPage = getPrePage(); if(mBookPageWidget==null){ return; } - onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),true); + Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() "); + onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),true,true); } @@ -1098,14 +1126,16 @@ private void hideSysUI(){ if(mBookPageWidget==null){ return; } - onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),true); + Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getCurPage() "); + onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),true,false); prePage = currentPage; currentPage = getNextPage(); // currentPage = currentChaptPages.get(currentPage.getPageNo()-1); if(mBookPageWidget==null){ return; } - onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),true); + Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getNextPage() "); + onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),true,true); Log.d("nextPage","nextPagenext"); HashMap map = new HashMap(); @@ -1588,8 +1618,10 @@ private void hideSysUI(){ if(mBookPageWidget==null){ return; } - onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),updateChapter); - onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),updateChapter); + Log.d(TAG, "currentPage onDraw: mBookPageWidget.getCurPage() "); + onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),updateChapter,false); + Log.d(TAG, "currentPage onDraw: mBookPageWidget.getNextPage() "); + onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),updateChapter,true); } //更新电量 diff --git a/zhuike/src/main/res/drawable/dislike_icon.png b/zhuike/src/main/res/drawable/dislike_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..03ec72fb7f49e1a5fbcceb5f7e52d9274a79cd7b GIT binary patch literal 1519 zcmVPx)sYygZRA>d|n@vv}M;OP~E3kP{fGR)@1;h=N6H*WnQd+{Tl`2)rExok2et@L8 zrHAI&_5?2_#IGT|Mzx3^A%28#7s*w`R}p{P z*4DN-JUo2NI&ojQI0f$R?hcmA<*#7$9TEuT_MnRTo42 zDLnlx!t!N0F9j}@N&}Tj`7eithW3N(2prP%Y(`+oI7?e;voq~%Qe-3hZpwJh4qk2gR4q4Mpp zc)S=rJw2h?c~v4C8ChllqX+JIRaD7i@6)sNa8zg+c6xf+z-+5xj;pR<%yD<|?Ck7c z)X?20v?>UUhhT!FF_XICN+xD(&sK$v!3uwpirC$c!+vM#Y{l|wo);2>CG zSenpe<&b_Wl*bu{fff4Ff+nlU10+yf5z6BTRbYj_6rd|)HF;VFm^gvZ8)d{(~C^p=pE*HI^xhtxBk&TROZvk^R z4?XZgS0LMAo5*S&6;{|FLu0o>6e)*f6KA~|KegbkiD#`|D@(IA;GQ&h7o%>t*+d%j z?D_e*(cRr`&sK`V!*k+{R|A+50R0D`Tk6*bz%Byz6VXG~kZvSQ^Lr6*l@P!W?JN#p ztZ!eU!h*d*mg8ix|8htc2QV{u!VSS8;~BpW>nsio7cgeW5>L3HcWREB8A{N0GLS_! z+Xc)D^|KKV768p75Lr2^ zwFKCCK$iue9C{9EQHc$CoDbwkG - + android:orientation="vertical" + > @@ -17,6 +19,13 @@ app:search_baground="@drawable/search_baground_shap" /> + + - \ No newline at end of file + \ No newline at end of file diff --git a/zhuike/src/main/res/layout/ad_toutiao_activity_splash.xml b/zhuike/src/main/res/layout/ad_toutiao_activity_splash.xml index 4f1ef19..d09c366 100644 --- a/zhuike/src/main/res/layout/ad_toutiao_activity_splash.xml +++ b/zhuike/src/main/res/layout/ad_toutiao_activity_splash.xml @@ -5,14 +5,24 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" - android:background="#000000" + tools:context=".AD.toutiao.SplashActivity"> + diff --git a/zhuike/src/main/res/layout/ad_toutiao_native_ad.xml b/zhuike/src/main/res/layout/ad_toutiao_native_ad.xml index 27b429c..b54925a 100644 --- a/zhuike/src/main/res/layout/ad_toutiao_native_ad.xml +++ b/zhuike/src/main/res/layout/ad_toutiao_native_ad.xml @@ -61,6 +61,7 @@