diff --git a/zhuike/build.gradle b/zhuike/build.gradle index 6922e4d..e0b5616 100644 --- a/zhuike/build.gradle +++ b/zhuike/build.gradle @@ -83,5 +83,5 @@ dependencies { // implementation 'com.ms-square:expandableTextView:0.1.4' // implementation 'com.github.tangguna:SearchBox:1.0.1' implementation 'com.github.chengzipi:Searchbox:v1.0.0' - + implementation 'com.github.ixiaow:multilayout:1.0.0' } diff --git a/zhuike/src/main/assets/litepal.xml b/zhuike/src/main/assets/litepal.xml index ad786d7..134df54 100644 --- a/zhuike/src/main/assets/litepal.xml +++ b/zhuike/src/main/assets/litepal.xml @@ -2,7 +2,7 @@ - + diff --git a/zhuike/src/main/java/com/novelbook/android/BookActivity.java b/zhuike/src/main/java/com/novelbook/android/BookActivity.java index 5df1729..02e3191 100644 --- a/zhuike/src/main/java/com/novelbook/android/BookActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/BookActivity.java @@ -7,6 +7,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; +import android.graphics.pdf.PdfDocument; import android.net.Uri; import android.os.Build; import android.os.Handler; @@ -320,7 +321,7 @@ public class BookActivity extends Activity_base { break; case R.id.llCate: - Log.d(TAG, String .format("prepareBook: current book %s, start to open book cate of %s" , mNovel.getName() , pageFactory.getNovle().getName())); + // Log.d(TAG, String .format("prepareBook: current book %s, start to open book cate of %s" , mNovel.getName() , pageFactory.getNovle().getName())); intent = new Intent(BookActivity.this, MarkActivity.class); startActivity(intent);; @@ -684,7 +685,10 @@ void onResponseProcess( String content ,String url){ registerReceiver(receiver,filter); if(mNovel!=null && mNovel.getId()>0) { mNovel = LitePal.find(Novel.class, mNovel.getId()); //更新最新进度 - if((pageFactory.getNovle()==null || mNovel.getId() !=pageFactory.getNovle().getId())){ + if(pageFactory==null){ + pageFactory = PageFactory.getInstance(); + } + if(( pageFactory.getNovle()==null || mNovel.getId() !=pageFactory.getNovle().getId())){ pageFactory.prepareBook(mNovel); } } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/BookMarkFragment.java b/zhuike/src/main/java/com/novelbook/android/Fragments/BookMarkFragment.java index e44bbc7..833d1a1 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/BookMarkFragment.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/BookMarkFragment.java @@ -8,6 +8,7 @@ import android.view.View; import android.widget.AdapterView; import android.widget.ListView; +import com.novelbook.android.MarkActivity; import com.novelbook.android.R; import com.novelbook.android.adapter.MarkAdapter; import com.novelbook.android.db.BookMarks; @@ -23,7 +24,7 @@ import butterknife.BindView; /** * Created by Administrator on 2016/8/31 0031. */ -public class BookMarkFragment extends BasicFragment { +public class BookMarkFragment extends BasicFragment implements MarkActivity.Sortmark{ public static final String ARGUMENT = "argument"; @BindView(R.id.lv_bookmark) @@ -42,14 +43,17 @@ public class BookMarkFragment extends BasicFragment { @Override protected void initData() { - pageFactory = PageFactory.getInstance(); + Bundle bundle = getArguments(); if (bundle != null) { novelId = bundle.getInt(ARGUMENT); } bookMarksList = new ArrayList<>(); - bookMarksList = LitePal.where("novelId = ?", novelId+"").find(BookMarks.class); + bookMarksList = LitePal.where("novelId = ?", novelId+"").order(String.format("id %s",isAsc ?"asc" :"desc")). find(BookMarks.class); Log.d(TAG, "initData: bookmark size " +bookMarksList.size()); + markAdapter = new MarkAdapter(getActivity(), bookMarksList); + lv_bookmark.setAdapter(markAdapter); + } @Override protected void fillData() { @@ -66,6 +70,7 @@ public class BookMarkFragment extends BasicFragment { @Override protected void initListener() { + pageFactory = PageFactory.getInstance(); lv_bookmark.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { @@ -101,8 +106,8 @@ public class BookMarkFragment extends BasicFragment { @Override protected void initViews() { - markAdapter = new MarkAdapter(getActivity(), bookMarksList); - lv_bookmark.setAdapter(markAdapter); + + ((MarkActivity) getActivity()).setSortmark(this); } @Override @@ -124,4 +129,10 @@ public class BookMarkFragment extends BasicFragment { return bookMarkFragment; } + boolean isAsc = true; + @Override + public void sortList() { + isAsc =!isAsc; + initData(); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/CatalogFragment.java b/zhuike/src/main/java/com/novelbook/android/Fragments/CatalogFragment.java index aad53fc..5f3b3f7 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/CatalogFragment.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/CatalogFragment.java @@ -2,13 +2,18 @@ package com.novelbook.android.Fragments; import android.app.ProgressDialog; import android.os.Bundle; +import android.support.v7.widget.LinearLayoutManager; +import android.text.TextUtils; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; +import android.widget.ImageButton; import android.widget.ListView; +import android.widget.TextView; +import com.novelbook.android.MarkActivity; import com.novelbook.android.R; import com.novelbook.android.ReadActivity; import com.novelbook.android.adapter.CatalogueAdapter; @@ -19,25 +24,36 @@ import com.novelbook.android.netutils.NetUtil; import com.novelbook.android.utils.PageFactory; +import org.litepal.LitePal; + import java.io.File; import java.util.ArrayList; import butterknife.BindView; import butterknife.ButterKnife; +import butterknife.OnClick; /** * Created by Administrator on 2016/8/31 0031. */ -public class CatalogFragment extends BasicFragment { +public class CatalogFragment extends BasicFragment implements MarkActivity.Sortcat { public static final String TAG=CatalogFragment.class.getSimpleName(); public static final String ARGUMENT = "argument"; private PageFactory pageFactory; ArrayList catalogueList = new ArrayList<>(); - + ArrayList catalogCached = new ArrayList<>(); @BindView(R.id.lv_catalogue) ListView lv_catalogue; +/* @BindView(R.id.tvTitle) + TextView tvTitle; + @BindView(R.id.tvChapts) + TextView tvChapters; + @BindView(R.id.btnSort) + ImageButton ibSort;*/ + + CatalogueAdapter catalogueAdapter; protected void processArguments(){ if (getArguments() != null) { Bundle bundle = getArguments() ; @@ -46,18 +62,60 @@ public class CatalogFragment extends BasicFragment { } } + boolean isAsc = true; @Override protected void fillData() { - + catalogueList.clear(); catalogueList.addAll(pageFactory.getChapters()); - CatalogueAdapter catalogueAdapter = new CatalogueAdapter(getContext(), catalogueList); - catalogueAdapter.setCharter(pageFactory.getCurrentChapter()); + + // int currentChp =pageFactory.getCurrentChapter()-1; + int currentChp =pageFactory.getNovle().getLastReadChapt()-1; + if(!isAsc){ + catalogueList =revertArray(); + currentChp = catalogueList.size() -currentChp-1; + + } + + catalogueAdapter = new CatalogueAdapter(getContext(), catalogueList); + catalogueAdapter.setCharter(currentChp+1); lv_catalogue.setAdapter(catalogueAdapter); + catalogueAdapter.setCahedChapters(catalogCached); catalogueAdapter.notifyDataSetChanged(); + int count= lv_catalogue.getCount(); + if(count >=pageFactory.getCurrentChapter() ){ + lv_catalogue.setSelection(currentChp); + } + + /* tvTitle.setText(pageFactory.getBookName()); + tvChapters.setText(String.format("共%s章",catalogueList.size()));*/ + + + } + ArrayList revertArray(){ + ArrayList tmp = new ArrayList<>(); + + for(int i = catalogueList.size()-1;i>=0;i--){ + tmp.add(catalogueList.get(i)); + + } + + return tmp; + + } + + /* @OnClick(R.id.btnSort) + void Onclick(View view){ + if(view.getId() == R.id.btnSort){ + Log.d(TAG, "Onclick: sorted"); + catalogueList = getArray(); + catalogueAdapter.notifyDataSetChanged(); + } + + }*/ @Override protected int getLayoutRes() { return R.layout.fragment_catalog; @@ -66,6 +124,8 @@ public class CatalogFragment extends BasicFragment { @Override protected void initData() { + ((MarkActivity) getActivity()).setSortcat(this); + showProgressDialog(false,"请稍等"); pageFactory = PageFactory.getInstance(); @@ -75,6 +135,20 @@ public class CatalogFragment extends BasicFragment { new Thread() { @Override public void run() { + ArrayList list =(ArrayList) LitePal.where("novelId=?" ,pageFactory.getNovle().getId()+"").find(Chapter.class); + File file; + for(Chapter cp : list){ + if(!TextUtils.isEmpty(cp.getChapterPath())) { + String filename =pageFactory.getChapterFileName(cp.getIndex()); + file = new File(filename); + if(file.exists()) { + Log.d(TAG, String .format("prepare book: load cats,chapter %s ,id %s,file %s is exist" ,cp.getChapterName(),cp.getIndex() , filename)); + + catalogCached.add(cp.getIndex()); + } + } + } + int slepttime = 0; while (NetUtil.isNetworkConnected() &&( slepttime < 1000 && ( pageFactory.isReadingCatalogs() || pageFactory.getChapters().size() == 0))) { try { @@ -113,61 +187,16 @@ public class CatalogFragment extends BasicFragment { // if(pageFactory.getPageWidget()==null){ Novel novel = pageFactory.getNovle(); + Chapter cp = catalogueList.get(position); + Log.d(TAG, String .format("prepare book: catalog list postion %s, cp.index %s ,cp.name %s ",position,cp.getIndex(),cp.getChapterName())); if(novel!=null){ - novel.setLastReadChapt(position+1); + + novel.setLastReadChapt(cp.getIndex()); novel.setLastReadPos(1); ReadActivity.openBook(novel, getActivity()); - /* new Thread() { - @Override - public void run() { - try { - sleep(40); - } catch (InterruptedException e) { - e.printStackTrace(); - } - ReadActivity.openBook(novel, getActivity()); - }}.start();*/ + } - // }else { - // pageFactory.changeChapter(position+1); - // } - /*new Thread() { - @Override - public void run() { - super.run(); - int slepttime =0; - int chapid = position+1; - - File f = new File(pageFactory.getChapterFileName(chapid)) ; - - while( pageFactory.getChapters().size() ==0 || !f.exists()){ - try { - sleep(50); - slepttime+=1; - if(pageFactory.getChapters().size()>0){ - //Log.d(TAG, String .format("prepare book: slept %s for loading chapter content %s,chapter.getid %s " , slepttime*50, chapid,pageFactory.getChapters().get(chapid-1).getId())); - - }else{ - // Log.d(TAG, String .format("prepare book: slept %s for loading pageFactory.getChapters().size() %s " , slepttime*50, pageFactory.getChapters().size())); - - } - } catch (InterruptedException e) { - e.printStackTrace(); - } - if(slepttime>100) - { - break; - } - } - Log.d(TAG, String .format("prepare book: total slept %s for loading chapter content %s,chapter.getid %s " , slepttime*50, chapid,pageFactory.getChapters().get(chapid-1).getId())); - - handler.sendEmptyMessage(2); - *//* if(getActivity()!=null) { - getActivity().finish(); - }*//* - } - }.start();*/ getActivity().finish(); @@ -200,4 +229,12 @@ public class CatalogFragment extends BasicFragment { } + @Override + public void sortList() { + isAsc =!isAsc; + + fillData(); + + + } } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java index d36ec97..aec70be 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_Shelf.java @@ -198,8 +198,15 @@ public class Fragment_Shelf extends BasicFragment { .setBackgroundColor(getResources().getColor(android.R.color.transparent)); TextView tv =(TextView) bottomSheetDialog.findViewById(R.id.bdTitle); + tv.setText(bookLists.get(position).getName()); + LinearLayout lldetail=(LinearLayout) bottomSheetDialog.findViewById(R.id.llBookdetail); + lldetail.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + showBookDetail(bookLists.get(position)); + } + }); bottomSheetDialog.show(); } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java index e15ec53..351768a 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java @@ -6,6 +6,7 @@ import android.support.v7.widget.RecyclerView; import android.util.Log; import android.view.View; +import com.ixiaow.multilayout.MultiLayout; import com.novelbook.android.R; import com.novelbook.android.adapter.BandanAdapterNew; import com.novelbook.android.adapter.BookListAdapter; @@ -20,6 +21,7 @@ import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.OnItemClickListener; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import butterknife.BindView; @@ -36,7 +38,16 @@ public class Fragment_bangdan extends BasicFragment { // private List mData; @BindView(R.id.rvBangdan) RecyclerView rvBandan; - +// @BindView(R.id.topic_layout) +// MultiLayout topic_layout; + private static final String[] TAB_NAMES = { + "全部", "赛事", "原创", "少年", "少女", "日漫", + "杂志", "热血", "搞笑", "治愈", "惊秫", "古风", + "全部全部", "赛事2", "原创1", "少年2", "少女1", "日漫2", + "杂志eeee3", "热血2", "搞笑1", "治愈2", "惊秫2", "古风2", + "全部1", "赛事1", "原创2", "少年1", "少女", "日漫2", + "杂志1", "热血1", "搞笑2", "治愈1", "惊秫1", "古风1" + }; public static Fragment_bangdan newInstance(String param1, String param2) { Fragment_bangdan fragment = new Fragment_bangdan(); Bundle args = new Bundle(); @@ -139,7 +150,7 @@ public class Fragment_bangdan extends BasicFragment { public void initViews(){ - + //topic_layout.initTabNames(Arrays.asList(TAB_NAMES)); } void initialBookList() { 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 5d6472b..5fd903b 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 @@ -284,7 +284,8 @@ public class Fragment_booklist extends BasicFragment { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); - + Log.d(TAG, String.format("onScrollStateChanged , state %s ,lastVisibleitem %s ,getItemCount %s,pageno %s ,pageCount %s", + newState==RecyclerView.SCROLL_STATE_IDLE,lastVisibleItem,mAdapter.getItemCount(),pageNo,pageCount)); //判断RecyclerView的状态 是空闲时,同时,是最后一个可见的ITEM时才加载 if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==mAdapter.getItemCount()){ 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 2b4d4c6..1dbfe03 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 @@ -1,29 +1,51 @@ package com.novelbook.android.Fragments; import android.os.Bundle; +import android.os.Handler; +import android.os.Message; import android.support.v4.widget.NestedScrollView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.util.Log; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; +import com.google.gson.Gson; +import com.ixiaow.multilayout.MultiLayout; import com.novelbook.android.R; + +import com.novelbook.android.adapter.JudgeNestedScrollView; +import com.novelbook.android.bean.Progress; 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.GsonUtil; import com.novelbook.android.utils.OnItemClickListener; import com.novelbook.android.adapter.BookListAdapter; import com.flyco.tablayout.CommonTabLayout; import com.flyco.tablayout.listener.CustomTabEntity; import com.flyco.tablayout.listener.OnTabSelectListener; +import org.json.JSONArray; +import org.json.JSONObject; + import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import butterknife.BindView; -public class Fragment_paihang extends BasicFragment { +import static com.novelbook.android.utils.Constants.lstNt; +import static com.novelbook.android.utils.Constants.lstProgress; +import static com.novelbook.android.utils.Constants.lstSex; +public class Fragment_paihang extends BasicFragment { +final String TAG = Fragment_paihang.class.getSimpleName(); public static String getFTag() { return "com.novelbook.android.Fragments.Fragment_paihang"; @@ -34,15 +56,26 @@ public class Fragment_paihang extends BasicFragment { private BookListAdapter mAdapter; // private BookListAdapter mAdapter; private List mData;; - + private List mMoreData; @BindView(R.id.rvPaihang) RecyclerView rvPaihang; - @BindView(R.id.tab_layout1) + /* @BindView(R.id.tab_layout1) CommonTabLayout tabLayout1; @BindView(R.id.tab_layout2) CommonTabLayout tabLayout2; - @BindView(R.id.tab_layout3) + @BindView(R.id.tab_layout3)*/ CommonTabLayout tabLayout3; + @BindView(R.id.topic_layout) + MultiLayout topic_layout; + @BindView(R.id.topic_layout1) + MultiLayout topic_layout1; + @BindView(R.id.topic_layout2) + MultiLayout topic_layout2; + + + + + public Fragment_paihang() { // Required empty public constructor @@ -50,13 +83,28 @@ public class Fragment_paihang extends BasicFragment { protected void processArguments(){ if (getArguments() != null) { Bundle bundle = getArguments() ; - - - } + } @Override protected void fillData() { + if(rvPaihang.getAdapter()==null) { + rvPaihang.setLayoutManager(new LinearLayoutManager(activity)); + rvPaihang.setAdapter(mAdapter); + } + if(mMoreData!=null) { + if(mMoreData.size()>0) { + pageNo++; + } + int status = pageCount >= pageNo ? BookListAdapter.LOADING_MORE : BookListAdapter.NO_LOAD_MORE; + // mAdapter.setPercent(pageNo/pageCount); + mAdapter.AddFooterItem(mMoreData); + mAdapter.changeMoreStatus(status); + + } + + mAdapter.notifyDataSetChanged(); + } public static Fragment_paihang newInstance(String param1, String param2) { @@ -73,9 +121,8 @@ public class Fragment_paihang extends BasicFragment { if (getArguments() != null) { } - initData(); - } + } @Override protected int getLayoutRes() { @@ -84,155 +131,262 @@ public class Fragment_paihang extends BasicFragment { @Override public void initData() { + tmp=0; + loadSearchData(); + } + private void loadSearchData(){ + int pn = pageNo; + String sex = lstSex.get(tab1Pos); + String cate = lstNt.get(tab2Pos); + if(pageNo==1) { - mData =initData(mData,'Z'); - mData1= new ArrayList<>(); - mData2 = new ArrayList<>(); - mData3 = new ArrayList<>(); - mData1.add(new TabEntry("男A",0,0) ); - mData1.add(new TabEntry("女A",0,0)); - for (int i = 'A'; i < 'F'; i++) - { - mData2.add(new TabEntry("类" + (char) i,0,0) ); - if(i<'D') - mData3.add(new TabEntry("榜" + (char) i,0,0) ); + if (mData != null) { //下拉刷新 + mData = new ArrayList(); + mAdapter.setData(mData); + + } else { + + mData = new ArrayList(); + mAdapter = new BookListAdapter(activity, mData, R.layout.recycle_list_item_horizon, new OnItemClickListener() { + + @Override + public void onItemClick(View view, int position) { + showBookDetail(mData.get(position)); + // openBook(mData.get(position),mAdapter); + } + + @Override + public void onItemLongClick(View view, int position) { + // initDialog(position); + // mAdapter.removeData(position); + } + + @Override + public void onLinearOutClick(View view, int position, int llId) { + Toast.makeText(activity, "book " + position + " clicked", + Toast.LENGTH_SHORT).show(); + } + }); + mAdapter.setShowFootView(true); + rvPaihang.setLayoutManager(new LinearLayoutManager(activity)); + rvPaihang.setAdapter(mAdapter); + + } } - mAdapter = new BookListAdapter(activity, mData, R.layout.recycle_list_item_shudan, new OnItemClickListener() { + + + + mMoreData =null; + OnSuccessAndFaultListener successAndFaultListener = new OnSuccessAndFaultListener() { @Override - public void onItemClick(View view, int position) { - showBookDetail(mData.get(position) ); - //openBook(mData.get(position),mAdapter); + public void onSuccess(String result) { + + // mFirstPage= gson.fromJson(result, FirstPage.class); + try { + JSONObject jsonObject = new JSONObject(result); + pageCount = jsonObject.getInt("pageCount"); + + mMoreData = GsonUtil. parserJsonArray(jsonObject,Constants.BLOCK_TITLE_NOVELS); + + } catch (Exception e) { + e.printStackTrace(); + } + handler.sendEmptyMessage(1); + } @Override - public void onItemLongClick(View view, int position) { - // initDialog(position); - // mAdapter.removeData(position); + public void onFault(String errorMsg) { + //失败 + Log.d(TAG, "error on get firstpage: " + errorMsg); + handler.sendEmptyMessage(1); } + }; + + BookSubscribe.getCateNovelList(cate, pageNo, tab1Pos+1, tab3Pos+1, new OnSuccessAndFaultSub(successAndFaultListener, getActivity())); + - @Override - public void onLinearOutClick(View view, int position ,int llId) { - Toast.makeText(activity, "book " + position + " clicked", - Toast.LENGTH_SHORT).show(); - } - }); } @Override public void initViews(){ +/* + showProgressDialog(false,"加载。。。。"); + new Thread(){ + @Override + public void run() { + Log.d(TAG, "changing Source: to get site rule" ); + while(lstNt==null){ + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + handler.sendEmptyMessage(2); + } + }.start();*/ + + + //setScrollListner(); + initLoadMoreListener(); initTabs(); - initialBookList(); - setScrollListner(); + } - class TabEntry implements CustomTabEntity{ - - public String title; - public int selectedIcon; - public int unSelectedIcon; - - public TabEntry(String title, int selectedIcon, int unSelectedIcon) { - this.title = title; - this.selectedIcon = selectedIcon; - this.unSelectedIcon = unSelectedIcon; - } - - @Override - public String getTabTitle() { - return title; - } - - @Override - public int getTabSelectedIcon() { - return selectedIcon; - } - - @Override - public int getTabUnselectedIcon() { - return unSelectedIcon; - } - } - private void initTabs() { - tabLayout1.setTabData(mData1); - tabLayout1.setOnTabSelectListener(new OnTabSelectListener() { + /* + while(lstNt==null){ + try { + Thread.sleep(10); + } catch (InterruptedException e) { + e.printStackTrace(); + } + }*/ + + + topic_layout.initTabNames(lstNt) ; + topic_layout1.initTabNames( lstSex) ; + topic_layout2.initTabNames(Arrays.asList(lstProgress)) ; + // topic_layout.initTabNames(lstNt); + + topic_layout.setOnTabSelectListener(new MultiLayout.OnTabSelectListener() { @Override - public void onTabSelect(int position) { - tab1Pos = position; + public void select(TextView textView, int i, int i1) { + Log.d(TAG, String.format("select: text %s,i %s i1 %s ",textView.getText(),i,i1)); + tab2Pos = i1; + tabChanged(); + } + + + }); + topic_layout1.setOnTabSelectListener(new MultiLayout.OnTabSelectListener() { + @Override + public void select(TextView textView, int i, int i1) { + Log.d(TAG, String.format("select: text %s,i %s i1 %s ",textView.getText(),i,i1)); + tab1Pos = i1; tabChanged(); } - @Override - public void onTabReselect(int position) { - //TODO 重选 - } }); - - tabLayout2.setTabData(mData2); - - tabLayout2.setOnTabSelectListener(new OnTabSelectListener() { + topic_layout2.setOnTabSelectListener(new MultiLayout.OnTabSelectListener() { @Override - public void onTabSelect(int position) { - tab2Pos = position; + public void select(TextView textView, int i, int i1) { + Log.d(TAG, String.format("select: text %s,i %s i1 %s ",textView.getText(),i,i1)); + tab3Pos = i1; tabChanged(); } - - @Override - public void onTabReselect(int position) { - //TODO 重选 - } }); - tabLayout3.setTabData(mData3); - tabLayout3.setOnTabSelectListener(new OnTabSelectListener() { - @Override - public void onTabSelect(int position) { - tab3Pos = position; - tabChanged(); - } + // tabChanged(); - @Override - public void onTabReselect(int position) { - //TODO 重选 - } - }); - tabChanged(); } - + int tmp=0; void tabChanged() { + + Log.d(TAG, String.format("tabChanged: to load data tmp %s" , tmp )); + tmp++; + /* Toast.makeText(activity, String.format( "TAB1 :{0}, TAB2 :{1}, TAB3 :{3}", mData1.get(tab1Pos).getTabTitle(), mData2.get(tab2Pos).getTabTitle(), mData3.get(tab3Pos).getTabTitle()), Toast.LENGTH_SHORT).show(); - - */ - String selectedKey = mData1.get(tab1Pos).getTabTitle() +" " + + String selectedKey = mData1.get(tab1Pos).getTabTitle() +" " + mData2.get(tab2Pos).getTabTitle() +" " + mData3.get(tab3Pos).getTabTitle() ; - initialBookList(); + */ + if(lstSex==null) return; + + pageNo=1; + + String sex = lstSex.get(tab1Pos); + String cate = lstNt.get(tab2Pos); + String selectedKey = lstSex.get(tab1Pos) +" " + + cate +" " + + lstProgress[tab3Pos] ; + + + Toast.makeText(activity, selectedKey, Toast.LENGTH_SHORT).show(); tvHint.setText(selectedKey); + Log.d(TAG, String.format("tabChanged: to load data %s,pageno %s" , selectedKey,pageNo )); + + if( tmp<4) return; + loadSearchData(); + } + private void initLoadMoreListener() { + rvPaihang.addOnScrollListener(new RecyclerView.OnScrollListener() { + int lastVisibleItem ,visibleItemCount,totalItemCount,pastVisiblesItems; + + @Override + public void onScrollStateChanged(RecyclerView recyclerView, int newState) { + super.onScrollStateChanged(recyclerView, newState); + + //判断RecyclerView的状态 是空闲时,同时,是最后一个可见的ITEM时才加载 + + Log.d(TAG, String.format("onScrollStateChanged , state %s ,lastVisibleitem %s ,getItemCount %s,pageno %s ,pageCount %s", + newState==RecyclerView.SCROLL_STATE_IDLE,lastVisibleItem,mAdapter.getItemCount(),pageNo,pageCount)); + if(newState==RecyclerView.SCROLL_STATE_IDLE&&lastVisibleItem+1==mAdapter.getItemCount()){ + + if(pageNo <= pageCount) { + //设置正在加载更多 + mAdapter.changeMoreStatus(mAdapter.LOADING_MORE); + + //改为网络请求 + loadSearchData(); + }else{ + mAdapter.changeMoreStatus(mAdapter.NO_LOAD_MORE); + } + + } + + } + + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + + LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); + + // if (dy > 0) { + visibleItemCount = layoutManager.getChildCount(); + totalItemCount = layoutManager.getItemCount(); + pastVisiblesItems = layoutManager.findFirstVisibleItemPosition(); + + + // } + Log.d(TAG, String.format("onScrolled:dy %s,visibleItemCount %s,totalItemCount %s,pastVisiblesItems %s ", + dy, visibleItemCount,totalItemCount,pastVisiblesItems)); + //最后一个可见的ITEM + lastVisibleItem=layoutManager.findLastVisibleItemPosition(); + lastVisibleItem=layoutManager.findLastCompletelyVisibleItemPosition(); + } + }); + + } //----------------绑定列表 + void initialBookList() { - rvPaihang.setLayoutManager(new LinearLayoutManager(activity)); - rvPaihang.setAdapter(mAdapter); + // rvPaihang.setLayoutManager(new LinearLayoutManager(activity)); + // rvPaihang.setAdapter(mAdapter); } - + @BindView(R.id.tvHint) + TextView tvHint; //------------滑动监听 - @BindView(R.id.n_scroll_view) - NestedScrollView mNestedScrollView; + /* @BindView(R.id.n_scroll_view) + JudgeNestedScrollView mNestedScrollView; @BindView(R.id.llTabs) LinearLayout llTabs; @BindView(R.id.tvHint) @@ -259,6 +413,7 @@ public class Fragment_paihang extends BasicFragment { // 随着滑动距离改变透明度 // Log.e("al=","="+alpha); // re.setBackgroundColor(Color.argb(alpha, 255, 0, 0)); + mNestedScrollView.setNeedScroll(true); } else { tvHint.setVisibility(View.VISIBLE); // if (alpha < 255) { @@ -267,19 +422,54 @@ public class Fragment_paihang extends BasicFragment { // alpha = 255; // re.setBackgroundColor(Color.argb(alpha, 255, 0, 0)); // } + mNestedScrollView.setNeedScroll(false); } + *//* LinearLayoutManager layoutManager = (LinearLayoutManager) NestedScrollView.getLayoutManager(); + int lastVisibleItemPosition = 0; + int totalItemCount = layoutManager.getItemCount(); + + if(v.getChildAt(v.getChildCount() - 1) != null) { + if (scrollY >= (v.getChildAt(v.getChildCount()-1).getMeasuredHeight() - v.getMeasuredHeight()) + && scrollY > oldScrollY) { + if (layoutManager instanceof LinearLayoutManager) { + lastVisibleItemPosition = ((LinearLayoutManager) layoutManager).findLastVisibleItemPosition(); + } + + if (totalItemCount < previousTotalItemCount) { + this.currentPage = this.startingPageIndex; + this.previousTotalItemCount = totalItemCount; + if (totalItemCount == 0) { + this.loading = true; + } + } + + if (loading && (totalItemCount > previousTotalItemCount)) { + loading = false; + previousTotalItemCount = totalItemCount; + } + + if (!loading && (lastVisibleItemPosition + visibleThreshold) > totalItemCount) { + currentPage++; + onLoadMore(); + loading = true; + } + } + }*//* + + + } }); } - +*/ @Override public void onResume() { super.onResume(); //mNestedScrollView.smoothScrollBy(1,1); - tvHint.setVisibility(isShowHint? View.VISIBLE:View.GONE); + // tvHint.setVisibility(isShowHint? View.VISIBLE:View.GONE); } diff --git a/zhuike/src/main/java/com/novelbook/android/Main2Activity.java b/zhuike/src/main/java/com/novelbook/android/Main2Activity.java index cfa0b67..5ad02c2 100644 --- a/zhuike/src/main/java/com/novelbook/android/Main2Activity.java +++ b/zhuike/src/main/java/com/novelbook/android/Main2Activity.java @@ -32,6 +32,7 @@ import com.novelbook.android.netutils.OnSuccessAndFaultListener; import com.novelbook.android.netutils.OnSuccessAndFaultSub; import com.novelbook.android.utils.Config; import com.novelbook.android.utils.Constants; +import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.PageFactory; @@ -74,7 +75,7 @@ public class Main2Activity extends Activity_base // ButterKnife.bind(this); initialSexOption(); - + getSearchTabTtitle(); } @@ -523,5 +524,33 @@ private int bottomSelectedIndex; } }, this)); } + void getSearchTabTtitle(){ + BookSubscribe.getSearchTitles(new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + @Override + public void onSuccess(String result) { + // mFirstPage= gson.fromJson(result, FirstPage.class); + try { + + Constants.lstSex = GsonUtil.parserStringBlocks(result,"sex"); + Constants.lstNt =GsonUtil.parserStringBlocks(result,"nt"); + // Constants.lstProgress =GsonUtil.parserProgressBlocks(result,"progress"); + + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + @Override + public void onFault(String errorMsg) { + //失败 + Log.d(TAG, "error on get firstpage: " + errorMsg); + + + } + },this)); + + } } diff --git a/zhuike/src/main/java/com/novelbook/android/MarkActivity.java b/zhuike/src/main/java/com/novelbook/android/MarkActivity.java index b020f08..6f602ae 100644 --- a/zhuike/src/main/java/com/novelbook/android/MarkActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/MarkActivity.java @@ -7,6 +7,7 @@ import android.support.v7.widget.Toolbar; import android.util.DisplayMetrics; import android.util.Log; import android.view.View; +import android.widget.ImageButton; import com.flyco.tablayout.SlidingTabLayout; import com.novelbook.android.adapter.MyPagerAdapter; @@ -17,6 +18,7 @@ import com.novelbook.android.utils.PageFactory; import java.util.ArrayList; import butterknife.BindView; +import butterknife.OnClick; public class MarkActivity extends Activity_base { @@ -34,11 +36,13 @@ public class MarkActivity extends Activity_base { SlidingTabLayout tabLayout; // @Bind(R.id.lv_catalogue) // ListView lv_catalogue; + @BindView(R.id.btnSort) + ImageButton ibSort; - private PageFactory pageFactory; - private Config config; + private PageFactory pageFactory; + /* private Config config; private Typeface typeface; - private ArrayList catalogueList = new ArrayList<>(); + private ArrayList catalogueList = new ArrayList<>();*/ private DisplayMetrics dm; private String EXTR_BOOK ="book"; @@ -62,9 +66,9 @@ public class MarkActivity extends Activity_base { pageFactory = PageFactory.getInstance(); Log.d(TAG, "prepareBook: pagefactory.mbook is ?" + (pageFactory.getNovle() .getName()) ); - config = Config.getInstance(); - dm = getResources().getDisplayMetrics(); - typeface = config.getTypeface(); + //config = Config.getInstance(); + // dm = getResources().getDisplayMetrics(); + // typeface = config.getTypeface(); setSupportActionBar(toolbar); //设置导航图标 @@ -93,5 +97,35 @@ public class MarkActivity extends Activity_base { protected void initListener() { } + @OnClick(R.id.btnSort) + void Onclick(View view){ + if(view.getId() == R.id.btnSort){ + Log.d(TAG, "Onclick: sorted"); + if(sortcat!=null){ + sortcat.sortList(); + } + if(sortmark!=null){ + sortmark.sortList(); + } + } + + } + private Sortcat sortcat=null; + private Sortmark sortmark=null; + + public void setSortcat(Sortcat sort) { + this.sortcat = sort; + } + + + public void setSortmark(Sortmark sort) { + this.sortmark = sort; + } + public interface Sortmark { + public void sortList(); + } + public interface Sortcat { + public void sortList(); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/ReadActivity.java b/zhuike/src/main/java/com/novelbook/android/ReadActivity.java index 675fcd4..62880e6 100644 --- a/zhuike/src/main/java/com/novelbook/android/ReadActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/ReadActivity.java @@ -739,7 +739,7 @@ public class ReadActivity extends Activity_base implements SpeechSynthesizerLis private void showReadSetting(){ isShow = true; - rl_progress.setVisibility(View.GONE); + // rl_progress.setVisibility(View.GONE); if (isSpeaking){ Animation topAnim = AnimationUtils.loadAnimation(this, R.anim.dialog_top_enter); @@ -831,7 +831,7 @@ public class ReadActivity extends Activity_base implements SpeechSynthesizerLis R.id.tv_dayornight,R.id.tv_pagemode, R.id.tv_setting, R.id.bookpop_bottom, /*R.id.rl_bottom,*/R.id.tv_stop_read ,R.id.llTopAd}) public void onClick(View view) { - if( pageFactory.isReady()) + // if( pageFactory.isReady()) switch (view.getId()) { // case R.id.btn_return: // finish(); diff --git a/zhuike/src/main/java/com/novelbook/android/adapter/CatalogueAdapter.java b/zhuike/src/main/java/com/novelbook/android/adapter/CatalogueAdapter.java index 629bc17..61bee2c 100644 --- a/zhuike/src/main/java/com/novelbook/android/adapter/CatalogueAdapter.java +++ b/zhuike/src/main/java/com/novelbook/android/adapter/CatalogueAdapter.java @@ -19,15 +19,17 @@ import java.util.List; public class CatalogueAdapter extends BaseAdapter { private Context mContext; private List bookCatalogueList; + private List bookCatalogueListCached; private Typeface typeface; private Config config; private int currentCharter = 0; - public CatalogueAdapter(Context context, List bookCatalogueList) { + public CatalogueAdapter(Context context, List bookCatalogueList ) { mContext = context; this.bookCatalogueList = bookCatalogueList; config = config.getInstance(); typeface = config.getTypeface(); + } @Override @@ -49,6 +51,11 @@ public class CatalogueAdapter extends BaseAdapter { currentCharter = charter; } + public void setCahedChapters(List listCached ){ + bookCatalogueListCached =listCached; + notifyDataSetChanged(); + } + @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = LayoutInflater.from(mContext); @@ -58,6 +65,10 @@ public class CatalogueAdapter extends BaseAdapter { convertView = inflater.inflate(R.layout.zcataloguelistview_item,null); viewHolder.catalogue_tv = (TextView)convertView.findViewById(R.id.catalogue_tv); viewHolder.catalogue_tv.setTypeface(typeface); + viewHolder.getCatalogue_cache =(TextView)convertView.findViewById(R.id.catalogue_cache); + viewHolder.getCatalogue_cache.setTypeface(typeface); + // viewHolder.getCatalogue_cache.setTextSize( viewHolder.catalogue_tv.getTextSize()-2); + viewHolder.getCatalogue_cache.setTextColor( mContext.getResources().getColor(R.color.light_gray)); convertView.setTag(viewHolder); }else { viewHolder = (ViewHolder)convertView.getTag(); @@ -67,12 +78,20 @@ public class CatalogueAdapter extends BaseAdapter { }else{ viewHolder.catalogue_tv.setTextColor(mContext.getResources().getColor(R.color.dark_gray)); } - viewHolder.catalogue_tv.setText(bookCatalogueList.get(position).getChapterName()); + Chapter chapter = bookCatalogueList.get(position); + + viewHolder.catalogue_tv.setText(chapter.getChapterName()); + viewHolder.getCatalogue_cache.setVisibility(View.GONE); + if(bookCatalogueListCached.contains(chapter.getIndex())) { + viewHolder.getCatalogue_cache.setVisibility(View.VISIBLE); + } + //Log.d("catalogue",bookCatalogueList.get(position).getBookCatalogue()); return convertView; } class ViewHolder { TextView catalogue_tv; + TextView getCatalogue_cache; } } diff --git a/zhuike/src/main/java/com/novelbook/android/adapter/JudgeNestedScrollView.java b/zhuike/src/main/java/com/novelbook/android/adapter/JudgeNestedScrollView.java new file mode 100644 index 0000000..904f3f4 --- /dev/null +++ b/zhuike/src/main/java/com/novelbook/android/adapter/JudgeNestedScrollView.java @@ -0,0 +1,38 @@ +package com.novelbook.android.adapter; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.widget.NestedScrollView; +import android.util.AttributeSet; +import android.view.MotionEvent; + +public class JudgeNestedScrollView extends NestedScrollView { + private boolean isNeedScroll = true; + public JudgeNestedScrollView(@NonNull Context context) { + super(context); + } + + public JudgeNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public JudgeNestedScrollView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + /* switch (ev.getAction()) { + case MotionEvent.ACTION_MOVE: + return isNeedScroll; + }*/ //will cause tab no response + return super.onInterceptTouchEvent(ev); + } + + /* + 改方法用来处理NestedScrollView是否拦截滑动事件 + */ + public void setNeedScroll(boolean isNeedScroll) { + this.isNeedScroll = isNeedScroll; + } +} diff --git a/zhuike/src/main/java/com/novelbook/android/bean/Progress.java b/zhuike/src/main/java/com/novelbook/android/bean/Progress.java new file mode 100644 index 0000000..2328461 --- /dev/null +++ b/zhuike/src/main/java/com/novelbook/android/bean/Progress.java @@ -0,0 +1,22 @@ +package com.novelbook.android.bean; + +public class Progress { + private int id; + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/zhuike/src/main/java/com/novelbook/android/db/Novel.java b/zhuike/src/main/java/com/novelbook/android/db/Novel.java index 0bda50e..5330ebf 100644 --- a/zhuike/src/main/java/com/novelbook/android/db/Novel.java +++ b/zhuike/src/main/java/com/novelbook/android/db/Novel.java @@ -31,7 +31,7 @@ public class Novel extends LitePalSupport implements Serializable{ private String chapterName; private String desc; private String progress; - private long lastUpateTime; + private long lastUpdateTime; private boolean isOnShelf; //是否入书架 private boolean isFinished; //是否完本 @@ -187,11 +187,11 @@ public class Novel extends LitePalSupport implements Serializable{ public long getLastUpateTime() { - return lastUpateTime; + return lastUpdateTime; } public void setLastUpateTime(long lastUpateTime) { - this.lastUpateTime = lastUpateTime; + this.lastUpdateTime = lastUpateTime; } public boolean isOnShelf() { diff --git a/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java b/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java index 1803433..9502fe6 100644 --- a/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java +++ b/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java @@ -81,7 +81,8 @@ public interface HttpApi { Observable getSiteRankDetail(@Query("fn")String fn,@Query("pn")int pageNo,@Query("sex") int Sex); @GET( "search/{keyword}/{pageno}") Observable getSeachNolvelist(@Path("keyword")String keyWord,@Path("pageno")int pageNo,@Query("sex") int Sex); - - + // 搜索分类 http://xiaoshuofenxiang.com/api/page/topdata + @GET("page/topdata") + Observable getSearchTitles(); } diff --git a/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java b/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java index 476d0dd..5b5931e 100644 --- a/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java +++ b/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java @@ -75,5 +75,9 @@ public class BookSubscribe { Observable observable = HttpMethods.getInstance().getHttpApi().getSeachNolvelist(keyWord,pageNo,sex); HttpMethods.getInstance().toSubscribe(observable, subscriber); } + public static void getSearchTitles(DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getSearchTitles(); + HttpMethods.getInstance().toSubscribe(observable, subscriber); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java b/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java index 6666cf0..5b59a07 100644 --- a/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java +++ b/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java @@ -174,7 +174,7 @@ public class OnSuccessAndFaultSub extends DisposableObserver try { // final String result = CompressUtils.decompress(body.byteStream()); final String result =body.string(); - Log.e("body", result); + // Log.e("body", result); JSONObject jsonObject = new JSONObject(result); int resultCode = jsonObject.getInt("code"); if (resultCode == 0) { @@ -182,7 +182,7 @@ public class OnSuccessAndFaultSub extends DisposableObserver } else { String errorMsg = jsonObject.getString("message"); mOnSuccessAndFaultListener.onFault(errorMsg); - Log.e("OnSuccessAndFaultSub", "errorMsg: " + errorMsg); + Log.e("OnSuccessAndFaultSub", "errorMsg: " + errorMsg); } } catch (Exception e) { Toast.makeText(context,"出错了" + e.getMessage(),Toast.LENGTH_LONG); 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 14bdab8..1927a2f 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/BookUtil.java @@ -121,7 +121,7 @@ public class BookUtil { return mNovelSites; } - public synchronized void openBook(Novel novel) throws IOException, InterruptedException { + public synchronized void openBook(Novel novel, long chapter) throws IOException, InterruptedException { this.mNovel = novel; //如果当前缓存不是要打开的书本就缓存书本同时删除缓存 @@ -150,6 +150,15 @@ public class BookUtil { } } }else{ //读取目录列表 + Log.d(TAG, String.format("prepare book %s open chapter %s in background.... mMuluStatus %s,mSiteRule %s,thread %s",mNovel.getName(),chapter,mMuluStatus,mSiteRule,Thread.currentThread().getName()) ); + + File file =new File(fileChapterName((int)chapter)); + + if( file.exists()){ + Log.d(TAG, String.format("prepare book open chapter file %s, exist,not waiting more...to open file...",fileChapterName((int)chapter) )); + return; + } + MuluStatus m = mMuluStatus; // Log.d(TAG,String.format("mulu on Site %s download status %s",mSite.getDomain(),mMuluStatus)); @@ -159,16 +168,17 @@ public class BookUtil { while( mSiteRule ==null || mMuluStatus==null || mMuluStatus == MuluStatus.isDownloading){ sleptTime++; - if(sleptTime >100 || !NetUtil.isNetworkConnected()){ + if(sleptTime >400 || sleptTime >30 && !NetUtil.isNetworkConnected()){ break; } - Thread.sleep(50); - Log.d(TAG,String.format("prepare book %s waiting for mulu downloading ,mMuluStatus %s,msiteRule %s" ,mNovel.getName(),mMuluStatus,mSiteRule)); - if(mMuluStatus == MuluStatus.failed){ - throw new RuntimeException("读取资源失败,请检查网络"); + Thread.sleep(50); + if(mMuluStatus == MuluStatus.failed){ + Log.d(TAG,String.format("prepare book %s failed ,mMuluStatus %s,msiteRule %s,slept %s" ,mNovel.getName(),mMuluStatus,mSiteRule,sleptTime*50)); + // throw new RuntimeException("读取资源失败,请检查网络"); } } + Log.d(TAG,String.format("prepare book %s waiting for mulu downloading ,mMuluStatus %s,msiteRule %s,slept %s" ,mNovel.getName(),mMuluStatus,mSiteRule,sleptTime*50)); } // dismissProgressDialog(); @@ -522,7 +532,7 @@ public class BookUtil { - +int muluRetryCount =0; void readChaptersAsync( ) { String url = mSite.getMuluUrl(); @@ -531,47 +541,84 @@ public class BookUtil { long startTime= new Date().getTime(); Log.d(TAG,String.format("loadChapts----start download %s 目录 from %s", mNovel.getName() ,url )); + /* if(muluRetryCount<3){ + muluRetryCount++; + return; + } + + if(muluRetryCount>=3) { + return; + }*/ HttpMethods.getOkClient().newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { - // Log.d(TAG, "onFailure: " + e.getMessage()); - Log.e(TAG, "loadChapts---- failed: ",e ); - Log.d(TAG,String.format("loadChapts---- failed %s 目录 from %s", mNovel.getName() ,url )); + // Log.d(TAG, "onFailure: " + e.getMessage()); + Log.e(TAG, "prepare book loadChapts---- failed: ", e); + Log.d(TAG, String.format("prepare book loadChapts---- failed %s 目录 from %s", mNovel.getName(), url)); handler.sendEmptyMessage(3); //TODO 如果是取消了访问,则返回 - if(e.toString().contains("closed") ||e.getMessage().contains("Canceled")) - { + if (e.toString().contains("closed") || e.getMessage().contains("Canceled")) { + Log.d(TAG, String.format("prepare book loadChapts---- canceled %s 目录 from %s", mNovel.getName(), url)); + + return; } + mMuluStatus = MuluStatus.failed; + + if (muluRetryCount < 3) { + try { + Thread.sleep(50); + } catch (InterruptedException e1) { + e1.printStackTrace(); + } + muluRetryCount++; + Log.d(TAG,String.format("prepare book loadChapts----failed, retrying count %s",muluRetryCount )); + readChaptersAsync(); + } + if (mNovelSites.getSites().length == 1) { //仅有一个rule,且失败了 + + // mMuluStatus = MuluStatus.failed; - if( mNovelSites.getSites().length ==1){ //仅有一个rule,且失败了 - mMuluStatus = MuluStatus.failed; return; } //try next site - for(Site st : mNovelSites.getSites() ){ - if(!st.getDomain().equals(mSite.getDomain())){ - mSite =st; - break; - } - } - // readChaptersAsync(); - getSiteRule(); - } + + for (Site st : mNovelSites.getSites()) { + if (!st.getDomain().equals(mSite.getDomain())) { + mSite = st; + break; + } + } + muluRetryCount=0; + + // readChaptersAsync(); + getSiteRule(); + } + @Override public void onResponse(Call call, Response response){ ResponseBody body = response.body(); + + + if(response.code()!=200){ - Log.d(TAG,String.format("loadChapts----failed, %s 目录 from %s,return code %s", mNovel.getName() ,url,response.code() )); + Log.d(TAG,String.format("prepare book loadChapts----failed, %s 目录 from %s,return code %s", mNovel.getName() ,url,response.code() )); handler.sendEmptyMessage(3); mMuluStatus = MuluStatus.failed; + if(muluRetryCount <3){ + Log.d(TAG,String.format("prepare book loadChapts----failed, response code %s retrying count %s",response.code(), muluRetryCount )); + muluRetryCount++; + readChaptersAsync(); + } return; } + + muluRetryCount =0; if (body != null) { Log.d(TAG, String.format("prepare book %s 章节信息读取成功.thread %s",mNovel.getName(),Thread.currentThread().getName()) ); try { @@ -580,7 +627,7 @@ public class BookUtil { // Log.d(TAG,String.format("loadChaptContent----end download %s 目录, 目录数量 %s, cost %s", mNovel.getName() , mChapters.size(), new Date().getTime() -startTime )); // long startTime2= new Date().getTime(); buildChapters(bodyStr,url); - Log.d(TAG,String.format("loadChapts----end download %s 目录, 目录数量 %s, cost %s", mNovel.getName() , mChapters.size(), new Date().getTime() -startTime )); + Log.d(TAG,String.format("prepare book loadChapts----end download %s 目录, 目录数量 %s, cost %s", mNovel.getName() , mChapters.size(), new Date().getTime() -startTime )); mMuluStatus = MuluStatus.isDone; Log.d(TAG, String.format("prepare book %s 章节信息完成.",mNovel.getName()) ); @@ -623,7 +670,7 @@ public class BookUtil { }*/ } catch (JSONException e) { // } catch (JSONException | IOException e) { - Log.d(TAG,String.format("mulu on Site %s download status %s",mSite.getDomain(),mMuluStatus)); + Log.d(TAG,String.format("prepare book, mulu on Site %s download status %s",mSite.getDomain(),mMuluStatus)); e.printStackTrace(); } finally { // result.close(); @@ -1139,109 +1186,121 @@ public class BookUtil { try { File file = new File(fileChapterName(index)); - if(!file.exists()) { + if (!file.exists()) { - if(mMuluStatus ==null){ - Log.d(TAG,String.format("prepare book loadChapts---- 还未有目录信息,出错了 %s 目录, 目录数量 %s, MuluStatus %s ,thread %s", mNovel.getName() , mChapters.size(), mMuluStatus,Thread.currentThread().getName() )); - // getTargetSites(); + if (mMuluStatus == null) { + Log.d(TAG, String.format("prepare book loadChapts---- 还未有目录信息,出错了 %s 目录, 目录数量 %s, MuluStatus %s ,thread %s", mNovel.getName(), mChapters.size(), mMuluStatus, Thread.currentThread().getName())); + // getTargetSites(); } int slept = 0; - while(NetUtil.isNetworkConnected() && slept <100 && mMuluStatus ==MuluStatus.isDownloading){ + while (NetUtil.isNetworkConnected() && slept < 100 && mMuluStatus == MuluStatus.isDownloading) { try { Thread.sleep(50); slept++; - Log.d(TAG,String.format("prepare book loadChapts----等待中 %s 目录, 目录数量 %s, slept %s, MuluStatus %s", mNovel.getName() , mChapters.size(),slept ,mMuluStatus )); + Log.d(TAG, String.format("prepare book loadChapts----等待中 %s 目录, 目录数量 %s, slept %s, MuluStatus %s", mNovel.getName(), mChapters.size(), slept, mMuluStatus)); } catch (InterruptedException e) { e.printStackTrace(); } } - if( !NetUtil.isNetworkConnected() || mChapters ==null || mChapters.size() ==0){ - Log.d(TAG,String.format("loadChapts----超时。。。或出错了 %s 目录, 目录数量 %s, slept %s, MuluStatus %s,thread %s", mNovel.getName() , mChapters.size(),slept ,mMuluStatus,Thread.currentThread().getName() )); + if (!NetUtil.isNetworkConnected() || muluRetryCount >= 3 && (mChapters == null || mChapters.size() == 0)) { + Log.d(TAG, String.format("loadChapts----超时。。。或出错了 %s 目录, 目录数量 %s, slept %s, MuluStatus %s,thread %s", mNovel.getName(), mChapters.size(), slept, mMuluStatus, Thread.currentThread().getName())); String error = "网络不给力"; - return error.toCharArray(); + return error.toCharArray(); } - Log.d(TAG,String.format("loadChaptContent----start %s" ,new Date().toString() )); + Log.d(TAG, String.format("loadChaptContent----start %s", new Date().toString())); + Log.d("loadChaptContent", String.format("begin to load content for chapter %s", index)); + Log.d("loadChaptContent", String.format("isDownloadChapt: %s", isDownloadChapt)); - Log.d( "loadChaptContent",String.format("begin to load content for chapter %s",index)); - Log.d( "loadChaptContent",String.format("isDownloadChapt: %s",isDownloadChapt)); - - if(!chaptDownStatus.containsKey(Integer.valueOf(index))){ - chaptDownStatus.put(index,DownloadStatus.downloading); + if (!chaptDownStatus.containsKey(Integer.valueOf(index))) { + chaptDownStatus.put(index, DownloadStatus.downloading); loadChaptContent(index); } - Log.d( "loadChaptContent",String.format("showing dialog " )); + Log.d("loadChaptContent", String.format("showing dialog ")); // Log.d(TAG,String.format("showing progress diaglog......")); - int maxSleep =6000; - int slepttime =0; - // while(!file.exists() && !getDownloadStatus()){//&& slepttime index ) { + if (mChapters.size() > index && NetUtil.isNetworkConnected()) { - File file2 = new File(fileChapterName(index+1)); + if (!chaptDownStatus.containsKey(index + 1) || chaptDownStatus.get(index + 1).equals(DownloadStatus.failure)) { - if(!file2.exists()) { - Log.d(TAG,String.format(" prepare book to load next chapt %s",index+1)); - loadChaptContent(index + 1); + + 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() ) { + if (index > 1 && index - 1 < mChapters.size() && NetUtil.isNetworkConnected()) { - 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",index-1)); - loadChaptContent(index - 1); } - } - int size = (int)file.length(); + int size = (int) file.length(); if (size < 0) { - throw new RuntimeException("Error during reading " + fileChapterName(index)); + Log.e(TAG, "prepare book chaptChars: Error during reading"+ fileChapterName(index) ); + // throw new RuntimeException("Error during reading " + fileChapterName(index)); } block = new char[size / 2]; - InputStreamReader reader = - new InputStreamReader( - new FileInputStream(file), - charachterType - ); - long l = reader.read(block); - if (reader.read(block) != block.length) { - // throw new RuntimeException("Error during reading " + fileChapterName(index)); + InputStreamReader reader = null; + try { + reader = + new InputStreamReader( + new FileInputStream(file), + charachterType + ); + + long l = reader.read(block); + + if (reader.read(block) != block.length) { + // throw new RuntimeException("Error during reading " + fileChapterName(index)); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (reader != null) { + reader.close(); + } } - reader.close(); - } catch (IOException e) { - e.printStackTrace(); - throw new RuntimeException("Error during reading " + fileChapterName(index)); - } catch (JSONException e) { + + } catch (JSONException | IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); - }finally { - } Cache cache = new Cache(); cache.setSize(block.length); diff --git a/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java b/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java index 0db4f37..f5c393f 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java @@ -18,9 +18,12 @@ import android.view.TextureView; import android.view.ViewConfiguration; import android.view.Window; import android.view.WindowManager; +import android.widget.Toast; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.security.Timestamp; +import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; @@ -30,12 +33,12 @@ public class CommonUtil { private static final String TAG= CommonUtil.class.getSimpleName(); public static int getScreenHeight(Context context){ - - if(checkDeviceHasNavigationBar(context)){ - return getDpi(context); + int diff = checkDeviceHasNavigationBar(context); + if(diff >0){ + return getDpi(context) -diff; // return height for no navigation bar } - return getScreenHeightWithOutBottomBar(context); + return getScreenHeightWithOutBottomBar(context); //return for with navigationbar } /** @@ -43,14 +46,17 @@ public class CommonUtil { * @param context * @return */ - public static boolean checkDeviceHasNavigationBar(Context context) { + public static int checkDeviceHasNavigationBar(Context context) { Point appUsableSize = getAppUsableScreenSize(context); Point realScreenSize = getRealScreenSize(context); - Log.d(TAG, String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s,realScreenSize.y -usablesize.y =%s, statusbar height %s" + Log.d(TAG, String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s" + + ",realScreenSize.y -usablesize.y =%s, statusbar height %s" ,appUsableSize.y ,realScreenSize.y, realScreenSize.y-appUsableSize.y ,getStatusBarHeight(context) )); Point p = getNavigationBarSize(context); - return realScreenSize.y-appUsableSize.y - getStatusBarHeight(context)>0; +// Toast.makeText(context,String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s,diff %s", +// appUsableSize.y ,realScreenSize.y,realScreenSize.y-appUsableSize.y - getStatusBarHeight(context)),Toast.LENGTH_LONG).show(); + return realScreenSize.y-appUsableSize.y - getStatusBarHeight(context); } public static Point getNavigationBarSize(Context context) { @@ -415,9 +421,31 @@ public class CommonUtil { public static String getDateString(long time,String format){ String f = TextUtils.isEmpty(format) ?"yyyy年MM月dd日 HH:mm:ss":format; + Date dt = new Date(time); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); + String rt =sdf.format(dt); + Log.d(TAG, String.format("getDateString:timestamp %s, formated time %s",time,rt)); + long time2 =System.currentTimeMillis(); + dt = new Date(time2); + rt =sdf.format(dt); + Log.d(TAG, String.format("getDateString:timestamp %s, formated time %s",time2,rt)); return sdf.format(dt); + + /* Timestamp ts = new Timestamp(time); + String tsStr = ""; + DateFormat sdf2 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); + try { + //方法一 + tsStr = sdf2.format(ts); + System.out.println(tsStr); + //方法二 + tsStr = ts.toString(); + System.out.println(tsStr); + } catch (Exception e) { + e.printStackTrace(); + }*/ + } public static String getDateString(long time){ 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 8af931e..3cb0500 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/Constants.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/Constants.java @@ -1,9 +1,18 @@ package com.novelbook.android.utils; +import com.novelbook.android.bean.Progress; + +import java.util.List; + public class Constants { public static final String BLOCK_TITLE_NOVELS = "ns"; public static final int NOVEL_SPAN_CNT =3 ; //grid columns public static final boolean SHOWAD =false ; - public static int SEX=1; + public static int SEX=1; //1 男,2女 public static String A_Regex = "]+href[\\s]*=[\\s]*['\"]?([^'\"]+)['\"\\s]?[^>]*>([^<]+)<"; //TODO: 从服务器更新 + public static List lstProperties =null; + public static List lstSex =null; + public static List lstNt=null; + //public static List lstProgress=null; + public static String[] lstProgress={"连载中","已完本","新书"}; } diff --git a/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java b/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java index 0271223..cd74343 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java @@ -6,8 +6,10 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.novelbook.android.bean.NovelBlock; +import com.novelbook.android.bean.Progress; import com.novelbook.android.db.Novel; +import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -38,6 +40,48 @@ public class GsonUtil { } return nv; } + public static List parserStringBlocks(String result,String blockName ) throws JSONException { + JSONObject jsonObject = new JSONObject(result); + JSONArray array = jsonObject.getJSONArray(blockName); + List lst = new ArrayList(); + for( int i=0;i< array.length();i++){ + lst .add(array.getString(i)); + } + return lst; + } + public static List parserProgressBlocks(String restult, String blockName ) throws JSONException { + JSONObject jsonObject = new JSONObject(restult); + String strJson = jsonObject.getString(blockName); + List list = new ArrayList(); + //创建一个Gson对象 + // Gson gson = new Gson(); + //创建一个JsonParser + JsonParser parser = new JsonParser(); + //通过JsonParser对象可以把json格式的字符串解析成一个JsonElement对象 + JsonElement el = parser.parse(strJson); + + //把JsonElement对象转换成JsonObject + JsonObject jsonObj = null; + if (el.isJsonObject()) { + jsonObj = el.getAsJsonObject(); + } + + + //把JsonElement对象转换成JsonArray + JsonArray jsonArray = null; + if (el.isJsonArray()) { + jsonArray = el.getAsJsonArray(); + } + + //遍历JsonArray对象 + Iterator it = jsonArray.iterator(); + while (it.hasNext()) { + JsonElement e = (JsonElement) it.next(); + //JsonElement转换为JavaBean对象 + list.add((Progress) gson.fromJson(e, Progress.class)); + } + return list; + } public static List parserNovleBlocks(String restult,String blockName ) throws JSONException { JSONObject jsonObject = new JSONObject(restult); String strJson = jsonObject.getString(blockName); 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 66ed228..007685d 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/PageFactory.java @@ -192,13 +192,19 @@ public class PageFactory implements ChangeSource{ } } private List loadCurrentChapt(int chaptId){ + Log.d(TAG, String.format("prepare book, loadCurrentChapt chaptId %s, getChapters().size() %s ",chaptId,getChapters().size() ) ); - chaptId = chaptId >getChapters().size()?getChapters().size():chaptId; + final File file = new File(getChapterFileName(chaptId)); - chaptId = chaptId >0?chaptId:1; + if (!file.exists()) { //待下载 + chaptId = chaptId > getChapters().size() ? getChapters().size() : chaptId; + + chaptId = chaptId > 0 ? chaptId : 1; + } + + List chaptPages = new ArrayList(); + chaptPages.add(new TRPage()); - List chaptPages = new ArrayList(); - chaptPages.add(new TRPage()); @@ -208,9 +214,12 @@ public class PageFactory implements ChangeSource{ drawStatus(mBookPageWidget.getCurPage()); drawStatus(mBookPageWidget.getNextPage()); - final File file = new File(getChapterFileName(chaptId)); + // final File file = new File(getChapterFileName(chaptId)); + + Log.d(TAG, String.format("prepare book to open chapter %s ,file is exist ? %s",chaptId,file.exists() ) ); + if (!file.exists()) { - Log.d(TAG, String.format("prepare book to open chapter %s ,file is not download",chaptId ) ); + mStatus = Status.OPENING; if( !NetUtil.isNetworkConnected()){ //TODO: 500错误处理 mStatus = Status.NETWORKFAILE; @@ -218,7 +227,14 @@ public class PageFactory implements ChangeSource{ drawStatus(mBookPageWidget.getNextPage()); return chaptPages; } - + if(getChapters().size()==0 && mBookUtil.muluRetryCount>=3) { + Log.d(TAG, String.format("prepare book download mulu 失败,重试次数: %s ,thread.name %s",mBookUtil.muluRetryCount,Thread.currentThread().getName() ) ); + mBookUtil.muluRetryCount=0; + mStatus = Status.FAIL; + drawStatus(mBookPageWidget.getCurPage()); + drawStatus(mBookPageWidget.getNextPage()); + return chaptPages; + } // showProgressDialog(); final int chid = chaptId; new Thread() { @@ -234,7 +250,7 @@ public class PageFactory implements ChangeSource{ @Override public void run() { int slepttime =0; - while( !file.exists() && slepttime <100){ + while( !file.exists() && slepttime <100 && mBookUtil.muluRetryCount<3){ try { sleep(50); slepttime++; @@ -243,7 +259,12 @@ public class PageFactory implements ChangeSource{ } } Log.d(TAG, String.format("prepare book to download chapter %s ,slepted %s ,thread.name %s",chid,slepttime*50 ,Thread.currentThread().getName() ) ); + mStatus = Status.FINISH; + if( mBookUtil.muluRetryCount>=3){ + mStatus = Status.FAIL; + } + //notice file done handler.sendEmptyMessage(1); @@ -261,17 +282,17 @@ public class PageFactory implements ChangeSource{ } - }else if(getChapters().size()==0) { + }/*else if(getChapters().size()==0) { mStatus = Status.FAIL; drawStatus(mBookPageWidget.getCurPage()); drawStatus(mBookPageWidget.getNextPage()); return chaptPages; - } + }*/ chaptPages.clear(); - chaptId = mChapters!=null && mChapters.size() <= chaptId ? 1 : chaptId; + // chaptId = mChapters!=null && mChapters.size() <= chaptId ? 1 : chaptId; Log.d(TAG, String.format("changing Source prepare book to open chapter %s ",chaptId ) ); char[] chars = mBookUtil.chaptChars(chaptId); @@ -408,6 +429,9 @@ public static boolean busy(){ marginWidth = mContext.getResources().getDimension(R.dimen.readingMarginWidth); marginHeight = mContext.getResources().getDimension(R.dimen.readingMarginHeight); + // Log.d(TAG, "PageFactory: marginHeight +" +marginHeight); + // marginHeight = CommonUtil. getStatusBarHeight(mContext); + Log.d(TAG, "PageFactory: marginHeight " +marginHeight); statusMarginBottom = mContext.getResources().getDimension(R.dimen.reading_status_margin_bottom); lineSpace = context.getResources().getDimension(R.dimen.reading_line_spacing); paragraphSpace = context.getResources().getDimension(R.dimen.reading_paragraph_spacing); @@ -496,7 +520,7 @@ public static boolean busy(){ status = "正在拼命加载..."; break; case FAIL: - status = "打开书本失败!"; + status = "读取错误,请稍后重试"; break; case NETWORKFAILE: status = "请开启网络"; @@ -525,6 +549,7 @@ public static boolean busy(){ } public void onDraw(Bitmap bitmap,List m_lines,Boolean updateChapter) { + mAd.hideSystemUI(); if(m_lines.size()==0){ return; } @@ -550,11 +575,11 @@ public static boolean busy(){ // * column won't be updated. // mBook.save(); - /* Novel nv = LitePal.find(Novel.class,mBook.getId()); + /*Novel nv = LitePal.find(Novel.class,mBook.getId()); Log.d(TAG,String.format("prepare book saved lastchapt %s,lastpos %s, db lastchapt %s last pos %s", - currentChapter,currentPage.getBegin(),nv.getLastReadChapt(),nv.getLastReadPos()));*/ - + currentChapter,currentPage.getBegin(),nv.getLastReadChapt(),nv.getLastReadPos())); + */ } /* @@ -582,25 +607,30 @@ public static boolean busy(){ if (m_lines.size() > 0) { float y = marginHeight; + String lastLine =""; for (String strLine : m_lines) { // if(strLine.endsWith("\n")) { // if(strLine.charAt(strLine.length()-1) == ('\n' )) { - // Log.d("TAG", strLine); - // Log.d("TAG","最后字符 。。。" +strLine.charAt(strLine.length()-1) + ""); + // Log.d(TAG, strLine); + // Log.d(TAG,"最后字符 。。。" +strLine.charAt(strLine.length()-1) + ""); + lastLine =strLine; if(( strLine.charAt(strLine.length()-1) + "" ).equals("\n")){ strLine =strLine.replace("\n",""); y += space; space =m_fontSize + paragraphSpace; - Log.d("TAG",String.format("开始新段落 %s, y plus is %s" ,strLine, m_fontSize + paragraphSpace)); + Log.d( TAG ,String.format("开始新段落 %s, y plus is %s" ,strLine, m_fontSize + paragraphSpace)); }else{ y += space; space =m_fontSize + lineSpace; - Log.d("TAG",String.format("%s,y plus is %s" ,strLine, m_fontSize + lineSpace)); + Log.d(TAG,String.format("%s,y plus is %s" ,strLine, m_fontSize + lineSpace)); } c.drawText(strLine, measureMarginWidth, y, mPaint); // word.append(strLine); } + Log.d(TAG,String.format("getNavigationBarSize mHeight is %s ,last line height %s, power %s, %s", + mHeight,y,mHeight - CommonUtil.convertDpToPixel(mContext,10) + mBorderWidth - statusMarginBottom, lastLine)); + float adHeight = mHeight -y - space -marginHeight-statusMarginBottom; float adY =y +space; showAd((int)adHeight,(int)adY); @@ -698,6 +728,7 @@ public static boolean busy(){ } } + Log.d(TAG, "prepare book prePage: to open prepage: "); cancelPage = currentPage; onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),true); currentPage = getPrePage(); @@ -728,7 +759,7 @@ public static boolean busy(){ } } - + Log.d(TAG, "prepare book nextPage: to open next page: "); cancelPage = currentPage; onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),true); prePage = currentPage; @@ -758,12 +789,12 @@ public static boolean busy(){ NetUtil.cancelRequest(mBook.getNovelId() ); }catch (Exception e) { - Log.e(TAG, "prepare Book: error on canceling request "+e.getMessage()); + Log.e(TAG, "prepare book: error on canceling request "+e.getMessage()); e.printStackTrace(); } } - // Log.d(TAG, "prepareBook: .start prepare book " + book.getName()); + Log.d(TAG, "prepare book: .start prepare book " + book.getName()); this.mBook = book ; mBookUtil = new BookUtil(); //this.mBookUtil.setContext(context); @@ -820,9 +851,10 @@ public static boolean busy(){ return; } if (result) { - + Log.d(TAG, String.format("prepare book ready, to open chapter %s ",chapter ) ); // m_mbBufLen = mBookUtil.getBookLen(); mBookUtil.setChapterNo((int)chapter); + Log.d(TAG, String.format("prepare book ready, to open chapter, loadCurrentChapt %s ",chapter ) ); currentChaptPages = loadCurrentChapt((int)chapter); currentPage = getPageForBegin(begin) ;// currentChaptPages.get(0); // currentPage = getPageForBegin(begin); @@ -856,7 +888,7 @@ public static boolean busy(){ begin = params[1]; currentChapter = (int) chapter; try { - mBookUtil.openBook(mBook); + mBookUtil.openBook(mBook,chapter); } catch (Exception e) { e.printStackTrace(); return false; @@ -1152,12 +1184,14 @@ public static boolean busy(){ //绘制当前页面 public void currentPage(Boolean updateChapter){ + Log.d(TAG, "prepare book currentPage: to open current Page : "); onDraw(mBookPageWidget.getCurPage(),currentPage.getLines(),updateChapter); onDraw(mBookPageWidget.getNextPage(),currentPage.getLines(),updateChapter); } //更新电量 public void updateBattery(int mLevel){ + mAd.hideSystemUI(); if (currentPage != null && mBookPageWidget != null && !mBookPageWidget.isRunning()) { if (level != mLevel) { level = mLevel; @@ -1167,6 +1201,7 @@ public static boolean busy(){ } public void updateTime(){ + mAd.hideSystemUI(); if (currentPage != null && mBookPageWidget != null && !mBookPageWidget.isRunning()) { String mDate = sdf.format(new java.util.Date()); if (date != mDate) { @@ -1368,6 +1403,10 @@ public static boolean busy(){ //是否可以翻页 public boolean isReady() { return mStatus==Status.FINISH; + + + + } //设置页面背景 public void setBgBitmap(Bitmap BG) { diff --git a/zhuike/src/main/java/com/novelbook/android/view/PageWidget.java b/zhuike/src/main/java/com/novelbook/android/view/PageWidget.java index be988c4..7484297 100644 --- a/zhuike/src/main/java/com/novelbook/android/view/PageWidget.java +++ b/zhuike/src/main/java/com/novelbook/android/view/PageWidget.java @@ -158,7 +158,8 @@ public class PageWidget extends View { if (!isMove) { isMove = Math.abs(downX - x) > slop || Math.abs(downY - y) > slop; } - + Log.d(TAG, String.format("onTouchEvent:ACTION_MOVE isMove %s, isbusy %s",isMove,PageFactory.busy())); + if(!PageFactory.busy()) if (isMove){ isMove = true; if (moveX == 0 && moveY ==0) { @@ -218,10 +219,11 @@ public class PageWidget extends View { } }else if (event.getAction() == MotionEvent.ACTION_UP){ Log.e(TAG,"ACTION_UP"); - if (!isMove){ + Log.d(TAG, String.format("onTouchEvent:ACTION_UP isMove %s, isbusy %s",isMove,PageFactory.busy())); + if (!isMove || PageFactory.busy()){ cancelPage = false; //是否点击了中间 - if (downX > mScreenWidth / 3 && downX < mScreenWidth * 2 / 3 && downY > mScreenHeight / 3 && downY < mScreenHeight * 2 / 3){ + if (downX > mScreenWidth / 3 && downX < mScreenWidth * 2 / 3 && downY > mScreenHeight / 3 && downY < mScreenHeight * 2 / 3 ){ if (mTouchListener != null){ mTouchListener.center(); } @@ -231,7 +233,9 @@ public class PageWidget extends View { // mTouch.x = 0.1f; // mTouch.y = 0.1f; return true; - }else if (x < mScreenWidth / 2){ + } + + else if (x < mScreenWidth / 2){ isNext = false; }else{ isNext = true; @@ -252,18 +256,21 @@ public class PageWidget extends View { } } - if (cancelPage && mTouchListener != null){ - mTouchListener.cancel(); - } + if(!PageFactory.busy()) { + if (cancelPage && mTouchListener != null) { + mTouchListener.cancel(); + } - Log.e(TAG,"isNext:" + isNext); - if (!noNext) { - isRuning = true; - mAnimationProvider.startAnimation(mScroller); - this.postInvalidate(); + Log.e(TAG, "isNext:" + isNext); + if (!noNext) { + isRuning = true; + mAnimationProvider.startAnimation(mScroller); + this.postInvalidate(); + } } } + return true; } diff --git a/zhuike/src/main/res/drawable/ic_format_line_spacing_black_24dp.xml b/zhuike/src/main/res/drawable/ic_format_line_spacing_black_24dp.xml new file mode 100644 index 0000000..fd9ff29 --- /dev/null +++ b/zhuike/src/main/res/drawable/ic_format_line_spacing_black_24dp.xml @@ -0,0 +1,5 @@ + + + diff --git a/zhuike/src/main/res/layout/activity_book.xml b/zhuike/src/main/res/layout/activity_book.xml index 7e141d3..a721f42 100644 --- a/zhuike/src/main/res/layout/activity_book.xml +++ b/zhuike/src/main/res/layout/activity_book.xml @@ -1,23 +1,22 @@ - - + android:fitsSystemWindows="true"> @@ -51,29 +50,27 @@ android:id="@+id/imageViewHead" android:layout_width="match_parent" android:layout_height="match_parent" - android:scaleType="fitXY" - /> + android:scaleType="fitXY" /> + android:scaleType="fitXY" /> + /> + android:visibility="gone" /> + android:text="" /> + + android:text="" /> + + android:text="" /> + + android:textColor="@color/common_google_signin_btn_text_light" /> @@ -144,64 +139,65 @@ android:layout_width="match_parent" android:layout_height="40dp" android:minHeight="40dp" - app:layout_collapseMode="pin" app:contentInsetLeft="0dp" app:contentInsetStart="0dp" + app:layout_collapseMode="pin" - app:popupTheme="@style/ToolBarTheme.PopupOverlay" > + app:popupTheme="@style/ToolBarTheme.PopupOverlay"> -