From 3166cbd88b69ea42ee677edf8766e285a6e47b64 Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 15 May 2020 16:57:48 +0800 Subject: [PATCH 01/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/rss/article/RssSortActivity.kt | 41 +------------------ app/src/main/res/menu/rss_articles.xml | 4 -- 2 files changed, 1 insertion(+), 44 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt index d7c7087d4..2d45bcd70 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt @@ -17,7 +17,6 @@ import io.legado.app.utils.gone import io.legado.app.utils.visible import kotlinx.android.synthetic.main.activity_rss_artivles.* import org.jetbrains.anko.startActivityForResult -import java.util.* class RssSortActivity : VMBaseActivity(R.layout.activity_rss_artivles) { @@ -26,8 +25,6 @@ class RssSortActivity : VMBaseActivity(R.layout.activity_rss_a private val editSource = 12319 private val fragments = linkedMapOf() private lateinit var adapter: TabFragmentPageAdapter - private val channels = LinkedHashMap() - private var groupMenu: Menu? = null override fun onActivityCreated(savedInstanceState: Bundle?) { adapter = TabFragmentPageAdapter(supportFragmentManager) @@ -37,7 +34,6 @@ class RssSortActivity : VMBaseActivity(R.layout.activity_rss_a title_bar.title = it }) viewModel.initData(intent) { - upChannelMenu() upFragments() } } @@ -47,12 +43,6 @@ class RssSortActivity : VMBaseActivity(R.layout.activity_rss_a return super.onCompatCreateOptionsMenu(menu) } - override fun onPrepareOptionsMenu(menu: Menu?): Boolean { - groupMenu = menu - upChannelMenu() - return super.onPrepareOptionsMenu(menu) - } - override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let { @@ -64,44 +54,15 @@ class RssSortActivity : VMBaseActivity(R.layout.activity_rss_a } } } - if (item.groupId == R.id.source_channel) { - val key = item.title.toString(); - val i = fragments.keys.indexOf(key) - if (i >= 0) - view_pager.currentItem = i - } return super.onCompatOptionsItemSelected(item) } - private fun upChannelMenu() { - // 加入频道列表 - groupMenu?.removeGroup(R.id.source_channel) - val sourceChannel = viewModel.rssSource?.sourceGroup - channels.clear() - sourceChannel?.split("\n\n")?.forEach { c -> - val d = c.split("::") - if (d.size > 1) { - channels[d[0]] = d[1] - val item = groupMenu?.add(R.id.source_channel, Menu.NONE, Menu.NONE, d[0]) - item?.isCheckable = true - val keys = fragments.keys - item?.isChecked = keys.indexOf(d[0]) == view_pager.currentItem - } - } - } - private fun upFragments() { fragments.clear() viewModel.rssSource?.sortUrls()?.forEach { fragments[it.key] = RssArticlesFragment.create(it.key, it.value) } - val sortUrlsSize = fragments.size - if (sortUrlsSize <= 1) { - channels.forEach { - fragments[it.key] = RssArticlesFragment.create(it.key, it.value) - } - } - if (sortUrlsSize == 1) { + if (fragments.size == 1) { tab_layout.gone() } else { tab_layout.visible() diff --git a/app/src/main/res/menu/rss_articles.xml b/app/src/main/res/menu/rss_articles.xml index 831b908a5..03d187bcd 100644 --- a/app/src/main/res/menu/rss_articles.xml +++ b/app/src/main/res/menu/rss_articles.xml @@ -12,8 +12,4 @@ android:title="@string/clear" app:showAsAction="never" /> - - - - \ No newline at end of file From 9222c4b73b943dba8f04a98a26e3e5b7f080863b Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 15 May 2020 17:45:53 +0800 Subject: [PATCH 02/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - app/src/main/assets/18PlusList.txt | 2 ++ .../java/io/legado/app/help/SourceHelp.kt | 20 +++++++++++-------- 3 files changed, 14 insertions(+), 9 deletions(-) create mode 100644 app/src/main/assets/18PlusList.txt diff --git a/.gitignore b/.gitignore index d32290ef4..700c700fe 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,3 @@ node_modules/ /app/google /app/gradle.properties package-lock.json -18PlusList.txt diff --git a/app/src/main/assets/18PlusList.txt b/app/src/main/assets/18PlusList.txt new file mode 100644 index 000000000..7776c3b14 --- /dev/null +++ b/app/src/main/assets/18PlusList.txt @@ -0,0 +1,2 @@ +OGN5dS5jb20= +c2cwMC54eXo= \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/help/SourceHelp.kt b/app/src/main/java/io/legado/app/help/SourceHelp.kt index 4cd1ca831..bdb883b10 100644 --- a/app/src/main/java/io/legado/app/help/SourceHelp.kt +++ b/app/src/main/java/io/legado/app/help/SourceHelp.kt @@ -3,8 +3,9 @@ package io.legado.app.help import android.os.Handler import android.os.Looper import io.legado.app.App -import io.legado.app.data.entities.BookSource import io.legado.app.data.entities.RssSource +import io.legado.app.utils.EncoderUtils +import io.legado.app.utils.NetworkUtils import io.legado.app.utils.splitNotBlank import org.jetbrains.anko.toast @@ -32,17 +33,20 @@ object SourceHelp { } } - fun insertBookSource(vararg bookSources: BookSource) { - App.db.bookSourceDao().insert(*bookSources) - } - private fun is18Plus(url: String?): Boolean { url ?: return false if (AppConfig.isGooglePlay) return false - list18Plus.forEach { - if (url.contains(it)) { - return true + val baseUrl = NetworkUtils.getBaseUrl(url) + baseUrl ?: return false + try { + val host = baseUrl.split("//", ".") + val base64Url = EncoderUtils.base64Encode("${host[host.lastIndex - 1]}.${host.last()}") + list18Plus.forEach { + if (base64Url == it) { + return true + } } + } catch (e: Exception) { } return false } From 2b187b63954e6c2514a42d05d736d50ac93b2737 Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 15 May 2020 18:03:59 +0800 Subject: [PATCH 03/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/storage/OldRule.kt | 4 +++- .../app/ui/book/source/manage/BookSourceViewModel.kt | 8 ++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/storage/OldRule.kt b/app/src/main/java/io/legado/app/help/storage/OldRule.kt index f5919eb2c..b69b35526 100644 --- a/app/src/main/java/io/legado/app/help/storage/OldRule.kt +++ b/app/src/main/java/io/legado/app/help/storage/OldRule.kt @@ -20,7 +20,7 @@ object OldRule { } catch (e: Exception) { null } - runCatching { + try { if (sourceAny?.ruleToc == null) { source.apply { val jsonItem = jsonPath.parse(json.trim()) @@ -125,6 +125,8 @@ object OldRule { GSON.fromJsonObject(GSON.toJson(sourceAny.ruleContent)) } } + } catch (e: Exception) { + e.printStackTrace() } return source } diff --git a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt index 5077a71cf..c6dc63c8e 100644 --- a/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/source/manage/BookSourceViewModel.kt @@ -233,6 +233,7 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) else -> "格式不对" } }.onError { + it.printStackTrace() finally(it.localizedMessage ?: "") }.onSuccess { finally(it) @@ -240,7 +241,11 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) } private fun importSourceUrl(url: String): Int { - HttpHelper.simpleGet(url, "UTF-8")?.let { body -> + HttpHelper.simpleGet(url, "UTF-8").let { body -> + if (body == null) { + toast("访问网站失败") + return 0 + } val bookSources = mutableListOf() val items: List> = jsonPath.parse(body).read("$") for (item in items) { @@ -252,6 +257,5 @@ class BookSourceViewModel(application: Application) : BaseViewModel(application) App.db.bookSourceDao().insert(*bookSources.toTypedArray()) return bookSources.size } - return 0 } } \ No newline at end of file From 4ea0bc893742dc53feaddcf31bc37917ce2375a5 Mon Sep 17 00:00:00 2001 From: kunfei Date: Fri, 15 May 2020 18:11:18 +0800 Subject: [PATCH 04/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/http/HttpHelper.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt index 31064e268..173a450c1 100644 --- a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt +++ b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt @@ -43,7 +43,11 @@ object HttpHelper { val response = getApiService(baseUrl, encode) .get(url, mapOf()) .execute() - return response.body() + return if (response.body() != null) { + response.body() + } else { + response.errorBody().toString() + } } return null } From d23344f6af207e553487e2943203fa2f450c88f4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 18:13:50 +0800 Subject: [PATCH 05/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookActivity.kt | 22 ++++++++++++++++++- .../page/delegate/HorizontalPageDelegate.kt | 4 ++-- .../book/read/page/delegate/PageDelegate.kt | 8 ++----- .../read/page/delegate/ScrollPageDelegate.kt | 4 ++-- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index e8835130a..6d39baa83 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -85,7 +85,9 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo private val mHandler = Handler() private val keepScreenRunnable: Runnable = Runnable { Help.keepScreenOn(window, false) } - + private val autoPageRunnable: Runnable = Runnable { autoPagePlus() } + private var autoPageProgress = 0 + private var isAutoPage = false private var screenTimeOut: Long = 0 private var timeBatteryReceiver: TimeBatteryReceiver? = null override val pageFactory: TextPageFactory get() = page_view.pageFactory @@ -558,7 +560,25 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo * 自动翻页 */ override fun autoPage() { + if (isAutoPage) { + isAutoPage = false + mHandler.removeCallbacks(autoPageRunnable) + page_view.upContent() + } else { + isAutoPage = true + autoPagePlus() + } + read_menu.setAutoPage(isAutoPage) + } + private fun autoPagePlus() { + mHandler.removeCallbacks(autoPageRunnable) + autoPageProgress++ + if (autoPageProgress >= 46) { + autoPageProgress = 0 + ReadBook.moveToNextPage() + } + mHandler.postDelayed(autoPageRunnable, 100) } /** diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt index f8f9bec74..774f522be 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/HorizontalPageDelegate.kt @@ -104,7 +104,7 @@ abstract class HorizontalPageDelegate(pageView: PageView) : PageDelegate(pageVie } override fun nextPageByAnim() { - super.nextPageByAnim() + abort() if (!hasNext()) return setDirection(Direction.NEXT) setTouchPoint(viewWidth.toFloat(), 0f) @@ -112,7 +112,7 @@ abstract class HorizontalPageDelegate(pageView: PageView) : PageDelegate(pageVie } override fun prevPageByAnim() { - super.prevPageByAnim() + abort() if (!hasPrev()) return setDirection(Direction.PREV) setTouchPoint(0f, 0f) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt index cd455b641..2f3bf9728 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/PageDelegate.kt @@ -170,13 +170,9 @@ abstract class PageDelegate(protected val pageView: PageView) : open fun onScroll() {}//移动contentView, slidePage - open fun nextPageByAnim() { - abort() - } + abstract fun nextPageByAnim() - open fun prevPageByAnim() { - abort() - } + abstract fun prevPageByAnim() open fun keyTurnPage(direction: Direction) { if (isRunning) return diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt index 3fa333cbf..b00578ec2 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/delegate/ScrollPageDelegate.kt @@ -79,12 +79,12 @@ class ScrollPageDelegate(pageView: PageView) : PageDelegate(pageView) { } override fun nextPageByAnim() { - super.nextPageByAnim() + abort() startScroll(0, 0, 0, -ChapterProvider.visibleHeight) } override fun prevPageByAnim() { - super.prevPageByAnim() + abort() startScroll(0, 0, 0, ChapterProvider.visibleHeight) } } \ No newline at end of file From d9437164871f5e9f1c17b359d161c1974614d86d Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 18:55:26 +0800 Subject: [PATCH 06/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/read/ReadBookActivity.kt | 8 +++++--- .../java/io/legado/app/ui/book/read/ReadMenu.kt | 6 +++++- .../io/legado/app/ui/book/read/page/PageView.kt | 13 ++++++++++++- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 6d39baa83..886f7938f 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -86,8 +86,8 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo private val mHandler = Handler() private val keepScreenRunnable: Runnable = Runnable { Help.keepScreenOn(window, false) } private val autoPageRunnable: Runnable = Runnable { autoPagePlus() } - private var autoPageProgress = 0 - private var isAutoPage = false + override var autoPageProgress = 0 + override var isAutoPage = false private var screenTimeOut: Long = 0 private var timeBatteryReceiver: TimeBatteryReceiver? = null override val pageFactory: TextPageFactory get() = page_view.pageFactory @@ -574,9 +574,11 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo private fun autoPagePlus() { mHandler.removeCallbacks(autoPageRunnable) autoPageProgress++ - if (autoPageProgress >= 46) { + if (autoPageProgress >= 460) { autoPageProgress = 0 ReadBook.moveToNextPage() + } else { + page_view.invalidate() } mHandler.postDelayed(autoPageRunnable, 100) } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt index 254d037ad..317af6aab 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadMenu.kt @@ -140,7 +140,11 @@ class ReadMenu : FrameLayout { }) //自动翻页 - fabAutoPage.onClick { callBack?.autoPage() } + fabAutoPage.onClick { + runMenuOut { + callBack?.autoPage() + } + } //替换 fabReplaceRule.onClick { callBack?.openReplaceRule() } diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 3a996bfe9..3be9bf48c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -3,6 +3,7 @@ package io.legado.app.ui.book.read.page import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas +import android.graphics.Rect import android.util.AttributeSet import android.view.MotionEvent import android.widget.FrameLayout @@ -11,6 +12,8 @@ import io.legado.app.service.help.ReadBook import io.legado.app.ui.book.read.page.delegate.* import io.legado.app.ui.book.read.page.entities.TextChapter import io.legado.app.utils.activity +import io.legado.app.utils.screenshot +import kotlinx.android.synthetic.main.activity_book_read.view.* class PageView(context: Context, attrs: AttributeSet) : FrameLayout(context, attrs), @@ -44,8 +47,14 @@ class PageView(context: Context, attrs: AttributeSet) : override fun dispatchDraw(canvas: Canvas) { super.dispatchDraw(canvas) - pageDelegate?.onDraw(canvas) + if (callBack.isAutoPage) { + nextPage.screenshot()?.let { + val rect = + Rect(0, 0, page_view.width, page_view.height * callBack.autoPageProgress / 460) + canvas.drawBitmap(it, rect, rect, null) + } + } } override fun computeScroll() { @@ -169,6 +178,8 @@ class PageView(context: Context, attrs: AttributeSet) : interface CallBack { val isInitFinish: Boolean + val isAutoPage: Boolean + val autoPageProgress: Int fun clickCenter() fun screenOffTimerStart() fun showTextActionMenu() From 528b0ac45b0209a3c6367e7a17b574bbc7cbd079 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 19:07:39 +0800 Subject: [PATCH 07/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/book/read/ReadBookActivity.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 886f7938f..f2830dc52 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -346,6 +346,10 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo toast(R.string.read_aloud_pause) return true } + if (isAutoPage) { + autoPageStop() + return true + } } } } @@ -561,9 +565,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo */ override fun autoPage() { if (isAutoPage) { - isAutoPage = false - mHandler.removeCallbacks(autoPageRunnable) - page_view.upContent() + autoPageStop() } else { isAutoPage = true autoPagePlus() @@ -571,6 +573,12 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo read_menu.setAutoPage(isAutoPage) } + private fun autoPageStop() { + isAutoPage = false + mHandler.removeCallbacks(autoPageRunnable) + page_view.upContent() + } + private fun autoPagePlus() { mHandler.removeCallbacks(autoPageRunnable) autoPageProgress++ From 873e61b4ee3eac00204c3d982c5c486bd98edfdd Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 19:08:28 +0800 Subject: [PATCH 08/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 1b9ae3c09..dbec02060 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 请关注公众号[开源阅读]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 * 新公众号[开源阅读]()已启用,[开源阅读软件]()备用 +**2020/05/17** +* 自动翻页功能完成 + **2020/05/10** * 添加识别rss分组中的频道信息,在菜单中可以切换频道 from yangyxd * 源管理添加置底,批量置顶,批量置地 From 7e111fc4aadcc228d66faa76236f74f110fbacb1 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 19:21:09 +0800 Subject: [PATCH 09/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/read/page/PageView.kt | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt index 3be9bf48c..ff93f113a 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/PageView.kt @@ -3,11 +3,13 @@ package io.legado.app.ui.book.read.page import android.annotation.SuppressLint import android.content.Context import android.graphics.Canvas +import android.graphics.Paint import android.graphics.Rect import android.util.AttributeSet import android.view.MotionEvent import android.widget.FrameLayout import io.legado.app.help.ReadBookConfig +import io.legado.app.lib.theme.accentColor import io.legado.app.service.help.ReadBook import io.legado.app.ui.book.read.page.delegate.* import io.legado.app.ui.book.read.page.entities.TextChapter @@ -26,6 +28,12 @@ class PageView(context: Context, attrs: AttributeSet) : var prevPage: ContentView = ContentView(context) var curPage: ContentView = ContentView(context) var nextPage: ContentView = ContentView(context) + private val autoPageRect by lazy { Rect() } + private val autoPagePint by lazy { + Paint().apply { + color = context.accentColor + } + } init { addView(nextPage) @@ -50,9 +58,16 @@ class PageView(context: Context, attrs: AttributeSet) : pageDelegate?.onDraw(canvas) if (callBack.isAutoPage) { nextPage.screenshot()?.let { - val rect = - Rect(0, 0, page_view.width, page_view.height * callBack.autoPageProgress / 460) - canvas.drawBitmap(it, rect, rect, null) + val bottom = page_view.height * callBack.autoPageProgress / 460 + autoPageRect.set(0, 0, page_view.width, bottom) + canvas.drawBitmap(it, autoPageRect, autoPageRect, null) + canvas.drawRect( + 0f, + bottom.toFloat() - 1, + page_view.width.toFloat(), + bottom.toFloat(), + autoPagePint + ) } } } @@ -155,18 +170,18 @@ class PageView(context: Context, attrs: AttributeSet) : override val currentChapter: TextChapter? get() { - return if (callBack.isInitFinish) ReadBook.textChapter(0) else null - } + return if (callBack.isInitFinish) ReadBook.textChapter(0) else null + } override val nextChapter: TextChapter? get() { - return if (callBack.isInitFinish) ReadBook.textChapter(1) else null - } + return if (callBack.isInitFinish) ReadBook.textChapter(1) else null + } override val prevChapter: TextChapter? get() { - return if (callBack.isInitFinish) ReadBook.textChapter(-1) else null - } + return if (callBack.isInitFinish) ReadBook.textChapter(-1) else null + } override fun hasNextChapter(): Boolean { return ReadBook.durChapterIndex < ReadBook.chapterSize - 1 From eb1eac8fcd3f97fe413f5702fa636933891ba683 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 21:21:07 +0800 Subject: [PATCH 10/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/ReadBookActivity.kt | 2 +- .../ui/replacerule/edit/ReplaceEditDialog.kt | 57 +++++++++++++++++-- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index f2830dc52..0c25c6086 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -584,7 +584,7 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo autoPageProgress++ if (autoPageProgress >= 460) { autoPageProgress = 0 - ReadBook.moveToNextPage() + page_view.fillPage(PageDelegate.Direction.NEXT) } else { page_view.invalidate() } diff --git a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt index 73c64a0e1..83bdcd97b 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt @@ -1,26 +1,30 @@ package io.legado.app.ui.replacerule.edit +import android.graphics.Rect import android.os.Bundle import android.util.DisplayMetrics -import android.view.LayoutInflater -import android.view.MenuItem -import android.view.View -import android.view.ViewGroup +import android.view.* import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.widget.PopupWindow import androidx.appcompat.widget.Toolbar import androidx.fragment.app.DialogFragment import androidx.fragment.app.FragmentManager import androidx.lifecycle.Observer import io.legado.app.R +import io.legado.app.constant.AppConst import io.legado.app.constant.Theme import io.legado.app.data.entities.ReplaceRule +import io.legado.app.ui.widget.KeyboardToolPop import io.legado.app.utils.applyTint import io.legado.app.utils.getViewModel import io.legado.app.utils.toast import kotlinx.android.synthetic.main.dialog_replace_edit.* +import org.jetbrains.anko.displayMetrics +import kotlin.math.abs class ReplaceEditDialog : DialogFragment(), - Toolbar.OnMenuItemClickListener { + Toolbar.OnMenuItemClickListener, + KeyboardToolPop.CallBack { companion object { @@ -41,6 +45,8 @@ class ReplaceEditDialog : DialogFragment(), } private lateinit var viewModel: ReplaceEditViewModel + private var mSoftKeyboardTool: PopupWindow? = null + private var mIsSoftKeyBoardShowing = false override fun onStart() { super.onStart() @@ -60,6 +66,8 @@ class ReplaceEditDialog : DialogFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + mSoftKeyboardTool = KeyboardToolPop(requireContext(), AppConst.keyboardToolChars, this) + view.viewTreeObserver.addOnGlobalLayoutListener(KeyboardOnGlobalChangeListener()) tool_bar.inflateMenu(R.menu.replace_edit) tool_bar.menu.applyTint(requireContext(), Theme.getTheme()) tool_bar.setOnMenuItemClickListener(this) @@ -111,6 +119,45 @@ class ReplaceEditDialog : DialogFragment(), val callBack get() = activity as? CallBack + override fun sendText(text: String) { + TODO("Not yet implemented") + } + + private fun showKeyboardTopPopupWindow() { + mSoftKeyboardTool?.let { + if (it.isShowing) return + view?.let { view -> + it.showAtLocation(view, Gravity.BOTTOM, 0, 0) + } + } + } + + private fun closePopupWindow() { + mSoftKeyboardTool?.dismiss() + } + + private inner class KeyboardOnGlobalChangeListener : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + activity?.let { + val rect = Rect() + // 获取当前页面窗口的显示范围 + dialog?.window?.decorView?.getWindowVisibleDisplayFrame(rect) + val screenHeight = it.displayMetrics.heightPixels + val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 + val preShowing = mIsSoftKeyBoardShowing + if (abs(keyboardHeight) > screenHeight / 5) { + mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 + showKeyboardTopPopupWindow() + } else { + mIsSoftKeyBoardShowing = false + if (preShowing) { + closePopupWindow() + } + } + } + } + } + interface CallBack { fun onReplaceRuleSave() } From 1415573eb1df6558a4ea2beb32eec269593fcaf6 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 21:32:33 +0800 Subject: [PATCH 11/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt index 83bdcd97b..e55677d88 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt @@ -67,7 +67,7 @@ class ReplaceEditDialog : DialogFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mSoftKeyboardTool = KeyboardToolPop(requireContext(), AppConst.keyboardToolChars, this) - view.viewTreeObserver.addOnGlobalLayoutListener(KeyboardOnGlobalChangeListener()) + ll_content.viewTreeObserver.addOnGlobalLayoutListener(KeyboardOnGlobalChangeListener()) tool_bar.inflateMenu(R.menu.replace_edit) tool_bar.menu.applyTint(requireContext(), Theme.getTheme()) tool_bar.setOnMenuItemClickListener(this) @@ -120,7 +120,7 @@ class ReplaceEditDialog : DialogFragment(), val callBack get() = activity as? CallBack override fun sendText(text: String) { - TODO("Not yet implemented") + } private fun showKeyboardTopPopupWindow() { From 76dec07358d84d56f44f114fabea47a6da0c1bf4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 23:12:34 +0800 Subject: [PATCH 12/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/replacerule/edit/ReplaceEditDialog.kt | 77 ++++++++----------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt index e55677d88..49c04f4d5 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt @@ -1,10 +1,13 @@ package io.legado.app.ui.replacerule.edit -import android.graphics.Rect import android.os.Bundle -import android.util.DisplayMetrics -import android.view.* +import android.view.LayoutInflater +import android.view.MenuItem +import android.view.View +import android.view.ViewGroup +import android.view.ViewGroup.LayoutParams.MATCH_PARENT import android.view.ViewGroup.LayoutParams.WRAP_CONTENT +import android.widget.EditText import android.widget.PopupWindow import androidx.appcompat.widget.Toolbar import androidx.fragment.app.DialogFragment @@ -19,8 +22,7 @@ import io.legado.app.utils.applyTint import io.legado.app.utils.getViewModel import io.legado.app.utils.toast import kotlinx.android.synthetic.main.dialog_replace_edit.* -import org.jetbrains.anko.displayMetrics -import kotlin.math.abs +import org.jetbrains.anko.sdk27.listeners.onFocusChange class ReplaceEditDialog : DialogFragment(), Toolbar.OnMenuItemClickListener, @@ -45,14 +47,11 @@ class ReplaceEditDialog : DialogFragment(), } private lateinit var viewModel: ReplaceEditViewModel - private var mSoftKeyboardTool: PopupWindow? = null - private var mIsSoftKeyBoardShowing = false + private lateinit var mSoftKeyboardTool: PopupWindow override fun onStart() { super.onStart() - val dm = DisplayMetrics() - activity?.windowManager?.defaultDisplay?.getMetrics(dm) - dialog?.window?.setLayout((dm.widthPixels * 0.9).toInt(), WRAP_CONTENT) + dialog?.window?.setLayout(MATCH_PARENT, WRAP_CONTENT) } override fun onCreateView( @@ -67,7 +66,6 @@ class ReplaceEditDialog : DialogFragment(), override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) mSoftKeyboardTool = KeyboardToolPop(requireContext(), AppConst.keyboardToolChars, this) - ll_content.viewTreeObserver.addOnGlobalLayoutListener(KeyboardOnGlobalChangeListener()) tool_bar.inflateMenu(R.menu.replace_edit) tool_bar.menu.applyTint(requireContext(), Theme.getTheme()) tool_bar.setOnMenuItemClickListener(this) @@ -77,6 +75,14 @@ class ReplaceEditDialog : DialogFragment(), arguments?.let { viewModel.initData(it) } + et_replace_rule.onFocusChange { v, hasFocus -> + if (hasFocus) { + mSoftKeyboardTool.width = et_replace_rule.width + mSoftKeyboardTool.showAsDropDown(v) + } else { + mSoftKeyboardTool.dismiss() + } + } } override fun onMenuItemClick(item: MenuItem?): Boolean { @@ -119,42 +125,27 @@ class ReplaceEditDialog : DialogFragment(), val callBack get() = activity as? CallBack - override fun sendText(text: String) { - - } - - private fun showKeyboardTopPopupWindow() { - mSoftKeyboardTool?.let { - if (it.isShowing) return - view?.let { view -> - it.showAtLocation(view, Gravity.BOTTOM, 0, 0) + private fun insertText(text: String) { + if (text.isBlank()) return + val view = dialog?.window?.decorView?.findFocus() + if (view is EditText) { + val start = view.selectionStart + val end = view.selectionEnd + val edit = view.editableText//获取EditText的文字 + if (start < 0 || start >= edit.length) { + edit.append(text) + } else { + edit.replace(start, end, text)//光标所在位置插入文字 } } } - private fun closePopupWindow() { - mSoftKeyboardTool?.dismiss() - } - - private inner class KeyboardOnGlobalChangeListener : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - activity?.let { - val rect = Rect() - // 获取当前页面窗口的显示范围 - dialog?.window?.decorView?.getWindowVisibleDisplayFrame(rect) - val screenHeight = it.displayMetrics.heightPixels - val keyboardHeight = screenHeight - rect.bottom // 输入法的高度 - val preShowing = mIsSoftKeyBoardShowing - if (abs(keyboardHeight) > screenHeight / 5) { - mIsSoftKeyBoardShowing = true // 超过屏幕五分之一则表示弹出了输入法 - showKeyboardTopPopupWindow() - } else { - mIsSoftKeyBoardShowing = false - if (preShowing) { - closePopupWindow() - } - } - } + override fun sendText(text: String) { + if (text == AppConst.keyboardToolChars[0]) { + val view = dialog?.window?.decorView?.findFocus() + view?.clearFocus() + } else { + insertText(text) } } From d0a06f6336dea8e7870443fca956a9fcf1b226c4 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 23:13:40 +0800 Subject: [PATCH 13/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index dbec02060..33ca18a3a 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2020/05/17** * 自动翻页功能完成 +* 替换规则输入时弹出辅助输入条 **2020/05/10** * 添加识别rss分组中的频道信息,在菜单中可以切换频道 from yangyxd From 0aaf7bfe9e394adcb0c0dcf57b5d41615a88b0c8 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 23:14:48 +0800 Subject: [PATCH 14/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt index 49c04f4d5..eb5a1c997 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt @@ -77,7 +77,7 @@ class ReplaceEditDialog : DialogFragment(), } et_replace_rule.onFocusChange { v, hasFocus -> if (hasFocus) { - mSoftKeyboardTool.width = et_replace_rule.width + mSoftKeyboardTool.width = v.width mSoftKeyboardTool.showAsDropDown(v) } else { mSoftKeyboardTool.dismiss() From 5282914d6585e7b12eb90c7826eb3ca8f460bbe9 Mon Sep 17 00:00:00 2001 From: kunfei Date: Sun, 17 May 2020 23:19:14 +0800 Subject: [PATCH 15/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt index eb5a1c997..0027f3209 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/edit/ReplaceEditDialog.kt @@ -88,7 +88,7 @@ class ReplaceEditDialog : DialogFragment(), override fun onMenuItemClick(item: MenuItem?): Boolean { when (item?.itemId) { R.id.menu_save -> { - val rule = getReplaceRule(); + val rule = getReplaceRule() if (!rule.isValid()){ toast(R.string.replace_rule_invalid) } From 1398696a26e83ab269071f809f4cf3d0b4a9589e Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 18 May 2020 09:29:32 +0800 Subject: [PATCH 16/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/constant/AppConst.kt | 2 +- app/src/main/java/io/legado/app/help/http/HttpHelper.kt | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/constant/AppConst.kt b/app/src/main/java/io/legado/app/constant/AppConst.kt index cf37e2b10..10ffccd1f 100644 --- a/app/src/main/java/io/legado/app/constant/AppConst.kt +++ b/app/src/main/java/io/legado/app/constant/AppConst.kt @@ -20,7 +20,7 @@ object AppConst { const val UA_NAME = "User-Agent" val userAgent: String by lazy { - "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36" + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36" } val SCRIPT_ENGINE: ScriptEngine by lazy { diff --git a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt index 173a450c1..dd480fbf5 100644 --- a/app/src/main/java/io/legado/app/help/http/HttpHelper.kt +++ b/app/src/main/java/io/legado/app/help/http/HttpHelper.kt @@ -1,5 +1,6 @@ package io.legado.app.help.http +import io.legado.app.constant.AppConst import io.legado.app.help.http.api.HttpGetApi import io.legado.app.utils.NetworkUtils import kotlinx.coroutines.suspendCancellableCoroutine @@ -94,6 +95,7 @@ object HttpHelper { return Interceptor { chain -> val request = chain.request() .newBuilder() + .addHeader(AppConst.UA_NAME, AppConst.userAgent) .addHeader("Keep-Alive", "300") .addHeader("Connection", "Keep-Alive") .addHeader("Cache-Control", "no-cache") From 6c28abcdcd7b57f40de92223ec9e6241805e2b7c Mon Sep 17 00:00:00 2001 From: kunfei Date: Mon, 18 May 2020 09:31:34 +0800 Subject: [PATCH 17/17] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 33ca18a3a..533d8bdc1 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 请关注公众号[开源阅读]()支持我,同时关注合作公众号[小说拾遗](),阅读公众号小编。 * 新公众号[开源阅读]()已启用,[开源阅读软件]()备用 +**2020/05/18** +* 修复http://alanskycn.gitee.io/书源导入失败问题,被屏蔽UA了 + **2020/05/17** * 自动翻页功能完成 * 替换规则输入时弹出辅助输入条