From fa457017ba4873a3c59ca02c8954d39360238a2d Mon Sep 17 00:00:00 2001 From: liao_mac <676528854@qq.com> Date: Mon, 14 Jan 2019 16:52:32 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0web=E7=AB=AF=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E6=9C=AC=E5=9C=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .idea/.name | 1 - .idea/misc.xml | 13 +- .idea/modules.xml | 1 + app/src/main/assets/uploader/index.html | 93 +++++++---- .../main/assets/uploader/scripts/transfer.js | 108 +++++++------ .../com/justwayward/reader/base/Constant.java | 2 + .../reader/bean/user/HtmlBook.java | 41 +++++ .../reader/manager/CacheManager.java | 1 + .../reader/service/DownloadBookService.java | 19 ++- .../reader/ui/activity/ReadActivity.java | 12 +- .../reader/ui/activity/WifiBookActivity.java | 17 +- .../reader/ui/contract/BookReadContract.java | 8 + .../ui/presenter/BookReadPresenter.java | 45 ++++++ .../justwayward/reader/utils/FileUtils.java | 35 +++++ .../reader/wifitransfer/NanoHTTPD.java | 145 ++++++++++++++++-- .../reader/wifitransfer/ServerRunner.java | 7 +- .../reader/wifitransfer/SimpleFileServer.java | 78 +++++++++- .../main/res/drawable/seekbar_battery_bg.xml | 4 +- .../res/drawable/seekbar_battery_night_bg.xml | 4 +- app/src/main/res/layout/activity_read.xml | 1 + app/src/main/res/values/colors.xml | 1 + app/src/main/res/values/strings.xml | 1 + 23 files changed, 520 insertions(+), 118 deletions(-) delete mode 100644 .idea/.name create mode 100644 app/src/main/java/com/justwayward/reader/bean/user/HtmlBook.java diff --git a/.gitignore b/.gitignore index 8e611405..6b51b93b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ /build /captures /gradle.properties +.idea diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index a34e0c5e..00000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -BookReader \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index d6c55f09..5c1c2efd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,7 +1,6 @@ - @@ -31,17 +30,7 @@ - - - - - - - - - - - + diff --git a/.idea/modules.xml b/.idea/modules.xml index 645babb9..319e5fe9 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -3,6 +3,7 @@ + diff --git a/app/src/main/assets/uploader/index.html b/app/src/main/assets/uploader/index.html index 0db83d41..f35e68fb 100644 --- a/app/src/main/assets/uploader/index.html +++ b/app/src/main/assets/uploader/index.html @@ -1,6 +1,6 @@ - + WiFi 传书 @@ -9,46 +9,73 @@ - - -
-
+ + +
+
- -
+
+
+ diff --git a/app/src/main/assets/uploader/scripts/transfer.js b/app/src/main/assets/uploader/scripts/transfer.js index 40a0ebef..c4a8b676 100644 --- a/app/src/main/assets/uploader/scripts/transfer.js +++ b/app/src/main/assets/uploader/scripts/transfer.js @@ -1,4 +1,4 @@ -$(function() { +$(function () { var isDragOver = false; var files = []; @@ -24,16 +24,16 @@ $(function() { if (!confirm(STRINGS.CONFIRM_DELETE_BOOK)) { return; } - var $node = $(_event.currentTarget); + var $node = $(_event.currentTarget); var fileName = $node.siblings(':first').text(); var deleteUrl = "delete_file"; var fileInfoContainer = $node.parent(); - fileInfoContainer.css({ 'color':'#fff', 'background-color': '#cb4638' }); + fileInfoContainer.css({'color': '#fff', 'background-color': '#cb4638'}); fileInfoContainer.find('.trash').removeClass('trash').unbind(); fileInfoContainer.find('.download').removeClass('download').unbind(); - $.post(deleteUrl, { '_method' : 'delete', 'file_name': fileName }, function() { - setTimeout(function() { - fileInfoContainer.slideUp('fast', function() { + $.post(deleteUrl, {'_method': 'delete', 'file_name': fileName}, function () { + setTimeout(function () { + fileInfoContainer.slideUp('fast', function () { fileInfoContainer.remove(); }); }, 300); @@ -41,21 +41,31 @@ $(function() { } function downloadBook(_event) { - var $node = $(_event.currentTarget); - var fileName = $node.siblings(':first').text(); - var url = "files/" + fileName; + var $node = $(_event.currentTarget).siblings(':first'); + var bookid = $node.attr('bookid'); + var fileName = encodeURI(encodeURI($node.text())) ; + //.text();// + var url = "files/" + bookid + ".txt?name=" + fileName ; window.location = url; } function loadFileList() { var now = new Date(); var url = "files?"; - $.get(url + now.getTime(), function(data) { - files = data; + $.getJSON(url + "time=" + now.getTime(), function (json) { + // JSON.parse(json,function (data) { + // files = data; + // fillFilesContainer(); + // }); + files = json; fillFilesContainer(); - //$(".download").click(downloadBook); - //$(".trash").click(deleteBook); - }); + }) + // $.get(url +"time=" + now.getTime(), function(data) { + // files = data; + // fillFilesContainer(); + // //$(".download").click(downloadBook); + // //$(".trash").click(deleteBook); + // }); } function fillFilesContainer() { @@ -65,13 +75,13 @@ $(function() { //filesContainer.height(height); var rowsCount = Math.floor(height / 40); - for (var i = 0; i < files.length;i ++) { + for (var i = 0; i < files.length; i++) { var row = $('
'); var fileInfo = files[i]; - row.append('
' + fileInfo.name +'
'); + row.append('
' + fileInfo.name + '
'); row.append('
' + fileInfo.size + '
'); - row.append('
'); - row.append('
'); + row.append('
'); + row.append('
'); filesContainer.append(row); } @@ -81,9 +91,9 @@ $(function() { function getUploadProgress() { var time = new Date().getTime(); var url = 'progress/' + encodeURI(currentFileName) + '?' + time; - $.getJSON(url, function(data) { + $.getJSON(url, function (data) { if (!data) { - getProgressReties ++ + getProgressReties++ if (getProgressReties < 5) { setTimeout(getUploadProgress, 500); return; @@ -99,7 +109,7 @@ $(function() { var elePrecent = eleSize.next() elePrecent.text(Math.round(data.progress * 100) + "%"); var eleProgress = ele.prev(); - eleProgress.animate({ width:Math.round(483 * data.progress) }, 280); + eleProgress.animate({width: Math.round(483 * data.progress)}, 280); if (data.progress < 1) { setTimeout(getUploadProgress, 300); @@ -121,25 +131,25 @@ $(function() { var arr = fileName.split("\\"); fileName = arr[arr.length - 1]; - currentQueueIndex ++; + currentQueueIndex++; var row = $("#right .file [filename='" + escape(fileName) + "']").parent(); alert(fileName) - $.post( "/send_file_name", {"filename": fileName}, function() { + $.post("/send_file_name", {"filename": fileName}, function () { $.ajaxFileUpload({ - url:'files', - secureuri:false, - fileElementId:eleFileId, + url: 'files', + secureuri: false, + fileElementId: eleFileId, dataType: 'text', success: function (data, status) { row.removeClass('progress_wrapper'); row.find('.progress').remove(); row.find('.precent').text('').remove(); - $('
') + $('
') //.click(downloadBook) .appendTo(row); - $('
') + $('
') //.click(deleteBook) .appendTo(row); isUploading = false; @@ -199,7 +209,7 @@ $(function() { for (var i = 0; i < files.length; ++i) { if (!checkFileName(files[i].name || files[i].fileName)) { uploader.add(files[i]); - actualFiles ++; + actualFiles++; } } if (totalFiles != actualFiles) { @@ -210,7 +220,7 @@ $(function() { function bindAjaxUpload(fileSelector) { $(fileSelector).unbind(); - $(fileSelector).change(function() { + $(fileSelector).change(function () { if (this.files) { uploadFiles(this.files) //优先使用HTML5上传方式 @@ -230,23 +240,31 @@ $(function() { var row = $('
'); row.append('
'); - row.append('
' + fileName +'
'); + row.append('
' + fileName + '
'); row.append('
-
'); row.append('
0%
'); $("#right .files").prepend(row); uploadQueue.push(fileSelector); - $(fileSelector).css({ top: '-9999px', left: '-9999px' }); + $(fileSelector).css({top: '-9999px', left: '-9999px'}); $('.file_upload_warper').append(''); bindAjaxUpload('#newfile_' + uploadQueue.length); startAjaxUpload(); }); $(fileSelector) - .mouseover(function() { $('#upload_button').removeClass('normal').addClass('pressed'); }) - .mouseout(function() { $('#upload_button').removeClass('pressed').addClass('normal'); }) - .mousedown(function() { $('#upload_button').removeClass('normal').addClass('pressed'); }) - .mouseup(function() { $('#upload_button').removeClass('pressed').addClass('normal'); }); + .mouseover(function () { + $('#upload_button').removeClass('normal').addClass('pressed'); + }) + .mouseout(function () { + $('#upload_button').removeClass('pressed').addClass('normal'); + }) + .mousedown(function () { + $('#upload_button').removeClass('normal').addClass('pressed'); + }) + .mouseup(function () { + $('#upload_button').removeClass('pressed').addClass('normal'); + }); // if (typeof(Worker) !== "undefined") { // $(fileSelector) // .mouseover(function() { $('#upload_button').removeClass('normal').addClass('pressed'); }) @@ -264,7 +282,7 @@ $(function() { function formatFileSize(value) { var multiplyFactor = 0; - var tokens = ["bytes","KB","MB","GB","TB"]; + var tokens = ["bytes", "KB", "MB", "GB", "TB"]; while (value > 1024) { value /= 1024; @@ -297,10 +315,10 @@ $(function() { var size = item.getSize(); var row = $('
'); row.append('
'); - row.append('
' + fileName +'
'); - row.append('
' + formatFileSize(size) +'
'); + row.append('
' + fileName + '
'); + row.append('
' + formatFileSize(size) + '
'); row.append('
0%
'); - $('
') + $('
') .click(cancelUpload) .appendTo(row); $("#right .files").prepend(row); @@ -323,10 +341,10 @@ $(function() { row.find('.progress').remove(); row.find('.precent').text('').remove(); row.find('.trash_white').remove(); - $('
') + $('
') //.click(downloadBook) .appendTo(row); - $('
') + $('
') //.click(deleteBook) .appendTo(row); }, @@ -407,7 +425,7 @@ $(function() { // $('
' + STRINGS.SELECT_BUTTON_LABLE + '
').prependTo("#upload_button") } - $(document).ready(function() { + $(document).ready(function () { // events delegate $('.files').on('click', '.trash', deleteBook); $('.files').on('click', '.download', downloadBook); @@ -415,7 +433,7 @@ $(function() { initPageStrings(); fillFilesContainer(); loadFileList(); - $(window).resize(function() { + $(window).resize(function () { fillFilesContainer(); }); bindAjaxUpload('#newfile_0'); @@ -426,7 +444,7 @@ $(function() { showHtml4View(); } - $(document).ajaxError(function(event, request, settings){ + $(document).ajaxError(function (event, request, settings) { alert(STRINGS.CANNOT_CONNECT_SERVER); }); }); diff --git a/app/src/main/java/com/justwayward/reader/base/Constant.java b/app/src/main/java/com/justwayward/reader/base/Constant.java index b305dfd3..7c8cbf98 100644 --- a/app/src/main/java/com/justwayward/reader/base/Constant.java +++ b/app/src/main/java/com/justwayward/reader/base/Constant.java @@ -49,6 +49,8 @@ public class Constant { public static String PATH_CHM = PATH_DATA + "/chm"; + + public static String BASE_PATH = AppUtils.getAppContext().getCacheDir().getPath(); public static final String ISNIGHT = "isNight"; diff --git a/app/src/main/java/com/justwayward/reader/bean/user/HtmlBook.java b/app/src/main/java/com/justwayward/reader/bean/user/HtmlBook.java new file mode 100644 index 00000000..93b16bbf --- /dev/null +++ b/app/src/main/java/com/justwayward/reader/bean/user/HtmlBook.java @@ -0,0 +1,41 @@ +package com.justwayward.reader.bean.user; + +public class HtmlBook { + + private String name; + private String bookid; + private String size; + + public HtmlBook() { + } + + public HtmlBook(String name, String bookid, String size) { + this.name = name; + this.size = size; + this.bookid = bookid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSize() { + return size; + } + + public void setSize(String size) { + this.size = size; + } + + public String getBookid() { + return bookid; + } + + public void setBookid(String bookid) { + this.bookid = bookid; + } +} diff --git a/app/src/main/java/com/justwayward/reader/manager/CacheManager.java b/app/src/main/java/com/justwayward/reader/manager/CacheManager.java index db1a9528..f3289868 100644 --- a/app/src/main/java/com/justwayward/reader/manager/CacheManager.java +++ b/app/src/main/java/com/justwayward/reader/manager/CacheManager.java @@ -17,6 +17,7 @@ import android.content.Context; import android.text.TextUtils; +import android.util.Log; import com.justwayward.reader.ReaderApplication; import com.justwayward.reader.base.Constant; diff --git a/app/src/main/java/com/justwayward/reader/service/DownloadBookService.java b/app/src/main/java/com/justwayward/reader/service/DownloadBookService.java index 02fc5b8b..71b0e182 100644 --- a/app/src/main/java/com/justwayward/reader/service/DownloadBookService.java +++ b/app/src/main/java/com/justwayward/reader/service/DownloadBookService.java @@ -19,8 +19,10 @@ import android.content.Intent; import android.os.AsyncTask; import android.os.IBinder; +import android.support.annotation.MainThread; import android.support.annotation.Nullable; import android.text.TextUtils; +import android.util.Log; import com.justwayward.reader.R; import com.justwayward.reader.ReaderApplication; @@ -34,6 +36,7 @@ import com.justwayward.reader.bean.support.DownloadQueue; import com.justwayward.reader.manager.CacheManager; import com.justwayward.reader.utils.AppUtils; +import com.justwayward.reader.utils.FileUtils; import com.justwayward.reader.utils.LogUtils; import com.justwayward.reader.utils.NetworkUtils; @@ -41,12 +44,22 @@ import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import java.io.File; import java.util.ArrayList; import java.util.List; +import rx.Observable; import rx.Observer; +import rx.Single; +import rx.SingleSubscriber; +import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Action1; +import rx.functions.Action2; +import rx.functions.Func0; +import rx.internal.util.ObserverSubscriber; +import rx.observables.SyncOnSubscribe; import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; @@ -70,7 +83,7 @@ public void onCreate() { super.onCreate(); EventBus.getDefault().register(this); LoggingInterceptor logging = new LoggingInterceptor(new Logger()); - logging.setLevel(LoggingInterceptor.Level.BODY); + logging.setLevel(LoggingInterceptor.Level.BASIC); bookApi = ReaderApplication.getsInstance().getAppComponent().getReaderApi(); } @@ -129,10 +142,12 @@ public synchronized void addToDownloadQueue(DownloadQueue queue) { // 从队列顺序取出第一条下载 if (downloadQueues.size() > 0 && !isBusy) { isBusy = true; - downloadBook(downloadQueues.get(0)); + DownloadQueue downloadQueue = downloadQueues.get(0); + downloadBook(downloadQueue); } } + public synchronized void downloadBook(final DownloadQueue downloadQueue) { AsyncTask downloadTask = new AsyncTask() { diff --git a/app/src/main/java/com/justwayward/reader/ui/activity/ReadActivity.java b/app/src/main/java/com/justwayward/reader/ui/activity/ReadActivity.java index 9a08756a..8ea1d349 100644 --- a/app/src/main/java/com/justwayward/reader/ui/activity/ReadActivity.java +++ b/app/src/main/java/com/justwayward/reader/ui/activity/ReadActivity.java @@ -414,7 +414,6 @@ private void initPagerWidget() { public void showBookToc(List list) { mChapterList.clear(); mChapterList.addAll(list); - readCurrentChapter(); } @@ -429,6 +428,15 @@ public void readCurrentChapter() { } } + + public void merginAllChapterToFile(){ + mPresenter.merginAllBook(recommendBooks,mChapterList); + } + + + + + @Override public synchronized void showChapterRead(ChapterRead.Chapter data, int chapter) { // 加载章节内容 if (data != null) { @@ -502,6 +510,8 @@ public void readBook() { ToastUtils.showToast("正在拼命开发中..."); } + + @OnClick(R.id.tvBookReadCommunity) public void onClickCommunity() { gone(rlReadAaSet, rlReadMark); diff --git a/app/src/main/java/com/justwayward/reader/ui/activity/WifiBookActivity.java b/app/src/main/java/com/justwayward/reader/ui/activity/WifiBookActivity.java index 759b94ad..1459ba3c 100644 --- a/app/src/main/java/com/justwayward/reader/ui/activity/WifiBookActivity.java +++ b/app/src/main/java/com/justwayward/reader/ui/activity/WifiBookActivity.java @@ -24,13 +24,22 @@ import android.widget.TextView; import com.justwayward.reader.R; +import com.justwayward.reader.api.BookApi; import com.justwayward.reader.base.BaseActivity; +import com.justwayward.reader.bean.BookMixAToc; +import com.justwayward.reader.bean.ChapterRead; import com.justwayward.reader.component.AppComponent; import com.justwayward.reader.component.DaggerMainComponent; +import com.justwayward.reader.ui.contract.BookReadContract; +import com.justwayward.reader.ui.presenter.BookReadPresenter; import com.justwayward.reader.utils.NetworkUtils; import com.justwayward.reader.wifitransfer.Defaults; import com.justwayward.reader.wifitransfer.ServerRunner; +import java.util.List; + +import javax.inject.Inject; + import butterknife.Bind; import butterknife.OnClick; @@ -51,6 +60,9 @@ public static void startActivity(Context context) { @Bind(R.id.tvRetry) TextView tvRetry; + @Inject + BookApi mBookApi; + @Override public int getLayoutId() { return R.layout.activity_wifi_book; @@ -84,13 +96,14 @@ public void initDatas() { tvRetry.setVisibility(View.GONE); mTvWifiIp.setText("http://" + NetworkUtils.getConnectWifiIp(mContext) + ":" + Defaults.getPort()); // 启动wifi传书服务器 - ServerRunner.startServer(); + ServerRunner.startServer(mBookApi); } else { mTvWifiIp.setText("请开启Wifi并重试"); tvRetry.setVisibility(View.VISIBLE); } } + @Override public void configViews() { @@ -129,4 +142,6 @@ protected void onDestroy() { super.onDestroy(); ServerRunner.stopServer(); } + + } diff --git a/app/src/main/java/com/justwayward/reader/ui/contract/BookReadContract.java b/app/src/main/java/com/justwayward/reader/ui/contract/BookReadContract.java index 75d113e5..46536e97 100644 --- a/app/src/main/java/com/justwayward/reader/ui/contract/BookReadContract.java +++ b/app/src/main/java/com/justwayward/reader/ui/contract/BookReadContract.java @@ -18,6 +18,7 @@ import com.justwayward.reader.base.BaseContract; import com.justwayward.reader.bean.BookMixAToc; import com.justwayward.reader.bean.ChapterRead; +import com.justwayward.reader.bean.Recommend; import java.util.List; @@ -39,6 +40,13 @@ interface Presenter extends BaseContract.BasePresenter { void getBookMixAToc(String bookId, String view); void getChapterRead(String url, int chapter); + + /** + * 合成所有的文件为一个整个text + * @param recommendBooks + * @param list + */ + void merginAllBook(Recommend.RecommendBooks recommendBooks, List list); } } diff --git a/app/src/main/java/com/justwayward/reader/ui/presenter/BookReadPresenter.java b/app/src/main/java/com/justwayward/reader/ui/presenter/BookReadPresenter.java index a0a31b6d..84acdf4c 100644 --- a/app/src/main/java/com/justwayward/reader/ui/presenter/BookReadPresenter.java +++ b/app/src/main/java/com/justwayward/reader/ui/presenter/BookReadPresenter.java @@ -21,20 +21,27 @@ import com.justwayward.reader.base.RxPresenter; import com.justwayward.reader.bean.BookMixAToc; import com.justwayward.reader.bean.ChapterRead; +import com.justwayward.reader.bean.Recommend; +import com.justwayward.reader.bean.support.DownloadProgress; import com.justwayward.reader.ui.contract.BookReadContract; +import com.justwayward.reader.utils.FileUtils; import com.justwayward.reader.utils.LogUtils; import com.justwayward.reader.utils.RxUtil; import com.justwayward.reader.utils.StringUtils; +import java.io.File; import java.util.List; import javax.inject.Inject; import rx.Observable; import rx.Observer; +import rx.Subscriber; import rx.Subscription; import rx.android.schedulers.AndroidSchedulers; import rx.functions.Func1; +import rx.internal.util.ObserverSubscriber; +import rx.observables.SyncOnSubscribe; import rx.schedulers.Schedulers; /** @@ -117,4 +124,42 @@ public void onError(Throwable e) { }); addSubscrebe(rxSubscription); } + + @Override + public void merginAllBook(Recommend.RecommendBooks recommendBooks, List list) { + + String fileName = recommendBooks.title; +// File file = FileUtils.getMerginBook(fileName + ".txt"); +// Subscription rxSubscription = new ObserverSubscriber +// (){}; + + + Observable.create(new Observable.OnSubscribe() { + @Override + public void call(Subscriber subscriber) { + + } + }).observeOn(AndroidSchedulers.mainThread()) + .subscribeOn(Schedulers.io()) + .subscribe(new Observer() { + @Override + public void onCompleted() { + + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onNext(String o) { + + } + });//); + + +// DownloadProgress progress + + } } \ No newline at end of file diff --git a/app/src/main/java/com/justwayward/reader/utils/FileUtils.java b/app/src/main/java/com/justwayward/reader/utils/FileUtils.java index 9f461eae..7c96cea1 100644 --- a/app/src/main/java/com/justwayward/reader/utils/FileUtils.java +++ b/app/src/main/java/com/justwayward/reader/utils/FileUtils.java @@ -36,6 +36,8 @@ import java.nio.channels.FileChannel; import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; import java.util.Enumeration; import java.util.Iterator; import java.util.List; @@ -63,6 +65,10 @@ public static File getBookDir(String bookId) { return new File(Constant.PATH_TXT + bookId); } + public static String getMerginBook(String bookName) { + return Constant.PATH_TXT + bookName; + } + public static File createWifiTempFile() { String src = Constant.PATH_DATA + "/" + System.currentTimeMillis(); File file = new File(src); @@ -71,6 +77,35 @@ public static File createWifiTempFile() { return file; } + public static File[] getBookDirFiles(String bookId) { + File dir = getBookDir(bookId); + if (dir.exists()) { + File[] files = dir.listFiles(); + try { + Arrays.sort(files, new Comparator() { + @Override + public int compare(File lhs, File rhs) { + Integer lPage = Integer.parseInt(getFileNameNotType(lhs)); + int rPage = Integer.parseInt(getFileNameNotType(rhs)); + return Integer.compare(lPage, rPage); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + return files; + } + return null; + } + + public static String getFileNameNotType(File file) { + String path = file.getPath(); + int separatorIndex = path.lastIndexOf(File.separator); + int lastTypeIndex = path.lastIndexOf("."); + return (separatorIndex < 0) ? path.substring(0, lastTypeIndex) : path.substring(separatorIndex + 1, lastTypeIndex); + } + + /** * 获取Wifi传书保存文件 * diff --git a/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java b/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java index 83f19a4e..d5f72ad1 100644 --- a/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java +++ b/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java @@ -17,10 +17,17 @@ import android.util.Log; +import com.justwayward.reader.api.BookApi; +import com.justwayward.reader.bean.BookMixAToc; +import com.justwayward.reader.bean.ChapterRead; +import com.justwayward.reader.manager.CacheManager; +import com.justwayward.reader.utils.FileUtils; + import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -44,6 +51,9 @@ import java.util.StringTokenizer; import java.util.TimeZone; +import nl.siegmann.epublib.domain.Book; +import rx.Observer; + public abstract class NanoHTTPD { /* * Pseudo-Parameter to use to store the actual query string in the @@ -268,6 +278,10 @@ public interface TempFile { * HTTP response. Return one of these from serve(). */ public static class Response { + private String bookId; + private BookMixAToc.mixToc bookMix; + + private BookApi bookApi; /** * HTTP status code after processing, e.g. "200 OK", HTTP_OK */ @@ -280,6 +294,7 @@ public static class Response { * Data of the response, may be null. */ public InputStream data; + /** * Headers for the HTTP response. Use addHeader() to add lines. */ @@ -315,6 +330,14 @@ public Response(Status status, String mimeType, String txt) { } } + public Response(Status status, String mimeType,String bookId, BookMixAToc.mixToc bookMix, BookApi bookApi) { + this.status = status; + this.mimeType = mimeType; + this.bookId = bookId; + this.bookMix = bookMix; + this.bookApi = bookApi; + } + public static void error(OutputStream outputStream, Status error, String message) { new Response(error, MIME_PLAINTEXT, message).send(outputStream); @@ -361,29 +384,115 @@ private void send(OutputStream outputStream) { pw.print("\r\n"); pw.flush(); - if (data != null) { - int pending = data.available(); // This is to support - // partial sends, see - // serveFile() - int BUFFER_SIZE = 16 * 1024; - byte[] buff = new byte[BUFFER_SIZE]; - while (pending > 0) { - int read = data.read(buff, 0, - ((pending > BUFFER_SIZE) ? BUFFER_SIZE - : pending)); - if (read <= 0) { - break; - } - outputStream.write(buff, 0, read); - pending -= read; - } - } + sendInputData(outputStream,data); +// 上传文件 + witBook(pw,outputStream); outputStream.flush(); outputStream.close(); if (data != null) data.close(); } catch (IOException ioe) { // Couldn't write? No can do. + ioe.printStackTrace(); + } + } + + public void witBook(final PrintWriter pw, OutputStream outputStream){ + if(this.bookMix == null){ + return; + } + final List list = this.bookMix.chapters; + for (int i = 0; i < list.size(); i++) { + final BookMixAToc.mixToc.Chapters character = list.get(i); + final String title = character.title; + File fileIndex = CacheManager.getInstance().getChapterFile(this.bookId, i); + if (fileIndex != null) { + FileInputStream fis = null; + try { + fis = new FileInputStream(fileIndex); + pw.print("\r\n"); + pw.print(title); + pw.print("\r\n"); + pw.flush(); + sendInputData(outputStream,fis); + outputStream.flush(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }finally { + if(fis != null){ + try { + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } else { +// 网络请求前先暂停350ms + try { + Thread.sleep(350); + } catch (InterruptedException e) { + e.printStackTrace(); + } + Log.i("tag_", "onload: " + character.link); +// 开始加载网页数据 + final int finalI = i; + bookApi.getChapterRead(character.link).subscribe(new Observer() { + @Override + public void onCompleted() { +// call(integer, observer); + } + + @Override + public void onError(Throwable e) { + + } + + @Override + public void onNext(ChapterRead chapterRead) { + Log.i("tag_", "onload end: chapterRead -> " + title); + pw.print("\r\n"); + pw.print(title); + pw.print("\r\n"); + pw.print(chapterRead.chapter.body); + pw.flush(); +// 保存当前的文章到本地 + CacheManager.getInstance().saveChapterFile(Response.this.bookId, finalI,chapterRead.chapter); + } + }); + } + } + } + + +// public String getTitle(File file ,int i ,BookMixAToc.mixToc mixToc){ +// if(mixToc != null && mixToc.chapters != null && i < mixToc.chapters.size() ){ +// return mixToc.chapters.get(i).title; +// }else{ +// return "第" + FileUtils.getFileNameNotType(file) + "章"; +// } +// +// } + + private void sendInputData(OutputStream outputStream, InputStream data) throws IOException { + if (data != null) { + int pending = data.available(); // This is to support + // partial sends, see + // serveFile() + int BUFFER_SIZE = 16 * 1024; + byte[] buff = new byte[BUFFER_SIZE]; + while (pending > 0) { + int read = data.read(buff, 0, + ((pending > BUFFER_SIZE) ? BUFFER_SIZE + : pending)); + if (read <= 0) { + break; + } + outputStream.write(buff, 0, read); + pending -= read; + } } } @@ -619,9 +728,11 @@ public void run() { + ioe.getMessage()); throw new InterruptedException(); } catch (Throwable ignored) { + ignored.printStackTrace(); } } catch (InterruptedException ie) { // Thrown by sendError, ignore and exit the thread. + ie.printStackTrace(); } finally { tempFileManager.clear(); } diff --git a/app/src/main/java/com/justwayward/reader/wifitransfer/ServerRunner.java b/app/src/main/java/com/justwayward/reader/wifitransfer/ServerRunner.java index 41173d2f..b3f48f59 100644 --- a/app/src/main/java/com/justwayward/reader/wifitransfer/ServerRunner.java +++ b/app/src/main/java/com/justwayward/reader/wifitransfer/ServerRunner.java @@ -15,6 +15,8 @@ */ package com.justwayward.reader.wifitransfer; +import com.justwayward.reader.api.BookApi; + import java.io.IOException; /** @@ -30,9 +32,11 @@ public class ServerRunner { /** * 启动wifi传书服务 + * @param mBookApi */ - public static void startServer() { + public static SimpleFileServer startServer( BookApi mBookApi) { server = SimpleFileServer.getInstance(); + server.setBookApi(mBookApi); try { if (!serverIsRunning) { server.start(); @@ -41,6 +45,7 @@ public static void startServer() { } catch (IOException e) { e.printStackTrace(); } + return server; } public static void stopServer() { diff --git a/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java b/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java index 75e1a1c7..6645750a 100644 --- a/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java +++ b/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java @@ -17,11 +17,21 @@ import android.text.TextUtils; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.justwayward.reader.ReaderApplication; +import com.justwayward.reader.api.BookApi; +import com.justwayward.reader.bean.BookMixAToc; import com.justwayward.reader.bean.Recommend; +import com.justwayward.reader.bean.user.HtmlBook; import com.justwayward.reader.manager.CollectionsManager; import com.justwayward.reader.manager.EventManager; +import com.justwayward.reader.utils.ACache; import com.justwayward.reader.utils.FileUtils; import com.justwayward.reader.utils.LogUtils; +import com.justwayward.reader.utils.RxUtil; +import com.justwayward.reader.utils.StringUtils; import java.io.ByteArrayInputStream; import java.io.File; @@ -30,8 +40,19 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.Map; +import rx.Observable; +import rx.Observer; +import rx.Subscription; +import rx.android.schedulers.AndroidSchedulers; +import rx.functions.Func1; + /** * Wifi传书 服务端 * @@ -41,6 +62,7 @@ public class SimpleFileServer extends NanoHTTPD { private static SimpleFileServer server; + private BookApi bookApi; public static SimpleFileServer getInstance() { if (server == null) { @@ -69,8 +91,27 @@ public Response serve(String uri, Method method, if (uri.contains("index.html") || uri.equals("/")) { return new Response(Response.Status.OK, "text/html", new String(FileUtils.readAssets("/index.html"))); } else if (uri.startsWith("/files/") && uri.endsWith(".txt")) { + String name = parms.get("name"); + String printName; + try { + printName = URLDecoder.decode(parms.get("name"), "utf-8"); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + printName = "tt"; + } String bookid = uri.substring(7, uri.lastIndexOf(".")); - return new Response(Response.Status.OK, "file", new String(FileUtils.getBytesFromFile(FileUtils.getChapterFile(bookid, 1)))); + LogUtils.d("-->uri= " + uri + ";name:" + printName); + //先加载章节列表 + Response resp = new Response(Response.Status.OK, MIME_DEFAULT_BINARY, bookid, getBookMixAToc(bookid, "chapters"), bookApi); + resp.addHeader("content-disposition", "attachment;filename=" + printName + ".txt");//URLEncoder.encode(name + ".txt", "utf-8")); + return resp; + } else if (uri.startsWith("/files")) { + List collectionList = CollectionsManager.getInstance().getCollectionList(); + List htmlBooks = new ArrayList<>(); + for (Recommend.RecommendBooks recommendBooks : collectionList) { + htmlBooks.add(new HtmlBook(recommendBooks.title, recommendBooks._id, recommendBooks.lastChapter)); + } + return new Response(Response.Status.OK, "text/json", new Gson().toJson(htmlBooks)); } else { // 获取文件类型 String type = Defaults.extensions.get(uri.substring(uri.lastIndexOf(".") + 1)); @@ -147,4 +188,39 @@ private void addToCollection(String fileName) { } //Looper.loop(); } + + + public BookMixAToc.mixToc getBookMixAToc(final String bookId, String viewChapters) { + + final BookMixAToc mixToc = new BookMixAToc(); + final String key = StringUtils.creatAcacheKey("book-toc", bookId, viewChapters); + String json = ACache.get(ReaderApplication.getsInstance()).getAsString(key); + if (json != null) { + return new Gson().fromJson(json, BookMixAToc.mixToc.class); + } else { + bookApi.getBookMixAToc(bookId, viewChapters).subscribe(new Observer() { + @Override + public void onNext(BookMixAToc data) { + mixToc.mixToc = data.mixToc; + ACache.get(ReaderApplication.getsInstance()).put(key, data.mixToc); + } + + @Override + public void onCompleted() { + } + + @Override + public void onError(Throwable e) { + LogUtils.e("onError: " + e); +// mView.netError(0); + } + }); + } + + return mixToc.mixToc; + } + + public void setBookApi(BookApi mBookApi) { + this.bookApi = mBookApi; + } } diff --git a/app/src/main/res/drawable/seekbar_battery_bg.xml b/app/src/main/res/drawable/seekbar_battery_bg.xml index 816a3668..2adda59e 100644 --- a/app/src/main/res/drawable/seekbar_battery_bg.xml +++ b/app/src/main/res/drawable/seekbar_battery_bg.xml @@ -16,8 +16,8 @@ + android:endColor="@color/battery_progress" + android:startColor="@color/battery_progress" /> diff --git a/app/src/main/res/drawable/seekbar_battery_night_bg.xml b/app/src/main/res/drawable/seekbar_battery_night_bg.xml index 27a20328..e8c7f74c 100644 --- a/app/src/main/res/drawable/seekbar_battery_night_bg.xml +++ b/app/src/main/res/drawable/seekbar_battery_night_bg.xml @@ -16,8 +16,8 @@ + android:endColor="@color/battery_progress" + android:startColor="@color/battery_progress" /> diff --git a/app/src/main/res/layout/activity_read.xml b/app/src/main/res/layout/activity_read.xml index 4a5c556e..2d0f8d70 100644 --- a/app/src/main/res/layout/activity_read.xml +++ b/app/src/main/res/layout/activity_read.xml @@ -67,6 +67,7 @@ android:layout_height="wrap_content" android:layout_weight="1.5" /> + #B2DFEE #EEA9B8 #EEA2AD + #bed0cf diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index db92ccbd..fe5ddc91 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -45,6 +45,7 @@ 已移除《%1$s》 + 下载 朗读 社区 换源 From e7e6a562f08ef331d1e707ad12f872fc3011bf24 Mon Sep 17 00:00:00 2001 From: liao_mac <676528854@qq.com> Date: Sat, 4 May 2019 09:01:35 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/assets/uploader/scripts/transfer.js | 21 ++++++++---- .../reader/wifitransfer/NanoHTTPD.java | 33 +++++++++++-------- .../reader/wifitransfer/SimpleFileServer.java | 13 ++++++-- 3 files changed, 45 insertions(+), 22 deletions(-) diff --git a/app/src/main/assets/uploader/scripts/transfer.js b/app/src/main/assets/uploader/scripts/transfer.js index c4a8b676..5efd5a34 100644 --- a/app/src/main/assets/uploader/scripts/transfer.js +++ b/app/src/main/assets/uploader/scripts/transfer.js @@ -41,12 +41,21 @@ $(function () { } function downloadBook(_event) { - var $node = $(_event.currentTarget).siblings(':first'); - var bookid = $node.attr('bookid'); - var fileName = encodeURI(encodeURI($node.text())) ; - //.text();// - var url = "files/" + bookid + ".txt?name=" + fileName ; - window.location = url; + //第一个参数是提示文字,第二个参数是文本框中默认的内容 + var start = prompt("请开始章节",0); + console.log(start) + if(start){ + //输出word的格式 + // alert("已获得:"+word); + + var $node = $(_event.currentTarget).siblings(':first'); + var bookid = $node.attr('bookid'); + var fileName = encodeURI(encodeURI($node.text())) ; + //.text();// + var url = "files/" + bookid + ".txt?name=" + fileName +"&start=" + start; + window.location = url; + } + } function loadFileList() { diff --git a/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java b/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java index d5f72ad1..0578f5d7 100644 --- a/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java +++ b/app/src/main/java/com/justwayward/reader/wifitransfer/NanoHTTPD.java @@ -278,8 +278,8 @@ public interface TempFile { * HTTP response. Return one of these from serve(). */ public static class Response { - private String bookId; - private BookMixAToc.mixToc bookMix; + private String bookId; + private BookMixAToc.mixToc bookMix; private BookApi bookApi; /** @@ -308,6 +308,12 @@ public Response(String msg) { this(Status.OK, MIME_HTML, msg); } + + /** + * start Chapters index + */ + public int start; + /** * Basic constructor. */ @@ -330,12 +336,13 @@ public Response(Status status, String mimeType, String txt) { } } - public Response(Status status, String mimeType,String bookId, BookMixAToc.mixToc bookMix, BookApi bookApi) { + public Response(Status status, String mimeType, String bookId, BookMixAToc.mixToc bookMix, BookApi bookApi, int start) { this.status = status; this.mimeType = mimeType; this.bookId = bookId; this.bookMix = bookMix; this.bookApi = bookApi; + this.start = start; } public static void error(OutputStream outputStream, Status error, @@ -384,9 +391,9 @@ private void send(OutputStream outputStream) { pw.print("\r\n"); pw.flush(); - sendInputData(outputStream,data); + sendInputData(outputStream, data); // 上传文件 - witBook(pw,outputStream); + witBook(pw, outputStream); outputStream.flush(); outputStream.close(); if (data != null) @@ -397,15 +404,15 @@ private void send(OutputStream outputStream) { } } - public void witBook(final PrintWriter pw, OutputStream outputStream){ - if(this.bookMix == null){ + public void witBook(final PrintWriter pw, OutputStream outputStream) { + if (this.bookMix == null) { return; } final List list = this.bookMix.chapters; - for (int i = 0; i < list.size(); i++) { + for (int i = start; i < list.size(); i++) { final BookMixAToc.mixToc.Chapters character = list.get(i); final String title = character.title; - File fileIndex = CacheManager.getInstance().getChapterFile(this.bookId, i); + File fileIndex = CacheManager.getInstance().getChapterFile(this.bookId, i + 1); if (fileIndex != null) { FileInputStream fis = null; try { @@ -414,14 +421,14 @@ public void witBook(final PrintWriter pw, OutputStream outputStream){ pw.print(title); pw.print("\r\n"); pw.flush(); - sendInputData(outputStream,fis); + sendInputData(outputStream, fis); outputStream.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); - }finally { - if(fis != null){ + } finally { + if (fis != null) { try { fis.close(); } catch (IOException e) { @@ -459,7 +466,7 @@ public void onNext(ChapterRead chapterRead) { pw.print(chapterRead.chapter.body); pw.flush(); // 保存当前的文章到本地 - CacheManager.getInstance().saveChapterFile(Response.this.bookId, finalI,chapterRead.chapter); + CacheManager.getInstance().saveChapterFile(Response.this.bookId, finalI, chapterRead.chapter); } }); } diff --git a/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java b/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java index 6645750a..a14fe2a3 100644 --- a/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java +++ b/app/src/main/java/com/justwayward/reader/wifitransfer/SimpleFileServer.java @@ -92,6 +92,13 @@ public Response serve(String uri, Method method, return new Response(Response.Status.OK, "text/html", new String(FileUtils.readAssets("/index.html"))); } else if (uri.startsWith("/files/") && uri.endsWith(".txt")) { String name = parms.get("name"); + String start = parms.get("start"); + int startIndex = 0; + try { + startIndex = Integer.parseInt(start); + } catch (NumberFormatException ex) { + ex.printStackTrace(); + } String printName; try { printName = URLDecoder.decode(parms.get("name"), "utf-8"); @@ -100,10 +107,10 @@ public Response serve(String uri, Method method, printName = "tt"; } String bookid = uri.substring(7, uri.lastIndexOf(".")); - LogUtils.d("-->uri= " + uri + ";name:" + printName); + LogUtils.d("-->uri= " + uri + ";name:" + printName + ";start:" + start); //先加载章节列表 - Response resp = new Response(Response.Status.OK, MIME_DEFAULT_BINARY, bookid, getBookMixAToc(bookid, "chapters"), bookApi); - resp.addHeader("content-disposition", "attachment;filename=" + printName + ".txt");//URLEncoder.encode(name + ".txt", "utf-8")); + Response resp = new Response(Response.Status.OK, MIME_DEFAULT_BINARY, bookid, getBookMixAToc(bookid, "chapters"), bookApi, startIndex); + resp.addHeader("content-disposition", "attachment;filename=" + printName + "_" + startIndex + ".txt");//URLEncoder.encode(name + ".txt", "utf-8")); return resp; } else if (uri.startsWith("/files")) { List collectionList = CollectionsManager.getInstance().getCollectionList();