pda/zhuike/src/main/java/com/novelbook/android/BookActivity.java

598 lines
18 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.NetUtil;
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 = 0;
// 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<Novel> mData;
;
private Gson gson = new Gson();
private List<Chapter> 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;
}
});
}
public final static String EXTRA_BOOK ="book";
@Override
protected void setTitle() {
mNovel = (Novel) getIntent().getSerializableExtra(EXTRA_BOOK);
novelId = mNovel.getNovelId();
this.setTitle(mNovel.getName());
}
@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
getBookInfo();
mData = getFakeData(5);
mAdapter = getBookListAdapter(mData);
}
/**
* 设置book list 传过来的基本信息
*/
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());
}
loader.displayImage(BookActivity.this, NetUtil.getCoverUrl(mNovel.getCover()), imageView);
}
void setShelfButtonText() {
String title = mNovel.isOnShelf() ? "移除书架" : "加入书架";
btnShelf.setText(title);
}
@OnClick({R.id.btnRead, R.id.btnCacheBook, R.id.btnShelf,R.id.llCate})
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;
case R.id.llCate:
Intent intent = new Intent(BookActivity.this, MarkActivity.class);
startActivity(intent);;
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<DownloadTask> 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<Novel> 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", "<dd> <a[^>]*href=\"(/book/[\\d]+/[\\d]+\\.html)\">([^<]+)</a></dd>");
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());
}
}
}
}