From f612d5217c2c79bfbd0bffd8a1e88129b0654ead Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Sun, 19 May 2019 12:19:39 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E4=B9=A6=E6=97=97=20=E4=B9=A6=E6=9E=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=20=E6=8D=A2=E6=BA=90=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=8F=AA=E5=8A=A0=E8=BD=BD=E5=90=AF=E7=94=A8=E7=9A=84=E4=B9=A6?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monkeybook/model/SearchBookModel.java | 12 +++++-- .../model/content/DefaultShuqi.java | 34 +++++++++++++++---- .../monke/monkeybook/service/WebService.java | 8 ++--- .../view/activity/SearchBookActivity.java | 24 +++++++++---- .../main/res/menu/menu_search_activity.xml | 2 ++ build.gradle | 4 +-- 6 files changed, 61 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java index cd7af21..b130b1e 100644 --- a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java +++ b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java @@ -108,10 +108,13 @@ public void initSearchEngineS1(@NonNull List sourceBeanList,Stri searchEngineS.add(new SearchEngine(Default716.TAG)); } if (useShuqi) { - searchEngineS.add(new SearchEngine(Defaultsq.TAG)); + searchEngineS.add(new SearchEngine(DefaultShuqi.TAG)); } } for (BookSourceBean bookSourceBean : sourceBeanList) { + if (searchBookType != null && !TextUtils.equals(bookSourceBean.getBookSourceType(), searchBookType)) { + continue; + } if (bookSourceBean.getEnable()) { SearchEngine se = new SearchEngine(bookSourceBean.getBookSourceUrl()); searchEngineS.add(se); @@ -139,7 +142,9 @@ public void initSearchEngineS() { if (searchBookType != null && !TextUtils.equals(bookSourceBean.getBookSourceType(), searchBookType)) { continue; } - searchEngineS.add(new SearchEngine(bookSourceBean.getBookSourceUrl())); + if (bookSourceBean.getEnable()) { + searchEngineS.add(new SearchEngine(bookSourceBean.getBookSourceUrl())); + } } } searchEngineChanged = false; @@ -153,7 +158,8 @@ public void startSearch(String query) { clearSearch(); if (searchEngineChanged || searchEngineS.isEmpty()) { - initSearchEngineS(); + //initSearchEngineS(); + searchHandler.obtainMessage(SearchHandler.MSG_EMPTY).sendToTarget(); } else { for (SearchEngine searchEngine : searchEngineS) { searchEngine.searchReset(); diff --git a/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java b/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java index 96ba26f..c245690 100644 --- a/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java +++ b/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java @@ -58,13 +58,34 @@ public Observable> searchBook(String content, int page) { private Observable> analyzeSearchBook(final String response) { return Observable.create(e -> { List searchBooks = new ArrayList<>(); + SearchBookBean item; JsonObject root = new JsonParser().parse(response).getAsJsonObject(); + JsonObject info = root.getAsJsonObject("info"); + int pageI = info.get("page").getAsInt(); + if (pageI == 1) { + if (root.has("aladdin")) { + JsonObject aladdin = root.getAsJsonObject("aladdin"); + item = new SearchBookBean(); + item.setTag(TAG); + item.setOrigin(TAG); + item.setBookType(BookType.TEXT); + item.setWeight(Integer.MAX_VALUE); + item.setAuthor(aladdin.get("author").getAsString()); + item.setKind(aladdin.get("category").getAsString()); + item.setLastChapter(aladdin.get("latest_chapter").getAsJsonObject().get("cname").getAsString()); + item.setName(aladdin.get("title").getAsString()); + item.setNoteUrl(aladdin.get("bid").getAsString()); + item.setCoverUrl(aladdin.get("cover").getAsString().replace("\\/", "/")); + item.setIntroduce(aladdin.get("desc").getAsString()); + searchBooks.add(item); + } + } + if (root.has("data")) { JsonArray booksArray = root.getAsJsonArray("data"); for (JsonElement element : booksArray) { JsonObject book = element.getAsJsonObject(); - String bookId = book.get("bid").getAsString(); - SearchBookBean item = new SearchBookBean(); + item = new SearchBookBean(); item.setTag(TAG); item.setOrigin(TAG); item.setBookType(BookType.TEXT); @@ -73,10 +94,9 @@ private Observable> analyzeSearchBook(final String response item.setKind(book.get("category").getAsString()); item.setLastChapter(book.get("first_chapter").getAsString()); item.setName(book.get("title").getAsString()); - item.setNoteUrl("http://c1.shuqireader.com/httpserver/filecache/get_book_content_" + bookId); + item.setNoteUrl(book.get("bid").getAsString()); item.setCoverUrl(book.get("cover").getAsString().replace("\\/", "/")); item.setIntroduce(book.get("desc").getAsString()); - item.putVariable("bookId", bookId); searchBooks.add(item); } } @@ -90,7 +110,7 @@ private Observable> analyzeSearchBook(final String response */ @Override public Observable getBookInfo(BookShelfBean bookShelfBean) { - String bid = bookShelfBean.getVariable("bookId"); + String bid = bookShelfBean.getNoteUrl(); String Data = bid + "1514984538213800000037e81a9d8f02596e1b895d07c171d5c9"; String Sign = MD5Utils.strToMd5By32(Data); HashMap fieldMap = new HashMap<>(); @@ -135,7 +155,7 @@ private Observable analyzeBookInfo(String s, final BookShelfBean */ @Override public Observable> getChapterList(BookShelfBean bookShelfBean) { - String bid = bookShelfBean.getVariable("bookId"); + String bid = bookShelfBean.getNoteUrl(); String Data = bid + "1514984538213800000037e81a9d8f02596e1b895d07c171d5c9"; String Sign = MD5Utils.strToMd5By32(Data); HashMap fieldMap = new HashMap<>(); @@ -160,7 +180,7 @@ private Observable> analyzeChapterList(String s, String noteUr String chapterId = ele.getAsJsonObject().get("chapterId").getAsString(); String chapterName = ele.getAsJsonObject().get("chapterName").getAsString(); ChapterBean temp = new ChapterBean(); - temp.setDurChapterUrl(noteUrl + "_" + chapterId + ".xml"); //id + temp.setDurChapterUrl("http://c1.shuqireader.com/httpserver/filecache/get_book_content_" + noteUrl + "_" + chapterId + ".xml"); //id temp.setDurChapterName(chapterName); temp.setNoteUrl(noteUrl); chapterBeans.add(temp); diff --git a/app/src/main/java/com/monke/monkeybook/service/WebService.java b/app/src/main/java/com/monke/monkeybook/service/WebService.java index e174af1..09b95bf 100644 --- a/app/src/main/java/com/monke/monkeybook/service/WebService.java +++ b/app/src/main/java/com/monke/monkeybook/service/WebService.java @@ -8,9 +8,6 @@ import android.content.Intent; import android.os.IBinder; -import androidx.annotation.Nullable; -import androidx.core.app.NotificationCompat; - import com.monke.monkeybook.MApplication; import com.monke.monkeybook.R; import com.monke.monkeybook.utils.NetworkUtil; @@ -21,6 +18,9 @@ import java.io.IOException; import java.net.InetAddress; +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; + public class WebService extends Service { private static boolean isRunning = false; private HttpServer httpServer; @@ -109,7 +109,7 @@ private PendingIntent getThisServicePendingIntent() { } private int getPort() { - return 1223; + return 1222; } /** diff --git a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java index 4fa7b72..a0eed23 100644 --- a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java +++ b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java @@ -41,7 +41,7 @@ import butterknife.ButterKnife; public class SearchBookActivity extends MBaseActivity implements SearchBookContract.View { - + private final int requestSource = 14; @BindView(R.id.searchView) SearchView searchView; @BindView(R.id.toolbar) @@ -203,14 +203,14 @@ public boolean onCreateOptionsMenu(Menu menu) { } private void initMenu() { if (menu == null) return; - menu.removeGroup(R.id.source_group); - menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source).setIcon(R.drawable.ic_source_manager_black_24dp); + menu.removeGroup(R.id.source_group_so); + menu.add(R.id.source_group_so, Menu.NONE, Menu.NONE, R.string.all_source).setIcon(R.drawable.ic_source_manager_black_24dp); List groupList = BookSourceManager.getInstance().getEnableGroupList(); for (String groupName : groupList) { - menu.add(R.id.source_group, Menu.NONE, Menu.NONE, groupName).setIcon(R.drawable.ic_source_manager_black_24dp); + menu.add(R.id.source_group_so, Menu.NONE, Menu.NONE, groupName).setIcon(R.drawable.ic_source_manager_black_24dp); } - menu.setGroupCheckable(R.id.source_group, true, true); - menu.getItem(1).setChecked(true); + menu.setGroupCheckable(R.id.source_group_so, true, true); + menu.getItem(3).setChecked(true); } @Override public boolean onPrepareOptionsMenu(Menu menu) { @@ -247,7 +247,7 @@ public boolean onOptionsItemSelected(MenuItem item) { finish(); break; default: - if (item.getGroupId() == R.id.source_group) { + if (item.getGroupId() == R.id.source_group_so) { item.setChecked(true); if (Objects.equals(getString(R.string.all_source), item.getTitle().toString())) { group = null; @@ -458,4 +458,14 @@ public void showBookSourceEmptyTip() { } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + if (requestCode == requestSource) { + initMenu(); + mPresenter.initSearchEngineS(group); + } + } + } } diff --git a/app/src/main/res/menu/menu_search_activity.xml b/app/src/main/res/menu/menu_search_activity.xml index 1892374..3fb5108 100644 --- a/app/src/main/res/menu/menu_search_activity.xml +++ b/app/src/main/res/menu/menu_search_activity.xml @@ -24,5 +24,7 @@ android:title="@string/book_inner_source_sq" app:showAsAction="never" /> + + diff --git a/build.gradle b/build.gradle index 94263fc..621ea3c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ ext { compile_sdk_version = 28 min_sdk_version = 21 - target_sdk_version = 27 + target_sdk_version = 28 support_library_version = '28.0.0' } @@ -12,7 +12,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.4.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' } } From d7326a789116e84613a72a12200030aecfc3131b Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Sun, 19 May 2019 12:19:39 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E4=B9=A6=E6=97=97=20=E4=B9=A6=E6=9E=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=20=E6=8D=A2=E6=BA=90=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=8F=AA=E5=8A=A0=E8=BD=BD=E5=90=AF=E7=94=A8=E7=9A=84=E4=B9=A6?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monkeybook/model/SearchBookModel.java | 12 +- .../model/content/Base64Decoder.java | 200 ------------ .../model/content/DefaultShuqi.java | 34 ++- .../monkeybook/model/content/Defaultsq.java | 285 ------------------ .../monkeybook/model/content/SqBook.java | 106 ------- .../model/content/SqBookDetail.java | 69 ----- .../model/content/SqChapterList.java | 22 -- .../monke/monkeybook/service/WebService.java | 8 +- .../view/activity/SearchBookActivity.java | 24 +- .../main/res/menu/menu_search_activity.xml | 2 + build.gradle | 4 +- 11 files changed, 61 insertions(+), 705 deletions(-) delete mode 100644 app/src/main/java/com/monke/monkeybook/model/content/Base64Decoder.java delete mode 100644 app/src/main/java/com/monke/monkeybook/model/content/Defaultsq.java delete mode 100644 app/src/main/java/com/monke/monkeybook/model/content/SqBook.java delete mode 100644 app/src/main/java/com/monke/monkeybook/model/content/SqBookDetail.java delete mode 100644 app/src/main/java/com/monke/monkeybook/model/content/SqChapterList.java diff --git a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java index cd7af21..b130b1e 100644 --- a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java +++ b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java @@ -108,10 +108,13 @@ public void initSearchEngineS1(@NonNull List sourceBeanList,Stri searchEngineS.add(new SearchEngine(Default716.TAG)); } if (useShuqi) { - searchEngineS.add(new SearchEngine(Defaultsq.TAG)); + searchEngineS.add(new SearchEngine(DefaultShuqi.TAG)); } } for (BookSourceBean bookSourceBean : sourceBeanList) { + if (searchBookType != null && !TextUtils.equals(bookSourceBean.getBookSourceType(), searchBookType)) { + continue; + } if (bookSourceBean.getEnable()) { SearchEngine se = new SearchEngine(bookSourceBean.getBookSourceUrl()); searchEngineS.add(se); @@ -139,7 +142,9 @@ public void initSearchEngineS() { if (searchBookType != null && !TextUtils.equals(bookSourceBean.getBookSourceType(), searchBookType)) { continue; } - searchEngineS.add(new SearchEngine(bookSourceBean.getBookSourceUrl())); + if (bookSourceBean.getEnable()) { + searchEngineS.add(new SearchEngine(bookSourceBean.getBookSourceUrl())); + } } } searchEngineChanged = false; @@ -153,7 +158,8 @@ public void startSearch(String query) { clearSearch(); if (searchEngineChanged || searchEngineS.isEmpty()) { - initSearchEngineS(); + //initSearchEngineS(); + searchHandler.obtainMessage(SearchHandler.MSG_EMPTY).sendToTarget(); } else { for (SearchEngine searchEngine : searchEngineS) { searchEngine.searchReset(); diff --git a/app/src/main/java/com/monke/monkeybook/model/content/Base64Decoder.java b/app/src/main/java/com/monke/monkeybook/model/content/Base64Decoder.java deleted file mode 100644 index d4c2ddd..0000000 --- a/app/src/main/java/com/monke/monkeybook/model/content/Base64Decoder.java +++ /dev/null @@ -1,200 +0,0 @@ -package com.monke.monkeybook.model.content; - -import java.io.*; - -public class Base64Decoder extends FilterInputStream { - - private static final char[] chars = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', - 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', - '7', '8', '9', '+', '/' }; - - // A mapping between char values and six-bit integers - private static final int[] ints = new int[128]; - static { - for (int i = 0; i < 64; i++) { - ints[chars[i]] = i; - } - } - - private int charCount; - private int carryOver; - - /*************************************************************************** - * Constructs a new Base64 decoder that reads input from the given - * InputStream. - * - * @param in - * the input stream - */ - public Base64Decoder(InputStream in) { - super(in); - } - - /*************************************************************************** - * Returns the next decoded character from the stream, or -1 if end of - * stream was reached. - * - * @return the decoded character, or -1 if the end of the input stream is - * reached - * @exception IOException - * if an I/O error occurs - */ - public int read() throws IOException { - // Read the next non-whitespace character - int x; - do { - x = in.read(); - if (x == -1) { - return -1; - } - } while (Character.isWhitespace((char) x)); - charCount++; - - // The '=' sign is just padding - if (x == '=') { - return -1; // effective end of stream - } - - // Convert from raw form to 6-bit form - x = ints[x]; - - // Calculate which character we're decoding now - int mode = (charCount - 1) % 4; - - // First char save all six bits, go for another - if (mode == 0) { - carryOver = x & 63; - return read(); - } - // Second char use previous six bits and first two new bits, - // save last four bits - else if (mode == 1) { - int decoded = ((carryOver << 2) + (x >> 4)) & 255; - carryOver = x & 15; - return decoded; - } - // Third char use previous four bits and first four new bits, - // save last two bits - else if (mode == 2) { - int decoded = ((carryOver << 4) + (x >> 2)) & 255; - carryOver = x & 3; - return decoded; - } - // Fourth char use previous two bits and all six new bits - else if (mode == 3) { - int decoded = ((carryOver << 6) + x) & 255; - return decoded; - } - return -1; // can't actually reach this line - } - - /*************************************************************************** - * Reads decoded data into an array of bytes and returns the actual number - * of bytes read, or -1 if end of stream was reached. - * - * @param buf - * the buffer into which the data is read - * @param off - * the start offset of the data - * @param len - * the maximum number of bytes to read - * @return the actual number of bytes read, or -1 if the end of the input - * stream is reached - * @exception IOException - * if an I/O error occurs - */ - public int read(byte[] buf, int off, int len) throws IOException { - if (buf.length < (len + off - 1)) { - throw new IOException("The input buffer is too small: " + len - + " bytes requested starting at offset " + off - + " while the buffer " + " is only " + buf.length - + " bytes long."); - } - - // This could of course be optimized - int i; - for (i = 0; i < len; i++) { - int x = read(); - if (x == -1 && i == 0) { // an immediate -1 returns -1 - return -1; - } else if (x == -1) { // a later -1 returns the chars read so far - break; - } - buf[off + i] = (byte) x; - } - return i; - } - - /*************************************************************************** - * Returns the decoded form of the given encoded string, as a String. Note - * that not all binary data can be represented as a String, so this method - * should only be used for encoded String data. Use decodeToBytes() - * otherwise. - * - * @param encoded - * the string to decode - * @return the decoded form of the encoded string - */ - public static String decode(String encoded) { - return new String(decodeToBytes(encoded)); - } - - public static byte[] decodeReturnByte(String encodedStr) { - return decodeToBytes(encodedStr); - } - public static byte[] decodeToBytes2(byte[] bytes) { - - Base64Decoder in = new Base64Decoder(new ByteArrayInputStream(bytes)); - - ByteArrayOutputStream out = new ByteArrayOutputStream( - (int) (bytes.length * 0.67)); - - try { - byte[] buf = new byte[4 * 1024]; // 4K buffer - int bytesRead; - while ((bytesRead = in.read(buf)) != -1) { - out.write(buf, 0, bytesRead); - } - out.close(); - - return out.toByteArray(); - } catch (IOException ignored) { - return null; - } - } - /*************************************************************************** - * Returns the decoded form of the given encoded string, as bytes. - * - * @param encoded - * the string to decode - * @return the decoded form of the encoded string - */ - public static byte[] decodeToBytes(String encoded) { - byte[] bytes = null; - try { - bytes = encoded.getBytes("UTF-8"); - } catch (UnsupportedEncodingException ignored) { - } - - Base64Decoder in = new Base64Decoder(new ByteArrayInputStream(bytes)); - - ByteArrayOutputStream out = new ByteArrayOutputStream( - (int) (bytes.length * 0.67)); - - try { - byte[] buf = new byte[4 * 1024]; // 4K buffer - int bytesRead; - while ((bytesRead = in.read(buf)) != -1) { - out.write(buf, 0, bytesRead); - } - out.close(); - - return out.toByteArray(); - } catch (IOException ignored) { - return null; - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java b/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java index 96ba26f..c245690 100644 --- a/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java +++ b/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java @@ -58,13 +58,34 @@ public Observable> searchBook(String content, int page) { private Observable> analyzeSearchBook(final String response) { return Observable.create(e -> { List searchBooks = new ArrayList<>(); + SearchBookBean item; JsonObject root = new JsonParser().parse(response).getAsJsonObject(); + JsonObject info = root.getAsJsonObject("info"); + int pageI = info.get("page").getAsInt(); + if (pageI == 1) { + if (root.has("aladdin")) { + JsonObject aladdin = root.getAsJsonObject("aladdin"); + item = new SearchBookBean(); + item.setTag(TAG); + item.setOrigin(TAG); + item.setBookType(BookType.TEXT); + item.setWeight(Integer.MAX_VALUE); + item.setAuthor(aladdin.get("author").getAsString()); + item.setKind(aladdin.get("category").getAsString()); + item.setLastChapter(aladdin.get("latest_chapter").getAsJsonObject().get("cname").getAsString()); + item.setName(aladdin.get("title").getAsString()); + item.setNoteUrl(aladdin.get("bid").getAsString()); + item.setCoverUrl(aladdin.get("cover").getAsString().replace("\\/", "/")); + item.setIntroduce(aladdin.get("desc").getAsString()); + searchBooks.add(item); + } + } + if (root.has("data")) { JsonArray booksArray = root.getAsJsonArray("data"); for (JsonElement element : booksArray) { JsonObject book = element.getAsJsonObject(); - String bookId = book.get("bid").getAsString(); - SearchBookBean item = new SearchBookBean(); + item = new SearchBookBean(); item.setTag(TAG); item.setOrigin(TAG); item.setBookType(BookType.TEXT); @@ -73,10 +94,9 @@ private Observable> analyzeSearchBook(final String response item.setKind(book.get("category").getAsString()); item.setLastChapter(book.get("first_chapter").getAsString()); item.setName(book.get("title").getAsString()); - item.setNoteUrl("http://c1.shuqireader.com/httpserver/filecache/get_book_content_" + bookId); + item.setNoteUrl(book.get("bid").getAsString()); item.setCoverUrl(book.get("cover").getAsString().replace("\\/", "/")); item.setIntroduce(book.get("desc").getAsString()); - item.putVariable("bookId", bookId); searchBooks.add(item); } } @@ -90,7 +110,7 @@ private Observable> analyzeSearchBook(final String response */ @Override public Observable getBookInfo(BookShelfBean bookShelfBean) { - String bid = bookShelfBean.getVariable("bookId"); + String bid = bookShelfBean.getNoteUrl(); String Data = bid + "1514984538213800000037e81a9d8f02596e1b895d07c171d5c9"; String Sign = MD5Utils.strToMd5By32(Data); HashMap fieldMap = new HashMap<>(); @@ -135,7 +155,7 @@ private Observable analyzeBookInfo(String s, final BookShelfBean */ @Override public Observable> getChapterList(BookShelfBean bookShelfBean) { - String bid = bookShelfBean.getVariable("bookId"); + String bid = bookShelfBean.getNoteUrl(); String Data = bid + "1514984538213800000037e81a9d8f02596e1b895d07c171d5c9"; String Sign = MD5Utils.strToMd5By32(Data); HashMap fieldMap = new HashMap<>(); @@ -160,7 +180,7 @@ private Observable> analyzeChapterList(String s, String noteUr String chapterId = ele.getAsJsonObject().get("chapterId").getAsString(); String chapterName = ele.getAsJsonObject().get("chapterName").getAsString(); ChapterBean temp = new ChapterBean(); - temp.setDurChapterUrl(noteUrl + "_" + chapterId + ".xml"); //id + temp.setDurChapterUrl("http://c1.shuqireader.com/httpserver/filecache/get_book_content_" + noteUrl + "_" + chapterId + ".xml"); //id temp.setDurChapterName(chapterName); temp.setNoteUrl(noteUrl); chapterBeans.add(temp); diff --git a/app/src/main/java/com/monke/monkeybook/model/content/Defaultsq.java b/app/src/main/java/com/monke/monkeybook/model/content/Defaultsq.java deleted file mode 100644 index daf1dfc..0000000 --- a/app/src/main/java/com/monke/monkeybook/model/content/Defaultsq.java +++ /dev/null @@ -1,285 +0,0 @@ -package com.monke.monkeybook.model.content; - -import android.text.TextUtils; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; -import com.monke.basemvplib.BaseModelImpl; -import com.monke.basemvplib.OkHttpHelper; -import com.monke.monkeybook.bean.BookContentBean; -import com.monke.monkeybook.bean.BookInfoBean; -import com.monke.monkeybook.bean.BookShelfBean; -import com.monke.monkeybook.bean.ChapterBean; -import com.monke.monkeybook.bean.SearchBookBean; -import com.monke.monkeybook.model.analyzeRule.AnalyzeHeaders; -import com.monke.monkeybook.model.annotation.BookType; -import com.monke.monkeybook.model.impl.IHttpGetApi; -import com.monke.monkeybook.model.impl.IStationBookModel; -import com.monke.monkeybook.utils.MD5Utils; -import com.monke.monkeybook.utils.StringUtils; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import io.reactivex.Observable; -import retrofit2.Response; - -public class Defaultsq extends BaseModelImpl implements IStationBookModel { - public static final String TAG = "Shuqi"; - - public static Defaultsq newInstance() { - return new Defaultsq(); - } - - /** - * 发现书籍 - */ - @Override - public Observable> findBook(String url, int page) { - return null; - } - - /** - * 搜索书籍 - */ - @Override - public Observable> searchBook(String content, int page) { - return OkHttpHelper.getInstance().createService("http://read.xiaoshuo1-sm.com", IHttpGetApi.class) - .getsearchBook("is_serchpay", "3", content, page, "30") - .flatMap(this::analyzeSearchBook); - } - - private Observable> analyzeSearchBook(final Response response) { - return Observable.create(e -> { - List searchBookList = new ArrayList<>(); - SqBook book, book1; - List books = new ArrayList<>(); - SearchBookBean item ; - JSONObject object = JSONObject.parseObject(response.body()); - JSONObject booksObject1 = object.getJSONObject("info"); - book1 = JSON.parseObject(booksObject1.toString(), SqBook.class); - int pageI = book1.getPage(); - int pages = book1.getCount(); - if(pageI == 1 && pageI <= pages) { - JSONObject booksObject = object.getJSONObject("aladdin"); - book = JSON.parseObject(booksObject.toString(), SqBook.class); - JSONObject jsonx = (JSONObject) book.getLatest_chapter(); - String cname = jsonx.getString("cname"); - item = new SearchBookBean(); - item.setTag(TAG); - item.setOrigin(TAG); - item.setBookType(BookType.TEXT); - item.setWeight(Integer.MAX_VALUE); - item.setAuthor(book.getAuthor()); - item.setKind(book.getCategory()); - item.setLastChapter(cname); - item.setName(book.getTitle()); - item.setNoteUrl(book.getBid()); - item.setCoverUrl(book.getCover().replace("\\/", "/")); - item.setIntroduce(book.getDesc()); - books.add(item); - } - if(pageI <= pages) { - JSONArray booksArray = object.getJSONArray("data"); - for (Object jsonObject : booksArray) { - book = JSON.parseObject(jsonObject.toString(), SqBook.class); - item = new SearchBookBean(); - item.setTag(TAG); - item.setOrigin(TAG); - item.setBookType(BookType.TEXT); - item.setWeight(Integer.MAX_VALUE); - item.setAuthor(book.getAuthor()); - item.setKind(book.getCategory()); - item.setLastChapter(book.getFirst_chapter()); - item.setName(book.getTitle()); - item.setNoteUrl(book.getBid()); - item.setCoverUrl(book.getCover().replace("\\/", "/")); - item.setIntroduce(book.getDesc()); - books.add(item); - } - } - e.onNext(books); - e.onComplete(); - }); - } - - /** - * 网络请求并解析书籍信息 - */ - @Override - public Observable getBookInfo(BookShelfBean bookShelfBean) { - String bid = bookShelfBean.getNoteUrl(); - String Data = bid + "1514984538213800000037e81a9d8f02596e1b895d07c171d5c9"; - String Sign = MD5Utils.strToMd5By32(Data); - HashMap fieldMap = new HashMap<>(); - fieldMap.put("timestamp", "1514984538213"); - fieldMap.put("user_id", "8000000"); - fieldMap.put("bookId", bid); - fieldMap.put("sign", Sign); - return OkHttpHelper.getInstance().createService("http://walden1.shuqireader.com", IHttpGetApi.class) - .getbookdetail(fieldMap) - .flatMap(response -> analyzeBookInfo(response.body(), bookShelfBean)); - } - - private Observable analyzeBookInfo(String s, final BookShelfBean bookShelfBean) { - return Observable.create(e -> { - if (TextUtils.isEmpty(s)) { - e.onError(new Throwable("书籍信息获取失败")); - e.onComplete(); - return; - } - JSONObject object = JSONObject.parseObject(s); - JSONObject data = (JSONObject) object.get("data"); - SqBookDetail bd = JSON.parseObject(data.toString(),SqBookDetail.class); - JSONObject jsonx = (JSONObject) bd.getLastChapter(); - String chapterName = jsonx.getString("chapterName"); - BookInfoBean bookInfoBean = bookShelfBean.getBookInfoBean(); - bookShelfBean.setLastChapterName(chapterName); - bookInfoBean.setBookType(BookType.TEXT); - bookInfoBean.setTag(TAG); - bookInfoBean.setOrigin(TAG); - bookInfoBean.setCoverUrl(bd.getImgUrl()); - bookInfoBean.setName(bd.getBookName()); - bookInfoBean.setAuthor(bd.getAuthorName()); - bookInfoBean.setIntroduce(bd.getDesc()); - bookInfoBean.setNoteUrl(bookShelfBean.getNoteUrl()); //id - bookInfoBean.setChapterListUrl(bookShelfBean.getNoteUrl()); - - e.onNext(bookShelfBean); - e.onComplete(); - }); - } - - /** - * 网络解析图书目录 - */ - @Override - public Observable> getChapterList(BookShelfBean bookShelfBean) { - String bid = bookShelfBean.getNoteUrl(); - String Data = bid + "1514984538213800000037e81a9d8f02596e1b895d07c171d5c9"; - String Sign = MD5Utils.strToMd5By32(Data); - HashMap fieldMap = new HashMap<>(); - fieldMap.put("timestamp", "1514984538213"); - fieldMap.put("user_id", "8000000"); - fieldMap.put("bookId", bid); - fieldMap.put("sign", Sign); - return OkHttpHelper.getInstance().createService("http://walden1.shuqireader.com", IHttpGetApi.class) - .getchapterlist(fieldMap) - .flatMap(response -> analyzeChapterList(response.body(),bookShelfBean.getNoteUrl())); - } - - private Observable> analyzeChapterList(String s, String novelUrl) { - return Observable.create(e -> { - List chapterBeans = new ArrayList<>(); - JSONObject object = JSONObject.parseObject(s); - JSONObject data = (JSONObject) object.get("data"); - JSONArray chapterListArray = data.getJSONArray("chapterList"); - int i = 1; - for (Object chapterListsObject:chapterListArray) { - JSONArray volumeListsArray = JSONObject.parseObject(chapterListsObject.toString()).getJSONArray("volumeList"); - for (Object volumeListObject:volumeListsArray) { - SqChapterList cl = JSON.parseObject(volumeListObject.toString(), SqChapterList.class); - String ChapterId = cl.getChapterId(); - String ChapterName= cl.getChapterName(); - ChapterBean temp = new ChapterBean(); - temp.setDurChapterUrl("http://c1.shuqireader.com/httpserver/filecache/get_book_content_" + novelUrl +"_"+ ChapterId +".xml"); //id - temp.setDurChapterIndex(i); - temp.setDurChapterName(ChapterName); - temp.setNoteUrl(novelUrl); - chapterBeans.add(temp); - i++; - } - } - e.onNext(chapterBeans); - e.onComplete(); - }); - } - - /** - * 章节缓存 - */ - @Override - public Observable getBookContent(ChapterBean chapterBean) { - return OkHttpHelper.getInstance().createService(StringUtils.getBaseUrl(chapterBean.getDurChapterUrl()), IHttpGetApi.class) - .getWebContent(chapterBean.getDurChapterUrl(), AnalyzeHeaders.getMap(null)) - .flatMap(response -> analyzeBookContent(response.body(), chapterBean)); - } - - private Observable analyzeBookContent(String s, ChapterBean chapterBean) { - return Observable.create(e -> { - BookContentBean bookContentBean = new BookContentBean(); - bookContentBean.setDurChapterUrl(chapterBean.getDurChapterUrl()); - bookContentBean.setDurChapterIndex(chapterBean.getDurChapterIndex()); - bookContentBean.setDurChapterName(chapterBean.getDurChapterName()); - bookContentBean.setNoteUrl(chapterBean.getNoteUrl()); - bookContentBean.setDurChapterContent(DecodeChapterContent(getSubString(s,"[CDATA[","]]>"))); - - e.onNext(bookContentBean); - e.onComplete(); - }); - } - /** - * 取两个文本之间的文本值 - * @param text 源文本 比如:欲取全文本为 12345 - * @param left 文本前面 - * @param right 后面文本 - * @return 返回 String - */ - public static String getSubString(String text, String left, String right) { - String result = ""; - int zLen; - if (left == null || left.isEmpty()) { - zLen = 0; - } else { - zLen = text.indexOf(left); - if (zLen > -1) { - zLen += left.length(); - } else { - zLen = 0; - } - } - int yLen = text.indexOf(right, zLen); - if (yLen < 0 || right == null || right.isEmpty()) { - yLen = text.length(); - } - result = text.substring(zLen, yLen); - return result; - } - public String DecodeChapterContent(String code) - { - String ss = ""; - try { - byte[] bytes = code.getBytes("UTF-8"); - - for (int i = 0; i < bytes.length; i++) - { - int charAt = bytes[i]; - if (65 <= charAt && charAt <= 90) - { - charAt = charAt + 13; - if (charAt > 90) - { - charAt = ((charAt % 90) + 65) - 1; - } - } - else if (97 <= charAt && charAt <= 122) - { - charAt = charAt + 13; - if (charAt > 122) - { - charAt = ((charAt % 122) + 97) - 1; - } - } - bytes[i] = (byte)charAt; - } - code = new String(bytes,"UTF-8"); - byte[] bbb = Base64Decoder.decodeToBytes2(bytes); - ss = new String(bbb,"UTF-8"); - } catch (UnsupportedEncodingException ignored) { - } - return ss.replace("
", "\n"); - } -} diff --git a/app/src/main/java/com/monke/monkeybook/model/content/SqBook.java b/app/src/main/java/com/monke/monkeybook/model/content/SqBook.java deleted file mode 100644 index 8b03a1a..0000000 --- a/app/src/main/java/com/monke/monkeybook/model/content/SqBook.java +++ /dev/null @@ -1,106 +0,0 @@ -package com.monke.monkeybook.model.content; - -public class SqBook { - private String bid; - - public String getBid() { - return bid; - } - - public void setBid(String bid) { - this.bid = bid; - } - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getCategory() { - return category; - } - - public void setCategory(String category) { - this.category = category; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getCover() { - return cover; - } - - public void setCover(String cover) { - this.cover = cover; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public String getFirst_chapter() { - return first_chapter; - } - - public void setFirst_chapter(String first_chapter) { - this.first_chapter = first_chapter; - } - - public Object getLatest_chapter() { - return latest_chapter; - } - - public void setLatest_chapter(Object latest_chapter) { - this.latest_chapter = latest_chapter; - } - - public int getCount() { - return count; - } - - public void setCount(int count) { - this.count = count; - } - - public int getPage() { - return page; - } - - public void setPage(int page) { - this.page = page; - } - - public String getLast_chapter_name() { - return last_chapter_name; - } - - public void setLast_chapter_name(String last_chapter_name) { - this.last_chapter_name = last_chapter_name; - } - - - private int page; - private int count; - private String last_chapter_name; - private Object latest_chapter; - private String first_chapter; - private String title; - private String category; - private String author; - private String cover; - private String desc; - -} diff --git a/app/src/main/java/com/monke/monkeybook/model/content/SqBookDetail.java b/app/src/main/java/com/monke/monkeybook/model/content/SqBookDetail.java deleted file mode 100644 index 7cdabb0..0000000 --- a/app/src/main/java/com/monke/monkeybook/model/content/SqBookDetail.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.monke.monkeybook.model.content; - -public class SqBookDetail { - private String bookId; - private String bookName; - private String authorName; - private String desc; - private String imgUrl; - - public String getBookId() { - return bookId; - } - - public void setBookId(String bookId) { - this.bookId = bookId; - } - - public String getBookName() { - return bookName; - } - - public void setBookName(String bookName) { - this.bookName = bookName; - } - - public String getAuthorName() { - return authorName; - } - - public void setAuthorName(String authorName) { - this.authorName = authorName; - } - - public String getDesc() { - return desc; - } - - public void setDesc(String desc) { - this.desc = desc; - } - - public String getImgUrl() { - return imgUrl; - } - - public void setImgUrl(String imgUrl) { - this.imgUrl = imgUrl; - } - - public Object getLastChapter() { - return lastChapter; - } - - public void setLastChapter(Object lastChapter) { - this.lastChapter = lastChapter; - } - - public String getClassName() { - return className; - } - - public void setClassName(String className) { - this.className = className; - } - - private Object lastChapter; - private String className; - -} diff --git a/app/src/main/java/com/monke/monkeybook/model/content/SqChapterList.java b/app/src/main/java/com/monke/monkeybook/model/content/SqChapterList.java deleted file mode 100644 index 91301d9..0000000 --- a/app/src/main/java/com/monke/monkeybook/model/content/SqChapterList.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.monke.monkeybook.model.content; - -public class SqChapterList { - public String getChapterName() { - return chapterName; - } - - public void setChapterName(String chapterName) { - this.chapterName = chapterName; - } - - public String getChapterId() { - return chapterId; - } - - public void setChapterId(String chapterId) { - this.chapterId = chapterId; - } - - private String chapterName; - private String chapterId; -} diff --git a/app/src/main/java/com/monke/monkeybook/service/WebService.java b/app/src/main/java/com/monke/monkeybook/service/WebService.java index e174af1..09b95bf 100644 --- a/app/src/main/java/com/monke/monkeybook/service/WebService.java +++ b/app/src/main/java/com/monke/monkeybook/service/WebService.java @@ -8,9 +8,6 @@ import android.content.Intent; import android.os.IBinder; -import androidx.annotation.Nullable; -import androidx.core.app.NotificationCompat; - import com.monke.monkeybook.MApplication; import com.monke.monkeybook.R; import com.monke.monkeybook.utils.NetworkUtil; @@ -21,6 +18,9 @@ import java.io.IOException; import java.net.InetAddress; +import androidx.annotation.Nullable; +import androidx.core.app.NotificationCompat; + public class WebService extends Service { private static boolean isRunning = false; private HttpServer httpServer; @@ -109,7 +109,7 @@ private PendingIntent getThisServicePendingIntent() { } private int getPort() { - return 1223; + return 1222; } /** diff --git a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java index 4fa7b72..a0eed23 100644 --- a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java +++ b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java @@ -41,7 +41,7 @@ import butterknife.ButterKnife; public class SearchBookActivity extends MBaseActivity implements SearchBookContract.View { - + private final int requestSource = 14; @BindView(R.id.searchView) SearchView searchView; @BindView(R.id.toolbar) @@ -203,14 +203,14 @@ public boolean onCreateOptionsMenu(Menu menu) { } private void initMenu() { if (menu == null) return; - menu.removeGroup(R.id.source_group); - menu.add(R.id.source_group, Menu.NONE, Menu.NONE, R.string.all_source).setIcon(R.drawable.ic_source_manager_black_24dp); + menu.removeGroup(R.id.source_group_so); + menu.add(R.id.source_group_so, Menu.NONE, Menu.NONE, R.string.all_source).setIcon(R.drawable.ic_source_manager_black_24dp); List groupList = BookSourceManager.getInstance().getEnableGroupList(); for (String groupName : groupList) { - menu.add(R.id.source_group, Menu.NONE, Menu.NONE, groupName).setIcon(R.drawable.ic_source_manager_black_24dp); + menu.add(R.id.source_group_so, Menu.NONE, Menu.NONE, groupName).setIcon(R.drawable.ic_source_manager_black_24dp); } - menu.setGroupCheckable(R.id.source_group, true, true); - menu.getItem(1).setChecked(true); + menu.setGroupCheckable(R.id.source_group_so, true, true); + menu.getItem(3).setChecked(true); } @Override public boolean onPrepareOptionsMenu(Menu menu) { @@ -247,7 +247,7 @@ public boolean onOptionsItemSelected(MenuItem item) { finish(); break; default: - if (item.getGroupId() == R.id.source_group) { + if (item.getGroupId() == R.id.source_group_so) { item.setChecked(true); if (Objects.equals(getString(R.string.all_source), item.getTitle().toString())) { group = null; @@ -458,4 +458,14 @@ public void showBookSourceEmptyTip() { } + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + if (requestCode == requestSource) { + initMenu(); + mPresenter.initSearchEngineS(group); + } + } + } } diff --git a/app/src/main/res/menu/menu_search_activity.xml b/app/src/main/res/menu/menu_search_activity.xml index 1892374..3fb5108 100644 --- a/app/src/main/res/menu/menu_search_activity.xml +++ b/app/src/main/res/menu/menu_search_activity.xml @@ -24,5 +24,7 @@ android:title="@string/book_inner_source_sq" app:showAsAction="never" /> + + diff --git a/build.gradle b/build.gradle index 94263fc..621ea3c 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ ext { compile_sdk_version = 28 min_sdk_version = 21 - target_sdk_version = 27 + target_sdk_version = 28 support_library_version = '28.0.0' } @@ -12,7 +12,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.1' + classpath 'com.android.tools.build:gradle:3.4.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' } } From a6dbc4931eeafe586fe4df22e2658c56b62bfb96 Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Mon, 20 May 2019 12:59:14 +0800 Subject: [PATCH 3/7] y --- app/build.gradle | 2 +- .../com/monke/monkeybook/model/SearchBookModel.java | 4 ++-- .../monkeybook/view/activity/SearchBookActivity.java | 2 +- build.gradle | 11 +++++++++-- gradle/wrapper/gradle-wrapper.properties | 2 +- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 3c743c0..cd32fdb 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,7 +62,7 @@ android { } defaultConfig { - applicationId "com.gedoor.monkeybook.super" + applicationId "com.nick.monkeybook.super" minSdkVersion min_sdk_version targetSdkVersion target_sdk_version versionCode currentVersionCode diff --git a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java index 65c7f4f..547df3f 100644 --- a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java +++ b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java @@ -132,8 +132,8 @@ public void startSearch(String query) { clearSearch(); if (searchEngineChanged || searchEngineS.isEmpty()) { - //initSearchEngineS(); - searchHandler.obtainMessage(SearchHandler.MSG_EMPTY).sendToTarget(); + initSearchEngineS(); + //searchHandler.obtainMessage(SearchHandler.MSG_EMPTY).sendToTarget(); } else { for (SearchEngine searchEngine : searchEngineS) { searchEngine.searchReset(); diff --git a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java index e36d0d3..0c40caa 100644 --- a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java +++ b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java @@ -44,7 +44,7 @@ import butterknife.ButterKnife; public class SearchBookActivity extends MBaseActivity implements SearchBookContract.View { - private final int requestSource = 14; + @BindView(R.id.searchView) SearchView searchView; @BindView(R.id.toolbar) diff --git a/build.gradle b/build.gradle index 621ea3c..34c36b2 100644 --- a/build.gradle +++ b/build.gradle @@ -7,12 +7,16 @@ ext { buildscript { repositories { + maven { url "https://maven.aliyun.com/nexus/content/groups/public/" } + maven { url "https://maven.aliyun.com/nexus/content/repositories/google" } + maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter" } + maven { url "https://maven.aliyun.com/nexus/content/repositories/gradle-plugin" } google() jcenter() mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:3.4.0' + classpath 'com.android.tools.build:gradle:3.4.1' classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' } } @@ -22,7 +26,10 @@ allprojects { flatDir { dirs 'libs' } - + maven { url "https://maven.aliyun.com/nexus/content/groups/public/" } + maven { url "https://maven.aliyun.com/nexus/content/repositories/google" } + maven { url "https://maven.aliyun.com/nexus/content/repositories/jcenter" } + maven { url "https://maven.aliyun.com/nexus/content/repositories/gradle-plugin" } google() jcenter() mavenCentral() diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 3572901..222fc13 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip From 11991bce6f2ce8d55793f0994a8d9bfaac74be20 Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Tue, 21 May 2019 14:22:23 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 9 +++++++++ .../java/com/monke/monkeybook/model/SearchBookModel.java | 4 +--- basemvplib/build.gradle | 1 + 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9218536..4fcaa48 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -115,9 +115,18 @@ configurations.all { } } } +repositories { + flatDir { + dirs 'libs' + } +} dependencies { implementation project(':basemvplib') + //implementation fileTree(dir: 'libs', include: ['*.jar']) + //implementation(name:'material-1.1.0-alpha06', ext:'aar') + //implementation(name:'glide-4.9.0', ext:'aar') + testImplementation 'junit:junit:4.12' //support implementation 'androidx.cardview:cardview:1.0.0' diff --git a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java index c8730b4..fb77864 100644 --- a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java +++ b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java @@ -116,9 +116,7 @@ public void initSearchEngineS() { if (searchBookType != null && !TextUtils.equals(bookSourceBean.getBookSourceType(), searchBookType)) { continue; } - if (bookSourceBean.getEnable()) { - searchEngineS.add(new SearchEngine(bookSourceBean.getBookSourceUrl())); - } + searchEngineS.add(new SearchEngine(bookSourceBean.getBookSourceUrl())); } } searchEngineChanged = false; diff --git a/basemvplib/build.gradle b/basemvplib/build.gradle index 054c265..e52800e 100644 --- a/basemvplib/build.gradle +++ b/basemvplib/build.gradle @@ -24,6 +24,7 @@ android { } dependencies { + //api fileTree(dir: 'libs', include: ['*.jar']) //support api 'androidx.core:core:1.2.0-alpha01' api 'androidx.appcompat:appcompat:1.1.0-alpha05' From 963cf2699f99626b96a8cb049663314b508cd3ac Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Wed, 19 Jun 2019 17:31:46 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E7=AB=A0=E8=8A=82=E4=B8=8E=E5=B7=B2=E9=98=85=E8=AF=BB=E7=AB=A0?= =?UTF-8?q?=E8=8A=82=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monke/monkeybook/bean/BookShelfBean.java | 6 + .../view/adapter/BookShelfGridAdapter.java | 17 +- .../view/adapter/BookShelfListAdapter.java | 19 +- .../monke/monkeybook/widget/BadgeView.java | 233 ++++++++++++++++++ .../main/res/layout/item_bookshelf_grid.xml | 20 +- .../main/res/layout/item_bookshelf_list.xml | 48 ++-- app/src/main/res/values/common_colors.xml | 2 +- 7 files changed, 288 insertions(+), 57 deletions(-) create mode 100644 app/src/main/java/com/monke/monkeybook/widget/BadgeView.java diff --git a/app/src/main/java/com/monke/monkeybook/bean/BookShelfBean.java b/app/src/main/java/com/monke/monkeybook/bean/BookShelfBean.java index e744160..2d3f24f 100644 --- a/app/src/main/java/com/monke/monkeybook/bean/BookShelfBean.java +++ b/app/src/main/java/com/monke/monkeybook/bean/BookShelfBean.java @@ -522,4 +522,10 @@ public String getVariable(String key) { } return variableStore.getVariable(key); } + + + public int getUnreadChapterNum() { + int num = getChapterListSize() - getDurChapter() - 1; + return num < 0 ? 0 : num; + } } \ No newline at end of file diff --git a/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfGridAdapter.java b/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfGridAdapter.java index 5ce0705..b86912e 100644 --- a/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfGridAdapter.java +++ b/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfGridAdapter.java @@ -17,6 +17,7 @@ import com.monke.monkeybook.R; import com.monke.monkeybook.bean.BookShelfBean; import com.monke.monkeybook.view.adapter.base.BaseBookListAdapter; +import com.monke.monkeybook.widget.BadgeView; import com.monke.monkeybook.widget.RotateLoading; import java.util.List; @@ -63,22 +64,22 @@ public void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNul } if (item.isFlag()) { + holder.tvHasNew.setVisibility(View.INVISIBLE); holder.rotateLoading.setVisibility(View.VISIBLE); } else { + if (item.getHasUpdate() && !item.isLocalBook()) { + holder.tvHasNew.setBadgeCount(item.getNewChapters()); + } else { + holder.tvHasNew.setBadgeCount(item.getUnreadChapterNum()); + } + holder.tvHasNew.setHighlight(item.getHasUpdate()); holder.rotateLoading.setVisibility(View.INVISIBLE); } - - if (item.getHasUpdate() && !item.isLocalBook()) { - holder.tvHasNew.setVisibility(View.VISIBLE); - } else { - holder.tvHasNew.setVisibility(View.INVISIBLE); - } - } public static class MyViewHolder extends RecyclerView.ViewHolder { ImageView ivCover; - TextView tvHasNew; + BadgeView tvHasNew; TextView tvName; RotateLoading rotateLoading; public View content; diff --git a/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfListAdapter.java b/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfListAdapter.java index ce379c9..568e001 100644 --- a/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfListAdapter.java +++ b/app/src/main/java/com/monke/monkeybook/view/adapter/BookShelfListAdapter.java @@ -23,6 +23,7 @@ import com.monke.monkeybook.bean.BookShelfBean; import com.monke.monkeybook.model.annotation.BookType; import com.monke.monkeybook.view.adapter.base.BaseBookListAdapter; +import com.monke.monkeybook.widget.BadgeView; import com.monke.monkeybook.widget.RotateLoading; import java.util.List; @@ -92,17 +93,17 @@ public void onBindViewHolder(@NonNull MyViewHolder holder, int position, @NonNul } if (item.isFlag()) { + holder.tvHasNew.setVisibility(View.INVISIBLE); holder.rotateLoading.setVisibility(View.VISIBLE); } else { + if (item.getHasUpdate() && !item.isLocalBook()) { + holder.tvHasNew.setBadgeCount(item.getNewChapters()); + } else { + holder.tvHasNew.setBadgeCount(item.getUnreadChapterNum()); + } + holder.tvHasNew.setHighlight(item.getHasUpdate()); holder.rotateLoading.setVisibility(View.INVISIBLE); } - - if (item.getHasUpdate() && !item.isLocalBook()) { - holder.tvHasNew.setVisibility(View.VISIBLE); - } else { - holder.tvHasNew.setVisibility(View.INVISIBLE); - } - } private SpannableStringBuilder getBookName(String name, int newChapters) { @@ -113,13 +114,13 @@ private SpannableStringBuilder getBookName(String name, int newChapters) { SpannableString chaptersSpan = new SpannableString(String.format(Locale.getDefault(), "(新增%d章)", newChapters)); chaptersSpan.setSpan(new RelativeSizeSpan(0.75f), 0, chaptersSpan.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); chaptersSpan.setSpan(new ForegroundColorSpan(getContext().getResources().getColor(R.color.colorTextSecondary)), 0, chaptersSpan.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - sbs.append(chaptersSpan); + //sbs.append(chaptersSpan); return sbs; } public static class MyViewHolder extends RecyclerView.ViewHolder { ImageView ivCover; - TextView tvHasNew; + BadgeView tvHasNew; TextView tvName; TextView tvAuthor; TextView tvRead; diff --git a/app/src/main/java/com/monke/monkeybook/widget/BadgeView.java b/app/src/main/java/com/monke/monkeybook/widget/BadgeView.java new file mode 100644 index 0000000..34c5ae8 --- /dev/null +++ b/app/src/main/java/com/monke/monkeybook/widget/BadgeView.java @@ -0,0 +1,233 @@ +package com.monke.monkeybook.widget; + +import android.content.Context; +import android.graphics.Color; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RoundRectShape; +import android.text.TextUtils; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.Gravity; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; +import android.widget.FrameLayout.LayoutParams; +import android.widget.TabWidget; + +import androidx.appcompat.widget.AppCompatTextView; + +import com.monke.monkeybook.R; + + +/** + * Created by milad heydari on 5/6/2016. + */ +public class BadgeView extends AppCompatTextView { + + private boolean mHideOnNull = true; + private float radius; + + public BadgeView(Context context) { + this(context, null); + } + + public BadgeView(Context context, AttributeSet attrs) { + this(context, attrs, android.R.attr.textViewStyle); + } + + public BadgeView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + + init(); + } + + private void init() { + if (!(getLayoutParams() instanceof LayoutParams)) { + LayoutParams layoutParams = + new LayoutParams( + ViewGroup.LayoutParams.WRAP_CONTENT, + ViewGroup.LayoutParams.WRAP_CONTENT, + Gravity.CENTER); + setLayoutParams(layoutParams); + } + + // set default font + setTextColor(Color.WHITE); + //setTypeface(Typeface.DEFAULT_BOLD); + setTextSize(TypedValue.COMPLEX_UNIT_SP, 11); + setPadding(dip2Px(5), dip2Px(1), dip2Px(5), dip2Px(1)); + radius = 8; + + // set default background + setBackground(radius, Color.parseColor("#d3321b")); + + setGravity(Gravity.CENTER); + + // default values + setHideOnNull(true); + setBadgeCount(0); + setMinWidth(dip2Px(16)); + setMinHeight(dip2Px(16)); + } + + public void setBackground(float dipRadius, int badgeColor) { + int radius = dip2Px(dipRadius); + float[] radiusArray = new float[]{radius, radius, radius, radius, radius, radius, radius, radius}; + + RoundRectShape roundRect = new RoundRectShape(radiusArray, null, null); + ShapeDrawable bgDrawable = new ShapeDrawable(roundRect); + bgDrawable.getPaint().setColor(badgeColor); + setBackground(bgDrawable); + } + + public void setBackground(int badgeColor) { + setBackground(radius, badgeColor); + } + + /** + * @return Returns true if view is hidden on badge value 0 or null; + */ + public boolean isHideOnNull() { + return mHideOnNull; + } + + /** + * @param hideOnNull the hideOnNull to set + */ + public void setHideOnNull(boolean hideOnNull) { + mHideOnNull = hideOnNull; + setText(getText()); + } + + /** + * @see android.widget.TextView#setText(java.lang.CharSequence, android.widget.TextView.BufferType) + */ + @Override + public void setText(CharSequence text, BufferType type) { + if (isHideOnNull() && TextUtils.isEmpty(text)) { + setVisibility(GONE); + } else { + setVisibility(VISIBLE); + } + super.setText(text, type); + } + + public void setBadgeCount(int count) { + setText(String.valueOf(count)); + if (count == 0) { + setVisibility(GONE); + } + } + + public void setHighlight(boolean highlight) { + setBackground(getResources().getColor(highlight ? R.color.light_green : R.color.darker_gray)); + } + + public Integer getBadgeCount() { + if (getText() == null) { + return null; + } + String text = getText().toString(); + try { + return Integer.parseInt(text); + } catch (NumberFormatException e) { + return null; + } + } + + public void setBadgeGravity(int gravity) { + LayoutParams params = (LayoutParams) getLayoutParams(); + params.gravity = gravity; + setLayoutParams(params); + } + + public int getBadgeGravity() { + LayoutParams params = (LayoutParams) getLayoutParams(); + return params.gravity; + } + + public void setBadgeMargin(int dipMargin) { + setBadgeMargin(dipMargin, dipMargin, dipMargin, dipMargin); + } + + public void setBadgeMargin(int leftDipMargin, int topDipMargin, int rightDipMargin, int bottomDipMargin) { + LayoutParams params = (LayoutParams) getLayoutParams(); + params.leftMargin = dip2Px(leftDipMargin); + params.topMargin = dip2Px(topDipMargin); + params.rightMargin = dip2Px(rightDipMargin); + params.bottomMargin = dip2Px(bottomDipMargin); + setLayoutParams(params); + } + + public int[] getBadgeMargin() { + LayoutParams params = (LayoutParams) getLayoutParams(); + return new int[]{params.leftMargin, params.topMargin, params.rightMargin, params.bottomMargin}; + } + + public void incrementBadgeCount(int increment) { + Integer count = getBadgeCount(); + if (count == null) { + setBadgeCount(increment); + } else { + setBadgeCount(increment + count); + } + } + + public void decrementBadgeCount(int decrement) { + incrementBadgeCount(-decrement); + } + + /** + * Attach the BadgeView to the TabWidget + * @param target the TabWidget to attach the BadgeView + * @param tabIndex index of the tab + */ + public void setTargetView(TabWidget target, int tabIndex) { + View tabView = target.getChildTabViewAt(tabIndex); + setTargetView(tabView); + } + + /** + * Attach the BadgeView to the target view + * @param target the view to attach the BadgeView + */ + public void setTargetView(View target) { + if (getParent() != null) { + ((ViewGroup) getParent()).removeView(this); + } + + if (target == null) { + return; + } + + if (target.getParent() instanceof FrameLayout) { + ((FrameLayout) target.getParent()).addView(this); + + } else if (target.getParent() instanceof ViewGroup) { + // use a new Framelayout container for adding badge + ViewGroup parentContainer = (ViewGroup) target.getParent(); + int groupIndex = parentContainer.indexOfChild(target); + parentContainer.removeView(target); + + FrameLayout badgeContainer = new FrameLayout(getContext()); + ViewGroup.LayoutParams parentLayoutParams = target.getLayoutParams(); + + badgeContainer.setLayoutParams(parentLayoutParams); + target.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); + + parentContainer.addView(badgeContainer, groupIndex, parentLayoutParams); + badgeContainer.addView(target); + + badgeContainer.addView(this); + } + + } + + /** + * converts dip to px + */ + private int dip2Px(float dip) { + return (int) (dip * getContext().getResources().getDisplayMetrics().density + 0.5f); + } +} diff --git a/app/src/main/res/layout/item_bookshelf_grid.xml b/app/src/main/res/layout/item_bookshelf_grid.xml index 2680345..f44a64c 100644 --- a/app/src/main/res/layout/item_bookshelf_grid.xml +++ b/app/src/main/res/layout/item_bookshelf_grid.xml @@ -25,22 +25,14 @@ android:transitionName="img_cover" tools:ignore="UnusedAttribute" /> - + tools:ignore="RtlHardcoded" /> - - - - + android:layout_marginEnd="2dp"> + + + diff --git a/app/src/main/res/values/common_colors.xml b/app/src/main/res/values/common_colors.xml index 1e403ec..09b6c76 100644 --- a/app/src/main/res/values/common_colors.xml +++ b/app/src/main/res/values/common_colors.xml @@ -29,5 +29,5 @@ #66ffffff #66000000 #66dddddd - + #aaaaaaaa \ No newline at end of file From 23f176eccc92145fbd3809d10bf421c3d50fdf77 Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Sun, 7 Jul 2019 11:10:39 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/monke/monkeybook/dao/DaoSession.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/monke/monkeybook/dao/DaoSession.java b/app/src/main/java/com/monke/monkeybook/dao/DaoSession.java index e84c211..2b2b471 100644 --- a/app/src/main/java/com/monke/monkeybook/dao/DaoSession.java +++ b/app/src/main/java/com/monke/monkeybook/dao/DaoSession.java @@ -1,22 +1,32 @@ package com.monke.monkeybook.dao; +import java.util.Map; + +import org.greenrobot.greendao.AbstractDao; +import org.greenrobot.greendao.AbstractDaoSession; +import org.greenrobot.greendao.database.Database; +import org.greenrobot.greendao.identityscope.IdentityScopeType; +import org.greenrobot.greendao.internal.DaoConfig; + import com.monke.monkeybook.bean.BookInfoBean; +import com.monke.monkeybook.bean.BookmarkBean; import com.monke.monkeybook.bean.BookShelfBean; import com.monke.monkeybook.bean.BookSourceBean; -import com.monke.monkeybook.bean.BookmarkBean; import com.monke.monkeybook.bean.ChapterBean; import com.monke.monkeybook.bean.CookieBean; import com.monke.monkeybook.bean.ReplaceRuleBean; import com.monke.monkeybook.bean.SearchBookBean; import com.monke.monkeybook.bean.SearchHistoryBean; -import org.greenrobot.greendao.AbstractDao; -import org.greenrobot.greendao.AbstractDaoSession; -import org.greenrobot.greendao.database.Database; -import org.greenrobot.greendao.identityscope.IdentityScopeType; -import org.greenrobot.greendao.internal.DaoConfig; - -import java.util.Map; +import com.monke.monkeybook.dao.BookInfoBeanDao; +import com.monke.monkeybook.dao.BookmarkBeanDao; +import com.monke.monkeybook.dao.BookShelfBeanDao; +import com.monke.monkeybook.dao.BookSourceBeanDao; +import com.monke.monkeybook.dao.ChapterBeanDao; +import com.monke.monkeybook.dao.CookieBeanDao; +import com.monke.monkeybook.dao.ReplaceRuleBeanDao; +import com.monke.monkeybook.dao.SearchBookBeanDao; +import com.monke.monkeybook.dao.SearchHistoryBeanDao; // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. From c8e7447260409e6d51eaea63097c356c8964d6d8 Mon Sep 17 00:00:00 2001 From: foxnick <354435383@qq.com> Date: Sat, 13 Jul 2019 19:39:36 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E5=88=A0=E9=99=A4My716=E5=86=85=E7=BD=AE?= =?UTF-8?q?=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../monke/monkeybook/bean/SearchBookBean.java | 2 +- .../monkeybook/model/SearchBookModel.java | 11 - .../monke/monkeybook/model/WebBookModel.java | 4 - .../monkeybook/model/content/Default716.java | 260 ------------------ .../model/content/DefaultShuqi.java | 6 +- .../monkeybook/model/task/SearchTaskImpl.java | 6 - .../presenter/ReadBookPresenterImpl.java | 8 +- .../presenter/SearchBookPresenterImpl.java | 7 - .../contract/SearchBookContract.java | 2 - .../view/activity/ReadBookActivity.java | 9 +- .../view/activity/SearchBookActivity.java | 9 - .../fragment/dialog/ChangeSourceDialog.java | 1 - .../main/res/menu/menu_search_activity.xml | 6 - app/src/main/res/values/strings.xml | 3 +- 14 files changed, 9 insertions(+), 325 deletions(-) delete mode 100644 app/src/main/java/com/monke/monkeybook/model/content/Default716.java diff --git a/app/src/main/java/com/monke/monkeybook/bean/SearchBookBean.java b/app/src/main/java/com/monke/monkeybook/bean/SearchBookBean.java index c80a468..439d15b 100644 --- a/app/src/main/java/com/monke/monkeybook/bean/SearchBookBean.java +++ b/app/src/main/java/com/monke/monkeybook/bean/SearchBookBean.java @@ -150,7 +150,7 @@ public void setNoteUrl(String noteUrl) { public String getRealNoteUrl() { if (!StringUtils.isBlank(noteUrl) - && noteUrl.startsWith("@716:")) { + && noteUrl.startsWith("@SQi:")) { return noteUrl.substring(5); } return noteUrl; diff --git a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java index 520f21a..1e748c4 100644 --- a/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java +++ b/app/src/main/java/com/monke/monkeybook/model/SearchBookModel.java @@ -13,7 +13,6 @@ import com.monke.monkeybook.bean.SearchEngine; import com.monke.monkeybook.help.AppConfigHelper; import com.monke.monkeybook.model.annotation.BookType; -import com.monke.monkeybook.model.content.Default716; import com.monke.monkeybook.model.content.DefaultShuqi; import com.monke.monkeybook.model.impl.ISearchTask; import com.monke.monkeybook.model.task.SearchTaskImpl; @@ -36,7 +35,6 @@ public class SearchBookModel implements ISearchTask.OnSearchingListener { private String group; private SearchListener searchListener; private boolean searchEngineChanged = false; - private boolean useMy716; private boolean useShuqi; private final List searchEngineS = new ArrayList<>(); private final List searchTasks = new ArrayList<>(); @@ -95,10 +93,6 @@ public void initSearchEngineS() { if (!searchEngineS.isEmpty()) { searchEngineS.clear(); } - - if (useMy716) { - searchEngineS.add(new SearchEngine(Default716.TAG)); - } if (useShuqi) { searchEngineS.add(new SearchEngine(DefaultShuqi.TAG)); } @@ -193,11 +187,6 @@ public SearchBookModel listener(SearchListener listener) { return this; } - public SearchBookModel useMy716(boolean useMy716) { - this.useMy716 = useMy716; - return this; - } - public SearchBookModel useShuqi(boolean useShuqi) { this.useShuqi = useShuqi; return this; diff --git a/app/src/main/java/com/monke/monkeybook/model/WebBookModel.java b/app/src/main/java/com/monke/monkeybook/model/WebBookModel.java index d5c4ac1..095cb66 100644 --- a/app/src/main/java/com/monke/monkeybook/model/WebBookModel.java +++ b/app/src/main/java/com/monke/monkeybook/model/WebBookModel.java @@ -10,7 +10,6 @@ import com.monke.monkeybook.bean.SearchBookBean; import com.monke.monkeybook.help.BookshelfHelp; import com.monke.monkeybook.help.ChapterContentHelp; -import com.monke.monkeybook.model.content.Default716; import com.monke.monkeybook.model.content.DefaultModel; import com.monke.monkeybook.model.content.DefaultShuqi; import com.monke.monkeybook.model.impl.IAudioBookChapterModel; @@ -22,7 +21,6 @@ import java.util.Objects; import io.reactivex.Observable; -import io.reactivex.schedulers.Schedulers; public class WebBookModel implements IWebBookModel { @@ -132,8 +130,6 @@ public Observable> findBook(String tag, String url, int pag private IStationBookModel getBookSourceModel(String tag) { if (BookShelfBean.LOCAL_TAG.equals(tag)) { return null; - } else if (TextUtils.equals(tag, Default716.TAG)) { - return Default716.getInstance(); } else if (TextUtils.equals(tag, DefaultShuqi.TAG)) { return DefaultShuqi.getInstance(); } else { diff --git a/app/src/main/java/com/monke/monkeybook/model/content/Default716.java b/app/src/main/java/com/monke/monkeybook/model/content/Default716.java deleted file mode 100644 index 3cfc0fc..0000000 --- a/app/src/main/java/com/monke/monkeybook/model/content/Default716.java +++ /dev/null @@ -1,260 +0,0 @@ -package com.monke.monkeybook.model.content; - -import android.text.TextUtils; - -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.monke.basemvplib.BaseModelImpl; -import com.monke.basemvplib.OkHttpHelper; -import com.monke.monkeybook.bean.BookContentBean; -import com.monke.monkeybook.bean.BookInfoBean; -import com.monke.monkeybook.bean.BookShelfBean; -import com.monke.monkeybook.bean.ChapterBean; -import com.monke.monkeybook.bean.SearchBookBean; -import com.monke.monkeybook.model.analyzeRule.AnalyzeHeaders; -import com.monke.monkeybook.model.annotation.BookType; -import com.monke.monkeybook.model.impl.IHttpGetApi; -import com.monke.monkeybook.model.impl.IStationBookModel; -import com.monke.monkeybook.utils.StringUtils; - -import org.jsoup.nodes.Element; -import org.seimicrawler.xpath.JXDocument; - -import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Objects; - -import io.reactivex.Observable; -import retrofit2.Response; - -public class Default716 extends BaseModelImpl implements IStationBookModel { - public static final String TAG = "My716"; - - private volatile static Default716 sInstance; - - private Default716() { - } - - public static Default716 getInstance() { - if (sInstance == null) { - synchronized (Default716.class) { - if (sInstance == null) { - sInstance = new Default716(); - } - } - } - return sInstance; - } - - /** - * 发现书籍 - */ - @Override - public Observable> findBook(String url, int page) { - return null; - } - - /** - * 搜索书籍 - */ - @Override - public Observable> searchBook(String content, int page) { - Map queryMap = new HashMap<>(); - queryMap.put("query", content); - return OkHttpHelper.getInstance().createService("http://api.zhuishushenqi.com", IHttpGetApi.class) - .searchBook("http://api.zhuishushenqi.com/book/fuzzy-search", - queryMap, - AnalyzeHeaders.getMap(null)) - .flatMap(this::analyzeSearchBook); - } - - private Observable> analyzeSearchBook(final Response response) { - return Observable.create(e -> { - List searchBookList = new ArrayList<>(); - JsonObject root = new JsonParser().parse(Objects.requireNonNull(response.body())).getAsJsonObject(); - if (root.get("ok").getAsBoolean()) { - JsonArray bookArray = root.get("books").getAsJsonArray(); - for (int i = 0, size = bookArray.size(); i < size; i++) { - JsonObject book = bookArray.get(i).getAsJsonObject(); - SearchBookBean searchBookBean = new SearchBookBean(); - searchBookBean.setTag(TAG); - searchBookBean.setOrigin(TAG); - searchBookBean.setBookType(BookType.TEXT); - searchBookBean.setWeight(Integer.MAX_VALUE); - searchBookBean.setKind(book.get("cat").getAsString()); - searchBookBean.setName(book.get("title").getAsString()); - searchBookBean.setAuthor(book.get("author").getAsString()); - searchBookBean.setNoteUrl("@716:http://api.zhuishushenqi.com/atoc?view=summary&book=" + book.get("_id").getAsString()); - String lastChapter = book.get("lastChapter").getAsString().replaceAll("^\\s*正文[卷:\\s]+", ""); - searchBookBean.setLastChapter(lastChapter); - searchBookBean.setCoverUrl("http://statics.zhuishushenqi.com" + book.get("cover").getAsString()); - searchBookBean.setIntroduce(book.get("shortIntro").getAsString()); - searchBookList.add(searchBookBean); - } - } - e.onNext(searchBookList); - e.onComplete(); - }); - } - - /** - * 网络请求并解析书籍信息 - */ - @Override - public Observable getBookInfo(BookShelfBean bookShelfBean) { - return OkHttpHelper.getInstance().createService("http://api.zhuishushenqi.com", IHttpGetApi.class) - .getWebContent(bookShelfBean.getNoteUrl(), AnalyzeHeaders.getMap(null)) - .flatMap(response -> analyzeBookInfo(response.body(), bookShelfBean)); - } - - private Observable analyzeBookInfo(String s, final BookShelfBean bookShelfBean) { - return Observable.create(e -> { - if (TextUtils.isEmpty(s)) { - e.onError(new Throwable("书籍信息获取失败")); - e.onComplete(); - return; - } - - JsonArray sourceArray = new JsonParser().parse(s).getAsJsonArray(); - HashMap sourceMap = new HashMap<>(); - for (int i = 0, size = sourceArray.size(); i < size; i++) { - JsonObject source = sourceArray.get(i).getAsJsonObject(); - String name = source.get("source").getAsString(); - sourceMap.put(name, source); - } - - JsonObject targetSource = null; - if (sourceMap.containsKey("xbiquge")) { - targetSource = sourceMap.get("xbiquge"); - } else if (sourceMap.containsKey("my176")) { - targetSource = sourceMap.get("my176"); - } else if (sourceMap.containsKey("hunhun")) { - targetSource = sourceMap.get("hunhun"); - } else if (sourceMap.containsKey("sanjiangge")) { - targetSource = sourceMap.get("sanjiangge"); - } else if (sourceMap.containsKey("xiaoxiaoshuwu")) { - targetSource = sourceMap.get("xiaoxiaoshuwu"); - } else if (sourceMap.containsKey("luoqiu")) { - targetSource = sourceMap.get("luoqiu"); - } else if (sourceMap.containsKey("snwx")) { - targetSource = sourceMap.get("snwx"); - } else if (sourceMap.containsKey("tianyibook")) { - targetSource = sourceMap.get("tianyibook"); - } else if (sourceMap.containsKey("shuhaha")) { - targetSource = sourceMap.get("shuhaha"); - } else if (sourceMap.containsKey("lewenwu")) { - targetSource = sourceMap.get("lewenwu"); - } else if (sourceMap.containsKey("zhuishuvip")) { - targetSource = sourceMap.get("zhuishuvip"); - } else if (sourceMap.size() > 0) { - Iterator it = sourceMap.keySet().iterator(); - targetSource = sourceMap.get(it.next()); - } - - if (targetSource != null) { - bookShelfBean.setLastChapterName(targetSource.get("lastChapter").getAsString()); - BookInfoBean bookInfoBean = bookShelfBean.getBookInfoBean(); - bookInfoBean.setBookType(BookType.TEXT); - bookInfoBean.setTag(TAG); - bookInfoBean.setOrigin(TAG); - bookInfoBean.setNoteUrl(bookShelfBean.getNoteUrl()); - bookInfoBean.setChapterListUrl("http://api.zhuishushenqi.com/atoc/" + targetSource.get("_id").getAsString() + "?view=chapters"); - e.onNext(bookShelfBean); - } else { - e.onError(new Throwable("书籍信息获取失败")); - } - e.onComplete(); - }); - } - - /** - * 网络解析图书目录 - */ - @Override - public Observable> getChapterList(BookShelfBean bookShelfBean) { - return OkHttpHelper.getInstance().createService("http://api.zhuishushenqi.com", IHttpGetApi.class) - .getWebContent(bookShelfBean.getBookInfoBean().getChapterListUrl(), AnalyzeHeaders.getMap(null)) - .flatMap(response -> analyzeChapterList(response.body(), bookShelfBean.getNoteUrl())); - } - - private Observable> analyzeChapterList(String s, String noteUrl) { - return Observable.create(e -> { - List chapterList = new ArrayList<>(); - JsonObject root = new JsonParser().parse(s).getAsJsonObject(); - JsonArray chapterArray = root.get("chapters").getAsJsonArray(); - for (JsonElement element : chapterArray) { - JsonObject chapter = element.getAsJsonObject(); - ChapterBean chapterBean = new ChapterBean(); - chapterBean.setDurChapterName(chapter.get("title").getAsString()); - final String link = chapter.get("link").getAsString(); - if (link.contains("vip.zhuishushenqi") - || link.contains("xbiquge")) { - chapterBean.setDurChapterUrl("http://chapterup.zhuishushenqi.com/chapter/" + URLEncoder.encode(link, "UTF-8")); - } else { - chapterBean.setDurChapterUrl(link); - } - chapterBean.setNoteUrl(noteUrl); - chapterList.add(chapterBean); - } - e.onNext(chapterList); - e.onComplete(); - }); - } - - /** - * 章节缓存 - */ - @Override - public Observable getBookContent(String chapterUrl, ChapterBean chapterBean) { - return OkHttpHelper.getInstance().createService(StringUtils.getBaseUrl(chapterBean.getDurChapterUrl()), IHttpGetApi.class) - .getWebContent(chapterBean.getDurChapterUrl(), AnalyzeHeaders.getMap(null)) - .flatMap(response -> analyzeBookContent(response.body(), chapterBean)); - } - - private Observable analyzeBookContent(String s, ChapterBean chapterBean) { - return Observable.create(e -> { - final BookContentBean bookContentBean = new BookContentBean(); - bookContentBean.setDurChapterUrl(chapterBean.getDurChapterUrl()); - bookContentBean.setDurChapterIndex(chapterBean.getDurChapterIndex()); - bookContentBean.setDurChapterName(chapterBean.getDurChapterName()); - bookContentBean.setNoteUrl(chapterBean.getNoteUrl()); - - if (chapterBean.getDurChapterUrl().contains("zhuishushenqi")) { - JsonObject root = new JsonParser().parse(s).getAsJsonObject(); - if (root.get("ok").getAsBoolean()) { - JsonObject chapterJson = root.get("chapter").getAsJsonObject(); - final String result; - if (chapterJson.has("isVip")) { - if (chapterJson.get("isVip").getAsBoolean()) { - result = "当前章节为VIP章节,无法阅读,请换源。"; - } else { - result = chapterJson.get("cpContent").getAsString(); - } - } else { - result = chapterJson.get("body").getAsString(); - } - bookContentBean.appendDurChapterContent(result.replaceAll("\\\\r\\\\n", "")); - } - } else { - JXDocument document = JXDocument.create(s); - Object object = document.selOne("//div[@name=\"content\"] or @id=\"content\" or @class=\"txt_tcontent\" or @id=\"htmlContent\""); - final String result; - if (object instanceof Element) { - result = ((Element) object).html(); - } else { - result = StringUtils.valueOf(object); - } - bookContentBean.appendDurChapterContent(result.replaceAll("\\\\r\\\\n", "")); - } - e.onNext(bookContentBean); - e.onComplete(); - }); - } - -} diff --git a/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java b/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java index 40ae3b1..4b2527a 100644 --- a/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java +++ b/app/src/main/java/com/monke/monkeybook/model/content/DefaultShuqi.java @@ -31,7 +31,7 @@ import io.reactivex.Observable; public class DefaultShuqi extends BaseModelImpl implements IStationBookModel { - public static final String TAG = "ShuQi"; + public static final String TAG = "书旗"; private volatile static DefaultShuqi sInstance; @@ -86,7 +86,7 @@ private Observable> analyzeSearchBook(final String response item.setKind(aladdin.get("category").getAsString()); item.setLastChapter(aladdin.get("latest_chapter").getAsJsonObject().get("cname").getAsString()); item.setName(aladdin.get("title").getAsString()); - item.setNoteUrl(aladdin.get("bid").getAsString()); + item.setNoteUrl("@SQi:"+aladdin.get("bid").getAsString()); item.setCoverUrl(aladdin.get("cover").getAsString().replace("\\/", "/")); item.setIntroduce(aladdin.get("desc").getAsString()); searchBooks.add(item); @@ -106,7 +106,7 @@ private Observable> analyzeSearchBook(final String response item.setKind(book.get("category").getAsString()); item.setLastChapter(book.get("first_chapter").getAsString()); item.setName(book.get("title").getAsString()); - item.setNoteUrl(book.get("bid").getAsString()); + item.setNoteUrl("@SQi:"+book.get("bid").getAsString()); item.setCoverUrl(book.get("cover").getAsString().replace("\\/", "/")); item.setIntroduce(book.get("desc").getAsString()); searchBooks.add(item); diff --git a/app/src/main/java/com/monke/monkeybook/model/task/SearchTaskImpl.java b/app/src/main/java/com/monke/monkeybook/model/task/SearchTaskImpl.java index 81aaeca..d0f722b 100644 --- a/app/src/main/java/com/monke/monkeybook/model/task/SearchTaskImpl.java +++ b/app/src/main/java/com/monke/monkeybook/model/task/SearchTaskImpl.java @@ -9,14 +9,11 @@ import com.monke.monkeybook.dao.DbHelper; import com.monke.monkeybook.model.BookSourceManager; import com.monke.monkeybook.model.WebBookModel; -import com.monke.monkeybook.model.content.Default716; import com.monke.monkeybook.model.content.DefaultShuqi; import com.monke.monkeybook.model.impl.ISearchTask; - import java.util.List; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicInteger; - import io.reactivex.Observable; import io.reactivex.Scheduler; import io.reactivex.disposables.CompositeDisposable; @@ -95,9 +92,6 @@ private void toSearch(String query, Scheduler scheduler) { if (!isDisposed() && !searchBookBeans.isEmpty()) { listener.onSearchResult(searchBookBeans); - if (TextUtils.equals(searchBookBeans.get(0).getTag(), Default716.TAG)) { - hasMore = false; - } if (TextUtils.equals(searchBookBeans.get(0).getTag(), DefaultShuqi.TAG)) { hasMore = false; } diff --git a/app/src/main/java/com/monke/monkeybook/presenter/ReadBookPresenterImpl.java b/app/src/main/java/com/monke/monkeybook/presenter/ReadBookPresenterImpl.java index 9e59c8a..09c2d22 100644 --- a/app/src/main/java/com/monke/monkeybook/presenter/ReadBookPresenterImpl.java +++ b/app/src/main/java/com/monke/monkeybook/presenter/ReadBookPresenterImpl.java @@ -29,7 +29,6 @@ import com.monke.monkeybook.help.RxBusTag; import com.monke.monkeybook.model.BookSourceManager; import com.monke.monkeybook.model.WebBookModel; -import com.monke.monkeybook.model.content.Default716; import com.monke.monkeybook.model.content.DefaultShuqi; import com.monke.monkeybook.presenter.contract.ReadBookContract; import com.monke.monkeybook.service.DownloadService; @@ -96,8 +95,6 @@ public void disableDurBookSource() { try { switch (bookShelf.getTag()) { case BookShelfBean.LOCAL_TAG: - case Default716.TAG: - break; case DefaultShuqi.TAG: break; default: @@ -309,10 +306,7 @@ public void onError(Throwable e) { } private void prepareSync() { - if (TextUtils.equals(bookShelf.getTag(), Default716.TAG) - || bookShelf.isLocalBook()) { - mView.upMenu(); - } else if (TextUtils.equals(bookShelf.getTag(), DefaultShuqi.TAG) + if (TextUtils.equals(bookShelf.getTag(), DefaultShuqi.TAG) || bookShelf.isLocalBook()) { mView.upMenu(); } else { diff --git a/app/src/main/java/com/monke/monkeybook/presenter/SearchBookPresenterImpl.java b/app/src/main/java/com/monke/monkeybook/presenter/SearchBookPresenterImpl.java index df8c243..e21e304 100644 --- a/app/src/main/java/com/monke/monkeybook/presenter/SearchBookPresenterImpl.java +++ b/app/src/main/java/com/monke/monkeybook/presenter/SearchBookPresenterImpl.java @@ -43,7 +43,6 @@ public SearchBookPresenterImpl(Context context) { //搜索引擎初始化 searchBookModel = new SearchBookModel(context) .listener(this) - .useMy716(AppConfigHelper.get().getBoolean("useMy716", true)) .useShuqi(AppConfigHelper.get().getBoolean("useShuqi", true)) .setup(); } @@ -220,12 +219,6 @@ public void stopSearch() { searchBookModel.stopSearch(); } - @Override - public void useMy716(Boolean bool) { - searchBookModel.useMy716(bool); - searchBookModel.notifySearchEngineChanged(); - } - @Override public void useShuqi(Boolean bool) { searchBookModel.useShuqi(bool); diff --git a/app/src/main/java/com/monke/monkeybook/presenter/contract/SearchBookContract.java b/app/src/main/java/com/monke/monkeybook/presenter/contract/SearchBookContract.java index e4f1732..2cfd61b 100644 --- a/app/src/main/java/com/monke/monkeybook/presenter/contract/SearchBookContract.java +++ b/app/src/main/java/com/monke/monkeybook/presenter/contract/SearchBookContract.java @@ -28,8 +28,6 @@ interface Presenter extends IPresenter { void stopSearch(); - void useMy716(Boolean bool); - void useShuqi(Boolean bool); } diff --git a/app/src/main/java/com/monke/monkeybook/view/activity/ReadBookActivity.java b/app/src/main/java/com/monke/monkeybook/view/activity/ReadBookActivity.java index cca7cc7..2005c0c 100644 --- a/app/src/main/java/com/monke/monkeybook/view/activity/ReadBookActivity.java +++ b/app/src/main/java/com/monke/monkeybook/view/activity/ReadBookActivity.java @@ -47,7 +47,7 @@ import com.monke.monkeybook.help.BitIntentDataManager; import com.monke.monkeybook.help.BookShelfHolder; import com.monke.monkeybook.help.ReadBookControl; -import com.monke.monkeybook.model.content.Default716; + import com.monke.monkeybook.model.content.DefaultShuqi; import com.monke.monkeybook.presenter.ReadBookPresenterImpl; import com.monke.monkeybook.presenter.contract.ReadBookContract; @@ -1042,14 +1042,11 @@ public boolean onPrepareOptionsMenu(Menu menu) { } } final boolean defaultShuqi = DefaultShuqi.TAG.equals(mPresenter.getBookShelf().getTag()); - final boolean default716 = Default716.TAG.equals(mPresenter.getBookShelf().getTag()); + MenuItem disableSourceItem = menu.findItem(R.id.disable_book_source); - if (default716 || defaultShuqi) { + if (defaultShuqi) { disableSourceItem.setVisible(false); disableSourceItem.setEnabled(false); - } else { - disableSourceItem.setVisible(true); - disableSourceItem.setEnabled(true); } } return super.onPrepareOptionsMenu(menu); diff --git a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java index 83c375c..86db060 100644 --- a/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java +++ b/app/src/main/java/com/monke/monkeybook/view/activity/SearchBookActivity.java @@ -249,10 +249,6 @@ public void upMenu() { @Override public boolean onPrepareOptionsMenu(Menu menu) { - MenuItem my716 = menu.findItem(R.id.action_book_my716); - if (my716 != null) { - my716.setChecked(AppConfigHelper.get().getBoolean("useMy716", true)); - } MenuItem shuqi = menu.findItem(R.id.action_book_shuqi); if (shuqi != null) { shuqi.setChecked(AppConfigHelper.get().getBoolean("useShuqi", true)); @@ -269,11 +265,6 @@ public boolean onOptionsItemSelected(MenuItem item) { case R.id.action_book_source_manage: BookSourceActivity.startThis(this); break; - case R.id.action_book_my716: - item.setChecked(!item.isChecked()); - AppConfigHelper.get().edit().putBoolean("useMy716", item.isChecked()).apply(); - mPresenter.useMy716(item.isChecked()); - break; case R.id.action_book_shuqi: item.setChecked(!item.isChecked()); AppConfigHelper.get().edit().putBoolean("useShuqi", item.isChecked()).apply(); diff --git a/app/src/main/java/com/monke/monkeybook/view/fragment/dialog/ChangeSourceDialog.java b/app/src/main/java/com/monke/monkeybook/view/fragment/dialog/ChangeSourceDialog.java index 0d15a9f..d0616e8 100644 --- a/app/src/main/java/com/monke/monkeybook/view/fragment/dialog/ChangeSourceDialog.java +++ b/app/src/main/java/com/monke/monkeybook/view/fragment/dialog/ChangeSourceDialog.java @@ -87,7 +87,6 @@ public void onCreate(@Nullable Bundle savedInstanceState) { searchBookModel = new SearchBookModel(requireContext()) .onlyOnePage() - .useMy716(true) .useShuqi(true) .setSearchBookType(selectCover ? null : bookInfo.getBookType()) .listener(this) diff --git a/app/src/main/res/menu/menu_search_activity.xml b/app/src/main/res/menu/menu_search_activity.xml index 5721a20..ad3c65d 100644 --- a/app/src/main/res/menu/menu_search_activity.xml +++ b/app/src/main/res/menu/menu_search_activity.xml @@ -14,12 +14,6 @@ android:title="@string/book_inner_source"> - - 全部 内置书源 外置书源 - My716 - ShuQi + 书旗 设置 关于 捐赠