修正url过滤问题

This commit is contained in:
mwang 2019-07-05 23:21:37 +08:00
parent fcb43d9a33
commit c92fd2e52d
15 changed files with 315 additions and 279 deletions

View File

@ -17,8 +17,8 @@ android {
// applicationId "com.zhushou.yueshu" // applicationId "com.zhushou.yueshu"
minSdkVersion 19 //target 19 Android 4.4 4.1% minSdkVersion 19 //target 19 Android 4.4 4.1%
targetSdkVersion 28 targetSdkVersion 28
versionCode 1 versionCode 6
versionName "v1.0" versionName "v6.0"
// testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" // testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
@ -62,7 +62,7 @@ android {
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
// versionCode 1 // versionCode 1
// versionName "v1.0" // versionName "v1.0"
applicationVariants.all { variant -> /* applicationVariants.all { variant ->
variant.outputs.all { output -> variant.outputs.all { output ->
def outFile = output.outputFile def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith(".apk")) { if (outFile != null && outFile.name.endsWith(".apk")) {
@ -71,21 +71,24 @@ android {
outputFileName = fileName; outputFileName = fileName;
} }
} }
} }*/
signingConfig signingConfigs.releaseConfig signingConfig signingConfigs.releaseConfig
} }
} }
// //
productFlavors { productFlavors {
// googleplay {} // googleplay {}
g { /* g {
applicationId "com.zhushou.yueshu" applicationId "com.zhushou.yueshu"
versionName "v1.0" versionName "v1.0"
buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"' buildConfigField "String", "MAIN_HOST", '"http://g.xiaoshuofenxiang.com/api/"'
buildConfigField "String", "API_HOST", '""' buildConfigField "String", "API_HOST", '""'
} }
//
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}*/
/* google { /* google {
applicationId "com.zhushou.yueshu" applicationId "com.zhushou.yueshu"
versionName "v1.0" versionName "v1.0"
@ -93,10 +96,7 @@ android {
buildConfigField "String", "API_HOST", '""' buildConfigField "String", "API_HOST", '""'
}*/ }*/
//
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
} }
android { android {

View File

@ -197,8 +197,8 @@
<meta-data <meta-data
android:name="UMENG_APPKEY" android:name="UMENG_APPKEY"
android:value="5cd6238a570df375c3000cc9" /> <!-- <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/> --> android:value="5cd6238a570df375c3000cc9" /> <!-- <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}"/> -->
<!--<meta-data android:name="UMENG_CHANNEL" android:value="debug" />--> <meta-data android:name="UMENG_CHANNEL" android:value="debug" />
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> <!--<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />-->
<!-- google ad--> <!-- google ad-->
<!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 --> <!-- Sample AdMob App ID: ca-app-pub-3940256099942544~3347511713 -->
<meta-data <meta-data

View File

@ -9,6 +9,7 @@ import android.support.v7.widget.RecyclerView;
import android.text.TextUtils; import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.TextureView;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
@ -95,7 +96,17 @@ public class Activity_ChgSource extends Activity_base {
e.printStackTrace(); e.printStackTrace();
} }
} }
mSites = new ArrayList<Site>(Arrays.asList(pageFactory.getNovelSites().getSites())); ArrayList<Site> tmp = new ArrayList<Site>(Arrays.asList(pageFactory.getNovelSites().getSites()));
for(Site site : tmp){
if(!TextUtils.isEmpty(site.getMuluUrl())){
mSites.add(site);
}
}
handler.sendEmptyMessage(1); handler.sendEmptyMessage(1);
}}.start();; }}.start();;

View File

@ -334,11 +334,11 @@ public class CatalogFragment extends BasicFragment implements MarkActivity.Sortc
public void hideProgressSelf() { public void hideProgressSelf() {
Log.d(TAG, "prepare book hideProgress2 called" ); Log.d(TAG, "prepare book hideProgress2 called" );
try{ /* try{
throw new Exception("who dismissed"); throw new Exception("who dismissed");
}catch (Exception e){ }catch (Exception e){
Log.e(TAG, "prepare book hideProgress2: ", e); Log.e(TAG, "prepare book hideProgress2: ", e);
} }*/
if (mProgressDialog2 == null) if (mProgressDialog2 == null)
return; return;

View File

@ -205,7 +205,7 @@ public class Fragment_Shelf extends BasicFragment {
@Override @Override
public void onFault(String errorMsg) { public void onFault(String errorMsg) {
//失败 //失败
Log.d(TAG, "error on get firstpage: " + errorMsg); Log.d(TAG, "error on get novel update list: " + errorMsg);
handler.sendEmptyMessage(1); handler.sendEmptyMessage(1);
} }
}; };
@ -793,6 +793,7 @@ public class Fragment_Shelf extends BasicFragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
getUpdatedData(); getUpdatedData();
if (bottomSheetDialog != null) { if (bottomSheetDialog != null) {
bottomSheetDialog.hide(); bottomSheetDialog.hide();
} }

View File

@ -341,15 +341,15 @@ public void testUpdate(){
lastUpdateTime - nv.lastUpdateTime lastUpdateTime - nv.lastUpdateTime
) ); ) );
// isUpdated = isUpdated && !(!TextUtils.isEmpty(chapterName) && !TextUtils.isEmpty(nv.chapterName) && (chapterName.equals(nv.lastReadChaptName) )); /* boolean isLastReadchaptUpdated = TextUtils.isEmpty(nv.lastReadChaptName) || !(chapterName.equals(nv.lastReadChaptName)); //没看过最新章节
// boolean isLastReadchaptUpdated = !TextUtils.isEmpty(chapterName) && !TextUtils.isEmpty(nv.lastReadChaptName) && !(chapterName.equals(nv.lastReadChaptName));
boolean isLastReadchaptUpdated = TextUtils.isEmpty(nv.lastReadChaptName) || !(chapterName.equals(nv.lastReadChaptName)); //没看过最新章节
boolean isLastChaptUpdated = !TextUtils.isEmpty(chapterName) && !TextUtils.isEmpty(nv.chapterName) && !(chapterName.equals(nv.chapterName)); boolean isLastChaptUpdated = !TextUtils.isEmpty(chapterName) && !TextUtils.isEmpty(nv.chapterName) && !(chapterName.equals(nv.chapterName));
Log.d("Novel", String.format( " server lastUpdateTime ,server chaptername %s,chaptername %s,lastreadchapt %s" , chapterName,nv.chapterName,nv.lastReadChaptName ) ); Log.d("Novel", String.format( " server lastUpdateTime ,server chaptername %s,chaptername %s,lastreadchapt %s" , chapterName,nv.chapterName,nv.lastReadChaptName ) );
isUpdated = isUpdated && isLastReadchaptUpdated || isLastChaptUpdated ; isUpdated = isUpdated && isLastReadchaptUpdated || isLastChaptUpdated ;
Log.d("Novel", String.format( " isupdated %s, server lastUpdateTime isLastReadchaptUpdated %s,isLastChaptUpdated %s" ,isUpdated,isLastReadchaptUpdated,isLastChaptUpdated ) ); Log.d("Novel", String.format( " isupdated %s, server lastUpdateTime isLastReadchaptUpdated %s,isLastChaptUpdated %s" ,isUpdated,isLastReadchaptUpdated,isLastChaptUpdated ) );
*/
if(!isUpdated){ if(!isUpdated){
setToDefault("isUpdated"); setToDefault("isUpdated");
} }

