|  | @ -2,7 +2,7 @@ | ||||||
| <litepal> | <litepal> | ||||||
|     <dbname value="book" ></dbname> |     <dbname value="book" ></dbname> | ||||||
| 
 | 
 | ||||||
|     <version value="3" ></version> |     <version value="4" ></version> | ||||||
| 
 | 
 | ||||||
|     <list> |     <list> | ||||||
|         <mapping class="com.novelbook.android.db.Chapter"></mapping> |         <mapping class="com.novelbook.android.db.Chapter"></mapping> | ||||||
|  |  | ||||||
|  | @ -521,7 +521,7 @@ public class BookActivity extends   Activity_base { | ||||||
| 
 | 
 | ||||||
|         boolean isLocalDbExist = LitePal.isExist(Novel.class, "novelId=?", novelId+""); |         boolean isLocalDbExist = LitePal.isExist(Novel.class, "novelId=?", novelId+""); | ||||||
| 
 | 
 | ||||||
| 
 |         showProgressDialog(false,"正在加载..."); | ||||||
|         BookSubscribe.getNovel(novelId, new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { |         BookSubscribe.getNovel(novelId, new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { | ||||||
|             @Override |             @Override | ||||||
|             public void onSuccess(String result) { |             public void onSuccess(String result) { | ||||||
|  |  | ||||||
|  | @ -49,6 +49,7 @@ import com.novelbook.android.netsubscribe.BookSubscribe; | ||||||
| import com.novelbook.android.netutils.NetUtil; | import com.novelbook.android.netutils.NetUtil; | ||||||
| import com.novelbook.android.netutils.OnSuccessAndFaultListener; | import com.novelbook.android.netutils.OnSuccessAndFaultListener; | ||||||
| import com.novelbook.android.netutils.OnSuccessAndFaultSub; | import com.novelbook.android.netutils.OnSuccessAndFaultSub; | ||||||
|  | import com.novelbook.android.utils.Constants; | ||||||
| import com.novelbook.android.utils.ImageUtil; | import com.novelbook.android.utils.ImageUtil; | ||||||
| import com.novelbook.android.utils.MyImageLoader; | import com.novelbook.android.utils.MyImageLoader; | ||||||
| import com.novelbook.android.utils.OnItemClickListener; | import com.novelbook.android.utils.OnItemClickListener; | ||||||
|  | @ -244,6 +245,12 @@ public abstract class BasicFragment extends Fragment { | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|     void showProgressDialog(boolean flag,String msg){ |     void showProgressDialog(boolean flag,String msg){ | ||||||
|  |         if(!Constants.showDialogOnUi){ | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |         if(pageNo >1 && !Constants.showDialogOnUiPage){ | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         if(getActivity()==null){ |         if(getActivity()==null){ | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  | @ -63,6 +63,7 @@ public class CatalogFragment extends BasicFragment implements MarkActivity.Sortc | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     boolean isAsc = true; |     boolean isAsc = true; | ||||||
|  |     boolean isFirstLoad = true; | ||||||
|     @Override |     @Override | ||||||
|     protected  void fillData() { |     protected  void fillData() { | ||||||
|         catalogueList.clear(); |         catalogueList.clear(); | ||||||
|  | @ -83,8 +84,9 @@ public class CatalogFragment extends BasicFragment implements MarkActivity.Sortc | ||||||
|         catalogueAdapter.notifyDataSetChanged(); |         catalogueAdapter.notifyDataSetChanged(); | ||||||
| 
 | 
 | ||||||
|        int count= lv_catalogue.getCount(); |        int count= lv_catalogue.getCount(); | ||||||
|        if(count >=pageFactory.getCurrentChapter() ){ |        if(count >=pageFactory.getCurrentChapter()&& isFirstLoad){ | ||||||
|            lv_catalogue.setSelection(currentChp); |            lv_catalogue.setSelection(currentChp); | ||||||
|  |            isFirstLoad =false; | ||||||
|        } |        } | ||||||
| 
 | 
 | ||||||
|       /* tvTitle.setText(pageFactory.getBookName()); |       /* tvTitle.setText(pageFactory.getBookName()); | ||||||
|  | @ -150,7 +152,7 @@ public class CatalogFragment extends BasicFragment implements MarkActivity.Sortc | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 int slepttime = 0; |                 int slepttime = 0; | ||||||
|                 while (NetUtil.isNetworkConnected() &&( slepttime < 1000 && ( pageFactory.isReadingCatalogs()  || pageFactory.getChapters().size() == 0))) { |                 while (NetUtil.isNetworkConnected() &&( slepttime < 100 && ( pageFactory.isReadingCatalogs()  || pageFactory.getChapters().size() == 0))) { | ||||||
|                     try { |                     try { | ||||||
|                         Log.d(TAG, String .format("prepare book:  to open book cate to sleep   %s" , 50)); |                         Log.d(TAG, String .format("prepare book:  to open book cate to sleep   %s" , 50)); | ||||||
|                         sleep(50); |                         sleep(50); | ||||||
|  | @ -206,7 +208,9 @@ public class CatalogFragment extends BasicFragment implements MarkActivity.Sortc | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|     protected void initViews() { |     protected void initViews() { | ||||||
|  |         lv_catalogue.setFastScrollEnabled(true); | ||||||
| 
 | 
 | ||||||
|  |         //lv_catalogue.setFastScrollStyle(R.style.FastScrollTheme); //不起作用 | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|  |  | ||||||
|  | @ -11,6 +11,7 @@ import android.support.design.widget.BottomSheetDialog; | ||||||
| import android.support.v7.widget.GridLayoutManager; | import android.support.v7.widget.GridLayoutManager; | ||||||
| import android.support.v7.widget.RecyclerView; | import android.support.v7.widget.RecyclerView; | ||||||
| import android.text.TextUtils; | import android.text.TextUtils; | ||||||
|  | import android.util.Log; | ||||||
| import android.view.LayoutInflater; | import android.view.LayoutInflater; | ||||||
| import android.view.View; | import android.view.View; | ||||||
| import android.view.ViewGroup; | import android.view.ViewGroup; | ||||||
|  | @ -26,11 +27,17 @@ import com.novelbook.android.R; | ||||||
| import com.novelbook.android.db.Novel; | import com.novelbook.android.db.Novel; | ||||||
| 
 | 
 | ||||||
| import com.novelbook.android.filechooser.FileChooserActivity; | import com.novelbook.android.filechooser.FileChooserActivity; | ||||||
|  | import com.novelbook.android.netsubscribe.BookSubscribe; | ||||||
| import com.novelbook.android.netutils.NetUtil; | 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.MyImageLoader; | import com.novelbook.android.utils.MyImageLoader; | ||||||
| import com.novelbook.android.utils.OnItemClickListener; | import com.novelbook.android.utils.OnItemClickListener; | ||||||
| import com.novelbook.android.adapter.BookListAdapter; | import com.novelbook.android.adapter.BookListAdapter; | ||||||
| 
 | 
 | ||||||
|  | import org.json.JSONObject; | ||||||
| import org.litepal.LitePal; | import org.litepal.LitePal; | ||||||
| 
 | 
 | ||||||
| import java.io.File; | import java.io.File; | ||||||
|  | @ -57,7 +64,7 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|     RecyclerView  mRecyclerView; |     RecyclerView  mRecyclerView; | ||||||
|   // private List<Novel> mDatas; |   // private List<Novel> mDatas; | ||||||
|     private BookListAdapter mAdapter; |     private BookListAdapter mAdapter; | ||||||
| 
 |     List<Novel> lstUpdate = new ArrayList<Novel>(); | ||||||
|     private List<Novel> bookLists; |     private List<Novel> bookLists; | ||||||
|    // private ShelfAdapter adapter; |    // private ShelfAdapter adapter; | ||||||
| 
 | 
 | ||||||
|  | @ -74,7 +81,9 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|         return fragment; |         return fragment; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| 
 |     private void loadNovelsOnShelf(){ | ||||||
|  |         bookLists = Novel.getNovelsOnShelf(); | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|     @Override |     @Override | ||||||
|  | @ -82,6 +91,48 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|         return R.layout.fragment_fragment__shelf; |         return R.layout.fragment_fragment__shelf; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * to get updated info from server | ||||||
|  |      */ | ||||||
|  |     private void getUpdatedData(){ | ||||||
|  |         List<Integer> novelIds; | ||||||
|  |         OnSuccessAndFaultListener successAndFaultListener =   new OnSuccessAndFaultListener() { | ||||||
|  |             @Override | ||||||
|  |             public void onSuccess(String result) { | ||||||
|  | 
 | ||||||
|  |                 // mFirstPage= gson.fromJson(result, FirstPage.class); | ||||||
|  |                 try { | ||||||
|  | 
 | ||||||
|  |                     lstUpdate = GsonUtil. parserJsonArray(result, Constants.BLOCK_TITLE_NOVELS); | ||||||
|  |                     if(lstUpdate.size()>0) { | ||||||
|  |                         for (Novel novel2 : lstUpdate) { | ||||||
|  |                             novel2.save();//更新本地信息 | ||||||
|  |                         } | ||||||
|  | 
 | ||||||
|  |                         loadNovelsOnShelf(); | ||||||
|  | 
 | ||||||
|  |                     } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |                 } catch (Exception e) { | ||||||
|  |                     e.printStackTrace(); | ||||||
|  |                 } | ||||||
|  |                 handler.sendEmptyMessage(1); | ||||||
|  | 
 | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             @Override | ||||||
|  |             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 |     @Override | ||||||
|     public void initData() { |     public void initData() { | ||||||
| 
 | 
 | ||||||
|  | @ -89,9 +140,15 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|        // mDatas = initData(mDatas,'X'); |        // mDatas = initData(mDatas,'X'); | ||||||
| 
 | 
 | ||||||
|        // bookLists = LitePal.where("isOnShelf=? or novelId=? ","1","").find(Novel.class); |        // bookLists = LitePal.where("isOnShelf=? or novelId=? ","1","").find(Novel.class); | ||||||
|         bookLists = Novel.getNovelsOnShelf(); |         loadNovelsOnShelf(); | ||||||
|  |         getUpdatedData(); | ||||||
|         flag = new boolean[bookLists.size()]; |         flag = new boolean[bookLists.size()]; | ||||||
| 
 | 
 | ||||||
|  |         if(bookLists.size()>0) { //TODO: to remove | ||||||
|  |             bookLists.get(0).setUpdated(true); | ||||||
|  |            // bookLists.get(bookLists.size()-1).setUpdated(true); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|         mAdapter = new BookListAdapter(activity,bookLists,R.layout.recycle_list_item,new OnItemClickListener() |         mAdapter = new BookListAdapter(activity,bookLists,R.layout.recycle_list_item,new OnItemClickListener() | ||||||
|         { |         { | ||||||
| 
 | 
 | ||||||
|  | @ -134,10 +191,20 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|     } |     } | ||||||
|     @Override |     @Override | ||||||
|     protected  void fillData() { |     protected  void fillData() { | ||||||
|  | 
 | ||||||
|  |         if(bookLists.size()==0){ | ||||||
|  |          //   return; | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |         mAdapter.setData(bookLists); | ||||||
|  |       //  mAdapter.notifyDataSetChanged(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  public void initReceyleView() { |  public void initReceyleView() { | ||||||
|      initData(); |     // initData(); | ||||||
|    //  mRecyclerView.setLayoutManager(new LinearLayoutManager(this.activity)); |    //  mRecyclerView.setLayoutManager(new LinearLayoutManager(this.activity)); | ||||||
|      mRecyclerView.setLayoutManager(new GridLayoutManager(activity,3)); |      mRecyclerView.setLayoutManager(new GridLayoutManager(activity,3)); | ||||||
|      mRecyclerView.setAdapter(mAdapter ); |      mRecyclerView.setAdapter(mAdapter ); | ||||||
|  | @ -238,12 +305,16 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|                     Novel nv =   bookLists.get(i); |                     Novel nv =   bookLists.get(i); | ||||||
|                     if(nv.isLocalBook()) |                     if(nv.isLocalBook()) | ||||||
|                     { |                     { | ||||||
|  | 
 | ||||||
|                         nv.delete(); |                         nv.delete(); | ||||||
|  | 
 | ||||||
|                         //TODO: remove cache on a new thread |                         //TODO: remove cache on a new thread | ||||||
|                         //Fileutil.deleteDir(file) |                         //Fileutil.deleteDir(file) | ||||||
|                     }else{ |                     }else{ | ||||||
|                         nv.setOnShelf(false); |                         Log.d(TAG, "shelfZhengliSubmit: to delete novel " + nv.getName()); | ||||||
|                         nv.save(); |                         nv.setToDefault("isOnShelf"); | ||||||
|  |                         //nv.setOnShelf(false); | ||||||
|  |                         nv.update(nv.getId()); | ||||||
|                         // nv.update(nv.getId()); //not work,,,If you set a default value to a field, the corresponding  column won't be updated. |                         // nv.update(nv.getId()); //not work,,,If you set a default value to a field, the corresponding  column won't be updated. | ||||||
|                     } |                     } | ||||||
| 
 | 
 | ||||||
|  | @ -389,12 +460,15 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|             // 如果设置了回调,则设置点击事件 |             // 如果设置了回调,则设置点击事件 | ||||||
|             if (mOnItemClickListener != null) |             if (mOnItemClickListener != null) | ||||||
|             { |             { | ||||||
|  |                 holder.checkBox.setOnCheckedChangeListener(null);//先设置一次CheckBox的选中监听器,传入参数null | ||||||
|  |                 holder.checkBox.setChecked(flag[position]);//用数组中的值设置CheckBox的选中状态 | ||||||
|  | 
 | ||||||
|                 holder.itemView.setOnClickListener(new View.OnClickListener() |                 holder.itemView.setOnClickListener(new View.OnClickListener() | ||||||
|                 { |                 { | ||||||
|                     @Override |                     @Override | ||||||
|                     public void onClick(View v) |                     public void onClick(View v) | ||||||
|                     { |                     { | ||||||
| 
 |                         holder.checkBox.setChecked(  !holder.checkBox.isChecked()); | ||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
| 
 | 
 | ||||||
|  | @ -407,8 +481,7 @@ public class Fragment_Shelf extends BasicFragment { | ||||||
|                     } |                     } | ||||||
|                 }); |                 }); | ||||||
| 
 | 
 | ||||||
|                 holder.checkBox.setOnCheckedChangeListener(null);//先设置一次CheckBox的选中监听器,传入参数null | 
 | ||||||
|                 holder.checkBox.setChecked(flag[position]);//用数组中的值设置CheckBox的选中状态 |  | ||||||
| 
 | 
 | ||||||
|                 //再设置一次CheckBox的选中监听器,当CheckBox的选中状态发生改变时,把改变后的状态储存在数组中 |                 //再设置一次CheckBox的选中监听器,当CheckBox的选中状态发生改变时,把改变后的状态储存在数组中 | ||||||
|                 holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { |                 holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { | ||||||
|  |  | ||||||
|  | @ -200,7 +200,7 @@ public class Fragment_booklist extends BasicFragment { | ||||||
|                     mMoreData = GsonUtil. parserJsonArray(jsonObject,Constants.BLOCK_TITLE_NOVELS); |                     mMoreData = GsonUtil. parserJsonArray(jsonObject,Constants.BLOCK_TITLE_NOVELS); | ||||||
| 
 | 
 | ||||||
|                 } catch (Exception e) { |                 } catch (Exception e) { | ||||||
|                     e.printStackTrace(); |                     e.printStackTrace(); Log.e(TAG, "onSuccess: 解析失败",e ); | ||||||
|                 } |                 } | ||||||
|                 handler.sendEmptyMessage(1); |                 handler.sendEmptyMessage(1); | ||||||
| 
 | 
 | ||||||
|  | @ -214,7 +214,7 @@ public class Fragment_booklist extends BasicFragment { | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
| 
 |          showProgressDialog(false,"正在加载..."); | ||||||
| 
 | 
 | ||||||
|         Log.d(TAG,String.format("fn is %s",fn) ); |         Log.d(TAG,String.format("fn is %s",fn) ); | ||||||
| 
 | 
 | ||||||
|  | @ -229,9 +229,11 @@ public class Fragment_booklist extends BasicFragment { | ||||||
|                         String resultstr = jsonObject.getString("rank") ; |                         String resultstr = jsonObject.getString("rank") ; | ||||||
|                         pageCount = jsonObject.getJSONObject("rank").getInt("pageCount"); |                         pageCount = jsonObject.getJSONObject("rank").getInt("pageCount"); | ||||||
|                         mMoreData =    GsonUtil. parserJsonArray(resultstr,Constants.BLOCK_TITLE_NOVELS); |                         mMoreData =    GsonUtil. parserJsonArray(resultstr,Constants.BLOCK_TITLE_NOVELS); | ||||||
|  |                         Log.d(TAG, "排行榜详细 onSuccess: pageCount " + pageCount); | ||||||
| 
 | 
 | ||||||
|                     } catch (Exception e) { |                     } catch (Exception e) { | ||||||
|                         e.printStackTrace(); |                         e.printStackTrace(); | ||||||
|  |                         Log.e(TAG, "onSuccess: 解析失败",e ); | ||||||
|                     } |                     } | ||||||
|                     handler.sendEmptyMessage(1); |                     handler.sendEmptyMessage(1); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -212,7 +212,7 @@ final String TAG = Fragment_paihang.class.getSimpleName(); | ||||||
|                 handler.sendEmptyMessage(1); |                 handler.sendEmptyMessage(1); | ||||||
|             } |             } | ||||||
|         }; |         }; | ||||||
| 
 |           showProgressDialog(false,"正在加载..."); | ||||||
|         BookSubscribe.getCateNovelList(cate, pageNo, tab1Pos+1, tab3Pos+1, new OnSuccessAndFaultSub(successAndFaultListener, getActivity())); |         BookSubscribe.getCateNovelList(cate, pageNo, tab1Pos+1, tab3Pos+1, new OnSuccessAndFaultSub(successAndFaultListener, getActivity())); | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -226,7 +226,7 @@ final String TAG = Fragment_paihang.class.getSimpleName(); | ||||||
|         else { |         else { | ||||||
|             initTabs(); |             initTabs(); | ||||||
|         } |         } | ||||||
|         //showProgressDialog(false,"加载。。。。"); |          showProgressDialog(false,"正在加载..."); | ||||||
|         new Thread(){ |         new Thread(){ | ||||||
|             @Override |             @Override | ||||||
|             public void run() { |             public void run() { | ||||||
|  |  | ||||||
|  | @ -140,6 +140,8 @@ public class Main2Activity extends Activity_base | ||||||
|         //  toolbar= (Toolbar) findViewById(R.id.toolbar); |         //  toolbar= (Toolbar) findViewById(R.id.toolbar); | ||||||
| 
 | 
 | ||||||
|           setSupportActionBar(toolbar); |           setSupportActionBar(toolbar); | ||||||
|  |         getSupportActionBar().setHomeButtonEnabled(false); | ||||||
|  |         getSupportActionBar().setDisplayHomeAsUpEnabled(false); | ||||||
|         //  toolbar.setNavigationIcon(R.mipmap.ic_launcher_round);//设置导航栏图标 |         //  toolbar.setNavigationIcon(R.mipmap.ic_launcher_round);//设置导航栏图标 | ||||||
|         //   toolbar.setLogo(R.mipmap.ic_launcher);//设置app logo |         //   toolbar.setLogo(R.mipmap.ic_launcher);//设置app logo | ||||||
|      //  toolbar.setTitle("Title");//设置主标题 |      //  toolbar.setTitle("Title");//设置主标题 | ||||||
|  | @ -310,8 +312,9 @@ private  int bottomSelectedIndex; | ||||||
|         boolean showTitle = bottomSelectedIndex !=1; |         boolean showTitle = bottomSelectedIndex !=1; | ||||||
|         String title =  bottomSelectedIndex==0?"我的书架":"排行榜"; |         String title =  bottomSelectedIndex==0?"我的书架":"排行榜"; | ||||||
|       //  txtTitle.setVisibility(View.GONE); |       //  txtTitle.setVisibility(View.GONE); | ||||||
|      //   toggle.setDrawerIndicatorEnabled(showToggle); |         toggle.setDrawerIndicatorEnabled(showToggle); | ||||||
|       //  toggle.syncState(); |         toggle.syncState(); | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
|         //spinner.setVisibility( showSpinner?View.VISIBLE:View.GONE); |         //spinner.setVisibility( showSpinner?View.VISIBLE:View.GONE); | ||||||
|         rgSex.setVisibility( showSpinner?View.VISIBLE:View.GONE); |         rgSex.setVisibility( showSpinner?View.VISIBLE:View.GONE); | ||||||
|  | @ -486,10 +489,14 @@ private  int bottomSelectedIndex; | ||||||
|            swithToolbarItems(); |            swithToolbarItems(); | ||||||
|            botoomNavigation.setVisibility(View.VISIBLE); |            botoomNavigation.setVisibility(View.VISIBLE); | ||||||
|            fragment_shelf.initReceyleView(); |            fragment_shelf.initReceyleView(); | ||||||
|  |            toggle.setDrawerIndicatorEnabled(true); | ||||||
|  |            toggle.syncState(); | ||||||
| 
 | 
 | ||||||
|        }else { |        }else { | ||||||
|            toggle.setDrawerIndicatorEnabled(false); |            toggle.setDrawerIndicatorEnabled(false); | ||||||
|  | 
 | ||||||
|            toggle.syncState(); |            toggle.syncState(); | ||||||
|  | 
 | ||||||
|            supportInvalidateOptionsMenu(); |            supportInvalidateOptionsMenu(); | ||||||
|            isShelfZhengli = true; |            isShelfZhengli = true; | ||||||
|            botoomNavigation.setVisibility(View.GONE); |            botoomNavigation.setVisibility(View.GONE); | ||||||
|  |  | ||||||
|  | @ -662,36 +662,7 @@ public class ReadActivity extends  Activity_base implements SpeechSynthesizerLis | ||||||
| //        return bookpage; | //        return bookpage; | ||||||
| //    } | //    } | ||||||
| 
 | 
 | ||||||
|     /** |  | ||||||
|      * 隐藏菜单。沉浸式阅读 |  | ||||||
|      */ |  | ||||||
|     public void hideSystemUI() { |  | ||||||
|         // Set the IMMERSIVE flag. |  | ||||||
|         // Set the content to appear under the system bars so that the content |  | ||||||
|         // doesn't resize when the system bars hide and show. |  | ||||||
|         getWindow().getDecorView().setSystemUiVisibility( |  | ||||||
|                 View.SYSTEM_UI_FLAG_LAYOUT_STABLE |  | ||||||
|                         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |  | ||||||
|                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |  | ||||||
|                            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar |  | ||||||
|                         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar |  | ||||||
|                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |  | ||||||
|         ); |  | ||||||
| 
 | 
 | ||||||
|         getWindow().setNavigationBarColor(getResources().getColor(R.color.read_dialog_bg)); |  | ||||||
|         pageFactory.setBusy(false); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     private void showSystemUI() { |  | ||||||
|         getWindow().getDecorView().setSystemUiVisibility( |  | ||||||
|                 View.SYSTEM_UI_FLAG_LAYOUT_STABLE |  | ||||||
|                        // | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION |  | ||||||
|                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |  | ||||||
|                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY |  | ||||||
|                         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar |  | ||||||
|         ); |  | ||||||
|         pageFactory.setBusy(true); |  | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     //显示书本进度 |     //显示书本进度 | ||||||
|     public void showProgressBar(float progress){ |     public void showProgressBar(float progress){ | ||||||
|  | @ -759,7 +730,37 @@ public class ReadActivity extends  Activity_base implements SpeechSynthesizerLis | ||||||
|             appbar.setVisibility(View.VISIBLE); |             appbar.setVisibility(View.VISIBLE); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |     /** | ||||||
|  |      * 隐藏菜单。沉浸式阅读 | ||||||
|  |      */ | ||||||
|  |     public void hideSystemUI() { | ||||||
|  |         // Set the IMMERSIVE flag. | ||||||
|  |         // Set the content to appear under the system bars so that the content | ||||||
|  |         // doesn't resize when the system bars hide and show. | ||||||
|  |         getWindow().getDecorView().setSystemUiVisibility( | ||||||
|  |                 View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||||
|  |                         | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||||
|  |                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | ||||||
|  |                         | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // hide nav bar | ||||||
|  |                         | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | ||||||
|  |                         | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | ||||||
|  |                       //  | View.SYSTEM_UI_FLAG_IMMERSIVE | ||||||
|  |         ); | ||||||
| 
 | 
 | ||||||
|  |         getWindow().setNavigationBarColor(getResources().getColor(R.color.read_dialog_bg)); | ||||||
|  |         pageFactory.setBusy(false); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     private void showSystemUI() { | ||||||
|  |         getWindow().getDecorView().setSystemUiVisibility( | ||||||
|  |                 View.SYSTEM_UI_FLAG_LAYOUT_STABLE | ||||||
|  |                         // | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION | ||||||
|  |                         | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | ||||||
|  |                          | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | ||||||
|  |                 // | View.SYSTEM_UI_FLAG_FULLSCREEN // hide status bar | ||||||
|  |         ); | ||||||
|  |         pageFactory.setBusy(true); | ||||||
|  |     } | ||||||
|     private void hideReadSetting() { |     private void hideReadSetting() { | ||||||
|         isShow = false; |         isShow = false; | ||||||
|         Animation bottomAnim = AnimationUtils.loadAnimation(this, R.anim.dialog_exit); |         Animation bottomAnim = AnimationUtils.loadAnimation(this, R.anim.dialog_exit); | ||||||
|  |  | ||||||
|  | @ -36,6 +36,7 @@ public  class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol | ||||||
|    // private MyImageLoader loader = new MyImageLoader(); |    // private MyImageLoader loader = new MyImageLoader(); | ||||||
|     private Context context; |     private Context context; | ||||||
|     private List<Novel> mDatas  ; |     private List<Novel> mDatas  ; | ||||||
|  | 
 | ||||||
|     private OnItemClickListener mOnItemClickListener; |     private OnItemClickListener mOnItemClickListener; | ||||||
|     private int listItemID; |     private int listItemID; | ||||||
|     //private List<Novel> mBooks; |     //private List<Novel> mBooks; | ||||||
|  | @ -193,8 +194,16 @@ public  class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol | ||||||
|             if (holder.tvAuthor != null) holder.tvAuthor.setText(mDatas.get(position).getAuthor()); |             if (holder.tvAuthor != null) holder.tvAuthor.setText(mDatas.get(position).getAuthor()); | ||||||
|             if (holder.tvCate != null) holder.tvCate.setText(mDatas.get(position).getNovelType()); |             if (holder.tvCate != null) holder.tvCate.setText(mDatas.get(position).getNovelType()); | ||||||
|             if (holder.tvDesc != null) holder.tvDesc.setText(mDatas.get(position).getDesc()); |             if (holder.tvDesc != null) holder.tvDesc.setText(mDatas.get(position).getDesc()); | ||||||
|  |             if (holder.tvStatus != null) holder.tvStatus.setText(mDatas.get(position).getProgress()); | ||||||
|             if (holder.imageView != null && !TextUtils.isEmpty(mDatas.get(position).getCover())) { |             if (holder.imageView != null && !TextUtils.isEmpty(mDatas.get(position).getCover())) { | ||||||
|                 ImageUtil.loadImage(context, mDatas.get(position).getCover(), holder.imageView); |                 ImageUtil.loadImage(context, mDatas.get(position).getCover(), holder.imageView); | ||||||
|  |             } if (holder.imageUpdate != null) { | ||||||
|  |                 if( mDatas.get(position).isUpdated()){ | ||||||
|  |                     holder.imageUpdate.setVisibility(View.VISIBLE); | ||||||
|  |                 }else{ | ||||||
|  |                     holder.imageUpdate.setVisibility(View.GONE); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|             } |             } | ||||||
|             if (holder.tvNum != null) holder.tvNum.setText("999"); |             if (holder.tvNum != null) holder.tvNum.setText("999"); | ||||||
|             // 如果设置了回调,则设置点击事件 |             // 如果设置了回调,则设置点击事件 | ||||||
|  | @ -234,6 +243,12 @@ public  class BookListAdapter extends RecyclerView.Adapter< RecyclerView.ViewHol | ||||||
|         notifyItemRemoved(position); |         notifyItemRemoved(position); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     //to set booklist updated, used in shelf | ||||||
|  |     public void setUpdate(List<Novel> lstUpdate) { | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public class FooterViewHolder extends RecyclerView.ViewHolder { |     public class FooterViewHolder extends RecyclerView.ViewHolder { | ||||||
|         @BindView(R.id.pbLoad) |         @BindView(R.id.pbLoad) | ||||||
|         ProgressBar mPbLoad; |         ProgressBar mPbLoad; | ||||||
|  |  | ||||||
|  | @ -14,6 +14,9 @@ import butterknife.ButterKnife; | ||||||
| public  class MyViewHolder extends RecyclerView.ViewHolder { | public  class MyViewHolder extends RecyclerView.ViewHolder { | ||||||
|         @BindView(R.id.imageView) |         @BindView(R.id.imageView) | ||||||
|         ImageView imageView; |         ImageView imageView; | ||||||
|  |         @BindView(R.id.imageUpdated) | ||||||
|  |         @Nullable | ||||||
|  |         ImageView imageUpdate; | ||||||
|         @BindView(R.id.title) |         @BindView(R.id.title) | ||||||
|         TextView tvTitle; |         TextView tvTitle; | ||||||
|         @Nullable |         @Nullable | ||||||
|  | @ -23,10 +26,14 @@ public  class MyViewHolder extends RecyclerView.ViewHolder { | ||||||
|         @BindView(R.id.category) |         @BindView(R.id.category) | ||||||
|         TextView tvCate; |         TextView tvCate; | ||||||
|         @Nullable |         @Nullable | ||||||
|  |         @BindView(R.id.tvNovelStatus) | ||||||
|  |         TextView tvStatus; | ||||||
|  |         @Nullable | ||||||
|         @BindView(R.id.desc) |         @BindView(R.id.desc) | ||||||
|         TextView tvDesc; |         TextView tvDesc; | ||||||
|         @Nullable |         @Nullable | ||||||
|         @BindView(R.id.tvCateNums) |         @BindView(R.id.tvCateNums) | ||||||
|  | 
 | ||||||
|         TextView tvNum; |         TextView tvNum; | ||||||
|         public MyViewHolder(View view) { |         public MyViewHolder(View view) { | ||||||
|             super(view); |             super(view); | ||||||
|  |  | ||||||
|  | @ -34,6 +34,24 @@ public class Novel extends LitePalSupport implements Serializable{ | ||||||
|     private long lastUpdateTime; |     private long lastUpdateTime; | ||||||
|     private boolean isOnShelf;  //是否入书架 |     private boolean isOnShelf;  //是否入书架 | ||||||
|     private boolean isFinished; //是否完本 |     private boolean isFinished; //是否完本 | ||||||
|  |     private boolean isUpdated; | ||||||
|  |     private boolean isTop;//置顶 | ||||||
|  | 
 | ||||||
|  |     public boolean isTop() { | ||||||
|  |         return isTop; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setTop(boolean top) { | ||||||
|  |         isTop = top; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public boolean isUpdated() { | ||||||
|  |         return isUpdated; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setUpdated(boolean updated) { | ||||||
|  |         isUpdated = updated; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     public String getInfoUrl() { |     public String getInfoUrl() { | ||||||
|         return infoUrl; |         return infoUrl; | ||||||
|  |  | ||||||
|  | @ -77,7 +77,7 @@ public interface HttpApi { | ||||||
|     @GET("page/siteranks") |     @GET("page/siteranks") | ||||||
|     Observable<ResponseBody> getSiteRanks(@Query("sex") int Sex); |     Observable<ResponseBody> getSiteRanks(@Query("sex") int Sex); | ||||||
|    //http://xiaoshuofenxiang.com/api/page/siterank?fn=qidian-yuanchuangfengyunbang&pn=3 |    //http://xiaoshuofenxiang.com/api/page/siterank?fn=qidian-yuanchuangfengyunbang&pn=3 | ||||||
|    @GET("page/siterank?fn=qidian-yuanchuangfengyunbang&pn=3") |    @GET("page/siterank") | ||||||
|    Observable<ResponseBody> getSiteRankDetail(@Query("fn")String fn,@Query("pn")int pageNo,@Query("sex") int Sex); |    Observable<ResponseBody> getSiteRankDetail(@Query("fn")String fn,@Query("pn")int pageNo,@Query("sex") int Sex); | ||||||
|    @GET(  "search/{keyword}/{pageno}") |    @GET(  "search/{keyword}/{pageno}") | ||||||
|    Observable<ResponseBody> getSeachNolvelist(@Path("keyword")String keyWord,@Path("pageno")int pageNo,@Query("sex") int Sex); |    Observable<ResponseBody> getSeachNolvelist(@Path("keyword")String keyWord,@Path("pageno")int pageNo,@Query("sex") int Sex); | ||||||
|  |  | ||||||
|  | @ -545,11 +545,15 @@ public class BookUtil { | ||||||
| int muluRetryCount =0; | int muluRetryCount =0; | ||||||
| 
 | 
 | ||||||
|     void readChaptersAsync( ) { |     void readChaptersAsync( ) { | ||||||
|  |         if(mSite==null ||mSiteRule ==null){ | ||||||
|  |             Log.d(TAG,String.format("prepare book loadChapts failed---- %s ,mSite is null? %s ,mSiteRule ==null ? %s",  mNovel.getName()  ,mSite==null,mSiteRule ==null  )); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         String url = mSite.getMuluUrl(); |         String url = mSite.getMuluUrl(); | ||||||
|         Request request = getTagRequest(url); |         Request request = getTagRequest(url); | ||||||
|         mMuluStatus = MuluStatus.isDownloading; |         mMuluStatus = MuluStatus.isDownloading; | ||||||
|         long startTime= new Date().getTime(); |         long startTime= new Date().getTime(); | ||||||
|         Log.d(TAG,String.format("loadChapts----start download %s  目录 from %s",  mNovel.getName()  ,url )); |         Log.d(TAG,String.format("prepare book loadChapts----start download %s  目录 from %s",  mNovel.getName()  ,url )); | ||||||
| 
 | 
 | ||||||
|      /*   if(muluRetryCount<3){ |      /*   if(muluRetryCount<3){ | ||||||
|             muluRetryCount++; |             muluRetryCount++; | ||||||
|  | @ -654,7 +658,10 @@ int muluRetryCount =0; | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|     void buildChapters( String content ,String url){ |     void buildChapters( String content ,String url){ | ||||||
| 
 |         if(mSite==null ||mSiteRule ==null){ | ||||||
|  |             Log.d(TAG,String.format("prepare book buildChapters failed---- %s ,mSite is null? %s ,mSiteRule ==null ? %s",  mNovel.getName()  ,mSite==null,mSiteRule ==null  )); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|         try { |         try { | ||||||
|             JSONObject siteJson = new JSONObject(); |             JSONObject siteJson = new JSONObject(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -33,32 +33,55 @@ public class CommonUtil { | ||||||
| 
 | 
 | ||||||
|     private static final String TAG= CommonUtil.class.getSimpleName(); |     private static final String TAG= CommonUtil.class.getSimpleName(); | ||||||
|     public static int getScreenHeight(Context context){ |     public static int getScreenHeight(Context context){ | ||||||
|         int diff = checkDeviceHasNavigationBar(context); |         int diff = statusBarDiff(context); | ||||||
|  |         int ret=0; | ||||||
|         if(diff >0){ |         if(diff >0){ | ||||||
|             return getDpi(context) -diff;  // return height for no navigation bar |             ret = getRealScreenSize(context).y;// -diff;  // return height for no navigation bar  //有虚拟按键 honor 8 或 没有虚拟按键但顶部有其他占用高度的 mi8 | ||||||
| 
 |             Log.d(TAG, String.format("getNavigationBarSize:screen height is getRealScreenSize(context).y -diff = %s , diff is %s" ,ret ,diff)); | ||||||
|  |         }else { | ||||||
|  |             ret = getAppUsableScreenSize(context).y;  //return for with navigationbar  //没有虚拟按键 mate20 | ||||||
|  |             Log.d(TAG, String.format("getNavigationBarSize:screen height is getAppUsableScreenSize(context).y =%s", ret)); | ||||||
|         } |         } | ||||||
|         return getScreenHeightWithOutBottomBar(context);  //return for with navigationbar |  | ||||||
| 
 | 
 | ||||||
|  |         return ret; | ||||||
|     } |     } | ||||||
|     /** |     /** | ||||||
|      * 获取是否存在NavigationBar |      * 获取是否存在NavigationBar | ||||||
|      * @param context |      * @param context | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|     public static int checkDeviceHasNavigationBar(Context context) { |     public static int statusBarDiff(Context context) { | ||||||
|         Point appUsableSize = getAppUsableScreenSize(context); |         Point appUsableSize = getAppUsableScreenSize(context); | ||||||
|         Point realScreenSize = getRealScreenSize(context); |         Point realScreenSize = getRealScreenSize(context); | ||||||
| 
 | 
 | ||||||
|         Log.d(TAG, String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s" + |         Log.d(TAG, String.format("getNavigationBarSize:getDpi %s,getScreenHeightWithOutBottomBar %s, usablesize.y %s,realScreenSize.y %s" + | ||||||
|                         ",realScreenSize.y -usablesize.y =%s, statusbar height %s" |                         ",realScreenSize.y -usablesize.y =%s, statusbar height %s" | ||||||
|                 ,appUsableSize.y ,realScreenSize.y, realScreenSize.y-appUsableSize.y ,getStatusBarHeight(context) )); |                 ,getDpi(context) ,getScreenHeightWithOutBottomBar(context),appUsableSize.y ,realScreenSize.y, realScreenSize.y-appUsableSize.y ,getStatusBarHeight(context) )); | ||||||
|         Point p = getNavigationBarSize(context); |         Point p = getNavigationBarSize(context); | ||||||
| //        Toast.makeText(context,String.format("getNavigationBarSize: usablesize.y %s,realScreenSize.y %s,diff %s", | //        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(); | //                appUsableSize.y ,realScreenSize.y,realScreenSize.y-appUsableSize.y - getStatusBarHeight(context)),Toast.LENGTH_LONG).show(); | ||||||
|         return   realScreenSize.y-appUsableSize.y - getStatusBarHeight(context); |         return   realScreenSize.y-appUsableSize.y - getStatusBarHeight(context); | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|  |     //状态栏高度 | ||||||
|  |     public static int getStatusBarHeight(Context c) { | ||||||
|  |         int resourceId = c.getResources() | ||||||
|  |                 .getIdentifier("status_bar_height", "dimen", "android"); | ||||||
|  |         if (resourceId > 0) { | ||||||
|  |             return c.getResources().getDimensionPixelSize(resourceId); | ||||||
|  |         } | ||||||
|  |         return 0; | ||||||
|  |     } | ||||||
|  |     //返回值就是导航栏的高度,得到的值单位px | ||||||
|  |     public float getNavigationBarHeight(Context c) { | ||||||
|  |         float result = 0; | ||||||
|  |         int resourceId = c.getResources().getIdentifier("navigation_bar_height", "dimen", "android"); | ||||||
|  |         if (resourceId > 0) { | ||||||
|  |             result = c.getResources().getDimension(resourceId); | ||||||
|  |         } | ||||||
|  |         return result; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     public static Point getNavigationBarSize(Context context) { |     public static Point getNavigationBarSize(Context context) { | ||||||
|         Point appUsableSize = getAppUsableScreenSize(context); |         Point appUsableSize = getAppUsableScreenSize(context); | ||||||
|         Point realScreenSize = getRealScreenSize(context); |         Point realScreenSize = getRealScreenSize(context); | ||||||
|  | @ -103,54 +126,6 @@ public class CommonUtil { | ||||||
| 
 | 
 | ||||||
|         return size; |         return size; | ||||||
|     } |     } | ||||||
|     public static int getStatusBarHeight(Context c) { |  | ||||||
|         int resourceId = c.getResources() |  | ||||||
|                 .getIdentifier("status_bar_height", "dimen", "android"); |  | ||||||
|         if (resourceId > 0) { |  | ||||||
|             return c.getResources().getDimensionPixelSize(resourceId); |  | ||||||
|         } |  | ||||||
|         return 0; |  | ||||||
|     } |  | ||||||
| /*    public static boolean isNavigationBarShow(){ |  | ||||||
|         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |  | ||||||
|             Display display = getActivity().getWindowManager().getDefaultDisplay(); |  | ||||||
|             Point size = new Point(); |  | ||||||
|             Point realSize = new Point(); |  | ||||||
|             display.getSize(size); |  | ||||||
|             display.getRealSize(realSize); |  | ||||||
|             boolean  result  = realSize.y!=size.y; |  | ||||||
|             return realSize.y!=size.y; |  | ||||||
|         }else { |  | ||||||
|             boolean menu = ViewConfiguration.get(getActivity()).hasPermanentMenuKey(); |  | ||||||
|             boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); |  | ||||||
|             if(menu || back) { |  | ||||||
|                 return false; |  | ||||||
|             }else { |  | ||||||
|                 return true; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     }*/ |  | ||||||
| 
 |  | ||||||
|     /** |  | ||||||
|      * 获取是否有虚拟按键 |  | ||||||
|      * 通过判断是否有物理返回键反向判断是否有虚拟按键 |  | ||||||
|      * mate20 不行 |  | ||||||
|      * @param context |  | ||||||
|      * @return |  | ||||||
|      */ |  | ||||||
|    /* public static boolean checkDeviceHasNavigationBar2(Context context) { |  | ||||||
| 
 |  | ||||||
|         boolean hasMenuKey = ViewConfiguration.get(context) |  | ||||||
|                 .hasPermanentMenuKey(); |  | ||||||
|         boolean hasBackKey = KeyCharacterMap |  | ||||||
|                 .deviceHasKey(KeyEvent.KEYCODE_BACK); |  | ||||||
|         if (!hasMenuKey & !hasBackKey) { |  | ||||||
|             // 做任何你需要做的,这个设备有一个导航栏 |  | ||||||
|             return true; |  | ||||||
|         } |  | ||||||
|         return false; |  | ||||||
|     } |  | ||||||
| */ |  | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * 获取虚拟功能键高度 |      * 获取虚拟功能键高度 | ||||||
|  | @ -200,7 +175,7 @@ public class CommonUtil { | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * 获取 虚拟按键的高度 |      * 获取 虚拟按键+ 顶部状态栏 + x 的高度 | ||||||
|      * @param context |      * @param context | ||||||
|      * @return |      * @return | ||||||
|      */ |      */ | ||||||
|  | @ -451,5 +426,45 @@ public class CommonUtil { | ||||||
| 
 | 
 | ||||||
|         return getDateString(time,""); |         return getDateString(time,""); | ||||||
|     } |     } | ||||||
|  | /*    public static boolean isNavigationBarShow(){ | ||||||
|  |         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { | ||||||
|  |             Display display = getActivity().getWindowManager().getDefaultDisplay(); | ||||||
|  |             Point size = new Point(); | ||||||
|  |             Point realSize = new Point(); | ||||||
|  |             display.getSize(size); | ||||||
|  |             display.getRealSize(realSize); | ||||||
|  |             boolean  result  = realSize.y!=size.y; | ||||||
|  |             return realSize.y!=size.y; | ||||||
|  |         }else { | ||||||
|  |             boolean menu = ViewConfiguration.get(getActivity()).hasPermanentMenuKey(); | ||||||
|  |             boolean back = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK); | ||||||
|  |             if(menu || back) { | ||||||
|  |                 return false; | ||||||
|  |             }else { | ||||||
|  |                 return true; | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     }*/ | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 获取是否有虚拟按键 | ||||||
|  |      * 通过判断是否有物理返回键反向判断是否有虚拟按键 | ||||||
|  |      * mate20 不行 | ||||||
|  |      * @param context | ||||||
|  |      * @return | ||||||
|  |      */ | ||||||
|  |    /* public static boolean checkDeviceHasNavigationBar2(Context context) { | ||||||
|  | 
 | ||||||
|  |         boolean hasMenuKey = ViewConfiguration.get(context) | ||||||
|  |                 .hasPermanentMenuKey(); | ||||||
|  |         boolean hasBackKey = KeyCharacterMap | ||||||
|  |                 .deviceHasKey(KeyEvent.KEYCODE_BACK); | ||||||
|  |         if (!hasMenuKey & !hasBackKey) { | ||||||
|  |             // 做任何你需要做的,这个设备有一个导航栏 | ||||||
|  |             return true; | ||||||
|  |         } | ||||||
|  |         return false; | ||||||
|  |     } | ||||||
|  | */ | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -17,4 +17,6 @@ public class Constants { | ||||||
|      public static String[] lstProgress={"连载中","已完本","新书"}; |      public static String[] lstProgress={"连载中","已完本","新书"}; | ||||||
|     public static int retryCnt =10; |     public static int retryCnt =10; | ||||||
|     // public static  List<String> lstProgress=null; |     // public static  List<String> lstProgress=null; | ||||||
|  |     public static boolean showDialogOnUi =true; | ||||||
|  |     public static boolean showDialogOnUiPage =false; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -69,6 +69,8 @@ public class PageFactory implements ChangeSource{ | ||||||
|     private float mBorderWidth; |     private float mBorderWidth; | ||||||
|     // 上下与边缘的距离 |     // 上下与边缘的距离 | ||||||
|     private float marginHeight ; |     private float marginHeight ; | ||||||
|  |     //满屏 差异 | ||||||
|  |     private float screenHeihtDiff ; | ||||||
|     // 左右与边缘的距离 |     // 左右与边缘的距离 | ||||||
|     private float measureMarginWidth ; |     private float measureMarginWidth ; | ||||||
|     // 左右与边缘的距离 |     // 左右与边缘的距离 | ||||||
|  | @ -455,22 +457,24 @@ public static boolean busy(){ | ||||||
|         mWidth = metric.widthPixels; |         mWidth = metric.widthPixels; | ||||||
|        // mHeight = metric.heightPixels; |        // mHeight = metric.heightPixels; | ||||||
|        // mHeight = CommonUtil.getDpi(context); |        // mHeight = CommonUtil.getDpi(context); | ||||||
|         mHeight = CommonUtil.getScreenHeight(context); |         mHeight = CommonUtil.getScreenHeight(context) - CommonUtil.statusBarDiff(context); | ||||||
|         sdf = new SimpleDateFormat("HH:mm");//HH:mm为24小时制,hh:mm为12小时制 |         sdf = new SimpleDateFormat("HH:mm");//HH:mm为24小时制,hh:mm为12小时制 | ||||||
|         date = sdf.format(new java.util.Date()); |         date = sdf.format(new java.util.Date()); | ||||||
|         df = new DecimalFormat("#0.0"); |         df = new DecimalFormat("#0.0"); | ||||||
| 
 | 
 | ||||||
|         marginWidth = mContext.getResources().getDimension(R.dimen.readingMarginWidth); |         marginWidth = mContext.getResources().getDimension(R.dimen.readingMarginWidth); | ||||||
|         marginHeight = mContext.getResources().getDimension(R.dimen.readingMarginHeight); |         marginHeight = mContext.getResources().getDimension(R.dimen.readingMarginHeight); | ||||||
|       //  Log.d(TAG, "PageFactory: marginHeight +" +marginHeight); |        // Log.d(TAG, "getNavigationBarSize: orignal marginHeight +" +marginHeight); | ||||||
|       //  marginHeight = CommonUtil. getStatusBarHeight(mContext); |       //  marginHeight = CommonUtil. getStatusBarHeight(mContext); | ||||||
|         Log.d(TAG, "PageFactory: marginHeight " +marginHeight); | 
 | ||||||
|         statusMarginBottom = mContext.getResources().getDimension(R.dimen.reading_status_margin_bottom); |         statusMarginBottom = mContext.getResources().getDimension(R.dimen.reading_status_margin_bottom); | ||||||
|  |         screenHeihtDiff =CommonUtil.statusBarDiff(mContext); | ||||||
|  |         Log.d(TAG, "getNavigationBarSize: screenHeihtDiff   " +screenHeihtDiff); | ||||||
|         lineSpace = context.getResources().getDimension(R.dimen.reading_line_spacing); |         lineSpace = context.getResources().getDimension(R.dimen.reading_line_spacing); | ||||||
|         paragraphSpace = context.getResources().getDimension(R.dimen.reading_paragraph_spacing); |         paragraphSpace = context.getResources().getDimension(R.dimen.reading_paragraph_spacing); | ||||||
|         mVisibleWidth = mWidth - marginWidth * 2; |         mVisibleWidth = mWidth - marginWidth * 2; | ||||||
|         mVisibleHeight = mHeight - marginHeight * 2; |         mVisibleHeight = mHeight - marginHeight * 2; | ||||||
| 
 |         mHeight +=screenHeihtDiff; | ||||||
|         typeface = config.getTypeface(); |         typeface = config.getTypeface(); | ||||||
|         m_fontSize = config.getFontSize(); |         m_fontSize = config.getFontSize(); | ||||||
|         lineSpace =config.getLineSpace(); |         lineSpace =config.getLineSpace(); | ||||||
|  | @ -686,8 +690,9 @@ public static boolean busy(){ | ||||||
|        // String strPercent = df.format(fPercent * 100) + "%";//进度文字 |        // String strPercent = df.format(fPercent * 100) + "%";//进度文字 | ||||||
|         String strPercent = String.format("%s/%s",currentPage.getPageNo(),currentChaptPages.size()) + "页";//进度文字 |         String strPercent = String.format("%s/%s",currentPage.getPageNo(),currentChaptPages.size()) + "页";//进度文字 | ||||||
|         int nPercentWidth = (int) mBatterryPaint.measureText("10/25页") + 50;  //Paint.measureText直接返回參數字串所佔用的寬度 |         int nPercentWidth = (int) mBatterryPaint.measureText("10/25页") + 50;  //Paint.measureText直接返回參數字串所佔用的寬度 | ||||||
|         c.drawText(strPercent, mWidth - nPercentWidth, mHeight - statusMarginBottom, mBatterryPaint);//x y为坐标值 |         float botoomY =mHeight - statusMarginBottom;// +screenHeihtDiff; | ||||||
|         c.drawText(date, marginWidth ,mHeight - statusMarginBottom, mBatterryPaint); |         c.drawText(strPercent, mWidth - nPercentWidth, botoomY, mBatterryPaint);//x y为坐标值 | ||||||
|  |         c.drawText(date, marginWidth ,botoomY, mBatterryPaint); | ||||||
|         // 画电池 |         // 画电池 | ||||||
|         level = batteryInfoIntent.getIntExtra( "level" , 0 ); |         level = batteryInfoIntent.getIntExtra( "level" , 0 ); | ||||||
|         int scale = batteryInfoIntent.getIntExtra("scale", 100); |         int scale = batteryInfoIntent.getIntExtra("scale", 100); | ||||||
|  | @ -696,8 +701,8 @@ public static boolean busy(){ | ||||||
|         //画电池外框 |         //画电池外框 | ||||||
|         float width = CommonUtil.convertDpToPixel(mContext,20) - mBorderWidth; |         float width = CommonUtil.convertDpToPixel(mContext,20) - mBorderWidth; | ||||||
|         float height = CommonUtil.convertDpToPixel(mContext,10); |         float height = CommonUtil.convertDpToPixel(mContext,10); | ||||||
|         rect1.set(rect1Left, mHeight - height - statusMarginBottom,rect1Left + width, mHeight - statusMarginBottom); |         rect1.set(rect1Left, botoomY - height  ,rect1Left + width, botoomY); | ||||||
|         rect2.set(rect1Left + mBorderWidth, mHeight - height + mBorderWidth - statusMarginBottom, rect1Left + width - mBorderWidth, mHeight - mBorderWidth - statusMarginBottom); |         rect2.set(rect1Left + mBorderWidth, botoomY - height + mBorderWidth  , rect1Left + width - mBorderWidth, botoomY - mBorderWidth ); | ||||||
|        // c.save(Canvas.CLIP_SAVE_FLAG); |        // c.save(Canvas.CLIP_SAVE_FLAG); | ||||||
|         c.save(); |         c.save(); | ||||||
|         c.clipRect(rect2, Region.Op.DIFFERENCE); |         c.clipRect(rect2, Region.Op.DIFFERENCE); | ||||||
|  |  | ||||||
| After Width: | Height: | Size: 780 B | 
| After Width: | Height: | Size: 605 B | 
| After Width: | Height: | Size: 672 B | 
| After Width: | Height: | Size: 677 B | 
|  | @ -0,0 +1,6 @@ | ||||||
|  | <?xml version="1.0" encoding="utf-8"?> | ||||||
|  | <selector | ||||||
|  |   xmlns:android="http://schemas.android.com/apk/res/android"> | ||||||
|  |     <item android:state_pressed="true" android:drawable="@drawable/slide_block_click" /> | ||||||
|  |     <item android:drawable="@drawable/slide_block" /> | ||||||
|  | </selector> | ||||||
| After Width: | Height: | Size: 1.0 KiB | 
| After Width: | Height: | Size: 975 B | 
|  | @ -8,9 +8,10 @@ | ||||||
|     android:orientation="vertical"> |     android:orientation="vertical"> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|         <LinearLayout |         <FrameLayout | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="match_parent" |             android:layout_height="match_parent" | ||||||
|  | 
 | ||||||
|             android:orientation="vertical"> |             android:orientation="vertical"> | ||||||
| 
 | 
 | ||||||
|             <android.support.v7.widget.RecyclerView |             <android.support.v7.widget.RecyclerView | ||||||
|  | @ -32,9 +33,11 @@ | ||||||
|                 android:layout_weight="0" |                 android:layout_weight="0" | ||||||
|                 android:background="@color/white" |                 android:background="@color/white" | ||||||
|                 android:gravity="bottom" |                 android:gravity="bottom" | ||||||
|  |                 android:layout_gravity="bottom" | ||||||
|                 android:orientation="horizontal" |                 android:orientation="horizontal" | ||||||
|                 android:visibility="gone" |                 android:visibility="visible" | ||||||
|                 android:paddingBottom="0dp" |                 android:paddingBottom="0dp" | ||||||
|  | 
 | ||||||
|                 > |                 > | ||||||
| 
 | 
 | ||||||
|                 <Button |                 <Button | ||||||
|  | @ -50,7 +53,7 @@ | ||||||
|                     android:textColor="@color/colorAccent" /> |                     android:textColor="@color/colorAccent" /> | ||||||
| 
 | 
 | ||||||
|             </LinearLayout> |             </LinearLayout> | ||||||
|         </LinearLayout> |         </FrameLayout> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -2,7 +2,10 @@ | ||||||
|     xmlns:tools="http://schemas.android.com/tools" |     xmlns:tools="http://schemas.android.com/tools" | ||||||
| 
 | 
 | ||||||
|     style="@style/llOutside" |     style="@style/llOutside" | ||||||
|     tools:context=".Fragments.Fragment_booklist"> |     tools:context=".Fragments.Fragment_booklist" | ||||||
|  | 
 | ||||||
|  |     android:clipToPadding="false" | ||||||
|  |     > | ||||||
|     <android.support.v4.widget.SwipeRefreshLayout |     <android.support.v4.widget.SwipeRefreshLayout | ||||||
|         android:id="@+id/swipeLayout" |         android:id="@+id/swipeLayout" | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|  |  | ||||||
|  | @ -10,7 +10,7 @@ | ||||||
|     android:layout_margin="0dp" |     android:layout_margin="0dp" | ||||||
|     android:padding="2dp"> |     android:padding="2dp"> | ||||||
|     <FrameLayout |     <FrameLayout | ||||||
|     android:layout_width="match_parent" |     android:layout_width="wrap_content" | ||||||
|     android:layout_height="wrap_content"> |     android:layout_height="wrap_content"> | ||||||
| 
 | 
 | ||||||
|         <ImageView |         <ImageView | ||||||
|  | @ -18,11 +18,20 @@ | ||||||
|         style="@style/NovelImage" |         style="@style/NovelImage" | ||||||
| 
 | 
 | ||||||
|         android:src="@drawable/googleg_standard_color_18" /> |         android:src="@drawable/googleg_standard_color_18" /> | ||||||
|  |         <ImageView | ||||||
|  |             android:id="@+id/imageUpdated" | ||||||
|  |              android:layout_width="38dp" | ||||||
|  |             android:layout_height="38dp" | ||||||
|  |             android:layout_gravity="end" | ||||||
|  |             android:layout_marginTop="2dp" | ||||||
|  |             android:layout_marginRight="6dp" | ||||||
|  |             android:visibility="gone" | ||||||
|  |             android:src="@drawable/ic_book_update_flag" /> | ||||||
|         <CheckBox |         <CheckBox | ||||||
|             android:id="@+id/id_check_box" |             android:id="@+id/id_check_box" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="wrap_content" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:layout_gravity="right" |             android:layout_gravity="end" | ||||||
|             android:layout_marginTop="5dp" |             android:layout_marginTop="5dp" | ||||||
|             android:visibility="gone" |             android:visibility="gone" | ||||||
|             android:text=""/> |             android:text=""/> | ||||||
|  |  | ||||||
|  | @ -19,7 +19,9 @@ | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="match_parent" |         android:layout_height="match_parent" | ||||||
|         android:gravity="top" |         android:gravity="top" | ||||||
|         android:layout_weight="1"> |         android:layout_weight="1" | ||||||
|  | 
 | ||||||
|  |         > | ||||||
| 
 | 
 | ||||||
|         <TextView |         <TextView | ||||||
|             android:id="@+id/title" |             android:id="@+id/title" | ||||||
|  | @ -27,6 +29,7 @@ | ||||||
| 
 | 
 | ||||||
|             android:text=" " |             android:text=" " | ||||||
|            /> |            /> | ||||||
|  | 
 | ||||||
|         <LinearLayout |         <LinearLayout | ||||||
|         android:layout_marginTop="2dp" |         android:layout_marginTop="2dp" | ||||||
|         android:layout_marginLeft="0dp" |         android:layout_marginLeft="0dp" | ||||||
|  | @ -39,6 +42,13 @@ | ||||||
|             android:id="@+id/category" |             android:id="@+id/category" | ||||||
|             android:text=" " |             android:text=" " | ||||||
|             /> |             /> | ||||||
|  |             <TextView | ||||||
|  |                 style="@style/TextViewNovelType.Status" | ||||||
|  |                 android:id="@+id/tvNovelStatus" | ||||||
|  |                 android:text="" | ||||||
|  |                 android:layout_marginLeft="10dp" | ||||||
|  | 
 | ||||||
|  |                 /> | ||||||
|         <TextView |         <TextView | ||||||
|             android:id="@+id/author" |             android:id="@+id/author" | ||||||
|             style="@style/TextViewNovelAuthor" |             style="@style/TextViewNovelAuthor" | ||||||
|  |  | ||||||
|  | @ -5,18 +5,21 @@ | ||||||
|     android:layout_width="match_parent" |     android:layout_width="match_parent" | ||||||
|     android:layout_height="match_parent" |     android:layout_height="match_parent" | ||||||
|     android:background="#000000" |     android:background="#000000" | ||||||
|     android:orientation="vertical"> |  | ||||||
| 
 | 
 | ||||||
|  |     android:orientation="vertical"> | ||||||
|  |     <!--android:clipToPadding="false" | ||||||
|  |         android:fitsSystemWindows="true" | ||||||
|  |     --> | ||||||
|     <FrameLayout |     <FrameLayout | ||||||
|         android:layout_width="match_parent" |         android:layout_width="match_parent" | ||||||
|         android:layout_height="match_parent"> |         android:layout_height="match_parent" | ||||||
|  |      > | ||||||
|         <android.support.design.widget.AppBarLayout |         <android.support.design.widget.AppBarLayout | ||||||
|             android:id="@+id/appbar" |             android:id="@+id/appbar" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="wrap_content" |             android:layout_height="wrap_content" | ||||||
|             android:layout_alignParentTop="true" |             android:layout_alignParentTop="true" | ||||||
|             android:clipToPadding="true" | 
 | ||||||
|             android:fitsSystemWindows="true" |  | ||||||
|             android:theme="@style/AppTheme.AppBarOverlay" |             android:theme="@style/AppTheme.AppBarOverlay" | ||||||
| 
 | 
 | ||||||
|             android:visibility="gone"> |             android:visibility="gone"> | ||||||
|  | @ -26,7 +29,6 @@ | ||||||
|                 android:layout_width="match_parent" |                 android:layout_width="match_parent" | ||||||
|                 android:layout_height="wrap_content" |                 android:layout_height="wrap_content" | ||||||
|                 android:background="@color/read_dialog_bg" |                 android:background="@color/read_dialog_bg" | ||||||
| 
 |  | ||||||
|                 android:fitsSystemWindows="true" |                 android:fitsSystemWindows="true" | ||||||
|                 android:minHeight="?attr/actionBarSize" |                 android:minHeight="?attr/actionBarSize" | ||||||
|                 app:popupTheme="@style/AppTheme.PopupOverlay" /> |                 app:popupTheme="@style/AppTheme.PopupOverlay" /> | ||||||
|  | @ -38,7 +40,9 @@ | ||||||
|         <com.novelbook.android.view.PageWidget |         <com.novelbook.android.view.PageWidget | ||||||
|             android:id="@+id/bookpage" |             android:id="@+id/bookpage" | ||||||
|             android:layout_width="match_parent" |             android:layout_width="match_parent" | ||||||
|             android:layout_height="match_parent" /> |             android:layout_height="match_parent" | ||||||
|  | 
 | ||||||
|  |             /> | ||||||
| 
 | 
 | ||||||
|         <LinearLayout |         <LinearLayout | ||||||
|             android:id="@+id/llTopAd" |             android:id="@+id/llTopAd" | ||||||
|  |  | ||||||
| After Width: | Height: | Size: 699 B | 
| After Width: | Height: | Size: 1.2 KiB | 
|  | @ -410,6 +410,19 @@ | ||||||
|     </style> |     </style> | ||||||
| 
 | 
 | ||||||
|     <style name="Toolbar"></style> |     <style name="Toolbar"></style> | ||||||
|  |     <style name="FastScrollTheme"> | ||||||
|  |         <item name="android:textColorPrimary">?android:textColorPrimaryInverse</item> | ||||||
|  |         <item name="android:fastScrollThumbDrawable">@drawable/selector_slide_view</item> | ||||||
|  |         <item name="android:fastScrollTrackDrawable">@android:color/transparent</item> | ||||||
|  |     </style> | ||||||
|  | 
 | ||||||
|  |     <style name="TextViewNovelType.Status"> | ||||||
|  | 
 | ||||||
|  |         <item name="android:textColor">@color/mediumturquoise</item> | ||||||
|  |         <item name="android:textSize">12sp</item> | ||||||
|  | 
 | ||||||
|  |     </style> | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| </resources> | </resources> | ||||||
|  |  | ||||||