package com.novelbook.android; import android.Manifest; import android.app.AlertDialog; import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; 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.DownloadTask; 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.service.ChapterDownloadSvrc; import com.novelbook.android.service.MyIntentService; import com.novelbook.android.service.ServiceDownload; import com.novelbook.android.utils.BookUtil; import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.MyImageLoader; 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; int novelId = 31590; // 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; @BindView(R.id.btnCacheBook) Button btnCach; Intent serviceIntent ; public Intent getSvrIntent(){ if(serviceIntent ==null){ serviceIntent= new Intent(this, ServiceDownload.class); } return serviceIntent; } @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); int bookId = getIntent().getIntExtra("bookId", 0); // this.setTitle("bookName"); } @Override protected void initData() { initiDownloadReceiver(); 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 MyImageLoader loader = new MyImageLoader(); public void setBookDetailInfo() { setShelfButtonText(); this.setTitle(mNovel.getName());//why not apply this.txtAuth.setText(mNovel.getAuthor()); this.txtCategory.setText(mNovel.getNovelType()); this.txtDesc.setText(mNovel.getDesc ()); this.txtTitle.setText(mNovel.getName()); this.txtDesc2.setText(mNovel.getDesc ()); this.txtLatestCate.setText(mNovel.getChapterName()); if (mNovel.getLastUpateTime() > 0) { this.txtLatestCate.setText(new Date(mNovel.getLastUpateTime()).toString() + "\n" + txtLatestCate.getText()); } if (!TextUtils.isEmpty(mNovel.getCover())) { String cover =mNovel.getCover(); if(!TextUtils.isEmpty(cover) ){ if(cover.startsWith("//")){ cover ="http:"+cover; } } loader.displayImage(BookActivity.this, cover, 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(); } else if (msg.what == 2) //准备数据,启动service { hideProgress(); Toast.makeText(BookActivity.this, "已加入下载队列1", Toast.LENGTH_LONG).show(); } else if (msg.what == 3) { Toast.makeText(BookActivity.this, "获取目录信息失败,下载失败", Toast.LENGTH_LONG).show(); } } }; private void readBook() { if (mNovel == null) { Toast.makeText(this, "网络错误", Toast.LENGTH_LONG); return; } ReadActivity.openBook(mNovel, BookActivity.this); } private void getChapters() { } boolean test=false; private void cacheBook() { if(test) { String url[] = { "https://img-blog.csdn.net/20160903083245762", "https://img-blog.csdn.net/20160903083252184", "https://img-blog.csdn.net/20160903083257871", "https://img-blog.csdn.net/20160903083257871", "https://img-blog.csdn.net/20160903083311972", "https://img-blog.csdn.net/20160903083319668", "https://img-blog.csdn.net/20160903083326871" }; Intent intent = new Intent(this, MyIntentService.class); for (int i=0;i<7;i++) {//循环启动任务 intent.putExtra(MyIntentService.DOWNLOAD_URL,url[i]); intent.putExtra(MyIntentService.INDEX_FLAG,i); startService(intent); } intent = getSvrIntent();//new Intent(this, ServiceDownload.class);;; for(int i=0;i<5;i++) { intent.putExtra("taskId",i); startService( intent); } // intent = new Intent(this, ChapterDownloadSvrc.class);;; // for(int i=0;i<3;i++) { // intent.putExtra("taskId",i); // startService( intent); } return; } // if (LitePal.where("novelId = ?", mNovel.getId() + "").count("DownloadTask") > 0) { List dts = LitePal.where("novelId = ?", mNovel.getId() + "").limit(1).find(DownloadTask.class); if (dts.size() > 0) { if (dts.get(0).getStatus() == 1) { Toast.makeText(this, String.format("亲,小说《%s》已经缓存完成了", mNovel.getName()), Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, String.format("亲,小说《%s》已经在缓存队列了,请耐心等待", mNovel.getName()), Toast.LENGTH_LONG).show(); startDownloadService(dts.get(0).getId()); // startService( getSvrIntent()); } return; } // } new Thread() { @Override public void run() { int slepttime = 0; while (slepttime < 100 && pageFactory.getChapters().size() == 0) { try { sleep(50); slepttime++; } catch (InterruptedException e) { e.printStackTrace(); } } if (pageFactory.getChapters().size() == 0) { handler.sendEmptyMessage(3); } else { DownloadTask dt = new DownloadTask(); dt.setDomain(mNovel.getDomain()); dt.setFinishedChpats(0); dt.setNovelId(mNovel.getId()); dt.setStatus(0); dt.setTotalChapts(mNovel.getTotalChapts()); dt.save(); // LitePal.deleteAll("chapter","novelId=?",mNovel.getId()+""); for (Chapter chapter : pageFactory.getChapters()) { chapter.setNovelId(mNovel.getId()); chapter.save(); } startDownloadService(dt.getId()); handler.sendEmptyMessage(2); } // Toast.makeText(BookActivity.this,"已加入下载队列2",Toast.LENGTH_LONG).show(); } }.start(); showProgress(false, "正在加入到队列,请等待"); } private void startDownloadService(int taskId) { Intent serviceIntent = getSvrIntent(); serviceIntent.putExtra("taskId",taskId); startService(serviceIntent); } 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 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 { nv.updateAll("novelId=?", novelId+""); } mNovel = Novel.getNovelBySvrId(novelId); if (null != mNovel) { handler.sendEmptyMessage(1); } pageFactory.prepareBook(mNovel); // 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(); mNovel = Novel.getNovelBySvrId(novelId); if (null != mNovel) { handler.sendEmptyMessage(1); pageFactory.prepareBook(mNovel); } } }, 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(); registerReceiver(receiver,filter); // View v =findViewById(R.id.head_img); // v.measure(0,0); // BlurKit.getInstance().blur(v, 20); // BlurKit.getInstance().fastBlur(v,20, 0.3f); } @Override public void onPause() { super.onPause(); unregisterReceiver(receiver); } @Override protected void onStart() { super.onStart(); // blurLayout.startBlur(); // blurLayout.lockView(); } @Override protected void onStop() { super.onStop(); // blurLayout.pauseBlur(); } private IntentFilter filter; DownloadProcessReceiver receiver; void initiDownloadReceiver(){ filter = new IntentFilter("ServiceDownload.ChapterContent.finished"); filter.addCategory(Intent.CATEGORY_DEFAULT); receiver = new DownloadProcessReceiver(); } class DownloadProcessReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent){ int novelId =0; int progress=0; if( intent.hasExtra("novelId")){ novelId = intent.getIntExtra("novelId",0); } if( intent.hasExtra("progress")){ progress = intent.getIntExtra("progress",0); } if(novelId == mNovel.getId()){ btnCach.setText(progress +"/" +pageFactory.getChapters().size()); } } } }