package com.novelbook.android; import android.app.AlertDialog; import android.content.DialogInterface; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.Toast; import com.google.gson.Gson; import com.novelbook.android.adapter.BookListAdapter; import com.novelbook.android.db.Chapter; import com.novelbook.android.db.Novel; import com.novelbook.android.netsubscribe.BookSubscribe; import com.novelbook.android.netsubscribe.MovieSubscribe; import com.novelbook.android.netutils.HttpMethods; import com.novelbook.android.netutils.OnSuccessAndFaultListener; import com.novelbook.android.netutils.OnSuccessAndFaultSub; import com.novelbook.android.utils.BookUtil; import com.novelbook.android.utils.NovelParseUtil; import org.json.JSONException; import org.json.JSONObject; import org.litepal.LitePal; import java.io.File; import java.io.IOException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; import java.util.List; import butterknife.BindView; import butterknife.OnClick; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; public class BookActivity extends Activity_base { String novelId="f2619820112625133c14dcb170f5e092"; String muluUrl="https://www.qu.la/book/390/"; private Novel mNovel; static String TAG = BookActivity.class.getSimpleName(); BookListAdapter mAdapter; // private BookListAdapter mAdapter; private List mData;; private ArrayList mChapters = new ArrayList<>(); @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.rvBooklist) RecyclerView rvBooklist; @Override public int getLayoutRes() { return R.layout.activity_book; } @Override protected void initViews() { initialBookList(); } @Override protected void setupToolbar(){ super.setupToolbar(); toolbar.inflateMenu(R.menu.menu_book);//设置右上角的填充菜单 toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int menuItemId = item.getItemId(); if (menuItemId == R.id.menuShelf) { } return true; } }); } @Override protected void setTitle() { String title = getIntent().getStringExtra("BOOKNAME"); this.setTitle(title); } @Override protected void initData() { getBookInfo(); // getMuluInfo(); mData =getFakeData(5); mAdapter = getBookListAdapter(mData); } @OnClick({R.id.btnRead,R.id.btnCacheBook}) void submitButton(View view){ switch (view.getId()) { case R.id.btnRead: testBook(); // openBook(new Novel() ); break; case R.id.btnCacheBook: cachBook(); break; } } private void cachBook() { MovieSubscribe.getData(1,10,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { //成功 Toast.makeText(BookActivity.this,"请求成功:"+result,Toast.LENGTH_SHORT).show(); } @Override public void onFault(String errorMsg) { //失败 Toast.makeText(BookActivity.this,"请求失败:"+errorMsg,Toast.LENGTH_SHORT).show(); } },BookActivity.this)); } void openBook(Novel book ) { final String path = book.getNovelPath(); if(null ==path) { List bookLists = LitePal.findAll(Novel.class); if(bookLists.size()>0) { openBook(bookLists.get(0) ); } return; } File file = new File(path); if (!file.exists()){ //to get book content txt from web new AlertDialog.Builder(this) .setTitle(this.getString(R.string.app_name)) .setMessage(path + "文件不存在,是否删除该书本?") .setPositiveButton("删除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { LitePal.deleteAll(Novel.class, "bookpath = ?", path); } }).setCancelable(true).show(); return; } ReadActivity.openBook(book ,mChapters,this); } void getMuluInfo(){ BookSubscribe.getNovelMulu(novelId,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { //成功 try { JSONObject jsonObject = new JSONObject(result); muluUrl= jsonObject.getString("muluUrl"); } catch (JSONException e) { e.printStackTrace(); } Toast.makeText(BookActivity.this,"muluUrl 请求成功:" + muluUrl,Toast.LENGTH_SHORT).show(); } @Override public void onFault(String errorMsg) { //失败 Toast.makeText(BookActivity.this,"Novel 请求失败:"+errorMsg,Toast.LENGTH_SHORT).show(); } },BookActivity.this)); } void getBookInfo(){ boolean isLocalDbExist = LitePal.isExist(Novel.class,"novelId=?", novelId); BookSubscribe.getNovel(novelId,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { //成功 Gson gson = new Gson(); // result ={"id":"f2619820112625133c14dcb170f5e092","novelType":"����","novelType2":"������½","name":"���Ʋ��","author":"�������","cover":"http:\/\/qidian.qpic.cn\/qdbimg\/349573\/1209977\/180","description":"","lastestChapterName":"�ڰ��� ��ʼ","lastUpateTime":""} // Novel nv = gson.fromJson(result,Novel.class); //to change id to noveId Novel nv = new Novel(); try { JSONObject jsonObject = new JSONObject(result); nv.setNovelId(jsonObject.getString("id")); // nv.setLastUpateTime(jsonObject.getLong("lastUpateTime")); nv.setAuthor(jsonObject.getString("author")); nv.setNovelName(jsonObject.getString("name")); nv.setCover(jsonObject.getString("cover")); nv.setNovelType(jsonObject.getString("novelType")); nv.setNovelType2(jsonObject.getString("novelType2")); nv.setLastestChapterName(jsonObject.getString("lastestChapterName")); } catch (JSONException e) { e.printStackTrace(); } //to load image //to load desc //... if(!isLocalDbExist){ // nv.saveAsync(); nv.save (); }else{ List nvs = LitePal.where("novelId=?",novelId).find(Novel.class); for (Novel novel:nvs ) { Log.d(TAG,String.format("novel id %s before update: lastUpdateTime: %s",novel.getId(),novel.getLastUpateTime())); } nv.setLastUpateTime(new Date().getTime()); nv.updateAll("novelId=?",novelId); nvs = LitePal.where("novelId=?",novelId).find(Novel.class); for (Novel novel:nvs ) { Log.d(TAG,String.format("novel id %s after update: lastUpdateTime: %s",novel.getId(),novel.getLastUpateTime())); } } List nvs = LitePal.where("novelId=?",novelId).find(Novel.class); if(nvs.size()>0) { mNovel = nvs.get(0); } // getMuluInfo(); Toast.makeText(BookActivity.this,"Novel 请求成功:"+result,Toast.LENGTH_SHORT).show(); } @Override public void onFault(String errorMsg) { //失败 Toast.makeText(BookActivity.this,"Novel 请求失败:"+errorMsg,Toast.LENGTH_SHORT).show(); } },BookActivity.this)); } void testBook(){ //to get mulu list String url = muluUrl;// "https://www.qu.la/book/161/";//"https://www.qu.la/book/746/"; Request request = new Request.Builder() .url(url) // .header("User-Agent", "OkHttp Example") .build(); HttpMethods.getOkClient().newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.d(TAG, "onFailure: " + e.getMessage()); } @Override public void onResponse(Call call, Response response){ ResponseBody body = response.body(); if (body != null) { try { String bodyStr = body.string(); Log.d(TAG, "onResponse: " +bodyStr); onResponseProcess(bodyStr,url); ReadActivity.openBook(mNovel ,mChapters,BookActivity.this); } catch (IOException e) { e.printStackTrace(); }finally { body.close(); } } } }); } void onResponseProcess( String content ,String url){ // HttpResult result ; // HttpResult result2 = null; try { JSONObject siteJson = new JSONObject(); siteJson.put("chapterUrlRegexOnMulu", ""); siteJson.put("chapterUrlPattern", "/book/[\\d]+/[\\d]+\\.html$"); /* String[] chapters = NovelParseUtil.getChapters(url, content, siteJson); if (chapters != null) { for (int i = 0; i < chapters.length; i += 2) { Log.d(TAG,String.format("%s-->%s", chapters[i], chapters[i+1])); } } */ siteJson.put("chapterUrlRegexOnMulu", "
]*href=\"(/book/[\\d]+/[\\d]+\\.html)\">([^<]+)
"); String[] chapters2 = NovelParseUtil.getChapters(url, content, siteJson); if (chapters2 != null) { for (int i = 0; i < chapters2.length; i += 2) { Log.d(TAG, String.format("%s-->%s", chapters2[i], chapters2[i + 1])); Chapter chapter = new Chapter(); chapter.setChapterName(chapters2[i + 1]); chapter.setChapterUrl(chapters2[i ]); mChapters.add(chapter); } /* siteJson.put("chapterContentRegex", "
([\\s\\S]+?)
"); siteJson.put("chapterContentDumpRegex", ""); for (int i = 0; i < chapters2.length; i += 2) { Request request = new Request.Builder() .url(chapters2[i]) // .header("User-Agent", "OkHttp Example") .build(); Response response = HttpMethods.getOkClient().newCall(request).execute(); // Log.d(TAG,String.format("%s-->%s\n%s" , chapters2[i], chapters2[i+1] , NovelParseUtil.getChapterContent(response.body().string(), siteJson))); } */ } } catch (JSONException e) { // } catch (JSONException | IOException e) { e.printStackTrace(); } finally { // result.close(); // if (result2 != null) result2.close(); } } //----------------绑定列表 void initialBookList() { rvBooklist.setLayoutManager(new LinearLayoutManager(this)); rvBooklist.setAdapter(mAdapter); } @Override protected void onResume() { super.onResume(); // View v =findViewById(R.id.head_img); // v.measure(0,0); // BlurKit.getInstance().blur(v, 20); // BlurKit.getInstance().fastBlur(v,20, 0.3f); } @Override protected void onStart() { super.onStart(); // blurLayout.startBlur(); // blurLayout.lockView(); } @Override protected void onStop() { super.onStop(); // blurLayout.pauseBlur(); } /* class BookListAdapter extends RecyclerView.Adapter< BookListAdapter.MyViewHolder> { private final int EMPTY_VIEW = 1; private final int PROGRESS_VIEW = 2; private final int IMAGE_VIEW = 3; private Context context; private List mDatas = new ArrayList(); private OnItemClickListener mOnItemClickListener; private int listItemID; public BookListAdapter(Context context,List mDatas,int listItemID,OnItemClickListener clickLitener) { this.context = context; this.mDatas = mDatas; this.mOnItemClickListener = clickLitener; this.listItemID = listItemID; } public BookListAdapter(Context context, OnItemClickListener clickLitener) { this.context = context; this.mOnItemClickListener = clickLitener; } @Override public int getItemViewType(int position) { if(mDatas.size() == 0){ return EMPTY_VIEW; } else if(mDatas.get(position) == null){ return PROGRESS_VIEW; } else { return super.getItemViewType(position); } } @Override public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { BookListAdapter.MyViewHolder holder = new BookListAdapter.MyViewHolder(LayoutInflater.from( context).inflate(listItemID, parent, false)); return holder; } public void setParameters(List mDatas,int listItemID ) { this.mDatas = mDatas; this.listItemID = listItemID; } public void setOnItemClickLitener(OnItemClickListener mOnItemClickLitener) { this.mOnItemClickListener = mOnItemClickLitener; } @Override public void onBindViewHolder( BookListAdapter.MyViewHolder holder, int position) { holder.tvTitle.setText(mDatas.get(position)); holder.tvAuthor.setText("金庸" +position); holder.tvCate.setText("cate"+position); holder.tvDesc.setText("this is desc " +position); // 如果设置了回调,则设置点击事件 if (mOnItemClickListener != null) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickListener.onItemClick(holder.itemView, pos); } }); holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { int pos = holder.getLayoutPosition(); mOnItemClickListener.onItemLongClick(holder.itemView, pos); return false; } }); } } @Override public int getItemCount() { return mDatas.size(); } public void addData(int position) { mDatas.add(position, "Insert One"); notifyItemInserted(position); } public void removeData(int position) { mDatas.remove(position); notifyItemRemoved(position); } class MyViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.title) TextView tvTitle; @BindView(R.id.author) TextView tvAuthor; @BindView(R.id.category) TextView tvCate; @BindView(R.id.desc) TextView tvDesc; public MyViewHolder(View view) { super(view); ButterKnife.bind(this, view); //tvTitle = (TextView) view.findViewById(R.id.title); // tvAuthor = (TextView) view.findViewById(R.id.author); } } } */ }