View File

@ -249,29 +249,47 @@ public class BookUtil {
Log.d(TAG, String.format("prepare book %s get novel sites count %s .",mNovel.getName(), nvs.getSites().length) ); Log.d(TAG, String.format("prepare book %s get novel sites count %s .",mNovel.getName(), nvs.getSites().length) );
if(nvs.getSites().length ==0){ if(nvs.getSites().length ==0){
throw new RuntimeException("书本错误 code 001"); //无目标网站 throw new RuntimeException("书本错误 no site, code 001"); //无目标网站
// return; // return;
} }
mSite =null;
if(nvs.getSites().length > 0){ if(nvs.getSites().length > 0){
for (Site site:nvs.getSites() ) { for (Site site:nvs.getSites() ) {
if(TextUtils.isEmpty(site.getMuluUrl())){
continue;
}
if(!TextUtils.isEmpty(mNovel.getDomain()) && site.getDomain().equals(mNovel.getDomain())){ if(!TextUtils.isEmpty(mNovel.getDomain()) && site.getDomain().equals(mNovel.getDomain())){
mSite = site; mSite = site;
break; break;
} }
} }
if(mSite ==null) if(mSite ==null) {
for (Site site:nvs.getSites() ) { for (Site site : nvs.getSites()) {
if(site.getSelectedByDefault()){ if(TextUtils.isEmpty(site.getMuluUrl())){
continue;
}
if (site.getSelectedByDefault()) {
mSite = site; mSite = site;
break; break;
} }
} }
if(mSite ==null) }
mSite =nvs.getSites()[0];
if(mSite ==null) {
for (Site site : nvs.getSites()) {
if(TextUtils.isEmpty(site.getMuluUrl())){
continue;
}
mSite = site;
break;
}
}
}
if(mSite!=null) {
getSiteRule();
} }
getSiteRule();
} }
private void setSiteInfo() { private void setSiteInfo() {
@ -865,6 +883,10 @@ int muluRetryCount =0;
} }
String url = mSite.getMuluUrl(); String url = mSite.getMuluUrl();
int maxAge= isForceRefresh ?0 : mNovel.getMaxAge(); int maxAge= isForceRefresh ?0 : mNovel.getMaxAge();
if(!isHttpOrHttps(url)){
return ;
}
Request request = getTagRequest(url,REUtil.getDomain(url),maxAge); Request request = getTagRequest(url,REUtil.getDomain(url),maxAge);
mMuluStatus = MuluStatus.isDownloading; mMuluStatus = MuluStatus.isDownloading;
@ -1761,6 +1783,14 @@ int muluRetryCount =0;
return block; return block;
} }
boolean isHttpOrHttps(String url){
if(TextUtils.isEmpty(url) || !url.toLowerCase().startsWith("http") && !url.toLowerCase().startsWith("https")){
Log.d(TAG, String.format("prepare book isHttpOrHttps: url % is bad for request ",url));
return false ;
}
return true;
}
Map<Integer,Integer> fileRetryCnt = new HashMap<Integer,Integer>(); Map<Integer,Integer> fileRetryCnt = new HashMap<Integer,Integer>();
private void loadChaptContent(final int chapterIndex) throws JSONException, InterruptedException { private void loadChaptContent(final int chapterIndex) throws JSONException, InterruptedException {
/* 章节内容没有缓存在本地 /* 章节内容没有缓存在本地
@ -1797,6 +1827,11 @@ private void loadChaptContent(final int chapterIndex) throws JSONException, Inte
JSONObject siteJson = new JSONObject(); JSONObject siteJson = new JSONObject();
siteJson.put("chapterContentRegex", mSiteRule.getChapterContentRegex()); siteJson.put("chapterContentRegex", mSiteRule.getChapterContentRegex());
siteJson.put("chapterContentDumpRegex", mSiteRule.getChapterContentDumpRegex()); siteJson.put("chapterContentDumpRegex", mSiteRule.getChapterContentDumpRegex());
if(!isHttpOrHttps(url)){
return ;
}
Request request = getTagRequest(url, refUrl,-1); Request request = getTagRequest(url, refUrl,-1);
@ -1921,13 +1956,14 @@ private void loadChaptContent(final int chapterIndex) throws JSONException, Inte
*/ */
private Request getTagRequest(String url, String refUrl ,int maxAge) { private Request getTagRequest(String url, String refUrl ,int maxAge) {
try {
Request.Builder builder = new Request.Builder() Request.Builder builder = new Request.Builder()
.tag(mNovel.getNovelId()) //标记 请求的tag,切换小说或离开小说界面(BookActivity) 取消未执行完毕的 此tag的所有请求 .tag(mNovel.getNovelId()) //标记 请求的tag,切换小说或离开小说界面(BookActivity) 取消未执行完毕的 此tag的所有请求
.url(url) .url(url)
.removeHeader("Pragma"); .removeHeader("Pragma");
if(!TextUtils.isEmpty(refUrl)){ if (!TextUtils.isEmpty(refUrl)) {
builder.header("Referer",refUrl); builder.header("Referer", refUrl);
} }
for (int i = 0; i < mSiteRule.getHeaders().length; i += 2) { for (int i = 0; i < mSiteRule.getHeaders().length; i += 2) {
@ -1935,21 +1971,24 @@ private void loadChaptContent(final int chapterIndex) throws JSONException, Inte
} }
if(mSiteRule.getUserAgents()!=null && mSiteRule.getUserAgents().length>0){ if (mSiteRule.getUserAgents() != null && mSiteRule.getUserAgents().length > 0) {
String siteAgent =mSiteRule.getUserAgents()[new Random().nextInt( mSiteRule.getUserAgents().length-1)]; String siteAgent = mSiteRule.getUserAgents()[new Random().nextInt(mSiteRule.getUserAgents().length - 1)];
Log.d(TAG, "prepare book on getTagRequest:add site user agent " + siteAgent); Log.d(TAG, "prepare book on getTagRequest:add site user agent " + siteAgent);
builder.removeHeader("User-Agent").addHeader("User-Agent",siteAgent ); // 随机agent builder.removeHeader("User-Agent").addHeader("User-Agent", siteAgent); // 随机agent
}else{ } else {
builder.removeHeader("User-Agent").addHeader("User-Agent", HttpMethods.USERAGENT); builder.removeHeader("User-Agent").addHeader("User-Agent", HttpMethods.USERAGENT);
} }
if (maxAge > 0) { if (maxAge > 0) {
builder.header("Cache-Control", "public, max-age=" + maxAge); builder.header("Cache-Control", "public, max-age=" + maxAge);
} }
return builder.build(); return builder.build();
}catch (Exception er){
}
return null;
} }
private String getRequestHeader(Request request) { private String getRequestHeader(Request request) {

View File

@ -22,7 +22,9 @@ import java.util.List;
public class GsonUtil { public class GsonUtil {
private static Gson gson = new Gson(); private static Gson gson = new Gson();
public static Novel getNovel(String json){
public static List<String>
/*public static Novel getNovel(String json){
Novel nv = new Novel(); Novel nv = new Novel();
try { try {
JSONObject jsonObject = new JSONObject(json); JSONObject jsonObject = new JSONObject(json);
@ -41,8 +43,7 @@ public class GsonUtil {
e.printStackTrace(); e.printStackTrace();
} }
return nv; return nv;
} }*/parserStringBlocks(String result,String blockName ) throws JSONException {
public static List<String> parserStringBlocks(String result,String blockName ) throws JSONException {
JSONObject jsonObject = new JSONObject(result); JSONObject jsonObject = new JSONObject(result);
JSONArray array = jsonObject.getJSONArray(blockName); JSONArray array = jsonObject.getJSONArray(blockName);
List<String> lst = new ArrayList<String>(); List<String> lst = new ArrayList<String>();

View File

@ -1,6 +1,7 @@
package com.novelbook.android.utils; package com.novelbook.android.utils;
import android.text.TextUtils;
import android.util.Log; import android.util.Log;
import com.novelbook.android.db.Chapter; import com.novelbook.android.db.Chapter;
@ -279,6 +280,9 @@ public class NovelParseUtil {
private static String access(String url,int maxAge, SiteRule siteRule) { private static String access(String url,int maxAge, SiteRule siteRule) {
if(TextUtils.isEmpty(url) || !url.toLowerCase().startsWith("http") || !url.toLowerCase().startsWith("https")){
return "";
}
Request.Builder builder = new Request.Builder() Request.Builder builder = new Request.Builder()
// .tag(mNovel.getNovelId()) //标记 请求的tag,切换小说或离开小说界面(BookActivity) 取消未执行完毕的 此tag的所有请求 // .tag(mNovel.getNovelId()) //标记 请求的tag,切换小说或离开小说界面(BookActivity) 取消未执行完毕的 此tag的所有请求
.url(url) .url(url)

View File

@ -1155,7 +1155,7 @@ private void hideSysUI(){
// Log.d(TAG, strLine); // Log.d(TAG, strLine);
// Log.d(TAG,"最后字符 。。。" +strLine.charAt(strLine.length()-1) + ""); // Log.d(TAG,"最后字符 。。。" +strLine.charAt(strLine.length()-1) + "");
lastLine =strLine; lastLine =strLine;
strLine = strLine.replace("<EFBFBD>",""); // strLine = strLine.replace("<EFBFBD>","");
if(lineNo==trPage.getNativeBannerStartLine()){ if(lineNo==trPage.getNativeBannerStartLine()){
if(showAd && mAd!=null){ if(showAd && mAd!=null){
@ -1165,7 +1165,7 @@ private void hideSysUI(){
// mAd.showNativeBannerInLines(trPage.getNativeBannerHeight(),(int)y); // mAd.showNativeBannerInLines(trPage.getNativeBannerHeight(),(int)y);
} }
y+=trPage.getNativeBannerHeight() +m_fontSize +lineSpace ; y+=trPage.getNativeBannerHeight() +m_fontSize +lineSpace ;
Log.d(TAG, String.format("onDraw showNativeBannerInLines : lineno %s,strline %s ",lineNo,strLine)); // Log.d(TAG, String.format("onDraw showNativeBannerInLines : lineno %s,strline %s ",lineNo,strLine));
space = m_fontSize + lineSpace; space = m_fontSize + lineSpace;
// y-=lineSpace; // y-=lineSpace;
if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) { if (strLine.length() > 0 && (strLine.charAt(strLine.length() - 1) + "").equals("\n")) {
@ -1197,7 +1197,7 @@ private void hideSysUI(){
// Log.d(TAG,String.format("getNavigationBarSize mHeight is %s ,last line height %s, power %s, %s", // // 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)); // mHeight,y,mHeight - CommonUtil.convertDpToPixel(mContext,10) + mBorderWidth - statusMarginBottom, lastLine));
// lastLine =lastLine.trim().replace(Constants.BAD_CHAR,""); // lastLine =lastLine.trim().replace(Constants.BAD_CHAR,"");
Log.d(TAG, String.format("onDraw: last line lenth %s,%s, ",lastLine.length() ,lastLine)); // Log.d(TAG, String.format("onDraw: last line lenth %s,%s, ",lastLine.length() ,lastLine));
float adHeight = mHeight -y - space -marginHeight-statusMarginBottom; float adHeight = mHeight -y - space -marginHeight-statusMarginBottom;
float adY =y ;//+space; float adY =y ;//+space;
adY= lastLine.length()==0 ?adY-m_fontSize - lineSpace :adY; adY= lastLine.length()==0 ?adY-m_fontSize - lineSpace :adY;
@ -1218,7 +1218,7 @@ private void hideSysUI(){
// showAd((int) adHeight, (int) adY); // 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("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("ad + statusMarginBottom %s ",200+ statusMarginBottom));
// Log.d(TAG,String.format("adHeight %s, adY %s",adHeight,adY)); // Log.d(TAG,String.format("adHeight %s, adY %s",adHeight,adY));
@ -1245,11 +1245,11 @@ private void hideSysUI(){
c.drawText(strPercent, mWidth - nPercentWidth, botoomY, mBatterryPaint);//x y为坐标值 c.drawText(strPercent, mWidth - nPercentWidth, botoomY, mBatterryPaint);//x y为坐标值
c.drawText(date, marginWidth ,botoomY, mBatterryPaint); c.drawText(date, marginWidth ,botoomY, mBatterryPaint);
// 画电池 // 画电池
Log.d(TAG, String.format("updateBattery to draw: level1 %s ",level)); // Log.d(TAG, String.format("updateBattery to draw: level1 %s ",level));
// level = batteryInfoIntent.getIntExtra( "level" , 0 ); // level = batteryInfoIntent.getIntExtra( "level" , 0 );
int scale = batteryInfoIntent.getIntExtra("scale", 100); int scale = batteryInfoIntent.getIntExtra("scale", 100);
mBatteryPercentage = (float) level / scale; mBatteryPercentage = (float) level / scale;
Log.d(TAG, String.format("updateBattery to draw: level2 %s ",level)); // Log.d(TAG, String.format("updateBattery to draw: level2 %s ",level));
float rect1Left = marginWidth + dateWith + statusMarginBottom;//电池外框left位置 float rect1Left = marginWidth + dateWith + statusMarginBottom;//电池外框left位置
//画电池外框 //画电池外框
@ -1324,11 +1324,11 @@ private void hideSysUI(){
} }
public void showAd(){ public void showAd(){
Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s ",mAdType )); // Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s ",mAdType ));
if(mStatus == Status.LASTPAGE || mAd==null ||currentPage==null || !Constants.AD_SETTING.isShowAdsense()){ if(mStatus == Status.LASTPAGE || mAd==null ||currentPage==null || !Constants.AD_SETTING.isShowAdsense()){
return; return;
} }
Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s, pageNo %s",mAdType, currentPage.getPageNo())); // Log.d(TAG, String.format("loadBannerAd showAd: mAdType %s, pageNo %s",mAdType, currentPage.getPageNo()));
if(mAdType ==AdTpye.BANNER){ if(mAdType ==AdTpye.BANNER){
mAd.showTopBanner(mAdHeight,mAdY); mAd.showTopBanner(mAdHeight,mAdY);
}else if(mAdType == AdTpye.NATIVEINLINES){ }else if(mAdType == AdTpye.NATIVEINLINES){
@ -1374,7 +1374,7 @@ private void hideSysUI(){
} }
} }
Log.d(TAG, "prepare book prePage: to open prepage: "); // Log.d(TAG, "prepare book prePage: to open prepage: ");
cancelPage = currentPage; cancelPage = currentPage;
if(mBookPageWidget==null){ if(mBookPageWidget==null){
return; return;
@ -1384,13 +1384,13 @@ private void hideSysUI(){
if(mBookPageWidget==null){ if(mBookPageWidget==null){
return; return;
} }
Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() "); // Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() ");
onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true); onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true);
}else{ }else{
if(mBookPageWidget==null){ if(mBookPageWidget==null){
return; return;
} }
Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() "); // Log.d(TAG, " prePage() onDraw: mBookPageWidget.getNextPage() ");
currentPage = getPrePage(); currentPage = getPrePage();
onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true); onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true);
@ -1411,7 +1411,7 @@ private void hideSysUI(){
return; return;
} }
Log.d(TAG, "prepare book nextPage:chaptid " +mBookUtil.getChapterNo()); // Log.d(TAG, "prepare book nextPage:chaptid " +mBookUtil.getChapterNo());
if (currentPage.getEnd() >= mBookUtil.getChapterLen()) { if (currentPage.getEnd() >= mBookUtil.getChapterLen()) {
Log.d(TAG,"已经是本章最后一页了"); Log.d(TAG,"已经是本章最后一页了");
File file =new File( mBookUtil.fileChapterName(currentChapter+1)); File file =new File( mBookUtil.fileChapterName(currentChapter+1));
@ -1470,9 +1470,9 @@ private void hideSysUI(){
if(mBookPageWidget==null){ if(mBookPageWidget==null){
return; return;
} }
Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getCurPage() "); // Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getCurPage() ");
// onDraw(mBookPageWidget.getCurPage(),currentPage ,true,false); // onDraw(mBookPageWidget.getCurPage(),currentPage ,true,false);
Log.d(TAG, "nextpage:set current bitmap ..ondraw"); // Log.d(TAG, "nextpage:set current bitmap ..ondraw");
prePage = currentPage; prePage = currentPage;
currentPage = getNextPage(); currentPage = getNextPage();
mLoadingChaptNo=0; mLoadingChaptNo=0;
@ -1480,9 +1480,9 @@ private void hideSysUI(){
if(mBookPageWidget==null){ if(mBookPageWidget==null){
return; return;
} }
Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getNextPage() "); // Log.d(TAG, "nextPage() onDraw: mBookPageWidget.getNextPage() ");
onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true); onDraw(mBookPageWidget.getNextPage(),currentPage ,true,true);
Log.d("nextPage","nextPagenext"); // Log.d("nextPage","nextPagenext");
HashMap<String,String> map = new HashMap<String,String>(); HashMap<String,String> map = new HashMap<String,String>();
map.put("novel",bookName); map.put("novel",bookName);
@ -1510,18 +1510,19 @@ private void hideSysUI(){
public void prepareBook(Novel book){ public void prepareBook(Novel book){
Log.d(TAG, "prepare book: start prepare book " + book.getName());
Log.d(TAG, "prepare book: start prepare book " + book.getName());
if(getNovel()!=null) { if(getNovel()!=null) {
if (getNovel().getNovelId() != book.getNovelId()) { //取消未上本书完成的web请求待验证效果 if (getNovel().getNovelId() != book.getNovelId()) { //取消未上本书完成的web请求待验证效果
try { try {
NetUtil.cancelRequest(getNovel().getNovelId()); NetUtil.cancelRequest(getNovel().getNovelId());
} catch (Exception e) { } catch (Exception e) {
Log.e(TAG, "prepare book: error on canceling request " + e.getMessage()); // Log.e(TAG, "prepare book: error on canceling request " + e.getMessage());
e.printStackTrace(); e.printStackTrace();
} }
}else{ }else{
Log.d(TAG, "prepare book: has been prepared, return.... " + book.getName()); // Log.d(TAG, "prepare book: has been prepared, return.... " + book.getName());
if(mBookUtil!=null) { if(mBookUtil!=null) {
return; return;
} }
@ -1663,8 +1664,8 @@ private void hideSysUI(){
public TRPage getNextPage(){ public TRPage getNextPage(){
int nextPageNo =currentPage.getPageNo(); 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" // 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)); // ,currentChapter, getChapters().size(), currentChaptPages.size() , nextPageNo));
if(nextPageNo==0){ if(nextPageNo==0){
drawStatus(); drawStatus();
} }
@ -1690,7 +1691,7 @@ private void hideSysUI(){
int prePageNo =currentPage.getPageNo()-1; int prePageNo =currentPage.getPageNo()-1;
Log.d(TAG,String.format("currentPageno %s,total pagno %s",currentPage.getPageNo(),currentChaptPages.size())); // Log.d(TAG,String.format("currentPageno %s,total pagno %s",currentPage.getPageNo(),currentChaptPages.size()));
if(prePageNo <=0){ if(prePageNo <=0){
@ -1726,7 +1727,7 @@ private void hideSysUI(){
if(currentChaptPages.size()==0){ if(currentChaptPages.size()==0){
return new TRPage(); return new TRPage();
} }
Log.d(TAG, String.format("prepare book getPageForBegin: currentChaptPages count %s, chaptid %s, begin %s ",currentChaptPages.size(),currentChapter,begin)); // Log.d(TAG, String.format("prepare book getPageForBegin: currentChaptPages count %s, chaptid %s, begin %s ",currentChaptPages.size(),currentChapter,begin));
for(TRPage page : currentChaptPages) for(TRPage page : currentChaptPages)
{ {
if(page.getEnd() >=begin){ if(page.getEnd() >=begin){
@ -1751,7 +1752,8 @@ private void hideSysUI(){
} }
int adHeight = trpage.getNativeBannerHeight()+trpage.getBannerHeight(); int adHeight = trpage.getNativeBannerHeight()+trpage.getBannerHeight();
calculateLineCount(adHeight ); calculateLineCount(adHeight );
Log.d(TAG, String.format("getNextChapterPage getNextLines: pageNo %s, adHeight %s, totalLines %s",trpage.getPageNo(),adHeight,mLineCount)); // Log.d(TAG, String.format("getNextChapterPage getNextLines: pageNo %s, adHeight %s, totalLines %s",trpage.getPageNo(),adHeight,mLineCount));
boolean newParagraph =false;
while (mBookUtil.next(true,chaptId) != -1){ while (mBookUtil.next(true,chaptId) != -1){
char word = (char) mBookUtil.next(false,chaptId); char word = (char) mBookUtil.next(false,chaptId);
// Log.d(TAG, String.format(" loadchapt getNextLines() chaptId %s, word '%s'", chaptId,word )); // Log.d(TAG, String.format(" loadchapt getNextLines() chaptId %s, word '%s'", chaptId,word ));
@ -1761,9 +1763,10 @@ private void hideSysUI(){
//判断是否换行 //判断是否换行
if ((word + "" ).equals("\n") ){// if ((word + "" ).equals("\r") && (((char) mBookUtil.next(true)) + "").equals("\n")){ if ((word + "" ).equals("\n") ){// if ((word + "" ).equals("\r") && (((char) mBookUtil.next(true)) + "").equals("\n")){
// mBookUtil.next(false); // mBookUtil.next(false);
newParagraph =true;
if ( !line.isEmpty()){ if ( !line.isEmpty()){
if (showChapTitleOnTopWhenNextPage && lines.size() >0 && mBookUtil.isChapterTitle(line)) { 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) )); // Log.d(TAG,String.format("title is %s\n,size is %s ,position is %s" ,line,line.length(),mBookUtil.getPosition(chaptId) ));
//isFirstPage =true; //isFirstPage =true;
firstPageLine=1; firstPageLine=1;
break; break;
@ -1788,6 +1791,14 @@ private void hideSysUI(){
continue; continue;
} }
if(newParagraph && line.length()==0) {
newParagraph = false;
if(!(word+"").equals(Constants.BAD_CHAR)){
line += Constants.BAD_CHAR + Constants.BAD_CHAR;
widthChar += 2* mPaint.measureText( Constants.BAD_CHAR + "");
}
}
width += widthChar; width += widthChar;
// Log.d(TAG, String.format(" loadchapt getNextLines(),widthChar %s ,width %s,mVisibleWidth %s",widthChar, width ,mVisibleWidth )); // Log.d(TAG, String.format(" loadchapt getNextLines(),widthChar %s ,width %s,mVisibleWidth %s",widthChar, width ,mVisibleWidth ));
@ -1978,7 +1989,7 @@ private void hideSysUI(){
*/ */
currentChapter = mBookUtil.getChapterNo(); currentChapter = mBookUtil.getChapterNo();
Log.d(TAG, String.format(" prepare book onDraw chapter after mBookUtil.getChapterNo(),currentChapter %s ",currentChapter ) ); Log.d(TAG, String.format(" prepare book onDraw chapter after mBookUtil.getChapterNo(),currentChapter %s ",currentChapter ) );
return currentChapter ; return currentChapter ;
} }
@ -1988,9 +1999,9 @@ private void hideSysUI(){
if(mBookPageWidget==null){ if(mBookPageWidget==null){
return; return;
} }
Log.d(TAG, "currentPage onDraw: mBookPageWidget.getCurPage() "); // Log.d(TAG, "currentPage onDraw: mBookPageWidget.getCurPage() ");
onDraw(mBookPageWidget.getCurPage(),currentPage ,updateChapter,false); onDraw(mBookPageWidget.getCurPage(),currentPage ,updateChapter,false);
Log.d(TAG, "currentPage onDraw: mBookPageWidget.getNextPage() "); // Log.d(TAG, "currentPage onDraw: mBookPageWidget.getNextPage() ");
onDraw(mBookPageWidget.getNextPage(),currentPage ,updateChapter,true); onDraw(mBookPageWidget.getNextPage(),currentPage ,updateChapter,true);
} }
@ -1999,7 +2010,7 @@ private void hideSysUI(){
hideSysUI(); hideSysUI();
if (currentPage != null && mBookPageWidget != null && !mBookPageWidget.isRunning()) { if (currentPage != null && mBookPageWidget != null && !mBookPageWidget.isRunning()) {
Log.d(TAG, String.format("updateBattery: level old %s, new %s",level,mLevel)); // Log.d(TAG, String.format("updateBattery: level old %s, new %s",level,mLevel));
if (level != mLevel) { if (level != mLevel) {
level = mLevel; level = mLevel;
currentPage(false); currentPage(false);

View File

@ -176,7 +176,7 @@ int mPageMode =0;
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
// canvas.drawColor(0xFFAAAAAA); // canvas.drawColor(0xFFAAAAAA);
canvas.drawColor(mBgColor); canvas.drawColor(mBgColor);
Log.e("pagewidget onDraw","isMoveing isNext:" + isNext + " isRuning:" + isRuning); // Log.e("pagewidget onDraw","isMoveing isNext:" + isNext + " isRuning:" + isRuning);
if (isRuning) { if (isRuning) {
mAnimationProvider.drawMove(canvas); mAnimationProvider.drawMove(canvas);
} else { } else {
@ -196,7 +196,7 @@ int mPageMode =0;
int x = (int)event.getX(); int x = (int)event.getX();
int y = (int)event.getY(); int y = (int)event.getY();
Log.d(TAG, String.format("onTouchEvent: x %s,y %s ",x,y)); // Log.d(TAG, String.format("onTouchEvent: x %s,y %s ",x,y));
mAnimationProvider.setTouchPoint(x,y); mAnimationProvider.setTouchPoint(x,y);
if (event.getAction() == MotionEvent.ACTION_DOWN){ //mAnimationProvider.setCancel(false); https://github.com/PeachBlossom/treader/issues/4 if (event.getAction() == MotionEvent.ACTION_DOWN){ //mAnimationProvider.setCancel(false); https://github.com/PeachBlossom/treader/issues/4
downX = (int) event.getX(); downX = (int) event.getX();
@ -219,7 +219,7 @@ int mPageMode =0;
if (!isMove) { if (!isMove) {
isMove = Math.abs(downX - x) > slop || Math.abs(downY - y) > slop; isMove = Math.abs(downX - x) > slop || Math.abs(downY - y) > slop;
} }
Log.d(TAG, String.format("onTouchEvent:ACTION_MOVE isMove %s, isbusy %s",isMove,PageFactory.busy())); // Log.d(TAG, String.format("onTouchEvent:ACTION_MOVE isMove %s, isbusy %s",isMove,PageFactory.busy()));
if(!PageFactory.busy()) if(!PageFactory.busy())
if (isMove){ if (isMove){
isMove = true; isMove = true;
@ -291,7 +291,7 @@ int mPageMode =0;
} }
}else if (event.getAction() == MotionEvent.ACTION_UP){ }else if (event.getAction() == MotionEvent.ACTION_UP){
//Log.e(TAG,"ACTION_UP"); //Log.e(TAG,"ACTION_UP");
Log.d(TAG, String.format("onTouchEvent:ACTION_UP isMove %s, isbusy %s",isMove,PageFactory.busy())); // Log.d(TAG, String.format("onTouchEvent:ACTION_UP isMove %s, isbusy %s",isMove,PageFactory.busy()));
if (!isMove || PageFactory.busy()){ if (!isMove || PageFactory.busy()){
cancelPage = false; cancelPage = false;
//是否点击了中间 //是否点击了中间
@ -337,7 +337,7 @@ int mPageMode =0;
if (!noNext) { if (!noNext) {
isRuning = true; isRuning = true;
Log.d(TAG, "onTouchEvent: startanimation"); // Log.d(TAG, "onTouchEvent: startanimation");
mAnimationProvider.startAnimation(mScroller); mAnimationProvider.startAnimation(mScroller);
mTouchListener.showAdAfterIni(); mTouchListener.showAdAfterIni();
this.postInvalidate(); this.postInvalidate();

View File

@ -87,7 +87,7 @@ public class SimulationAnimation extends AnimationProvider {
@Override @Override
public void drawMove(Canvas canvas) { public void drawMove(Canvas canvas) {
Log.d(TAG, "isMoveing drawMove: "); // Log.d(TAG, "isMoveing drawMove: ");
if (getDirection().equals(Direction.next)) { if (getDirection().equals(Direction.next)) {
calcPoints(); calcPoints();
drawCurrentPageArea(canvas, mCurPageBitmap, mPath0); drawCurrentPageArea(canvas, mCurPageBitmap, mPath0);

View File

@ -38,7 +38,7 @@
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
android:layout_margin="16dp" android:layout_margin="16dp"
android:layout_marginTop="20dp" android:layout_marginTop="30dp"
android:background="@drawable/background_circle" android:background="@drawable/background_circle"
android:gravity="center" android:gravity="center"
android:text="@string/click_to_skip" android:text="@string/click_to_skip"

View File

@ -14,57 +14,57 @@
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"> android:orientation="vertical">
<!-- <LinearLayout <!-- <LinearLayout
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_gravity="bottom"
android:layout_weight="0"
android:orientation="horizontal"
android:visibility="gone">
<TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="50dp"
android:layout_weight="1" /> android:layout_gravity="bottom"
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0" android:layout_weight="0"
android:background="@drawable/item_selector" android:orientation="horizontal"
android:drawableLeft="@drawable/ic_mood_black_24dp" android:visibility="gone">
android:paddingLeft="5dp"
android:text="推荐"
/> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
<Button <Button
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="match_parent" android:layout_height="match_parent"
android:layout_marginLeft="20dp" android:layout_weight="0"
android:layout_marginRight="20dp" android:background="@drawable/item_selector"
android:layout_weight="0" android:drawableLeft="@drawable/ic_mood_black_24dp"
android:background="@drawable/item_selector" android:paddingLeft="5dp"
android:drawableLeft="@drawable/ic_toys_black_24dp" android:text="推荐"
android:paddingLeft="5dp"
android:text="分享" />
<Button />
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0"
android:background="@drawable/item_selector"
android:drawableLeft="@drawable/ic_sentiment_very_satisfied_black_24dp"
android:paddingLeft="5dp"
android:text="报错" />
<TextView <Button
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:layout_weight="1" /> android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_weight="0"
android:background="@drawable/item_selector"
android:drawableLeft="@drawable/ic_toys_black_24dp"
android:paddingLeft="5dp"
android:text="分享" />
<Button
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="0"
android:background="@drawable/item_selector"
android:drawableLeft="@drawable/ic_sentiment_very_satisfied_black_24dp"
android:paddingLeft="5dp"
android:text="报错" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" />
</LinearLayout>--> </LinearLayout>-->
<LinearLayout style="@style/llGraySplit" /> <LinearLayout style="@style/llGraySplit" />
@ -98,32 +98,32 @@
android:text="简介" /> android:text="简介" />
</LinearLayout> </LinearLayout>
<com.timqi.collapsibletextview.CollapsibleTextView
xmlns:app="http://schemas.android.com/apk/res-auto" <com.timqi.collapsibletextview.CollapsibleTextView xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/txtDesc2" android:id="@+id/txtDesc2"
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:padding="5dp"
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"
android:padding="5dp"
app:collapsedLines="3" app:collapsedLines="3"
app:collapsedText=" 》》》" app:collapsedText=" 》》》"
app:expandedText=" 《《《" app:expandedText=" 《《《"
app:suffixColor="@color/colorPrimary" app:suffixColor="@color/colorPrimary"
app:suffixTrigger="true" app:suffixTrigger="true"
/> />
<TextView <TextView
android:visibility="gone"
android:id="@+id/txtDesc22" android:id="@+id/txtDesc22"
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="20dp" android:layout_marginLeft="20dp"
android:text="一句话概括了书单的内容" /> android:text="一句话概括了书单的内容"
android:visibility="gone" />
</LinearLayout> </LinearLayout>
<LinearLayout style="@style/llGraySplit" /> <LinearLayout style="@style/llGraySplit" />
<LinearLayout <LinearLayout
@ -131,25 +131,23 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout <LinearLayout
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="horizontal" android:orientation="horizontal"
android:visibility="visible" android:visibility="visible">
>
<TextView <TextView
android:layout_width="5dp" android:layout_width="5dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="@color/colorAccent" android:background="@color/colorAccent"
android:visibility="gone" android:visibility="gone" />
/>
<TextView <TextView
style="@style/TextViewTitle" style="@style/TextViewTitle"
android:layout_marginTop="5dp"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text="目录" /> android:text="目录" />
</LinearLayout> </LinearLayout>
@ -164,28 +162,29 @@
android:orientation="horizontal"> android:orientation="horizontal">
<ImageView <ImageView
android:layout_width="25dp" android:layout_width="25dp"
android:layout_height="25dp" android:layout_height="25dp"
android:layout_gravity="center" android:layout_gravity="center"
android:layout_weight="0" android:layout_marginRight="5dp"
android:layout_marginRight="5dp" android:layout_weight="0"
android:src="@mipmap/directory" /> android:src="@mipmap/directory" />
<TextView <TextView
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:layout_width="20dp" android:layout_width="20dp"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="目录"
android:textSize="11sp" android:textSize="11sp"
android:visibility="gone" android:visibility="gone" />
android:text="目录" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
> android:layout_weight="1"
android:orientation="vertical">
<TextView <TextView
android:id="@+id/txtLatestUpdate" android:id="@+id/txtLatestUpdate"
style="@style/TextViewDesc.small" style="@style/TextViewDesc.small"
@ -194,12 +193,13 @@
android:text="" android:text=""
/> />
<TextView <TextView
android:layout_marginTop="2dp"
android:id="@+id/txtLatestCate" android:id="@+id/txtLatestCate"
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginTop="2dp"
android:text="" android:text=""
/> />
@ -209,91 +209,95 @@
</LinearLayout> </LinearLayout>
<!--
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<!-- <LinearLayout
<LinearLayout android:layout_width="match_parent"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:layout_height="wrap_content" android:orientation="horizontal">
android:orientation="vertical">
<LinearLayout <TextView
android:layout_width="match_parent" style="@style/TextViewTitle"
android:layout_height="wrap_content" android:layout_width="match_parent"
android:orientation="horizontal"> android:layout_height="wrap_content"
android:layout_weight="1"
android:text="书友评论" />
<TextView <TextView
style="@style/TextViewTitle" style="@style/TextViewDesc"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_gravity="right"
android:text="书友评论" /> android:layout_weight="0"
android:gravity="right"
android:text="写评论" />
</LinearLayout>
<TextView <TextView
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:layout_width="wrap_content" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="right" android:layout_weight="1"
android:layout_weight="0" android:text=" 评论1 " />
android:gravity="right"
android:text="写评论" />
</LinearLayout>
<TextView <TextView
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text=" 评论1 " /> android:text=" 评论2 " />
<TextView <TextView
style="@style/TextViewDesc" style="@style/TextViewDesc"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:layout_weight="1"
android:text=" 评论2 " /> android:text=" 评论3 " />
</LinearLayout>
<TextView <LinearLayout style="@style/llGraySplit" />
style="@style/TextViewDesc" -->
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text=" 评论3 " />
</LinearLayout>
<LinearLayout style="@style/llGraySplit" />
-->
<LinearLayout <LinearLayout
android:id="@+id/ll_others" android:id="@+id/ll_others"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:orientation="vertical"> android:orientation="vertical">
<LinearLayout style="@style/llGraySplit" /> <LinearLayout style="@style/llGraySplit" />
<TextView <TextView
android:id="@+id/tvAuthorMore" android:id="@+id/tvAuthorMore"
style="@style/NovelBlockTitle" style="@style/NovelBlockTitle"
android:layout_marginBottom="5dp" android:layout_marginTop="5dp"
android:layout_marginTop="5dp" android:layout_marginBottom="5dp"
android:layout_weight="1" android:layout_weight="1"
android:text=" 其他作品" /> android:text=" 其他作品" />
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:id="@+id/rvBooklist" android:id="@+id/rvBooklist"
android:divider="#ffff0000" android:layout_width="match_parent"
android:dividerHeight="10dp" android:layout_height="match_parent"
android:layout_width="match_parent" android:divider="#ffff0000"
android:layout_height="match_parent" android:dividerHeight="10dp"
android:nestedScrollingEnabled="false" android:nestedScrollingEnabled="false"
android:paddingBottom="2dp" android:paddingBottom="2dp" />
/>
<FrameLayout
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp"
style="@style/frmBannerContainer"
android:layout_height="@dimen/nativeBannerHeight"
android:id="@+id/banner_container"/>
</LinearLayout> </LinearLayout>
<FrameLayout
android:id="@+id/banner_container"
style="@style/frmBannerContainer"
android:layout_height="@dimen/nativeBannerHeight"
android:layout_marginTop="1dp"
android:layout_marginBottom="1dp" />
<LinearLayout style="@style/llGraySplit" /> <LinearLayout style="@style/llGraySplit" />
<LinearLayout <LinearLayout
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
@ -303,22 +307,22 @@
<TextView <TextView
android:id="@+id/tvTonglei" android:id="@+id/tvTonglei"
style="@style/NovelBlockTitle" style="@style/NovelBlockTitle"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp" android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:layout_weight="1" android:layout_weight="1"
android:text="同类推荐" /> android:text="同类推荐" />
<android.support.v7.widget.RecyclerView <android.support.v7.widget.RecyclerView
android:id="@+id/rvBooklistRelated" android:id="@+id/rvBooklistRelated"
android:divider="#ffff0000"
android:dividerHeight="10dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:divider="#ffff0000"
android:dividerHeight="10dp"
android:nestedScrollingEnabled="false" android:nestedScrollingEnabled="false"
android:paddingBottom="50dp" android:paddingBottom="50dp" />
/>
</LinearLayout> </LinearLayout>
<LinearLayout style="@style/llGraySplit" /> <LinearLayout style="@style/llGraySplit" />
</LinearLayout> </LinearLayout>

View File

@ -8,81 +8,39 @@
</facet> </facet>
<facet type="android" name="Android"> <facet type="android" name="Android">
<configuration> <configuration>
<option name="SELECTED_BUILD_VARIANT" value="gDebug" /> <option name="SELECTED_BUILD_VARIANT" value="debug" />
<option name="ASSEMBLE_TASK_NAME" value="assembleGDebug" /> <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
<option name="COMPILE_JAVA_TASK_NAME" value="compileGDebugSources" /> <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
<afterSyncTasks> <afterSyncTasks>
<task>generateGDebugSources</task> <task>generateDebugSources</task>
</afterSyncTasks> </afterSyncTasks>
<option name="ALLOW_USER_CONFIGURATION" value="false" /> <option name="ALLOW_USER_CONFIGURATION" value="false" />
<option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" /> <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
<option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" /> <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res" />
<option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/src/debug/res;file://$MODULE_DIR$/build/generated/res/resValues/g/debug" /> <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/src/debug/res;file://$MODULE_DIR$/build/generated/res/resValues/debug" />
<option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" /> <option name="TEST_RES_FOLDERS_RELATIVE_PATH" value="" />
<option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" /> <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
</configuration> </configuration>
</facet> </facet>
</component> </component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8"> <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/build/intermediates/javac/gDebug/compileGDebugJavaWithJavac/classes" /> <output url="file://$MODULE_DIR$/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes" />
<output-test url="file://$MODULE_DIR$/build/intermediates/javac/gDebugUnitTest/compileGDebugUnitTestJavaWithJavac/classes" /> <output-test url="file://$MODULE_DIR$/build/intermediates/javac/debugUnitTest/compileDebugUnitTestJavaWithJavac/classes" />
<exclude-output /> <exclude-output />
<content url="file://$MODULE_DIR$"> <content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/g/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/gDebug/compileGDebugAidl/out" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debug/compileDebugAidl/out" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/g/debug" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/gDebug/compileGDebugRenderscript/out" isTestSource="false" generated="true" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debug/compileDebugRenderscript/out" isTestSource="false" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/g/debug" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/g/debug" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/res" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/debugAndroidTest/compileDebugAndroidTestAidl/out" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/aidl" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/debugAndroidTest/compileDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/rs" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/gDebug/shaders" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/g/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/aidl_source_output_dir/gDebugAndroidTest/compileGDebugAndroidTestAidl/out" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/g/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/renderscript_source_output_dir/gDebugAndroidTest/compileGDebugAndroidTestRenderscript/out" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/g/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/g/debug" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestGDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/test/g/debug" isTestSource="true" generated="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testGDebug/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/g/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/g/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/g/assets" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/g/aidl" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/g/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/g/rs" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/g/shaders" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/androidTestG/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/res" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/resources" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/assets" type="java-test-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/aidl" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/java" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/rs" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/testG/shaders" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" /> <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
@ -130,17 +88,25 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotation_processor_list" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/annotation_processor_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/apk_list" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/apk_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/build-info" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundle_manifest" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/bundle_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/check_manifest_result" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/check_manifest_result" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/compatible_screen_manifest" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/compatible_screen_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/duplicate_classes_check" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/duplicate_classes_check" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-apk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_app_manifest" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_app_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_app_info_output_file" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_main_apk_resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_merged_manifests" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_merged_manifests" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant_run_split_apk_resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/javac" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_aapt_derived_proguard_rules" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_aapt_derived_proguard_rules" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_main_dex_list" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/legacy_multidex_main_dex_list" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged-not-compiled-resources" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifest-checker" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_jni_libs" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_jni_libs" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/merged_manifests" />
@ -148,17 +114,16 @@
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/metadata_feature_manifest" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/metadata_feature_manifest" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/prebuild" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/processed_res" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/processed_res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-files" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/proguard-rules" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/res_stripped" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/resources" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shader_assets" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/signing_config" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/signing_config" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/split-apk" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
<excludeFolder url="file://$MODULE_DIR$/build/intermediates/validate_signing_config" /> <excludeFolder url="file://$MODULE_DIR$/build/intermediates/validate_signing_config" />
<excludeFolder url="file://$MODULE_DIR$/build/outputs" /> <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
<excludeFolder url="file://$MODULE_DIR$/build/reports" />
<excludeFolder url="file://$MODULE_DIR$/build/tmp" /> <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
</content> </content>
<orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" /> <orderEntry type="jdk" jdkName="Android API 28 Platform" jdkType="Android SDK" />