package com.novelbook.android; import android.Manifest; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.os.Build; import android.os.Handler; import android.os.Message; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.bumptech.glide.Glide; import com.google.gson.Gson; import com.novelbook.android.adapter.BookListAdapter; import com.novelbook.android.bean.NovelSites; import com.novelbook.android.db.Chapter; import com.novelbook.android.db.Novel; import com.novelbook.android.filechooser.FileChooserActivity; 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.GsonUtil; import com.novelbook.android.utils.NovelParseUtil; import com.novelbook.android.utils.PageFactory; import com.youth.banner.loader.ImageLoader; 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; import static com.novelbook.android.FileActivity.EXTERNAL_STORAGE_REQ_CODE; public class BookActivity extends Activity_base { private PageFactory pageFactory; String novelId="f2619820112625133c14dcb170f5e092"; String muluUrl="https://www.qu.la/book/390/"; private Novel mNovel; private Chapter mChapter; static String TAG = BookActivity.class.getSimpleName(); BookListAdapter mAdapter; // private BookListAdapter mAdapter; private List mData;; private Gson gson = new Gson(); private List mChapters = new ArrayList<>(); @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.rvBooklist) RecyclerView rvBooklist; @BindView(R.id.btnShelf) Button btnShelf; @BindView(R.id.imageView) ImageView imageView; @BindView(R.id.title) TextView txtTitle; @BindView(R.id.desc) TextView txtDesc; @BindView(R.id.author) TextView txtAuth; @BindView(R.id.category) TextView txtCategory; @BindView(R.id.txtDesc2) TextView txtDesc2; @BindView(R.id.txtLatestCate) TextView txtLatestCate; @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() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { checkPermission(BookActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE, EXTERNAL_STORAGE_REQ_CODE,"添加图书需要此权限,请允许"); } pageFactory = PageFactory.getInstance(); setBookInfo();//set title ,data from novel list if(mNovel==null) { getBookInfo(); } mData =getFakeData(5); mAdapter = getBookListAdapter(mData); } private void setBookInfo() { } private MyLoader loader = new MyLoader(); public void setBookDetailInfo( ){ setShelfButtonText(); this.txtAuth.setText(mNovel.getAuthor()); this.txtCategory.setText(mNovel.getNovelType()); this.txtDesc.setText(mNovel.getDescription()); this.txtTitle.setText(mNovel.getName()); this.txtDesc2.setText(mNovel.getDescription()); this.txtLatestCate.setText(mNovel.getLastestChapterName()); if(mNovel.getLastUpateTime()>0){ ; this.txtLatestCate.setText( new Date(mNovel.getLastUpateTime()).toString() +"\n"+txtLatestCate.getText()); } if(!TextUtils.isEmpty(mNovel.getCover())) { loader.displayImage(BookActivity.this, mNovel.getCover(), imageView); } } private class MyLoader extends ImageLoader { @Override public void displayImage(Context context, Object path, ImageView imageView) { Glide.with(context).load((String) path).into(imageView); } } void setShelfButtonText(){ String title = mNovel.isOnShelf()?"移除书架":"加入书架"; btnShelf.setText(title); } @OnClick({R.id.btnRead,R.id.btnCacheBook,R.id.btnShelf}) void submitButton(View view){ switch (view.getId()) { case R.id.btnRead: readBook(); //testBook(); // openBook(new Novel() ); break; case R.id.btnCacheBook: cacheBook(); break; case R.id.btnShelf: shelfBook(); break; } } private void shelfBook() { mNovel.setOnShelf(!mNovel.isOnShelf()); mNovel.save(); setShelfButtonText(); } Handler handler = new Handler() { @Override public void handleMessage(Message msg) { int wt = msg.what; if (msg.what == 1 ) { setBookDetailInfo(); } } }; private void readBook() { if(mNovel ==null){ Toast.makeText(this,"网络错误",Toast.LENGTH_LONG); return; } ReadActivity.openBook(mNovel , BookActivity.this); } private void getChapters() { } private void cacheBook() { 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 ,null,this); } void getMuluInfo(){ BookSubscribe.getNovelSites(novelId,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { //成功 try { NovelSites nvs = (NovelSites) gson.fromJson(result,NovelSites.class); pageFactory.prepareBook(mNovel,nvs,BookActivity.this); } catch ( Exception e) { e.printStackTrace(); } Toast.makeText(BookActivity.this,"getMuluInfo 请求成功 " ,Toast.LENGTH_SHORT).show(); } @Override public void onFault(String errorMsg) { //失败 Toast.makeText(BookActivity.this,"getMuluInfo 请求失败"+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) { //成功 Novel nv ; nv = gson.fromJson(result,Novel.class); // nv = GsonUtil.getNovel(result); 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); handler.sendEmptyMessage(1); } 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 readChapters( String url){ //to get mulu list 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 ,mChapter,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$"); siteJson.put("chapterUrlRegexOnMulu", "
]*href=\"(/book/[\\d]+/[\\d]+\\.html)\">([^<]+)
"); mChapters = NovelParseUtil.getChapters(url, content, siteJson); if (mChapters != null) { int lastReadChapt = mNovel.getLastReadChapt(); // int index =lastReadChapt*2-2; lastReadChapt = lastReadChapt >=mChapters.size() ? mChapters.size() -1:lastReadChapt; lastReadChapt = lastReadChapt <=0 ? 1:lastReadChapt; mChapter =mChapters.get(lastReadChapt-1); } } 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(); } }