pda/zhuike/.svn/pristine/0c/0c0a634467cb176e9ddb3d22da3...

2327 lines
86 KiB
Plaintext
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.utils;
import android.app.ProgressDialog;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.SyncAdapterType;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Region;
import android.graphics.Typeface;
import android.opengl.Visibility;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Toast;
import com.novelbook.android.MyApp;
import com.novelbook.android.R;
import com.novelbook.android.bean.AdSetting;
import com.novelbook.android.bean.NovelSites;
import com.novelbook.android.bean.Site;
import com.novelbook.android.db.Chapter;
import com.novelbook.android.db.Novel;
import com.novelbook.android.netutils.NetUtil;
import com.novelbook.android.view.PageWidget;
import com.umeng.analytics.MobclickAgent;
import org.litepal.LitePal;
import org.litepal.util.Const;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import static com.novelbook.android.utils.Constants.AD_BANNER_TOP;
//import static com.baidu.tts.loopj.AsyncHttpClient.log;
public class PageFactory implements ChangeSource{
private static final String TAG = "PageFactory";
private static PageFactory pageFactory;
private float mBannerNaviHeight;
private float mBannerTopHeight;
private Context mContext;
private Config config;
//当前的书本
// private File book_file = null;
// 默认背景颜色
private int m_backColor = 0xffff9e85;
//页面宽
private int mWidth;
//页面高
private int mHeight;
//文字字体大小
private float m_fontSize ;
//时间格式
private SimpleDateFormat sdf;
//时间
private String date;
//进度格式
private DecimalFormat df ;
//电池边界宽度
private float mBorderWidth;
// 上下与边缘的距离
private float marginHeight ;
//满屏 差异
private float screenHeihtDiff ;
// 左右与边缘的距离
private float measureMarginWidth ;
// 左右与边缘的距离
private float marginWidth ;
//状态栏距离底部高度
private float statusMarginBottom;
//行间距
private float lineSpace;
//段间距
private float paragraphSpace;
//段间距相对行间距的倍数
private final float prate = 1.8f;
//字高度
private float fontHeight;
//字体
private Typeface typeface;
//文字画笔
private Paint mPaint;
//加载画笔
private Paint waitPaint;
//文字颜色
private int m_textColor = Color.rgb(50, 65, 78);
// 绘制内容的宽
private float mVisibleHeight;
// 绘制内容的宽
private float mVisibleWidth;
// 每页可以显示的行数
private int mLineCount;
//电池画笔
private Paint mBatterryPaint ;
//电池字体大小
private float mBatterryFontSize;
//背景图片
private Bitmap m_book_bg = null;
//当前显示的文字
// private StringBuilder word = new StringBuilder();
//当前总共的行
// private Vector<String> m_lines = new Vector<>();
// // 当前页起始位置
// private long m_mbBufBegin = 0;
// // 当前页终点位置
// private long m_mbBufEnd = 0;
// // 之前页起始位置
// private long m_preBegin = 0;
// // 之前页终点位置
// private long m_preEnd = 0;
// 图书总长度
// private long m_mbBufLen = 0;
private Intent batteryInfoIntent;
//电池电量百分比
private float mBatteryPercentage;
//电池外边框
private RectF rect1 = new RectF();
//电池内边框
private RectF rect2 = new RectF();
//文件编码
// private String m_strCharsetName = "GBK";
//当前是否为第一页
private boolean m_isfirstPage;
//当前是否为最后一页
private boolean m_islastPage;
//书本widget
private PageWidget mBookPageWidget;
// //书本所有段
// List<String> allParagraph;
// //书本所有行
// List<String> allLines = new ArrayList<>();
//现在的进度
private float currentProgress;
//目录
// private List<Chapter> directoryList = new ArrayList<>();
//书本路径
private String bookPath = "";
//书本名字
private String bookName = "";
// private Novel mBook;
//书的目录列表
private List<Chapter> mChapters;
//当前章节
// private Chapter mCurrentChapter;
//书本章节
private int currentChapter = 0;
//当前电量
private int level = 0;
private BookUtil mBookUtil;
private PageEvent mPageEvent;
private TRPage currentPage;
private TRPage prePage;
private TRPage cancelPage;
ContentValues values = new ContentValues();
ConcurrentHashMap<Integer,List<TRPage>> chaptMap;
private List<TRPage> currentChaptPages;
private List<TRPage> nextChaptPages;
private List<TRPage> preChaptPages;
private AdInterface mAd;
private BookTask bookTask;
private final int MSG_CHANGECHAPTER =1;
private final int MSG_NEXTPAGE=2;
private final int MSG_HIDEPROGRESS=3;
private final int MSG_NEXTPAGE_FAIL=4;
private final int MSG_HID_AD=5;
private final int MSG_SHOW_LOADING=5;
private int mLoadingChaptNo;
public AdInterface getmAd() {
return mAd;
}
private static int mNavtiveBannerPlusCnt =0;
private int mSmallBannerPlusCnt =0;
private int mSmallBannerMinusCnt =0;
//页面宽
private int mAdHeight;
//页面高
private int mAdY;
private enum AdTpye {BANNER,NATIVEINLINES,CHAPTEREND;};
private AdTpye mAdType = AdTpye.BANNER;
public void setAd(AdInterface ad){
mAd =ad;
}
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
// Log.d(TAG, "prepare book get handler msg:" +msg);
handlerMsg(msg);
// dismissProgressDialog();
}
};
void handlerMsg(Message msg) {
if (msg.what == 1) {
Log.d(TAG, String.format("prepare book handler get notic to download chapter %s , getNovel() is null? %s", currentChapter, getNovel() == null));
if (getNovel() != null) {
changeChapter(currentChapter);
} else {
/* mStatus = Status.FAIL; // unknow error null Attempt to invoke virtual method 'android.graphics.Bitmap com.novelbook.android.view.PageWidget.getCurPage()' on a null object reference
drawStatus();
*/
}
} else if (msg.what == MSG_NEXTPAGE) {
mStatus =Status.FINISH;
// drawStatus();
Log.d(TAG, "prepare book to load next page");
nextPage();
} else if (msg.what == MSG_NEXTPAGE_FAIL) {
mStatus =Status.FAIL;
drawStatus();
} else if (msg.what == MSG_HIDEPROGRESS) {
// dismissProgressDialog();
if(mAd!=null) {
mAd.showRefresh(View.GONE);
// mAd.hideProgressbar();
mAd.showLoading(false);
// Log.d(TAG, "showloading: case MSG_HIDEPROGRESS: false" );
}
}else if (msg.what == MSG_HID_AD) {
// Log.d(TAG, "loadBannerAd: set banner gone 0, showingStatusAd " +showingStatusAd);
if(showingStatusAd) {
if (mAd != null) {
mAd.hideStatusAds();
// Log.d(TAG, "loadBannerAd: set banner gone 1");
}
}
}else if (msg.what == MSG_SHOW_LOADING) {
if(mAd!=null) {
mAd.showLoading(true);
Log.d(TAG, "showloading: case MSG_SHOW_LOADING: true" );
}
}
}
Map<Integer,Integer> fileRetryCnt = new HashMap<Integer,Integer>();
private List<TRPage> loadCurrentChapt(int chaptId){
Log.d(TAG, String.format("prepare book, loadCurrentChapt chaptId %s, getChapters().size() %s ,currentChapter %s",chaptId,getChapters().size() ,currentChapter) );
if ( getChapters().size()>0) { //待下载
chaptId = chaptId > getChapters().size() ? getChapters().size() : chaptId;
chaptId = chaptId > 0 ? chaptId : 1;
}
List<TRPage> chaptPages = new ArrayList<TRPage>();
chaptPages.add(new TRPage());
long starttime = new Date().getTime();
if(chaptMap==null) {
chaptMap = new ConcurrentHashMap<Integer, List<TRPage>>();
}
if(chaptMap.containsKey(chaptId)){
chaptPages =chaptMap.get(chaptId);
mBookUtil.setChapterLen( chaptPages.get(chaptPages.size()-1).getEnd());
mBookUtil.setChapterNo(chaptId);
Log.d(TAG, String.format("prepare book to load chapt %s, cost %s ",chaptId ,new Date().getTime() -starttime) );
return chaptMap.get(chaptId);
}
chaptId = chaptId > 0 ? chaptId : 1;
File file = new File(getChapterFileName(chaptId));
if (!file.exists() && getChapters().size()>0) { //待下载
chaptId = chaptId > getChapters().size() ? getChapters().size() : chaptId;
chaptId = chaptId > 0 ? chaptId : 1;
file = new File(getChapterFileName(chaptId));
}
if(!getNovel().isLocalBook()) {
mStatus = Status.OPENING;
final int maxSleep = Constants.MAX_SLEEP_4_CHAPT_DOWNLOAD+1000;
// final File file = new File(getChapterFileName(chaptId));
Log.d(TAG, String.format("prepare book to open chapter %s ,file is exist ? %s",chaptId,file.exists() ) );
if (!file.exists()) {
if (fileRetryCnt.containsKey(chaptId)) {
fileRetryCnt.put(chaptId, fileRetryCnt.get(chaptId) + 1);
loadingTxt+=".";
} else {
fileRetryCnt.clear();//只保留一个章节数据
fileRetryCnt.put(chaptId, 1);
loadingTxt="";
mBookUtil.fileRetryCnt.clear();
}
Log.d(TAG, String.format("prepare book loadCurrentChapt %s, rertying count %s ",chaptId, fileRetryCnt.get(chaptId)));
if(fileRetryCnt.get(chaptId) > Constants.retryCnt){
mStatus = Status.FAIL;
drawStatus();
return chaptPages;
}
drawStatus();
if( !NetUtil.isNetworkConnected()){ //TODO: 500错误处理
mStatus = Status.NETWORKFAILE;
drawStatus();
return chaptPages;
}
if(getChapters().size()==0 && mBookUtil.muluRetryCount>=Constants.retryCnt) {
Log.d(TAG, String.format("prepare book download mulu 失败,重试次数: %s ,thread.name %s",mBookUtil.muluRetryCount,Thread.currentThread().getName() ) );
mBookUtil.muluRetryCount=0;
mStatus = Status.FAIL;
drawStatus();
return chaptPages;
}
// showProgressDialog();
final int chid = chaptId;
new Thread() {
@Override
public void run() {
Log.d(TAG, String.format("prepare book to download chapter %s ,thread.name %s",chid,Thread.currentThread().getName() ) );
mBookUtil.chaptChars(chid);
super.run();
}}.start();
new Thread() {
@Override
public void run() {
int slepttime =0;
File file = new File(getChapterFileName(chid));
while( slepttime <maxSleep && getChapters().size()==0 && mBookUtil.muluRetryCount<Constants.retryCnt ||showingStatusAd &&(new Date().getTime() - showStatusAdTime <2200) ){
try {
sleep(50);
slepttime+=50;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, String.format("prepare book to download chapter %s ,slepted %s ,getChapters().size() %s," +
" mBookUtil.muluRetryCount %s,thread.name %s",chid,slepttime , getChapters().size(),mBookUtil.muluRetryCount,Thread.currentThread().getName() ) );
slepttime=0;
while( !file.exists() && slepttime <maxSleep && ( !mBookUtil.fileRetryCnt.containsKey(chid) || mBookUtil.fileRetryCnt.get(chid)< Constants.retryCnt)
||showingStatusAd &&(new Date().getTime() - showStatusAdTime <2200) ){
try {
sleep(50);
slepttime+=50;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, String.format("prepare book to download chapter %s ,slepted %s , mBookUtil.fileRetryCnt.get(chid) %s,thread.name %s"
,chid,slepttime, mBookUtil.fileRetryCnt.get(chid),Thread.currentThread().getName() ) );
mStatus = Status.FINISH;
if( mBookUtil.muluRetryCount>=Constants.retryCnt){
mStatus = Status.FAIL;
}
Log.d(TAG, String.format("prepare book to download chapter %s ,handler notice changeChapter %s",chid, currentChapter ) );
//notice file done
handler.sendEmptyMessage(MSG_CHANGECHAPTER);
super.run();
}}.start();
drawStatus();
return chaptPages;
}
}
chaptPages =readChaptCache(chaptId);
if(chaptPages.size()>0) {
chaptMap.put(chaptId, chaptPages);
mBookUtil.setChapterLen(chaptPages.get(chaptPages.size() - 1).getEnd());
mBookUtil.setChapterNo(chaptId);
Log.d(TAG, String.format("prepare book to load chapt %s, cost %s ",chaptId ,new Date().getTime() -starttime) );
mStatus = Status.FINISH;
Log.d(TAG, String.format("changing Source prepare book to draw chapter %s, currentChapter %s ",chaptId ,currentChapter ) );
// drawStatus();
}else{
mStatus = Status.FAIL;
if(getNovle().isLocalBook()){
mStatus=Status.LOCALFAIL;
}
drawStatus();
}
return chaptPages;
}
void preReadChaptCache(final int chaptId){
if(!Constants.PRE_LOAD_CHAPT){
return;
}
if(chaptMap==null) {
chaptMap = new ConcurrentHashMap<Integer, List<TRPage>>();
}
if(chaptMap.containsKey(chaptId)){
return;
}
Log.d(TAG, String.format("prepare book to preLoad chapt %s, current chapt %s --->",chaptId ,currentChapter) );
new Thread() {
@Override
public void run() {
super.run();
Log.d(TAG, String.format("prepare book to preRead chapter %s ,thread.name %s",chaptId,Thread.currentThread().getName() ) );
File file = new File(getChapterFileName(chaptId));
if(file.exists()) {
chaptMap.put(chaptId, readChaptCache(chaptId));
Log.d(TAG, String.format("prepare book to preLoad %s done <-----",chaptId ) );
}else{
Log.d(TAG, String.format("prepare book to trying download the chapt %s again........... ",chaptId ) );
mBookUtil.retryDownLoadContent(chaptId) ;
}
}}.start();
}
/**
* only read chapt that cached already
* @param chaptId
* @return
*/
List<TRPage> readChaptCache(int chaptId){
List<TRPage> chaptPages = new ArrayList<TRPage>();
Log.d(TAG, String.format("prepare book to open chapter %s, currentChapter %s ",chaptId ,currentChapter ) );
char[] chars = mBookUtil.chaptChars(chaptId);
mBookUtil.setTmpChaptLen(chars.length);
// mBookUtil.setChapterNo(chaptId);
// TRPage page = new TRPage();
long length =0;
int pageNo =0;
long starttime = new Date().getTime();
while(length <chars.length ) {
//long starttime1 = new Date().getTime();
pageNo++;
TRPage page = getNextChapterPage(chaptId,length ,pageNo);
// Log.d(TAG,"prepare book page.getBegin :" + page.getBegin()+ ",chapter length "+ mBookUtil.getChapterLen());
// if(page.getBegin() == mBookUtil.getChapterLen() ){ //最后一页空白的情况。。。
// break;
// }
length= page.getEnd();
if(page.getLines().size()==0){
pageNo--;
continue;
}
page.setChapterNo(chaptId);
page.setLastPage(page.getEnd()==chars.length);
page.setFirstPage(pageNo==1);
page.setPageNo(pageNo);
/* if(Constants.AD_SETTING.getChapterEndBanner().isShow() && length >=chars.length ){
if(page.getLines().size()< mLineCount/2)
page.setBannerHeight(0);
}*/
chaptPages.add(page);
// Log.d(TAG, String.format("prepare book build page %s ready for chapter %s,cost %s",pageNo, chaptId,new Date().getTime()-starttime1));
}
// Log.d(TAG, String.format(" prepare book build pages ready for chapter %s,cost %s", chaptId,new Date().getTime()-starttime));
return chaptPages;
}
public TRPage getNextChapterPage(int chaptId,long position,int pageNo) {
mBookUtil.setPostition(chaptId, position);
TRPage trPage = new TRPage();
// Constants.AD_CHAPT_NATIVE_BANNER_PER_PAGE_COUNT = 20;
if (Constants.AD_SETTING.isShowAdsense() && pageNo > 1) {
mNavtiveBannerPlusCnt++;
// Constants.AD_CHAPT_TOP_BANNER_PER_PAGE_COUNT = 1;
int bannerPagecnt = Constants.AD_SETTING.getChapterBanner().getPageCount4Display();
int nativeBannerPageCnt = Constants.AD_SETTING.getChapterContentBanner().getPageCount4Display();
if (Constants.AD_SETTING.getChapterContentBanner().isShow() &&
nativeBannerPageCnt > 0 &&
mNavtiveBannerPlusCnt >= nativeBannerPageCnt) {
mNavtiveBannerPlusCnt = 0;
calculateLineCount();
int adLines = (int) (mBannerNaviHeight / ((m_fontSize + lineSpace)));
if(mLineCount - adLines - 1>0) {
int adLine = new Random().nextInt(mLineCount - adLines - 1);
adLine = adLine < mLineCount ? adLine : mLineCount - 2;
if (adLine > 0) {
trPage.setNativeBannerStartLine(adLine);
//trPage.setNativeBannerHeight(Constants.AD_CHAPT_NATIVE_BANNER_HEIGHT);
trPage.setNativeBannerHeight((int) mBannerNaviHeight);
}
Log.d(TAG, String.format("getNextChapterPage: pageNo %s, adLines %s,adLine %s, nativeBannerHeight %s",
pageNo, adLines, adLine, trPage.getNativeBannerHeight()));
}
}
if(trPage.getNativeBannerHeight()==0)
if (Constants.AD_SETTING.getChapterBanner().isShow()) {
if (bannerPagecnt <=0 || mSmallBannerPlusCnt < bannerPagecnt) {
mSmallBannerPlusCnt++;
trPage.setBannerHeight((int) mBannerTopHeight);
} else {
mSmallBannerMinusCnt--;
if (mSmallBannerMinusCnt < 0) {
mSmallBannerMinusCnt = bannerPagecnt;
}
if (mSmallBannerMinusCnt == 0) {
mSmallBannerPlusCnt = 0;
}
}
Log.d(TAG, String.format("getNextChapterPage: pageNo %s, topBannerHeight %s,bannerPagecnt %s,mSmallBannerPlusCnt %s,mSmallBannerMinusCnt %s ", pageNo, trPage.getBannerHeight()
, bannerPagecnt ,mSmallBannerPlusCnt ,mSmallBannerMinusCnt ));
}
}
trPage.setPageNo(pageNo);
trPage.setBegin(position + 1);
// Log.d(TAG,"page postion next begin:" + (position + 1) + "");
trPage.setLines(getNextLines(chaptId, trPage));
if (trPage.getNativeBannerStartLine() > 0 && trPage.getNativeBannerStartLine() >= trPage.getLines().size()) {
trPage.setNativeBannerStartLine(trPage.getLines().size() - 1);
}
// Log.d(TAG,"page postion next end:" +mBookUtil.getPosition() + "");
trPage.setEnd(mBookUtil.getPosition(chaptId));
return trPage;
}
private static Status mStatus = Status.OPENING;
public NovelSites getNovelSites() {
return mBookUtil.getmNovelSites();
}
/* private ProgressDialog progressDialog;
private void showProgressDialog() {
if ( null == progressDialog) {
progressDialog =new ProgressDialog(mContext);
progressDialog.setMessage("正在努力加载...");
}
try {
progressDialog.show();
}catch (Exception e)
{
Log.e(TAG, "prepare book: ", e);
}
// progressDialog.show(mContext,"网络不给力","正努力加载",false,true);
}
private void dismissProgressDialog() {
if ( null != progressDialog) {
// progressDialog.dismiss();
}
}*/
public void changeSource(String domainName,String domain,int chapId,String chapTitle) {
hideSysUI();
fileRetryCnt.clear();
if(TextUtils.isEmpty(getSite().getDomain()) || TextUtils.isEmpty(domain)|| getSite().getDomain().equals(domain)){ //当前源
Log.d(TAG, "prepare book changing Source: same site with original " + domain);
return;
}
if(chaptMap!=null){
chaptMap.clear();
}
Log.d(TAG, String.format("prepare book changing Source:target site received: name %s, site domain %s ,chapterId %s " ,domainName, domain,chapId));
mStatus= Status.CHANGESOURCE;
statusChangeSource="正在换源...";
if(!TextUtils.isEmpty(domainName)) {
statusChangeSource = "前往 " + domainName.substring(0,domainName.length()>5?5:domainName.length()) + "...";
}
// drawChangeSourceStatus();
drawStatus();
mBookUtil.pagefactory=this;
mBookUtil.changeSource(domain, chapId, chapTitle);
}
@Override
public void drawStatus(Status status) {
mStatus =status;
drawStatus();
}
/* public String getChapterName() {
return getChapters().get(currentChapter-1).getChapterName();
}*/
public Chapter getChapter(){
return mBookUtil.getChapter(mBookUtil.getChapterNo());
}
private static boolean isBusy =false;
public void setBusy(boolean isBusy) {
this.isBusy = isBusy;
}
public static boolean busy(){
return isBusy;
}
public static boolean canTouch(){
switch (mStatus){
case FAIL:
return true;
case FINISH:return true;
case OPENING:return false;
case SERVERERROR:return true;
case CHANGESOURCE:return false;
case NETWORKFAILE:return true;
case LASTPAGE:return true;
}
return false;
}
public void refreshChapter() {
fileRetryCnt.clear();
mBookUtil.fileRetryCnt.clear();
if( chaptMap.containsKey(getCurrentChapter())){
chaptMap.remove(getCurrentChapter());
}
mBookUtil.refreshChapter();
}
public void changeSourceForCate(String name, String domain) {
if(getSite().getDomain().equals(domain)){ //当前源
Log.d(TAG, "prepare book changing Source: same site with original " + domain);
return;
}
mBookUtil.changeSite(domain);
}
public enum Status {
OPENING,
FINISH,
FAIL,
NETWORKFAILE,
SERVERERROR,
CHANGESOURCE ,
LOCALFAIL,
LASTPAGE;
}
private void hideSysUI(){
if(mAd!=null){
mAd.hideSystemUI();
// mAd.showRefresh(View.GONE);
}
}
public static synchronized PageFactory getInstance(Context context){
if(pageFactory==null){
createPageFactory(context);
}
return pageFactory;
}
public static synchronized PageFactory createPageFactory(Context context){
if (pageFactory == null){
pageFactory = new PageFactory(context);
}
return pageFactory;
}
private PageFactory(Context context) {
mBookUtil = new BookUtil();
mContext = context.getApplicationContext();
config = Config.getInstance();
//获取屏幕宽高
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metric = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metric);
mWidth = metric.widthPixels;
// mHeight = metric.heightPixels;
// mHeight = CommonUtil.getDpi(context);
mHeight = CommonUtil.getScreenHeight(context) - CommonUtil.statusBarDiff(context);
sdf = new SimpleDateFormat("HH:mm");//HH:mm为24小时制,hh:mm为12小时制
date = sdf.format(new java.util.Date());
df = new DecimalFormat("#0.0");
mBannerNaviHeight = mContext.getResources().getDimension(R.dimen.nativeBannerHeight) + 4 * Constants.ONE_DP_SIZE;
mBannerTopHeight = mContext.getResources().getDimension(R.dimen.topBannerHeight) + 0 * Constants.ONE_DP_SIZE;
marginWidth = mContext.getResources().getDimension(R.dimen.readingMarginWidth);
marginHeight = mContext.getResources().getDimension(R.dimen.readingMarginHeight);
// Log.d(TAG, "getNavigationBarSize: orignal marginHeight +" +marginHeight);
// marginHeight = CommonUtil. getStatusBarHeight(mContext);
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);
paragraphSpace = context.getResources().getDimension(R.dimen.reading_paragraph_spacing);
mVisibleWidth = mWidth - marginWidth * 2;
mVisibleHeight = mHeight - marginHeight * 2 - CommonUtil.convertDpToPixel(mContext,10);;
mHeight +=screenHeihtDiff;
typeface = config.getTypeface();
m_fontSize = config.getFontSize();
lineSpace =config.getLineSpace();
paragraphSpace = prate * lineSpace ;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);// 画笔
mPaint.setTextAlign(Paint.Align.LEFT);// 左对齐
mPaint.setTextSize(m_fontSize);// 字体大小
mPaint.setColor(m_textColor);// 字体颜色
mPaint.setTypeface(typeface);
mPaint.setSubpixelText(true);// 设置该项为true将有助于文本在LCD屏幕上的显示效果
waitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);// 画笔
waitPaint.setTextAlign(Paint.Align.LEFT);// 左对齐
waitPaint.setTextSize(mContext.getResources().getDimension(R.dimen.reading_max_text_size));// 字体大小
waitPaint.setColor(m_textColor);// 字体颜色
waitPaint.setTypeface(typeface);
waitPaint.setSubpixelText(true);// 设置该项为true将有助于文本在LCD屏幕上的显示效果
calculateLineCount();
mBorderWidth = mContext.getResources().getDimension(R.dimen.reading_board_battery_border_width);
mBatterryPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mBatterryFontSize = CommonUtil.sp2px(context, 12);
mBatterryPaint.setTextSize(mBatterryFontSize);
mBatterryPaint.setTypeface(typeface);
mBatterryPaint.setTextAlign(Paint.Align.LEFT);
mBatterryPaint.setColor(m_textColor);
batteryInfoIntent = context.getApplicationContext().registerReceiver(null,
new IntentFilter(Intent.ACTION_BATTERY_CHANGED)) ;//注册广播,随时获取到电池电量信息
level = batteryInfoIntent.getIntExtra( "level" , 0 );
initBg(config.getDayOrNight());
measureMarginWidth();
}
private void measureMarginWidth(){
float wordWidth =mPaint.measureText("\u3000");
float width = mVisibleWidth % wordWidth;
measureMarginWidth = marginWidth + width / 2;
// Rect rect = new Rect();
// mPaint.getTextBounds("好", 0, 1, rect);
// float wordHeight = rect.height();
// float wordW = rect.width();
// Paint.FontMetrics fm = mPaint.getFontMetrics();
// float wrodH = (float) (Math.ceil(fm.top + fm.bottom + fm.leading));
// String a = "";
}
//初始化背景
private void initBg(Boolean isNight){
if (isNight) {
//设置背景
// setBgBitmap(BitmapUtil.decodeSampledBitmapFromResource(
// mContext.getResources(), R.drawable.main_bg, mWidth, mHeight));
Bitmap bitmap = Bitmap.createBitmap(mWidth,mHeight, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.BLACK);
setBgBitmap(bitmap);
//设置字体颜色
setM_textColor(Color.rgb(128, 128, 128));
setBookPageBg(Color.BLACK);
} else {
//设置背景
setBookBg(config.getBookBgType());
}
}
private void calculateLineCount(){
mLineCount = (int) (mVisibleHeight / (m_fontSize + lineSpace));// 可显示的行数
}
private void calculateLineCount(float paragrapheight){
mLineCount = (int) ((mVisibleHeight - paragrapheight ) / (m_fontSize + lineSpace));// 可显示的行数
// Log.d(TAG,"line count is " + mLineCount +" paragrapheight is " +paragrapheight);
}
private void drawStatus(){
if(mBookPageWidget!=null) {
// drawStatus(mBookPageWidget.getCurPage());
drawStatus(mBookPageWidget.getNextPage());
}
}
public boolean isChangingSource(){
return mStatus == Status.CHANGESOURCE;
}
private String loadingTxt ="";
private String statusChangeSource ="正在换源...";
private boolean showingStatusAd =false;
private long showStatusAdTime =0;
private void drawStatus(Bitmap bitmap){
hideSysUI();
mAd.showRefresh(View.VISIBLE);
// mAd.hideProgressbar();
// mAd.showLoading(false);
String status = "";
boolean showAd =false;
switch (mStatus){
case OPENING:
status = "正在拼命加载" + loadingTxt;
mAd.showRefresh(View.GONE);
// mAd.showProgressbar(false,status);
mAd.showLoading(true);
Log.d(TAG, "showloading: case OPENING: true" );
//handler.sendEmptyMessage(MSG_SHOW_LOADING);
// showProgressDialog();
break;
case FAIL:
status = "读取错误,请稍后重试";
mAd.showRefresh(View.VISIBLE);
mAd.showReadSetting();
mAd.showLoading(false);
try {
throw new Exception("error on reading");
} catch (Exception e) {
e.printStackTrace();
Log.d(TAG, "prepare book: why fail ",e);
}
break;
case NETWORKFAILE:
mAd.showLoading(false);
Log.d(TAG, "showloading: case NETWORKFAILE: false" );
showAd =false;
status = "请开启网络";
break;
case SERVERERROR:
mAd.showLoading(false);
Log.d(TAG, "showloading: case SERVERERROR: false" );
status = "服务器故障";
break;
case FINISH:
mAd.showLoading(false);
Log.d(TAG, "showloading: case FINISH: false" );
status = "加载成功";
mAd.showRefresh(View.GONE);
mAd.hideProgressbar();
showAd =false;
break;
case CHANGESOURCE:
mAd.showLoading(true);
Log.d(TAG, "showloading: case CHANGESOURCE: true" );
status = statusChangeSource;
mAd.showRefresh(View.GONE);
break;
case LOCALFAIL:
mAd.showLoading(false);
Log.d(TAG, "showloading: case LOCALFAIL: false" );
status = "本地缓存加载错误";
mAd.showRefresh(View.GONE);
break;
case LASTPAGE:
status = "看完了,没有了";
mAd.showRefresh(View.GONE);
mAd.showLoading(false);
Log.d(TAG, "showloading: case LASTPAGE: false" );
break;
}
Canvas c = new Canvas(bitmap);
c.drawBitmap(getBgBitmap(), 0, 0, null);
waitPaint.setTextSize(mContext.getResources().getDimension(R.dimen.reading_max_text_size));// 字体大小
waitPaint.setColor(getTextColor());
waitPaint.setTextAlign(Paint.Align.CENTER);
Rect targetRect = new Rect(0, 0, mWidth, mHeight);
// c.drawRect(targetRect, waitPaint);
Paint.FontMetricsInt fontMetrics = waitPaint.getFontMetricsInt();
// 转载请注明出处http://blog.csdn.net/hursing
int baseline = (targetRect.bottom + targetRect.top - fontMetrics.bottom - fontMetrics.top) *4/5;
// 下面这行是实现水平居中drawText对应改为传入targetRect.centerX()
waitPaint.setTextAlign(Paint.Align.CENTER);
c.drawText(status, targetRect.centerX(), baseline, waitPaint);
Log.d(TAG, "changing Source showloading: drawing status :" +status );
// c.drawText("正在打开书本...", mHeight / 2, 0, waitPaint);
/* TextPaint tp = new TextPaint();
tp.setColor(getTextColor());
tp.setStyle(Paint.Style.FILL);
tp.setTextSize(50);
StaticLayout myStaticLayout = new StaticLayout(status, tp, c.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
myStaticLayout.draw(c);*/
// hideSysUI();
/* float adHeight = mHeight - baseline -marginHeight-statusMarginBottom-30;
float adY =targetRect.top +10;*/
float adHeight = baseline -100;
float adY =targetRect.top +250;
if(showAd)
while(!showingStatusAd /*|| new Date().getTime() - showStatusAdTime > 2000*/) {
showingStatusAd =true;
showStatusAdTime = new Date().getTime();
// showStatusAd((int) adHeight, (int) adY);
// Log.d(TAG, "loadBannerAd: draw status, AD is requested, mStatus:" +mStatus);
}
Log.d(TAG, "drawStatus: mStatus is " +mStatus);
if (mStatus==Status.OPENING ) {
mLoadingChaptNo =mLoadingChaptNo >0?mLoadingChaptNo: getNovel().getLastReadChapt();
String url = mBookUtil.getChapter(mLoadingChaptNo).getChapterUrl();
Log.d(TAG, "drawStatus: url is " +url);
if(!TextUtils.isEmpty(url)) {
if(url.length()>100)
url =url.substring(0,100);
waitPaint.setTextSize(mContext.getResources().getDimension(R.dimen.reading_medu_text_size));// 字体大小
waitPaint.setColor(getTextColor());
waitPaint.setTextAlign(Paint.Align.CENTER);
targetRect = new Rect(0, 0, mWidth, mHeight);
fontMetrics = waitPaint.getFontMetricsInt();
baseline = baseline +150;
// 下面这行是实现水平居中drawText对应改为传入targetRect.centerX()
String site = getSite().getName() ==null ? "":getSite().getName();
waitPaint.setTextAlign(Paint.Align.CENTER);
c.drawText("正加载第三方网站 " +site, targetRect.centerX(), baseline, waitPaint);
baseline+=40;
if(Constants.SHOW_NOVEL_CHAPTER_URL) {
c.drawText(url, targetRect.centerX(), baseline, waitPaint);
}
String chaptName= mBookUtil.getChapter(mLoadingChaptNo).getChapterName();
if(!TextUtils.isEmpty(chaptName)) {
if(chaptName.length()>100)
chaptName =chaptName.substring(0,100);
chaptName ="正为您搜索加载 " +chaptName +" ...";
baseline = 80;
// 下面这行是实现水平居中drawText对应改为传入targetRect.centerX()
waitPaint.setTextAlign(Paint.Align.CENTER);
c.drawText(chaptName, targetRect.centerX(), baseline, waitPaint);
}
}
}
mBookPageWidget.postInvalidate();
}
//上次翻书时间
private long lastPageTime;
public void onDraw(Bitmap bitmap,TRPage trPage,Boolean updateChapter,Boolean showAd) {
hideSysUI();
List<String> m_lines = trPage.getLines();
// mAd.showRefresh(View.GONE);
Log.d(TAG, String.format("onDraw: trPage pageno %s,showAd %s",trPage.getPageNo(),showAd));
// Log.d(TAG, "changing Source onDraw showloading: drawing status :" );
if(m_lines.size()==0 ){
return;
}
/* try {
throw new Exception("who's ad");
}catch (Exception e){
Log.e(TAG, "onDraw:changing Source ",e );
}*/
/* Log.d(TAG, "showloading: ondraw showAd: " +showAd );
try{
throw new Exception("showloading: ondraw mStatus: " +mStatus );
}catch (Exception e){
Log.e(TAG, "showloading: ", e);
}*/
if(showAd && mAd!=null){
handler.sendEmptyMessage(MSG_HID_AD);
//handler.sendEmptyMessage(MSG_HID_AD);
handler.sendEmptyMessage(MSG_HIDEPROGRESS);
mAdHeight=0;
mAdY=0;
}
mStatus =Status.FINISH;
// Log.d(TAG, String.format(" prepare book onDraw chapter %s, getChapters().size() %s ",currentChapter ,getChapters().size() ) );
if (getChapters().size() > 0 && updateChapter) {
// Log.d(TAG, String.format(" prepare book onDraw chapter to getCurrentChapter(),currentChapter %s ",currentChapter ) );
currentChapter = getCurrentChapter();
// Log.d(TAG, String.format(" prepare book onDraw chapter after getCurrentChapter(),currentChapter %s ",currentChapter ) );
}
// Log.d(TAG, String.format(" prepare book onDraw chapter _____________ %s ",currentChapter ) );
String chapterName =CommonUtil.subString(mBookUtil.getChapter(mBookUtil.getChapterNo()).getChapterName(),16); // CommonUtil.subString(getChapterName(),16);
//更新数据库进度
if ( mStatus ==Status.FINISH && currentPage != null && getNovel() != null) {
new Thread() {
@Override
public void run() {
super.run();
if (getNovel().getLastReadChapt() != currentChapter || getNovel().getLastReadPos() != currentPage.getBegin()) {
if (currentChapter > 1) {
getNovel().setLastReadChapt(currentChapter);
if(!TextUtils.isEmpty(chapterName)){
getNovel().setLastReadChaptName(chapterName);
}
} else {
getNovel().setToDefault("lastReadChapt");
}
if(lastPageTime>0) {
long time = new Date().getTime() - lastPageTime;
// Log.d(TAG, String.format("prepare book read time last %s,current %s,spent %s",lastPageTime,new Date().getTime(), time));
if (time > 1000) {
getNovel().setReadtime(getNovel().getReadtime() + time);
}
}
getNovel().setToDefault("isUpdated"); //去除更新标志
getNovel().setLastReadPos(currentPage.getBegin());
getNovel().update(getNovel().getId()); //If you set a default value to a field, the corresponding
// * column won't be updated.
// getNovel().save();
/* Novel nv = LitePal.find(Novel.class,getNovel().getId());
Log.d(TAG,String.format("prepare book %s ,%s isUpdated %s,saved isUpdated %s, saved lastchapt %s,lastpos %s, db lastchapt %s last pos %s",
getNovel().getId(),
getNovel().getName(),getNovel().isUpdated(),nv.isUpdated(),
currentChapter,currentPage.getBegin(),nv.getLastReadChapt(),nv.getLastReadPos()));*/
lastPageTime = new Date().getTime();
}
/*
values.put("lastReadPos",currentPage.getBegin());
values.put("lastReadChapt",currentChapter);
Log.d(TAG,String.format("begin to update book %s chapter%s bigin %s ",getNovel().getName(),currentChapter, currentPage.getBegin() ) );
int rows = LitePal.update(Novel.class,values,getNovel().getId());
Log.d(TAG,String.format("update book %s chapter%s bigin %s, result %s",getNovel().getName(),currentChapter, currentPage.getBegin(),rows) );
*/
}
}.start();
}
Canvas c = new Canvas(bitmap);
c.drawBitmap(getBgBitmap(), 0, 0, null);
// word.setLength(0);
mPaint.setTextSize(getFontSize());
mPaint.setColor(getTextColor());
mBatterryPaint.setColor(getTextColor());
if (m_lines.size() == 0) {
return;
}
float space =m_fontSize + lineSpace;
paragraphSpace = prate * lineSpace;
// if(showAd && mAd!=null){
mAdHeight= Constants.AD_SETTING.getChapterBanner().getDisplayPosition() ==AD_BANNER_TOP ? trPage.getBannerHeight() :0;
mAdY=(int)marginHeight;
mAdType =AdTpye.BANNER;
if(trPage.getBannerHeight()==0) {
mAd.showTopBanner(0,0);//hide banner container
}
// }
/* if(trPage.getPageNo()>1 && m_lines.size() <= mLineCount/2+1){
if(trPage.getTopBannerHeight() + trPage.getNativeBannerHeight() ==0){
mAdHeight=(int)mBannerNaviHeight;
mAdY=(int)marginHeight;
mAdType =AdTpye.NATIVEINLINES;
}
}*/
float y = marginHeight +mAdHeight;
String lastLine ="";
int lineNo =0;
for (String strLine : m_lines) {
lineNo++;
// if(strLine.endsWith("\n")) {
// if(strLine.charAt(strLine.length()-1) == ('\n' )) {
// Log.d(TAG, strLine);
// Log.d(TAG,"最后字符 。。。" +strLine.charAt(strLine.length()-1) + "");
lastLine =strLine;
strLine = strLine.replace("<22>","");
if(lineNo==trPage.getNativeBannerStartLine()){
if(showAd && mAd!=null){
mAdHeight=trPage.getNativeBannerHeight();
mAdY=(int)y +(int)( +lineSpace*0.5);
mAdType =AdTpye.NATIVEINLINES;
// mAd.showNativeBannerInLines(trPage.getNativeBannerHeight(),(int)y);
}
y+=trPage.getNativeBannerHeight() +m_fontSize +lineSpace ;
Log.d(TAG, String.format("onDraw showNativeBannerInLines : lineno %s,strline %s ",lineNo,strLine));
space = m_fontSize + lineSpace;
// y-=lineSpace;
if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) {
space = m_fontSize + paragraphSpace;
}
}else {
if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) {
strLine = strLine.replace("\n", "");
y += space;
space = m_fontSize + paragraphSpace;
// Log.d( TAG ,String.format("prepare book 开始新段落 %s, y plus is %s" ,strLine, m_fontSize + paragraphSpace));
} else {
y += space;
space = m_fontSize + lineSpace;
// Log.d(TAG,String.format("prepare book %s,y plus is %s" ,strLine, m_fontSize + lineSpace));
}
}
c.drawText(strLine, measureMarginWidth, y, mPaint);
// word.append(strLine);
}
// Log.d(TAG,String.format("getNavigationBarSize mHeight is %s ,last line height %s, power %s, %s", //
// mHeight,y,mHeight - CommonUtil.convertDpToPixel(mContext,10) + mBorderWidth - statusMarginBottom, lastLine));
// lastLine =lastLine.trim().replace(Constants.BAD_CHAR,"");
Log.d(TAG, String.format("onDraw: last line lenth %s,%s, ",lastLine.length() ,lastLine));
float adHeight = mHeight -y - space -marginHeight-statusMarginBottom;
float adY =y ;//+space;
adY= lastLine.length()==0 ?adY-m_fontSize - lineSpace :adY;
if(mAdHeight ==0 && showAd ) {
if(trPage.getBannerHeight()>0){
mAdY=(int) (mHeight - statusMarginBottom - trPage.getBannerHeight());
mAdHeight = trPage.getBannerHeight();
mAdType =AdTpye.BANNER;
}else if(trPage.getPageNo()>1 && trPage.isLastPage() && Constants.AD_SETTING.getChapterEndBanner().isShow()) {
mAdY=(int)adY;
mAdHeight = (int) adHeight;
mAdType = AdTpye.CHAPTEREND;
}else{
mAd.showNativeBannerInLines(0, 0);//清除内容广告
}
// showAd((int) adHeight, (int) adY);
Log.d(TAG, String.format("loadBannerAd: AD is requested, adtype %s, adHeight %s, ady %s",mAdType,adHeight,adY));
}
// Log.d(TAG,String.format("ad + statusMarginBottom %s ",200+ statusMarginBottom));
// Log.d(TAG,String.format("adHeight %s, adY %s",adHeight,adY));
if(trPage.getBannerHeight()==0 ){
mAd.showTopBanner(0, 0);//清除 banner广告
}
if(trPage.getNativeBannerHeight()==0 && mAdType != AdTpye.CHAPTEREND){
mAd.showNativeBannerInLines(0,0);//hide content banner container
}
//画进度及时间
int dateWith = (int) (mBatterryPaint.measureText(date)+mBorderWidth);//时间宽度
// float fPercent = (float) (currentPage.getBegin() * 1.0 / mBookUtil.getChapterLen());//进度
float fPercent = (float) (currentPage.getPageNo() * 1.0 /currentChaptPages.size());//进度
currentProgress = fPercent;
if (mPageEvent != null){
mPageEvent.changeProgress(fPercent);
}
// String strPercent = df.format(fPercent * 100) + "%";//进度文字
String strPercent = String.format("%s/%s",currentPage.getPageNo(),currentChaptPages.size()) + "页";//进度文字
int nPercentWidth = (int) mBatterryPaint.measureText("10/25页") + 50; //Paint.measureText直接返回參數字串所佔用的寬度
float botoomY =mHeight - statusMarginBottom;// +screenHeihtDiff;
c.drawText(strPercent, mWidth - nPercentWidth, botoomY, mBatterryPaint);//x y为坐标值
c.drawText(date, marginWidth ,botoomY, mBatterryPaint);
// 画电池
Log.d(TAG, String.format("updateBattery to draw: level1 %s ",level));
// level = batteryInfoIntent.getIntExtra( "level" , 0 );
int scale = batteryInfoIntent.getIntExtra("scale", 100);
mBatteryPercentage = (float) level / scale;
Log.d(TAG, String.format("updateBattery to draw: level2 %s ",level));
float rect1Left = marginWidth + dateWith + statusMarginBottom;//电池外框left位置
//画电池外框
float width = CommonUtil.convertDpToPixel(mContext,20) - mBorderWidth;
float height = CommonUtil.convertDpToPixel(mContext,10);
rect1.set(rect1Left, botoomY - height ,rect1Left + width, botoomY);
rect2.set(rect1Left + mBorderWidth, botoomY - height + mBorderWidth , rect1Left + width - mBorderWidth, botoomY - mBorderWidth );
// c.save(Canvas.CLIP_SAVE_FLAG);
c.save();
c.clipRect(rect2, Region.Op.DIFFERENCE);
c.drawRect(rect1, mBatterryPaint);
c.restore();
//画电量部分
rect2.left += mBorderWidth;
rect2.right -= mBorderWidth;
rect2.right = rect2.left + rect2.width() * mBatteryPercentage;
rect2.top += mBorderWidth;
rect2.bottom -= mBorderWidth;
c.drawRect(rect2, mBatterryPaint);
//画电池头
int poleHeight = (int) CommonUtil.convertDpToPixel(mContext,10) / 2;
rect2.left = rect1.right;
rect2.top = rect2.top + poleHeight / 4;
rect2.right = rect1.right + mBorderWidth;
rect2.bottom = rect2.bottom - poleHeight/4;
c.drawRect(rect2, mBatterryPaint);
//画书名
c.drawText(CommonUtil.subString(bookName,12), marginWidth ,statusMarginBottom + mBatterryFontSize, mBatterryPaint);
//画章
/* String chapterName ="";
if(mCurrentChapter!=null){
chapterName = mCurrentChapter.getChapterName();
}else*/
// if (getChapters().size() > 0)
{
int nChaterWidth = (int) mBatterryPaint.measureText(chapterName) + 1;
c.drawText(chapterName, mWidth - marginWidth - nChaterWidth, statusMarginBottom + mBatterryFontSize, mBatterryPaint);
}
if(currentPage!=null && currentPage.getPageNo()==1){
String sn = getNovel().getDomainName();
if(TextUtils.isEmpty(sn)){
if(getSite()!=null &&getSite().getName() !=null ){
sn =getSite().getName();
}
}
String source =String.format("本章节内容来自网络");
if(!TextUtils.isEmpty(sn)){
source =String.format("本章节内容来自第三方网站:%s",sn);
}
int anny= (int) CommonUtil.convertDpToPixel(mContext,25);
c.drawText(source, marginWidth, statusMarginBottom + mBatterryFontSize+anny, mBatterryPaint);
anny= (int) CommonUtil.convertDpToPixel(mContext,45);
c.drawText( Constants.announcement, marginWidth, statusMarginBottom + mBatterryFontSize+anny, mBatterryPaint);
}
if(mBookPageWidget!=null) {
mBookPageWidget.postInvalidate();
/* if(mAd!=null)
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mBookPageWidget.setetCurPage(mAd.getBitmapWithAd());
mBookPageWidget.setPageMode(config.getPageMode());
}
}, 1000);*/
}
}
public void showAd(){
Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s ",mAdType ));
if(mStatus == Status.LASTPAGE || mAd==null ||currentPage==null || !Constants.AD_SETTING.isShowAdsense()){
return;
}
Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s, pageNo %s",mAdType, currentPage.getPageNo()));
if(mAdType ==AdTpye.BANNER){
mAd.showTopBanner(mAdHeight,mAdY);
}else if(mAdType == AdTpye.NATIVEINLINES){
// mAd.showNativeBannerInLines(0,0);
mAd.showNativeBannerInLines(mAdHeight,mAdY);
}else if(mAdType == AdTpye.CHAPTEREND){
// mAd.showNativeBannerInLines(0,0);
mAd.showNativeBannerInLines(mAdHeight,mAdY);
}else{
mAd.showNativeBannerInLines(0,0);
}
}
private void showStatusAd(int adHeight,int adY) {
boolean showAd = showingStatusAd /*|| getCurrentPage()==null || getCurrentPage().getPageNo() > 1*/;
//Log.d(TAG, String.format("loadBannerAd showStatusAd: mAdType %s",mAdType));
// boolean showAd =true;
if (showAd && mAd != null) {
// mAd.showStatusAd(adHeight, adY);
}
}
//向前翻页
public void prePage(){
if(null == currentPage){
return;
}
if(mBookUtil.isBusy()){
return;
}
m_isfirstPage = false;
if (currentPage.getBegin() <= 1) {
Log.d(TAG,"当前是本章第一页");
m_isfirstPage =currentChapter ==1;
if ( m_isfirstPage){
Toast.makeText(mContext, "当前是第一页", Toast.LENGTH_SHORT).show();
return;
}
}
Log.d(TAG, "prepare book prePage: to open prepage: ");
cancelPage = currentPage;
if(mBookPageWidget==null){
return;
}
if(mStatus ==Status.LASTPAGE) {
// onDraw(mBookPageWidget.getCurPage(),currentPage ,true,false);
if(mBookPageWidget==null){
return;
}
Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() ");
onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true);
}else{
if(mBookPageWidget==null){
return;
}
Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() ");
currentPage = getPrePage();
onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true);
}
}
//向后翻页
public void nextPage(){
m_islastPage = false;
if(null == currentPage){
changeChapter(mBookUtil.getChapterNo());
return;
}
if(mBookUtil.isBusy()){
return;
}
Log.d(TAG, "prepare book nextPage:chaptid " +mBookUtil.getChapterNo());
if (currentPage.getEnd() >= mBookUtil.getChapterLen()) {
Log.d(TAG,"已经是本章最后一页了");
File file =new File( mBookUtil.fileChapterName(currentChapter+1));
if(!file.exists())
if(mBookUtil.getChapters().size()==0 &&NetUtil.isNetworkConnected()){
mBookUtil.setChapterNo(currentChapter+1);
mStatus = Status.OPENING;
drawStatus();
new Thread() {
@Override
public void run() {
int slepttime = 0; mBookUtil.muluRetryCount=0;
while (slepttime<200 && mBookUtil.getChapters().size()==0 && (mBookUtil.mMuluStatus == BookUtil.MuluStatus.isDownloading || mBookUtil.muluRetryCount < Constants.retryCnt)) {
try {
sleep(50);
slepttime++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Log.d(TAG, String.format("prepare book waiting for chapters slept %s, chapt size %s, MuluStatus %s, muluRetryCount %s ,mStatus %s" ,
slepttime *50,mBookUtil.getChapters().size(),mBookUtil.mMuluStatus,mBookUtil.muluRetryCount,mStatus));
if(mBookUtil.getChapters().size()>0){
if( mBookUtil.getChapterNo() == mBookUtil.getChapters().size()+1){
mBookUtil.setChapterNo(mBookUtil.getChapterNo()-1);
}
currentChapter=mBookUtil.getChapterNo();
handler.sendEmptyMessage(MSG_NEXTPAGE) ;
}else if(mBookUtil.mMuluStatus == BookUtil.MuluStatus.failed || mStatus !=Status.OPENING){
handler.sendEmptyMessage(MSG_NEXTPAGE_FAIL) ;
}
}}.start();
return;
}
mLoadingChaptNo =currentChapter+1;
m_islastPage =currentChapter == mBookUtil.getChapters().size();// ||mBookUtil.getChapters().size()==0;
if ( m_islastPage){
Toast.makeText(mContext, "已经是最后一页了", Toast.LENGTH_SHORT).show();
mStatus = Status.LASTPAGE;
drawStatus();
// currentPage(false);
return;
} else if(mBookUtil.getChapters().size()==0){
return;
}
}
// Log.d(TAG, "prepare book nextPage: to open next page: ");
cancelPage = currentPage;
if(mBookPageWidget==null){
return;
}
Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getCurPage() ");
// onDraw(mBookPageWidget.getCurPage(),currentPage ,true,false);
Log.d(TAG, "nextpage:set current bitmap ..ondraw");
prePage = currentPage;
currentPage = getNextPage();
mLoadingChaptNo=0;
// currentPage = currentChaptPages.get(currentPage.getPageNo()-1);
if(mBookPageWidget==null){
return;
}
Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getNextPage() ");
onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true);
Log.d("nextPage","nextPagenext");
HashMap<String,String> map = new HashMap<String,String>();
map.put("novel",bookName);
map.put("chapt",getChapter().getChapterName());
map.put("page",currentPage.getPageNo()+"");
MobclickAgent.onEvent(MyApp.applicationContext, "page_reading", map);
}
//取消翻页
public void cancelPage(){
if(cancelPage !=null && (cancelPage.isLastPage() || cancelPage.isFirstPage())){
mBookUtil.setChapterNo(cancelPage.getChapterNo());
currentChaptPages = loadCurrentChapt(cancelPage.getChapterNo());
currentPage = getPageForBegin(cancelPage.getBegin()) ;// currentChaptPages.get(0);
// currentPage = getPageForBegin(begin);
/* if (mBookPageWidget != null) {
currentPage(true);
}*/
}
currentPage = cancelPage;
if (mBookPageWidget != null) {
currentPage(true);
}
}
public void prepareBook(Novel book){
Log.d(TAG, "prepare book: start prepare book " + book.getName());
if(getNovel()!=null) {
if (getNovel().getNovelId() != book.getNovelId()) { //取消未上本书完成的web请求待验证效果
try {
NetUtil.cancelRequest(getNovel().getNovelId());
} catch (Exception e) {
Log.e(TAG, "prepare book: error on canceling request " + e.getMessage());
e.printStackTrace();
}
}else{
Log.d(TAG, "prepare book: has been prepared, return.... " + book.getName());
if(mBookUtil!=null) {
return;
}
}
}
if(mBookUtil!=null){
mBookUtil. clear();
mBookUtil=null;
}
mBookUtil = new BookUtil();
mBookUtil.pagefactory=this;
//this.mBookUtil.setContext(context);
this.mBookUtil.setNovel(book);
this.mBookUtil.getTargetSites();
}
public void initBookUtil() {
mBookUtil = new BookUtil();
}
/**
* 打开书本
* @throws IOException
*/
public void openBook(Novel book ,Context context) throws IOException {
if(book==null){
return;
}
if(book.isLocalBook()){ //离线书籍重新初始化加载mBookUtil
mBookUtil = new BookUtil();
mBookUtil.setNovel(book);
}else if(mBookUtil ==null || getNovle()==null){
Log.d(TAG, "prepare book: preparing in openBook method" + book.getName());
prepareBook(book);
}
mBookUtil.setContext(context);
mContext =context;
mBookUtil.pagefactory=this;
//清空数据
currentChapter = 0;
// m_mbBufLen = 0;
initBg(config.getDayOrNight());
if(getNovel()!=null &&getNovel().getNovelId() !=book.getNovelId()){ //取消未上本书完成的web请求
NetUtil.cancelRequest(getNovel().getNovelId() );
}
bookPath = book.getNovelPath();
bookName =book.getName();// FileUtils.getFileName(bookPath);
// this.mCurrentChapter = chapter;
mStatus = Status.OPENING;
if (bookTask != null && bookTask.getStatus() != AsyncTask.Status.FINISHED){
bookTask.cancel(true);
}
bookTask = new BookTask();
Log.d(TAG, String.format("prepare book 1 to open chapter %s ,position %s,source %s",book.getLastReadChapt() ,book.getLastReadPos(),book.getDomain()+book.getDomainName() ) );
bookTask.execute((long)book.getLastReadChapt(),book .getLastReadPos());
drawStatus();
}
private class BookTask extends AsyncTask<Long,Void,Boolean>{
private long chapter=0;
private long begin = 0;
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
Log.d("onPostExecute",isCancelled() + "");
if (isCancelled()){
return;
}
if (result) {
Log.d(TAG, String.format("prepare book ready, to open chapter %s ",chapter ) );
// m_mbBufLen = mBookUtil.getChapterLen();
currentChapter =(int)chapter;
mBookUtil.setChapterNo((int)chapter);
Log.d(TAG, String.format("prepare book ready, to open chapter, loadCurrentChapt %s ",chapter ) );
currentChaptPages = loadCurrentChapt((int)chapter);
currentPage = getPageForBegin(begin) ;// currentChaptPages.get(0);
// currentPage = getPageForBegin(begin);
if (mBookPageWidget != null) {
currentPage(true);
showAd();
}
// Log.d(TAG, String.format("prepare book set PageFactory.mStatus %s .",PageFactory.Status.FINISH ) );
// PageFactory.mStatus = PageFactory.Status.FINISH;
}else{
PageFactory.mStatus = PageFactory.Status.FAIL;
drawStatus();
Toast.makeText(mContext,"打开书本失败!",Toast.LENGTH_SHORT).show();
}
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected Boolean doInBackground(Long... params) {
chapter = params[0];
begin = params[1];
currentChapter = (int) chapter;
try {
int slept=0;
while(getNovel() ==null){
// Log.d(TAG, "prepare book:waiting for bookutil book:" + getNovel());
Thread.sleep(10);
slept++;
if(slept>500){
return false;
}
}
Log.d(TAG, "prepare book:waiting for bookutil book slept "+slept*10);
mBookUtil.openBook(getNovel(),chapter);
} catch (Exception e) {
Log.e(TAG, "prepare book: backgroud error", e);
e.printStackTrace();
return false;
}
return true;
}
}
public TRPage getNextPage(){
int nextPageNo =currentPage.getPageNo();
Log.e(TAG,String.format("prepare book getNextPage() currentChapter %s, chapters().size() %s,currentChaptPages .size() is %s,currentpage pageno is %s"
,currentChapter, getChapters().size(), currentChaptPages.size() , nextPageNo));
if(nextPageNo==0){
drawStatus();
}
if(nextPageNo >= currentChaptPages.size() && (getChapters().size()==0 || getChapters().size()>currentChapter)){
preChaptPages =currentChaptPages;
currentChapter++;
mBookUtil.setChapterNo(currentChapter);
currentChaptPages = loadCurrentChapt(currentChapter ) ;
nextPageNo =0;
}else {
if(getChapters().size()>currentChapter) {
preReadChaptCache(currentChapter + 1);
}
}
if(currentChaptPages.size()>nextPageNo)
return currentChaptPages.get(nextPageNo);
else{
return new TRPage("");
}
}
public TRPage getPrePage(){
int prePageNo =currentPage.getPageNo()-1;
Log.d(TAG,String.format("currentPageno %s,total pagno %s",currentPage.getPageNo(),currentChaptPages.size()));
if(prePageNo <=0){
nextChaptPages =currentChaptPages;
currentChapter--;
mLoadingChaptNo =currentChapter;
if(currentChapter ==0) {
return new TRPage("没有内容了");
}
mBookUtil.setChapterNo(currentChapter);
currentChaptPages = loadCurrentChapt(currentChapter ) ;
prePageNo = currentChaptPages.size();
}else{
if(currentChapter-1>0) {
preReadChaptCache(currentChapter - 1);
}
}
mLoadingChaptNo =0;
return currentChaptPages.get(prePageNo-1);
}
public TRPage getPageForBegin(long begin){
/*
TRPage trPage = new TRPage();
trPage.setBegin(begin);
mBookUtil.setPostition(begin - 1);
trPage.setLines(getNextLines());
trPage.setEnd(mBookUtil.getPosition());
return trPage;
*/
if(currentChaptPages.size()==0){
return new TRPage();
}
Log.d(TAG, String.format("prepare book getPageForBegin: currentChaptPages count %s, chaptid %s, begin %s ",currentChaptPages.size(),currentChapter,begin));
for(TRPage page : currentChaptPages)
{
if(page.getEnd() >=begin){
return page;
}
}
//return new TRPage();// currentChaptPages.get(currentChaptPages.size()-1);
return currentChaptPages.get(currentChaptPages.size()-1);
}
boolean showChapTitleOnTopWhenNextPage =false;
public List<String> getNextLines(int chaptId,TRPage trpage){
List<String> lines = new ArrayList<>();
float width = 0;
float height = 0;
String line = "";
// boolean isFirstPage =false;
int firstPageLine =0;
if(mBookUtil.getPosition(chaptId)==0) {
lines.add("\n");//lines.add("\n");
}
int adHeight = trpage.getNativeBannerHeight()+trpage.getBannerHeight();
calculateLineCount(adHeight );
Log.d(TAG, String.format("getNextChapterPage getNextLines: pageNo %s, adHeight %s, totalLines %s",trpage.getPageNo(),adHeight,mLineCount));
while (mBookUtil.next(true,chaptId) != -1){
char word = (char) mBookUtil.next(false,chaptId);
// Log.d(TAG, String.format(" loadchapt getNextLines() chaptId %s, word '%s'", chaptId,word ));
if((word+"").equals(Constants.BAD_CHAR)){
// continue;
}
//判断是否换行
if ((word + "" ).equals("\n") ){// if ((word + "" ).equals("\r") && (((char) mBookUtil.next(true)) + "").equals("\n")){
// mBookUtil.next(false);
if ( !line.isEmpty()){
if (showChapTitleOnTopWhenNextPage && lines.size() >0 && mBookUtil.isChapterTitle(line)) {
Log.d(TAG,String.format("title is %s\n,size is %s ,position is %s" ,line,line.length(),mBookUtil.getPosition(chaptId) ));
//isFirstPage =true;
firstPageLine=1;
break;
}
// Log.d(TAG, String.format(" loadchapt getNextLines()chaptId %s new line with enter '%s' ", chaptId, line+word ));
lines.add(line+word);
// lines.add("\n");
line = "";
width = 0;
height += paragraphSpace - lineSpace;
calculateLineCount(adHeight+height);
if (lines.size()>= mLineCount +firstPageLine){
// Log.d(TAG,String.format("lines count limit a %s,lines size %s",mLineCount,lines.size()));
line ="";
break;
}
}
}else {
float widthChar = mPaint.measureText(word + "");
if(widthChar==0){
continue;
}
width += widthChar;
// Log.d(TAG, String.format(" loadchapt getNextLines(),widthChar %s ,width %s,mVisibleWidth %s",widthChar, width ,mVisibleWidth ));
if (width > mVisibleWidth) {
width = widthChar;
lines.add(line);
// Log.d(TAG, String.format(" loadchapt getNextLines()chaptId %snew line '%s' ",chaptId , line ));
/* if (lines.size() == mLineCount){
Log.d(TAG,String.format("lines count limit b %s,lines size %s",mLineCount,lines.size()));
line ="";
break;
}
*/
line = word + "";
} else {
line += word;
// Log.d(TAG, String.format(" loadchapt getNextLines()chaptId %sgrowing line '%s' ",chaptId , line ));
}
}
if (lines.size() == mLineCount +firstPageLine){
// Log.d(TAG,String.format("loadchapt lines count ,chaptId %s limit c %s,lines size %s",chaptId ,mLineCount,lines.size()));
if (!line.isEmpty()){
// mBookUtil.setPostition(mBookUtil.getPosition() - line.length()-2);// mBookUtil.setPostition(mBookUtil.getPosition() - 1);
mBookUtil.setPostition(chaptId,mBookUtil.getPosition(chaptId) - 1);
}
break;
}
}
/*
if (lines.size() == mLineCount) {
Log.d(TAG, String.format("lines count limit d %s,lines size %s", mLineCount, lines.size()));
Log.d(TAG, String.format("lines count limit d %s,line is \n %s", mLineCount, line));
if (!line.isEmpty()) {
mBookUtil.setPostition(mBookUtil.getPosition() - line.length() - 2);// mBookUtil.setPostition(mBookUtil.getPosition() - 1);
}
}*/
if (!line.isEmpty() && lines.size() < mLineCount +firstPageLine){
if (!(showChapTitleOnTopWhenNextPage && mBookUtil.isChapterTitle(line) ) ) {
lines.add(line);
}else
{
// mBookUtil.setPostition(mBookUtil.getPosition() - line.length()-2);
}
// lines.add(line);
}
/*for (String str : lines){
Log.d(TAG,str + " ");
}*/
return lines;
}
/*public List<String> getPreLines(){
List<String> lines = new ArrayList<>();
float width = 0;
String line = "";
char[] par = mBookUtil.preLine();
while (par != null){
List<String> preLines = new ArrayList<>();
for (int i = 0 ; i < par.length ; i++){
char word = par[i];
float widthChar = mPaint.measureText(word + "");
width += widthChar;
if (width > mVisibleWidth) {
width = widthChar;
preLines.add(line);
line = word + "";
} else {
line += word;
}
// Log.d(TAG,"preLine is \n" + line);
}
*//* if ( mBookUtil.isChapterTitle(line)) {
mBookUtil.setPostition(mBookUtil.getPosition() - line.length()-2);
break;
}*//*
// lines.add(line);
// Log.d(TAG,"preLine is \n" + line);
if (!line.isEmpty()){
preLines.add(line);
}
lines.addAll(0,preLines);
if (lines.size() >= mLineCount){
break;
}
width = 0;
line = "";
par = mBookUtil.preLine();
}
List<String> reLines = new ArrayList<>();
int num = 0;
for (int i = lines.size() -1;i >= 0;i --){
if (reLines.size() < mLineCount) {
reLines.add(0,lines.get(i));
}else{
num = num + lines.get(i).length();
}
Log.d(TAG,lines.get(i) + " ");
}
if (num > 0){
if ( mBookUtil.getPosition() > 0) {
mBookUtil.setPostition(mBookUtil.getPosition() + num + 1);//mBookUtil.setPostition(mBookUtil.getPosition() + num + 2); // /r/n -> /n,只需要回退1个字符
}else{
mBookUtil.setPostition(mBookUtil.getPosition() + num );
}
}
return reLines;
}*/
//上一章
public void preChapter(){
fileRetryCnt.clear();
mBookUtil.fileRetryCnt.clear();
if(currentChapter==1){
Toast.makeText(mContext,"到头了",Toast.LENGTH_SHORT).show();
}
// if (mBookUtil.getChapters().size() > 0 ){
int num = currentChapter;
if (num ==1){
num = getCurrentChapter();
}
num --;
if (num >= 1){
nextChaptPages =currentChaptPages;
currentChapter = num;
mBookUtil.setChapterNo(currentChapter);
currentChaptPages = loadCurrentChapt(currentChapter ) ;
currentPage = getPageForBegin(0);
currentPage(true);
}
}
//}
//下一章
public void nextChapter(){
fileRetryCnt.clear();
mBookUtil.fileRetryCnt.clear();
int num = currentChapter;
if (num == 0){
num = getCurrentChapter();
}
if(num==getChapters().size()){
Toast.makeText(mContext,"没有了",Toast.LENGTH_SHORT).show();
}
num ++;
if (num <= getChapters().size() || mBookUtil.chaptCached(num)){
preChaptPages =currentChaptPages;
currentChapter = num;
mBookUtil.setChapterNo(currentChapter);
currentChaptPages = loadCurrentChapt(currentChapter ) ;
currentPage = getPageForBegin(0);
currentPage(true);
}
}
//获取现在的章
public int getCurrentChapter(){
/*int num = 0;
for (int i = 0;getDirectoryList().size() > i;i++){
Chapter bookCatalogue = getDirectoryList().get(i);
if (currentPage.getEnd() >= bookCatalogue.getBookChapterStartPos()){
num = i;
}else{
break;
}
}
return num;
*/
currentChapter = mBookUtil.getChapterNo();
Log.d(TAG, String.format(" prepare book onDraw chapter after mBookUtil.getChapterNo(),currentChapter %s ",currentChapter ) );
return currentChapter ;
}
//绘制当前页面
public void currentPage(Boolean updateChapter){
// Log.d(TAG, "prepare book currentPage: to open current Page : ");
if(mBookPageWidget==null){
return;
}
Log.d(TAG, "currentPage onDraw: mBookPageWidget.getCurPage() ");
onDraw(mBookPageWidget.getCurPage(),currentPage ,updateChapter,false);
Log.d(TAG, "currentPage onDraw: mBookPageWidget.getNextPage() ");
onDraw(mBookPageWidget.getNextPage(),currentPage ,updateChapter,true);
}
//更新电量
public void updateBattery(int mLevel){
hideSysUI();
if (currentPage != null && mBookPageWidget != null && !mBookPageWidget.isRunning()) {
Log.d(TAG, String.format("updateBattery: level old %s, new %s",level,mLevel));
if (level != mLevel) {
level = mLevel;
currentPage(false);
}
}
}
public void updateTime(){
hideSysUI();
if (currentPage != null && mBookPageWidget != null && !mBookPageWidget.isRunning()) {
String mDate = sdf.format(new java.util.Date());
if (date != mDate) {
date = mDate;
currentPage(false);
}
}
}
//改变进度
public void changeProgress(float progress){
long begin = (long) (mBookUtil.getChapterLen() * progress);
currentPage = getPageForBegin(begin);
currentPage(true);
}
//改变章节
public void changeChapter(int chapNum){
if (getNovel() == null) {
return;
}
long position =0;
if(currentChapter == chapNum){
if( currentPage!=null){
position =currentPage.getBegin();
Log.d(TAG, "prepare book changeChapter: to position " + position);
}
}
if(position==0){
if( !getNovle().isLocalBook()
&& getNovle().getDomain()!=null && getSite().getDomain()!=null
&& getNovle().getDomain().equals(getSite().getDomain())
&& getNovle().getLastReadChapt() == chapNum ){
position =getNovel().getLastReadPos();
}
}
preChaptPages =currentChaptPages;
currentChapter = chapNum;
mBookUtil.setChapterNo(currentChapter);
currentChaptPages = loadCurrentChapt(currentChapter ) ;
currentPage = getPageForBegin(position);
currentPage(true);
hideSysUI();
if(position>0){
showAd();
}
}
public void retryChapt(int chapNum){
fileRetryCnt.clear();
mBookUtil.fileRetryCnt.clear();
changeChapter(chapNum);
}
public void openBookmark(int chapNum,long position){
//preChaptPages =currentChaptPages;
currentChapter = chapNum;
mBookUtil.setChapterNo(currentChapter);
currentChaptPages = loadCurrentChapt(currentChapter ) ;
currentPage = getPageForBegin(position);
currentPage(true);
}
//改变行间距
public void changeLineHight(int lineSpace) {
this.lineSpace = lineSpace;
mPaint.setTextSize(m_fontSize);
calculateLineCount();
measureMarginWidth();
chaptMap.clear();
currentChaptPages = loadCurrentChapt(currentChapter );
currentPage = getPageForBegin(currentPage.getBegin());
currentPage(true);
showAd();
}
//改变字体大小
public void changeFontSize(int fontSize){
this.m_fontSize = fontSize;
mPaint.setTextSize(m_fontSize);
calculateLineCount();
measureMarginWidth();
chaptMap.clear();
currentChaptPages = loadCurrentChapt(currentChapter );
currentPage = getPageForBegin(currentPage.getBegin());
currentPage(true);
showAd();
}
//改变字体
public void changeTypeface(Typeface typeface){
this.typeface = typeface;
mPaint.setTypeface(typeface);
mBatterryPaint.setTypeface(typeface);
calculateLineCount();
measureMarginWidth();
chaptMap.clear();
currentPage = getPageForBegin(currentPage.getBegin());
currentPage(true);
}
//改变背景
public void changeBookBg(int type){
setBookBg(type);
currentPage(false);
}
//设置页面的背景
public void setBookBg(int type){
Bitmap bitmap = Bitmap.createBitmap(mWidth,mHeight, Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
int color = 0;
switch (type){
case Config.BOOK_BG_DEFAULT:
canvas = null;
bitmap.recycle();
if (getBgBitmap() != null) {
getBgBitmap().recycle();
}
bitmap = BitmapUtil.decodeSampledBitmapFromResource(
mContext.getResources(), R.drawable.paper, mWidth, mHeight);
color = mContext.getResources().getColor(R.color.read_font_default);
setBookPageBg(mContext.getResources().getColor(R.color.read_bg_default));
break;
case Config.BOOK_BG_1:
canvas.drawColor(mContext.getResources().getColor(R.color.read_bg_1));
color = mContext.getResources().getColor(R.color.read_font_1);
setBookPageBg(mContext.getResources().getColor(R.color.read_bg_1));
break;
case Config.BOOK_BG_2:
canvas.drawColor(mContext.getResources().getColor(R.color.read_bg_2));
color = mContext.getResources().getColor(R.color.read_font_2);
setBookPageBg(mContext.getResources().getColor(R.color.read_bg_2));
break;
case Config.BOOK_BG_3:
canvas.drawColor(mContext.getResources().getColor(R.color.read_bg_3));
color = mContext.getResources().getColor(R.color.read_font_3);
if (mBookPageWidget != null) {
mBookPageWidget.setBgColor(mContext.getResources().getColor(R.color.read_bg_3));
}
break;
case Config.BOOK_BG_4:
canvas.drawColor(mContext.getResources().getColor(R.color.read_bg_4));
color = mContext.getResources().getColor(R.color.read_font_4);
setBookPageBg(mContext.getResources().getColor(R.color.read_bg_4));
break;
}
setBgBitmap(bitmap);
//设置字体颜色
setM_textColor(color);
}
public void setBookPageBg(int color){
if (mBookPageWidget != null) {
mBookPageWidget.setBgColor(color);
}
}
//设置日间或者夜间模式
public void setDayOrNight(Boolean isNgiht){
initBg(isNgiht);
currentPage(false);
}
public void clear(){
// Log.d(TAG, String .format("prepare Book: clearing book info %s" , getNovle().getName()));
// if(mBookUtil!=null) {
// mBookUtil.clear();
// mBookUtil=null;
// }
/* try{
throw new Exception("factory cleared");
}catch (Exception e){
Log.e(TAG, "prepare book: clear() called", e);
}*/
fileRetryCnt.clear();
lastPageTime=0;
if(chaptMap!=null){
chaptMap.clear();
}
currentChapter = 0;
bookPath = "";
bookName = "";
//getNovel() = null;
// mBookPageWidget = null;
mPageEvent = null;
cancelPage = null;
prePage = null;
currentPage = null;
// mAd=null;
currentChaptPages =null;
preChaptPages=null;
nextChaptPages=null;
mNavtiveBannerPlusCnt=0;
mSmallBannerMinusCnt =0;
mSmallBannerPlusCnt=0;
}
public static Status getStatus(){
return mStatus;
}
//是否是第一页
public boolean isfirstPage() {
return m_isfirstPage;
}
//询问是否可以退出阅读
public boolean canExitSilent(){
return m_islastPage
|| mStatus==Status.FAIL
||mStatus==Status.NETWORKFAILE
|| mStatus==Status.SERVERERROR;
}
//是否是最后一页
public boolean islastPage() {
return m_islastPage;
}
//是否可以翻页
public boolean isReady() {
return mStatus==Status.FINISH;
}
//设置页面背景
public void setBgBitmap(Bitmap BG) {
m_book_bg = BG;
}
//设置页面背景
public Bitmap getBgBitmap() {
return m_book_bg;
}
//设置文字颜色
public void setM_textColor(int m_textColor) {
this.m_textColor = m_textColor;
}
//获取文字颜色
public int getTextColor() {
return this.m_textColor;
}
//获取文字大小
public float getFontSize() {
return this.m_fontSize;
}
public void setPageWidget(PageWidget mBookPageWidget){
this.mBookPageWidget = mBookPageWidget;
}
public PageWidget getPageWidget( ){
return mBookPageWidget;
}
public void setPageEvent(PageEvent pageEvent){
this.mPageEvent = pageEvent;
}
public interface PageEvent{
void changeProgress(float progress);
}
public void refreshCate(){
mBookUtil.getChapters().clear();
mBookUtil.getSiteRule(true);
}
public long getChapterLen(){
return mBookUtil.getChapterLen();
}
public TRPage getCurrentPage(){
return currentPage;
}
//获取书本的章
public List<Chapter> getChapters(){
return mBookUtil.getChapters();
}
public boolean isReadingCatalogs(){
return mBookUtil.isReadingCatalogs();
}
public String getBookPath(){
return bookPath;
}
public String getBookName(){
return getNovel().getName();
}
public Novel getNovle(){
return getNovel();
}
private Novel getNovel(){
if(mBookUtil!=null){
return mBookUtil.getNovel();
}
return new Novel();
}
public Site getSite(){
if(mBookUtil!=null){
return mBookUtil.getSite();
}
else{
return new Site();
}
}
public boolean isWorking(){
return mBookUtil !=null;
}
public String getChapterFileName(int chapid) {
return mBookUtil.fileChapterName(chapid);
}
}