package com.novelbook.android.Fragments; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Resources; import android.graphics.pdf.PdfDocument; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.Nullable; import android.support.design.widget.TabLayout; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.bytedance.sdk.openadsdk.AdSlot; 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; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.novelbook.android.AD.toutiao.TToast; import com.novelbook.android.Activity_base; import com.novelbook.android.Activity_paihangbang; import com.novelbook.android.Activity_shudan; import com.novelbook.android.BookActivity; import com.novelbook.android.BuildConfig; import com.novelbook.android.Main2Activity; import com.novelbook.android.R; import com.novelbook.android.ReadActivity; import com.novelbook.android.adapter.BookListAdapter; import com.novelbook.android.bean.NovelBlock; import com.novelbook.android.db.Novel; import com.novelbook.android.netsubscribe.BookSubscribe; import com.novelbook.android.netutils.NetUtil; import com.novelbook.android.netutils.OnSuccessAndFaultListener; import com.novelbook.android.netutils.OnSuccessAndFaultSub; 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.utils.PageFactory; 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.NativeUnifiedAD; import com.qq.e.ads.nativ.NativeUnifiedADData; import com.qq.e.comm.constants.AdPatternType; import com.qq.e.comm.util.AdError; import com.qq.e.comm.util.GDTLogger; import com.umeng.analytics.MobclickAgent; import com.youth.banner.loader.ImageLoader; import org.litepal.LitePal; import org.w3c.dom.Text; import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import butterknife.BindView; import butterknife.ButterKnife; import static com.novelbook.android.utils.AdUtil.getAppID; /** * A simple {@link Fragment} subclass. */ public abstract class BasicFragment extends Fragment implements /* NativeADUnifiedListener,*/NativeExpressAD.NativeExpressADListener { private static String TAG = BasicFragment.class.getSimpleName(); protected View rootView; protected int pageNo=1; private int pageCount; public int getPageCount() { pageCount = pageCount >Constants.MAX_PAGE_CNT ? Constants.MAX_PAGE_CNT :pageCount; return pageCount; } public void setPageCount(int pageCount) { this.pageCount = pageCount; } protected abstract int getLayoutRes(); protected abstract void initData(); protected abstract void fillData(); protected void initListener(){} protected abstract void initViews(); protected Gson gson = new Gson(); // protected MyImageLoader imgloader = new MyImageLoader(); // Main2Activity activity; Activity_base activity; @Nullable @BindView(R.id.swipeLayout) SwipeRefreshLayout mSwipeRefresh; @Nullable @BindView(R.id.banner_container) FrameLayout mBannerContainer; int MSG_INIT_TAB =99; int error_try=0; int error_try_max=5; public BasicFragment() { // Required empty public constructor } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setFTag(); // Log.d(TAG,"fragment onCreate "); // activity =(Main2Activity)getActivity(); activity = (Activity_base)getActivity(); processArguments(); // QLog.getLogger().e(dTAG,TAG+" "+ "onCreate"); // mediumFontSize = activity.getMiddleSizeFont(); } protected abstract void processArguments(); @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG,"onCreateView"); View view = inflater.inflate(getLayoutRes(), container, false); rootView = view; // 初始化View注入 ButterKnife.bind(this,view); initListener(); initData(); initViews(); initSwipeRefreshLayout(); if (mBannerContainer!=null && !Constants.AD_SETTING.isShowAdsense()) { if( mBannerContainer.getVisibility() !=View.GONE) { mBannerContainer.setVisibility(View.GONE); } } return view; // Inflate the layout for this fragment } public String getCurrentTag() { setFTag(); return TAG; } public void setFTag(){}; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { hideProgress(); int wt = msg.what; if (msg.what == 1) { try { fillData(); }catch (Exception e){ Log.e(TAG, "handleMessage: filldata error ", e); } } else if (msg.what == MSG_INIT_TAB) // { initTabs(); // Toast.makeText(getActivity(), "数据请求失败 ", Toast.LENGTH_LONG).show(); } if(getActivity()!=null && !NetUtil.isNetworkConnected()){ Toast.makeText(getActivity(),"好像没有网络啦",Toast.LENGTH_LONG).show(); } } }; void initTabs(){ } //--------------------------------------------------------------book list adapter------------------------------------------------ /* interface mOnItemClickListener { void onItemClick(View view, int position); void onItemLongClick(View view , int position); void onLinearOutClick(View view,int bookId); } */ protected List initData(List mDatas, char x) { mDatas = new ArrayList(); for (int i = 'A'; i < x; i++) { Novel bk = new Novel(); bk.setNovelId(i); bk.setAuthor("金庸"); bk.setName("射雕英雄传" +(char)i); bk.setNovelType("武侠"); bk.setDesc("南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事南宋时期的武林故事"); mDatas.add(bk); } return mDatas; } void showBookDetail(Novel book) { Intent intent = new Intent(activity, BookActivity.class); intent.putExtra(BookActivity.EXTRA_BOOK,book); startActivity(intent); } void getBookInfo(Novel novel){ int novelId = novel.getNovelId(); long id = novel.getId(); Log.d(TAG, String.format("prepare book %s ,start to loading book info from host ",novel.getName())); // showProgressDialog(false,"正在加载..."); PageFactory pageFactory =PageFactory.getInstance(activity ) ; pageFactory.initBookUtil(); ReadActivity.openBook(novel ,activity); BookSubscribe.getNovel(novel.getNovelId(),new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { //成功 Novel nv ; nv = gson.fromJson(result,Novel.class); if(id>0) { nv.update(id); nv= LitePal.find(Novel.class,id); }else { nv.save(); } Log.d(TAG, String.format("prepare book %s ,start to loading book info from host -----------done",novel.getName())); Log.d(TAG, String.format("prepare book %s ,lastchapt %s, last pos %s ,开始prepare.",nv.getName(),nv.getLastReadChapt(),nv.getLastReadPos()) ); // final Novel novel = nv; /* new Thread(){ @Override public void run() { super.run(); } }.start();*/ // ReadActivity.openBook(nv ,activity); // PageFactory.getInstance(activity.getApplicationContext()).prepareBook(nv ); //打开本地小说内容 //PageFactory.getInstance(activity ).prepareBook(nv ); //打开本地小说内容 pageFactory.prepareBook(nv ); Log.d(TAG, String.format("prepare book %s 开始open book.",nv.getName()) ); handler.sendEmptyMessage(99); } @Override public void onFault(String errorMsg) { //失败 Toast.makeText(getActivity(),novel.getName() +" 信息请求失败" ,Toast.LENGTH_SHORT).show(); // PageFactory.getInstance(activity ).prepareBook(novel ); //打开本地小说内容 pageFactory.prepareBook(novel ); // ReadActivity.openBook(novel ,activity); handler.sendEmptyMessage(99); } },getActivity())); } void showProgressDialog(boolean flag,String msg){ if(!Constants.showDialogOnUi){ return; } if(pageNo >1 && !Constants.showDialogOnUiPage){ return; } if(getActivity()==null){ return; } if(NetUtil.isNetworkConnected()) if(mSwipeRefresh ==null || !mSwipeRefresh.isRefreshing()) { ((Activity_base) getActivity()).showProgressDialog(flag,msg); } } void hideProgress(){ if(getActivity()==null){ return; } if(mSwipeRefresh!=null && mSwipeRefresh.isRefreshing()) { mSwipeRefresh.setRefreshing(false); } ((Activity_base) getActivity()).hideProgress(); } void initSwipeRefreshLayout(){ if(mSwipeRefresh==null){return;} mSwipeRefresh.setColorSchemeResources(R.color.colorPrimary,R.color.colorPrimaryDark); mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { // 开始刷新,设置当前为刷新状态 //swipeRefreshLayout.setRefreshing(true); pageNo=1; error_try=0; initData(); // TODO 获取数据 } }); } void openBook(Novel book, BookListAdapter mAdapter) { //从新从数据库抓取该书的最新阅读进度 Novel book1 = (Novel)LitePal.find(Novel.class,book.getId()); if(book1!=null) { //读取本地最新进度 book.setLastReadPos(book1.getLastReadPos()); book.setLastReadChapt(book1.getLastReadChapt()); } // Toast.makeText(activity, book.getName() + "加载", Toast.LENGTH_SHORT).show(); if(!book.isLocalBook()){ getBookInfo(book); /* PageFactory pageFactory = PageFactory.getInstance(); showProgressDialog(false,"读取目录信息"); int slept = 0; while(slept <100 || pageFactory.getChapters() == null || pageFactory.getChapters().size()==0){ try { Thread.sleep(50); slept++; } catch (InterruptedException e) { e.printStackTrace(); } } hideProgress(); */ //ReadActivity.openBook(book ,activity); return; } final String path = book.getNovelPath(); File file = new File(path); if (!file.exists()){ new AlertDialog.Builder(activity) .setTitle(activity.getString(R.string.app_name)) .setMessage(path + "文件不存在,是否删除该书本?") .setPositiveButton("删除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LitePal.deleteAll(Novel.class, "id = ?", book.getId()+""); if(mAdapter!=null) {mAdapter.setBookList( LitePal.where("isOnShelf=?","1").find(Novel.class));} } }).setCancelable(true).show(); return; } ReadActivity.openBook(book ,activity); } void showShudanDetail(int shuandanId){ Intent intent = new Intent(activity, Activity_shudan.class); intent.putExtra("NAME",shuandanId); startActivity(intent); } //-------------------------------------------------------------------------------------book list adapter end-------------------------------------------------- void showPaihangbang(Object obj) { //show paihangbang activity NovelBlock nb = (NovelBlock) obj; Intent intent = new Intent(activity, Activity_paihangbang.class); String title = TextUtils.isEmpty(nb.getTitle()) ? nb.getName() : nb.getTitle() ; intent.putExtra(Activity_paihangbang.EXTR_FN,nb.getFn() ); intent.putExtra(Activity_paihangbang.EXTR_TITLE,title ); startActivity(intent); } void showPaihangbang(NovelBlock nb) { //show paihangbang activity Intent intent = new Intent(activity, Activity_paihangbang.class); String title = TextUtils.isEmpty(nb.getTitle()) ? nb.getName() : nb.getTitle() ; intent.putExtra(Activity_paihangbang.EXTR_CID,nb.getCid() ); intent.putExtra(Activity_paihangbang.EXTR_TITLE,title ); intent.putExtra(Activity_paihangbang.EXTR_BANGDAN,title ); startActivity(intent); } protected void loadImageView(String url, ImageView imageView){ ImageUtil.loadImage( getActivity(), url , imageView); } public void reload() { loadData(); } public void loadData() { initData(); } //on tab changed void retryErorr(int msg){ if(error_try mAds = new ArrayList<>(); public void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) { if(mAdManager==null) { mAdManager = new NativeUnifiedAD(activity, getAppID(Constants.AD_TENCENT_QQ), Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ), this); } mAdManager.loadData(adCnt); qqAdapter =adapter; qqAddFooter=addFooter; Log.d(TAG, "loadListAd_qq: ad requested"); }*/ private boolean qqAddFooter; private BookListAdapter qqAdapter; /* @Override public void onADLoaded(List ads) { Log.d(TAG, "loadListAd_qq: ad onADLoaded,qqAddFooter? "+qqAddFooter); // mIsLoading = false; // 防止在onDestory后网络回包 if(qqAdapter==null){ return; } if(qqAddFooter) { qqAdapter.AddFooterItem(ads); }else{ qqAdapter.AddHeaderItem(ads); } }*/ @Override public void onNoAD(AdError adError) { Log.d(TAG, "loadListAd_qq: ad onNoAD " ); Log.i( TAG, String.format("onNoAD, error code: %d, error msg: %s", adError.getErrorCode(), adError.getErrorMsg())); } private NativeExpressAD mADManager; void loadListAd_qq(BookListAdapter adapter, int adCnt, boolean addFooter) { ADSize adSize = new ADSize(ADSize.FULL_WIDTH, ADSize.AUTO_HEIGHT); // 消息流中用AUTO_HEIGHT mADManager = new NativeExpressAD(activity, adSize, getAppID(Constants.AD_TENCENT_QQ), Constants.AD_SETTING.getInformationFlow().getSlotId(Constants.AD_TENCENT_QQ), this); mADManager.setMaxVideoDuration(5); mADManager.loadAD(adCnt); qqAdapter =adapter; qqAddFooter=addFooter; Log.d(TAG, "loadListAd_qq: ad requested"); } @Override public void onADLoaded(List adList) { Log.i(TAG, "onADLoaded: " + adList.size()); /* mAdViewList = adList; for (int i = 0; i < mAdViewList.size(); i++) { int position = FIRST_AD_POSITION + ITEMS_PER_AD * i; if (position < mNormalDataList.size()) { NativeExpressADView view = mAdViewList.get(i); GDTLogger.i("ad load[" + i + "]: " + getAdInfo(view)); if (view.getBoundData().getAdPatternType() == AdPatternType.NATIVE_VIDEO) { view.setMediaListener(mediaListener); } mAdViewPositionMap.put(view, position); // 把每个广告在列表中位置记录下来 mAdapter.addADViewToPosition(position, mAdViewList.get(i)); } } mAdapter.notifyDataSetChanged();*/ if(qqAdapter==null){ return; } if(qqAddFooter) { qqAdapter.AddFooterItem(adList); }else{ qqAdapter.AddHeaderItem(adList); } } @Override public void onRenderFail(NativeExpressADView adView) { Log.i(TAG, "onRenderFail: " + adView.toString()); } @Override public void onRenderSuccess(NativeExpressADView adView) { // Log.i(TAG, "onRenderSuccess: " + adView.toString() + ", adInfo: " + getAdInfo(adView)); } @Override public void onADExposure(NativeExpressADView adView) { Log.i(TAG, "onADExposure: " + adView.toString()); } @Override public void onADClicked(NativeExpressADView adView) { Log.i(TAG, "onADClicked: " + adView.toString()); } @Override public void onADClosed(NativeExpressADView adView) { Log.i(TAG, "onADClosed: " + adView.toString()); /* if (mAdapter != null) { int removedPosition = mAdViewPositionMap.get(adView); mAdapter.removeADView(removedPosition, adView); }*/ } @Override public void onADLeftApplication(NativeExpressADView adView) { Log.i(TAG, "onADLeftApplication: " + adView.toString()); } @Override public void onADOpenOverlay(NativeExpressADView adView) { Log.i(TAG, "onADOpenOverlay: " + adView.toString()); } @Override public void onADCloseOverlay(NativeExpressADView adView) { Log.i(TAG, "onADCloseOverlay"); } //qq ad end<------------- /** * 加载 toutiao feed广告 */ void loadListAd( BookListAdapter adapter, int adCnt, boolean addFooter) { if(!Constants.AD_SETTING.isShowAdsense()){ return; } if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TENCENT_QQ) { loadListAd_qq(adapter, adCnt, addFooter); }else if(Constants.AD_SETTING.getInformationFlow().getSource()==Constants.AD_TOUTIAO){ activity.loadListAd_toutiao(adapter, adCnt, addFooter); } } @Override public void onResume() { super.onResume(); error_try=0; showBanner(mBannerContainer,(int) getResources().getDimension(R.dimen.topBannerHeight) ); // MobclickAgent.onPageStart(TAG); } @Override public void onPause(){ super.onPause(); hideProgress(); // MobclickAgent.onPageEnd(TAG); } }