From 158d9c0fcb239bd30447438ae1b5127779deefaf Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 7 May 2021 11:52:36 +0800 Subject: [PATCH 01/45] =?UTF-8?q?=E9=A2=84=E4=B8=8B=E8=BD=BD=E7=AB=A0?= =?UTF-8?q?=E8=8A=82=E5=8F=AF=E8=B0=83=E6=95=B4=E6=95=B0=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 11a6dcfcd..cf587d664 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,7 +3,10 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 -**2021/05/04** +**2021/05/08** +* 预下载章节可调整数目 + +**2021/05/06** * 修复bug * url参数添加重置次数,retry * 修改默认tts, 手动导入 From 5ffe456d97c5ed2bc473a2ebc3e2a89bf9c9c4db Mon Sep 17 00:00:00 2001 From: gedoor Date: Fri, 7 May 2021 18:04:06 +0800 Subject: [PATCH 02/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 -- build.gradle | 3 +-- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 1edcc0755..0e6a4fac5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -149,8 +149,6 @@ dependencies { //lifecycle def lifecycle_version = '2.3.1' - //2.3.0 弃用lifecycle-extensions - //implementation "androidx.lifecycle:lifecycle-extensions:$lifecycle_version" implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version" //room diff --git a/build.gradle b/build.gradle index 7305a5fc4..4054b3c3a 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.2.0' - classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0" + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" } } @@ -22,7 +22,6 @@ allprojects { maven { url "https://maven.aliyun.com/nexus/content/groups/public/" } maven { url "https://jitpack.io" } maven { url "https://maven.google.com/" } - //maven { url "https://github.com/psiegman/mvn-repo/raw/master/releases" } } } From 8ee1147e1bb4c8cb4801dabee9a60503ea7ad073 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 08:38:54 +0800 Subject: [PATCH 03/45] =?UTF-8?q?=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 cf587d664..e752cc393 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2021/05/08** * 预下载章节可调整数目 +* 修复低版本Android使用TTS闪退。 by ag2s20150909 **2021/05/06** * 修复bug From bf2813f9e3c45223a2b801c1c4057395daba38a9 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 11:20:31 +0800 Subject: [PATCH 04/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index f17add4ab..01b29ff29 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -157,9 +157,6 @@ dependencies { kapt "androidx.room:room-compiler:$room_version" testImplementation "androidx.room:room-testing:$room_version" - //paging - implementation 'androidx.paging:paging-runtime-ktx:2.1.2' - //liveEventBus implementation 'com.jeremyliao:live-event-bus-x:1.5.7' From 6c3f5aaff3850733e8210b83fa89d941f27d0d10 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 11:20:50 +0800 Subject: [PATCH 05/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/data/dao/BookSourceDao.kt | 4 -- .../io/legado/app/data/dao/BookmarkDao.kt | 6 +- .../io/legado/app/data/dao/SearchBookDao.kt | 7 --- .../legado/app/ui/book/toc/BookmarkAdapter.kt | 61 +++++++------------ .../app/ui/book/toc/BookmarkFragment.kt | 22 ++----- 5 files changed, 32 insertions(+), 68 deletions(-) diff --git a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt index 7a40d4cc8..2d2dcff40 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookSourceDao.kt @@ -1,7 +1,6 @@ package io.legado.app.data.dao import androidx.lifecycle.LiveData -import androidx.paging.DataSource import androidx.room.* import io.legado.app.data.entities.BookSource @@ -41,9 +40,6 @@ interface BookSourceDao { @Query("select distinct bookSourceGroup from book_sources where enabledExplore = 1 and trim(exploreUrl) <> '' and trim(bookSourceGroup) <> ''") fun liveExploreGroup(): LiveData> - @Query("select * from book_sources where enabledExplore = 1 order by customOrder asc") - fun observeFind(): DataSource.Factory - @Query("select * from book_sources where bookSourceGroup like '%' || :group || '%'") fun getByGroup(group: String): List diff --git a/app/src/main/java/io/legado/app/data/dao/BookmarkDao.kt b/app/src/main/java/io/legado/app/data/dao/BookmarkDao.kt index 16fdff455..633c1187c 100644 --- a/app/src/main/java/io/legado/app/data/dao/BookmarkDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/BookmarkDao.kt @@ -1,6 +1,6 @@ package io.legado.app.data.dao -import androidx.paging.DataSource +import androidx.lifecycle.LiveData import androidx.room.* import io.legado.app.data.entities.Bookmark @@ -16,10 +16,10 @@ interface BookmarkDao { bookUrl: String, bookName: String, bookAuthor: String - ): DataSource.Factory + ): LiveData> @Query("SELECT * FROM bookmarks where bookUrl = :bookUrl and chapterName like '%'||:key||'%' or content like '%'||:key||'%'") - fun liveDataSearch(bookUrl: String, key: String): DataSource.Factory + fun liveDataSearch(bookUrl: String, key: String): LiveData> @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(vararg bookmark: Bookmark) diff --git a/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt b/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt index 9618ad317..8f53d0170 100644 --- a/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/SearchBookDao.kt @@ -1,6 +1,5 @@ package io.legado.app.data.dao -import androidx.paging.DataSource import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy @@ -10,12 +9,6 @@ import io.legado.app.data.entities.SearchBook @Dao interface SearchBookDao { - @Query("SELECT * FROM searchBooks") - fun observeAll(): DataSource.Factory - - @Query("SELECT * FROM searchBooks where time >= :time") - fun observeNew(time: Long): DataSource.Factory - @Query("select * from searchBooks where bookUrl = :bookUrl") fun getSearchBook(bookUrl: String): SearchBook? diff --git a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt index 8300aa3da..73fe4fe93 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt @@ -1,54 +1,38 @@ package io.legado.app.ui.book.toc -import android.view.LayoutInflater +import android.content.Context import android.view.ViewGroup -import androidx.paging.PagedListAdapter -import androidx.recyclerview.widget.DiffUtil -import androidx.recyclerview.widget.RecyclerView +import io.legado.app.base.adapter.ItemViewHolder +import io.legado.app.base.adapter.RecyclerAdapter import io.legado.app.data.entities.Bookmark import io.legado.app.databinding.ItemBookmarkBinding import splitties.views.onLongClick -class BookmarkAdapter(val callback: Callback) : PagedListAdapter(DIFF_CALLBACK) { +class BookmarkAdapter(context: Context, val callback: Callback) : + RecyclerAdapter(context) { - companion object { - - @JvmField - val DIFF_CALLBACK = object : DiffUtil.ItemCallback() { - override fun areItemsTheSame(oldItem: Bookmark, newItem: Bookmark): Boolean = - oldItem.time == newItem.time - - override fun areContentsTheSame(oldItem: Bookmark, newItem: Bookmark): Boolean = - oldItem.time == newItem.time - && oldItem.bookUrl == newItem.bookUrl - && oldItem.chapterName == newItem.chapterName - && oldItem.content == newItem.content - } - } - - override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder { - val binding = - ItemBookmarkBinding.inflate(LayoutInflater.from(parent.context), parent, false) - return MyViewHolder(binding) + override fun getViewBinding(parent: ViewGroup): ItemBookmarkBinding { + return ItemBookmarkBinding.inflate(inflater, parent, false) } - override fun onBindViewHolder(holder: MyViewHolder, position: Int) { - getItem(position)?.let { - holder.bind(it, callback) - } + override fun convert( + holder: ItemViewHolder, + binding: ItemBookmarkBinding, + item: Bookmark, + payloads: MutableList + ) { + binding.tvChapterName.text = item.chapterName + binding.tvBookText.text = item.bookText + binding.tvContent.text = item.content } - class MyViewHolder(val binding: ItemBookmarkBinding) : RecyclerView.ViewHolder(binding.root) { - - fun bind(bookmark: Bookmark, callback: Callback?) = with(binding) { - tvChapterName.text = bookmark.chapterName - tvBookText.text = bookmark.bookText - tvContent.text = bookmark.content - itemView.setOnClickListener { - callback?.onClick(bookmark) + override fun registerListener(holder: ItemViewHolder, binding: ItemBookmarkBinding) { + getItem(holder.layoutPosition)?.let { bookmark -> + binding.root.setOnClickListener { + callback.onClick(bookmark) } - itemView.onLongClick { - callback?.onLongClick(bookmark) + binding.root.onLongClick { + callback.onLongClick(bookmark) } } } @@ -57,4 +41,5 @@ class BookmarkAdapter(val callback: Callback) : PagedListAdapter(R.layout.fragment_ override val viewModel: ChapterListViewModel by activityViewModels() private val binding by viewBinding(FragmentBookmarkBinding::bind) private lateinit var adapter: BookmarkAdapter - private var bookmarkLiveData: LiveData>? = null + private var bookmarkLiveData: LiveData>? = null override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { viewModel.bookMarkCallBack = this @@ -43,7 +41,7 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ private fun initRecyclerView() { ATH.applyEdgeEffectColor(binding.recyclerView) - adapter = BookmarkAdapter(this) + adapter = BookmarkAdapter(requireContext(), this) binding.recyclerView.layoutManager = LinearLayoutManager(requireContext()) binding.recyclerView.addItemDecoration(VerticalDivider(requireContext())) binding.recyclerView.adapter = adapter @@ -51,11 +49,8 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ private fun initData(book: Book) { bookmarkLiveData?.removeObservers(viewLifecycleOwner) - bookmarkLiveData = - LivePagedListBuilder( - appDb.bookmarkDao.observeByBook(book.bookUrl, book.name, book.author), 20 - ).build() - bookmarkLiveData?.observe(viewLifecycleOwner, { adapter.submitList(it) }) + bookmarkLiveData = appDb.bookmarkDao.observeByBook(book.bookUrl, book.name, book.author) + bookmarkLiveData?.observe(viewLifecycleOwner, { adapter.setItems(it) }) } override fun startBookmarkSearch(newText: String?) { @@ -65,13 +60,8 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ } } else { bookmarkLiveData?.removeObservers(viewLifecycleOwner) - bookmarkLiveData = LivePagedListBuilder( - appDb.bookmarkDao.liveDataSearch( - viewModel.bookUrl, - newText - ), 20 - ).build() - bookmarkLiveData?.observe(viewLifecycleOwner, { adapter.submitList(it) }) + bookmarkLiveData = appDb.bookmarkDao.liveDataSearch(viewModel.bookUrl, newText) + bookmarkLiveData?.observe(viewLifecycleOwner, { adapter.setItems(it) }) } } From 16d1aab5a5cc2f7780f6c01506c7c9c0330a8835 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 11:30:47 +0800 Subject: [PATCH 06/45] =?UTF-8?q?=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/ui/book/read/page/ReadView.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt index bba292427..42886de3c 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ReadView.kt @@ -102,8 +102,8 @@ class ReadView(context: Context, attrs: AttributeSet) : setRect9x() } - public fun setRect9x() { - val edge = if (AppConfig.fullScreenGesturesSupport) { 200f } else { 0f } + fun setRect9x() { + val edge = if (AppConfig.fullScreenGesturesSupport) 200f else 0f tlRect.set(0f + edge, 0f, width * 0.33f, height * 0.33f) tcRect.set(width * 0.33f, 0f, width * 0.66f, height * 0.33f) trRect.set(width * 0.36f, 0f, width - 0f - edge, height * 0.33f) From 90fd0d1a5905d1eed02bc104030489f413c82a1a Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 11:44:00 +0800 Subject: [PATCH 07/45] =?UTF-8?q?=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/book/read/page/PageView.kt | 9 --------- 1 file changed, 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 fa14fbcf2..7b621735f 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 @@ -237,15 +237,6 @@ class PageView(context: Context) : FrameLayout(context) { fun scroll(offset: Int) { binding.contentTextView.scroll(offset) -// if (offset > 0) { -// for (i in 1..offset) { -// binding.contentTextView.scroll(1) -// } -// } else { -// for (i in offset..-1) { -// binding.contentTextView.scroll(-1) -// } -// } } fun upSelectAble(selectAble: Boolean) { From 60fb0d385de495d880b6634323c4dfe60cd6c479 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 12:34:53 +0800 Subject: [PATCH 08/45] =?UTF-8?q?WebDav=E5=88=9B=E5=BB=BA=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=B7=BB=E5=8A=A0try=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/lib/webdav/WebDav.kt | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 36713320f..7a8e438ae 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -144,19 +144,20 @@ class WebDav(urlStr: String) { /** * 根据自己的URL,在远程处创建对应的文件夹 - * * @return 是否创建成功 */ suspend fun makeAsDir(): Boolean { val url = httpUrl val auth = HttpAuth.auth if (url != null && auth != null) { - okHttpClient.newCall { - url(url) - method("MKCOL", null) - addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - } - return true + //防止报错 + return kotlin.runCatching { + okHttpClient.newCall { + url(url) + method("MKCOL", null) + addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) + } + }.isSuccess } return false } From b2ee9a99080b1f48c06cec328c3afc4e507669d3 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 12:36:06 +0800 Subject: [PATCH 09/45] =?UTF-8?q?WebDav=E5=88=9B=E5=BB=BA=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=B7=BB=E5=8A=A0try=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= 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 e752cc393..8095cacd6 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -6,6 +6,7 @@ **2021/05/08** * 预下载章节可调整数目 * 修复低版本Android使用TTS闪退。 by ag2s20150909 +* 修复WebDav报错 **2021/05/06** * 修复bug From 7c7ea811d420a0a39c44247b0e4f01c86d0c2f8b Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 12:45:10 +0800 Subject: [PATCH 10/45] =?UTF-8?q?WebDav=E5=88=9B=E5=BB=BA=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=B7=BB=E5=8A=A0try=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/lib/webdav/WebDav.kt | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 7a8e438ae..51f52cc9a 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -9,7 +9,6 @@ import okhttp3.RequestBody.Companion.asRequestBody import okhttp3.RequestBody.Companion.toRequestBody import org.jsoup.Jsoup import java.io.File -import java.io.IOException import java.io.InputStream import java.net.MalformedURLException import java.net.URL @@ -58,12 +57,7 @@ class WebDav(urlStr: String) { * @return 远程文件是否存在 */ suspend fun indexFileInfo(): Boolean { - propFindResponse(ArrayList())?.let { - if (it.text().isNotEmpty()) { - return true - } - } - return false + return !propFindResponse(ArrayList()).isNullOrEmpty() } /** @@ -73,13 +67,13 @@ class WebDav(urlStr: String) { * @return 文件列表 */ suspend fun listFiles(propsList: ArrayList = ArrayList()): List { - propFindResponse(propsList)?.text()?.let { body -> + propFindResponse(propsList)?.let { body -> return parseDir(body) } return ArrayList() } - private suspend fun propFindResponse(propsList: ArrayList): ResponseBody? { + private suspend fun propFindResponse(propsList: ArrayList): String? { val requestProps = StringBuilder() for (p in propsList) { requestProps.append("\n") @@ -100,7 +94,7 @@ class WebDav(urlStr: String) { // 注意:尽量手动指定需要返回的属性。若返回全部属性,可能后由于Prop.java里没有该属性名,而崩溃。 val requestBody = requestPropsStr.toRequestBody("text/plain".toMediaType()) method("PROPFIND", requestBody) - } + }.text() }.onFailure { it.printStackTrace() }.getOrNull() @@ -220,7 +214,6 @@ class WebDav(urlStr: String) { return false } - @Throws(IOException::class) private suspend fun getInputStream(): InputStream? { val url = httpUrl val auth = HttpAuth.auth From e894038271bc9498b661c20fe860770b1c66c127 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 13:33:29 +0800 Subject: [PATCH 11/45] =?UTF-8?q?WebDav=E5=88=9B=E5=BB=BA=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=B7=BB=E5=8A=A0try=E9=98=B2=E6=AD=A2?= =?UTF-8?q?=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt | 4 ++++ app/src/main/java/io/legado/app/lib/webdav/WebDav.kt | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt index 4dec4bf3e..f87d58aab 100644 --- a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt +++ b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt @@ -119,4 +119,8 @@ fun Request.Builder.postJson(json: String?) { val requestBody = json.toRequestBody("application/json; charset=UTF-8".toMediaType()) post(requestBody) } +} + +fun Request.Builder.mkCol() { + method("MKCOL", null) } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 51f52cc9a..8d20fdd17 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -1,5 +1,6 @@ package io.legado.app.lib.webdav +import io.legado.app.help.http.mkCol import io.legado.app.help.http.newCall import io.legado.app.help.http.okHttpClient import io.legado.app.help.http.text @@ -148,9 +149,9 @@ class WebDav(urlStr: String) { return kotlin.runCatching { okHttpClient.newCall { url(url) - method("MKCOL", null) + mkCol() addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - } + }.close() }.isSuccess } return false @@ -192,7 +193,7 @@ class WebDav(urlStr: String) { url(url) put(fileBody) addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - } + }.close() return true } return false @@ -208,7 +209,7 @@ class WebDav(urlStr: String) { url(url) put(fileBody) addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - } + }.close() return true } return false From acbd2b11d179420ae1e1c03974a38ff2fdc0e749 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 13:58:45 +0800 Subject: [PATCH 12/45] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B9=A6=E6=9E=B6?= =?UTF-8?q?=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/bookshelf/books/BooksAdapterGrid.kt | 3 - .../main/bookshelf/books/BooksAdapterList.kt | 3 - .../main/res/layout/item_bookshelf_grid.xml | 121 +++++++++++------- .../main/res/layout/item_bookshelf_list.xml | 9 -- 4 files changed, 72 insertions(+), 64 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index 286c13b74..62834745e 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -7,8 +7,6 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemBookshelfGridBinding -import io.legado.app.lib.theme.backgroundColor -import io.legado.app.utils.ColorUtils import io.legado.app.utils.invisible import splitties.views.onLongClick @@ -27,7 +25,6 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : ) = with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) tvName.text = item.name ivCover.load(item.getDisplayCover(), item.name, item.author) upRefresh(binding, item) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt index 95d027042..08281b3b0 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt @@ -7,8 +7,6 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemBookshelfListBinding -import io.legado.app.lib.theme.backgroundColor -import io.legado.app.utils.ColorUtils import io.legado.app.utils.invisible import splitties.views.onLongClick @@ -27,7 +25,6 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : ) = with(binding) { val bundle = payloads.getOrNull(0) as? Bundle if (bundle == null) { - root.setBackgroundColor(ColorUtils.withAlpha(context.backgroundColor, 0.5f)) tvName.text = item.name tvAuthor.text = item.author tvRead.text = item.durChapterTitle diff --git a/app/src/main/res/layout/item_bookshelf_grid.xml b/app/src/main/res/layout/item_bookshelf_grid.xml index 0816a9a83..648d3b85f 100644 --- a/app/src/main/res/layout/item_bookshelf_grid.xml +++ b/app/src/main/res/layout/item_bookshelf_grid.xml @@ -1,67 +1,90 @@ - + android:clickable="true" + android:focusable="true" + tools:ignore="UnusedAttribute"> - + android:layout_height="wrap_content" + android:orientation="vertical" + android:paddingTop="8dp" + android:paddingLeft="8dp" + android:paddingRight="8dp" + app:layout_constraintTop_toTopOf="parent"> - + android:layout_height="wrap_content"> + + + + + + - + + - - + android:lines="2" + android:text="@string/book_name" + android:textColor="@color/primaryText" + android:textSize="12sp" + tools:ignore="RtlHardcoded,RtlSymmetry" /> - + - + android:layout_height="0dp" + android:background="?android:attr/selectableItemBackground" + app:layout_constraintBottom_toBottomOf="parent" + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintVertical_bias="0.0" + tools:layout_editor_absoluteX="0dp" /> + + - diff --git a/app/src/main/res/layout/item_bookshelf_list.xml b/app/src/main/res/layout/item_bookshelf_list.xml index 5a9fefbd2..00eb4966f 100644 --- a/app/src/main/res/layout/item_bookshelf_list.xml +++ b/app/src/main/res/layout/item_bookshelf_list.xml @@ -167,13 +167,4 @@ app:layout_constraintVertical_bias="0.0" tools:layout_editor_absoluteX="0dp" /> - - - \ No newline at end of file From 45b6f77eab20003f1cb14c5b9532e925bc0ccc66 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 15:21:49 +0800 Subject: [PATCH 13/45] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=BF=BB=E9=A1=B5?= =?UTF-8?q?=E5=8A=A8=E7=94=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/ui/book/read/page/delegate/HorizontalPageDelegate.kt | 4 ++-- .../io/legado/app/ui/book/read/page/delegate/PageDelegate.kt | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) 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 11b469af1..3f8c29ca3 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 @@ -119,7 +119,7 @@ abstract class HorizontalPageDelegate(readView: ReadView) : PageDelegate(readVie abortAnim() if (!hasNext()) return setDirection(PageDirection.NEXT) - readView.setTouchPoint(viewWidth.toFloat(), 0f, false) + readView.setStartPoint(viewWidth.toFloat(), 0f, false) onAnimStart(animationSpeed) } @@ -127,7 +127,7 @@ abstract class HorizontalPageDelegate(readView: ReadView) : PageDelegate(readVie abortAnim() if (!hasPrev()) return setDirection(PageDirection.PREV) - readView.setTouchPoint(0f, 0f) + readView.setStartPoint(0f, 0f, false) onAnimStart(animationSpeed) } 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 a70961487..2b417240c 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 @@ -3,7 +3,7 @@ package io.legado.app.ui.book.read.page.delegate import android.content.Context import android.graphics.Canvas import android.view.MotionEvent -import android.view.animation.DecelerateInterpolator +import android.view.animation.LinearInterpolator import android.widget.Scroller import androidx.annotation.CallSuper import com.google.android.material.snackbar.Snackbar @@ -37,7 +37,7 @@ abstract class PageDelegate(protected val readView: ReadView) { protected var viewHeight: Int = readView.height protected val scroller: Scroller by lazy { - Scroller(readView.context, DecelerateInterpolator()) + Scroller(readView.context, LinearInterpolator()) } private val snackBar: Snackbar by lazy { From 8d9eb42b06e2fb77f74b73bbf06d699f5bb25f39 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sat, 8 May 2021 16:30:58 +0800 Subject: [PATCH 14/45] =?UTF-8?q?=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 + .../main/java/io/legado/app/base/BaseActivity.kt | 13 +++++++++---- .../main/java/io/legado/app/base/VMBaseActivity.kt | 6 ++++-- .../legado/app/ui/book/read/ReadBookBaseActivity.kt | 2 +- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 8095cacd6..5072d7149 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -7,6 +7,7 @@ * 预下载章节可调整数目 * 修复低版本Android使用TTS闪退。 by ag2s20150909 * 修复WebDav报错 +* 优化翻页动画点击翻页 **2021/05/06** * 修复bug diff --git a/app/src/main/java/io/legado/app/base/BaseActivity.kt b/app/src/main/java/io/legado/app/base/BaseActivity.kt index 4d2707444..8319d077b 100644 --- a/app/src/main/java/io/legado/app/base/BaseActivity.kt +++ b/app/src/main/java/io/legado/app/base/BaseActivity.kt @@ -33,7 +33,8 @@ abstract class BaseActivity( val fullScreen: Boolean = true, private val theme: Theme = Theme.Auto, private val toolBarTheme: Theme = Theme.Auto, - private val transparent: Boolean = false + private val transparent: Boolean = false, + private val imageBg: Boolean = true ) : AppCompatActivity(), CoroutineScope by MainScope() { @@ -173,9 +174,13 @@ abstract class BaseActivity( ATH.applyBackgroundTint(window.decorView) } } - ThemeConfig.getBgImage(this)?.let { - kotlin.runCatching { - window.decorView.background = it + if (imageBg) { + ThemeConfig.getBgImage(this)?.let { + try { + window.decorView.background = it + } catch (e: OutOfMemoryError) { + toastOnUi("Image Bg Out Of Memory") + } } } } diff --git a/app/src/main/java/io/legado/app/base/VMBaseActivity.kt b/app/src/main/java/io/legado/app/base/VMBaseActivity.kt index d86ba3699..3eeb5c91b 100644 --- a/app/src/main/java/io/legado/app/base/VMBaseActivity.kt +++ b/app/src/main/java/io/legado/app/base/VMBaseActivity.kt @@ -7,8 +7,10 @@ import io.legado.app.constant.Theme abstract class VMBaseActivity( fullScreen: Boolean = true, theme: Theme = Theme.Auto, - toolBarTheme: Theme = Theme.Auto -) : BaseActivity(fullScreen, theme, toolBarTheme) { + toolBarTheme: Theme = Theme.Auto, + transparent: Boolean = false, + imageBg: Boolean = true +) : BaseActivity(fullScreen, theme, toolBarTheme, transparent, imageBg) { protected abstract val viewModel: VM diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt index 843995702..e2d10bf9b 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookBaseActivity.kt @@ -39,7 +39,7 @@ import io.legado.app.utils.requestInputMethod * 阅读界面 */ abstract class ReadBookBaseActivity : - VMBaseActivity() { + VMBaseActivity(imageBg = false) { override val viewModel: ReadBookViewModel by viewModels() From a2b309abb59674413290e6961a6ac16f785f1260 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 9 May 2021 16:02:09 +0800 Subject: [PATCH 15/45] =?UTF-8?q?=E7=BD=91=E9=A1=B5=E8=AE=BF=E9=97=AE404?= =?UTF-8?q?=E4=BE=9D=E7=84=B6=E8=BF=94=E5=9B=9Ebody?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt index f87d58aab..bb50bf60a 100644 --- a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt +++ b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt @@ -28,7 +28,7 @@ suspend fun OkHttpClient.newCall( return response.body!! } } - throw IOException(response!!.message) + return response!!.body ?: throw IOException(response.message) } suspend fun OkHttpClient.newCallStrResponse( @@ -45,7 +45,7 @@ suspend fun OkHttpClient.newCallStrResponse( return StrResponse(response, response.body!!.text()) } } - throw IOException(response!!.message) + return StrResponse(response!!, response.body?.text() ?: response.message) } suspend fun Call.await(): Response = suspendCancellableCoroutine { block -> From 96fb68d0831bbe4cc6515eac666cf056acafe7c5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 9 May 2021 16:03:39 +0800 Subject: [PATCH 16/45] =?UTF-8?q?=E7=BD=91=E9=A1=B5=E8=AE=BF=E9=97=AE404?= =?UTF-8?q?=E4=BE=9D=E7=84=B6=E8=BF=94=E5=9B=9Ebody?= 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 5072d7149..82725adb5 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/05/09** +* 网页访问404依然返回body + **2021/05/08** * 预下载章节可调整数目 * 修复低版本Android使用TTS闪退。 by ag2s20150909 From c44da6be9e600351eb6d603a3471d69b64ab3eaa Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 9 May 2021 18:11:42 +0800 Subject: [PATCH 17/45] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../legado/app/ui/book/cache/CacheActivity.kt | 64 ++++++++++++++++--- app/src/main/res/menu/book_cache.xml | 5 ++ app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 6 files changed, 63 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt index fbdae644b..87e52de40 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt @@ -115,9 +115,13 @@ class CacheActivity : VMBaseActivity() CacheBook.stop(this@CacheActivity) } } + R.id.menu_export_all -> exportAll() R.id.menu_enable_replace -> AppConfig.exportUseReplace = !item.isChecked R.id.menu_export_web_dav -> AppConfig.exportToWebDav = !item.isChecked - R.id.menu_export_folder -> export(-1) + R.id.menu_export_folder -> { + exportPosition = -1 + selectExportFolder() + } R.id.menu_export_type -> showExportTypeConfig() R.id.menu_export_charset -> showCharsetConfig() R.id.menu_log -> @@ -212,7 +216,17 @@ class CacheActivity : VMBaseActivity() override fun export(position: Int) { exportPosition = position val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey) - if (path.isNullOrEmpty() || position < 0) { + if (path.isNullOrEmpty()) { + selectExportFolder() + } else { + startExport(path) + } + } + + private fun exportAll() { + exportPosition = -10 + val path = ACache.get(this@CacheActivity).getAsString(exportBookPathKey) + if (path.isNullOrEmpty()) { selectExportFolder() } else { startExport(path) @@ -233,15 +247,45 @@ class CacheActivity : VMBaseActivity() } private fun startExport(path: String) { - adapter.getItem(exportPosition)?.let { book -> - Snackbar.make(binding.titleBar, R.string.exporting, Snackbar.LENGTH_INDEFINITE) - .show() - when (AppConfig.exportType) { - 1 -> viewModel.exportEPUB(path, book) { - binding.titleBar.snackbar(it) + if (exportPosition == -10) { + if (adapter.getItems().isNotEmpty()) { + Snackbar.make(binding.titleBar, R.string.exporting, Snackbar.LENGTH_INDEFINITE) + .show() + var exportSize = adapter.getItems().size + adapter.getItems().forEach { book -> + when (AppConfig.exportType) { + 1 -> viewModel.exportEPUB(path, book) { + exportSize-- + if (exportSize <= 0) { + binding.titleBar.snackbar(it) + } else { + toastOnUi(it) + } + } + else -> viewModel.export(path, book) { + exportSize-- + if (exportSize <= 0) { + binding.titleBar.snackbar(it) + } else { + toastOnUi(it) + } + } + } } - else -> viewModel.export(path, book) { - binding.titleBar.snackbar(it) + } else { + toastOnUi(R.string.no_book) + } + } else if (exportPosition > 0) { + adapter.getItem(exportPosition)?.let { book -> + Snackbar.make(binding.titleBar, R.string.exporting, Snackbar.LENGTH_INDEFINITE) + .show() + when (AppConfig.exportType) { + 1 -> viewModel.exportEPUB(path, book) { + binding.titleBar.snackbar(it) + } + else -> viewModel.export(path, book) { + binding.titleBar.snackbar(it) + } } } } diff --git a/app/src/main/res/menu/book_cache.xml b/app/src/main/res/menu/book_cache.xml index 42c873c82..71598a744 100644 --- a/app/src/main/res/menu/book_cache.xml +++ b/app/src/main/res/menu/book_cache.xml @@ -20,6 +20,11 @@ + + 此url已订阅 高刷 使用屏幕最高刷新率 + 导出所有 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index de3414c63..1899df105 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -826,5 +826,6 @@ 此url已訂閱 高刷 使用螢幕最高刷新率 + 导出所有 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index e25c7283c..238ed1a32 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -826,5 +826,6 @@ 此url已订阅 高刷 使用屏幕最高刷新率 + 导出所有 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2b302583a..73982b13e 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -827,5 +827,6 @@ 此url已订阅 高刷 使用屏幕最高刷新率 + export_all From c6cffe7008c470ef6bf4e1433a3a3611b1994f64 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 9 May 2021 18:14:39 +0800 Subject: [PATCH 18/45] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=AF=BC=E5=87=BA?= 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 82725adb5..484779471 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2021/05/09** * 网页访问404依然返回body +* 添加书籍批量导出 **2021/05/08** * 预下载章节可调整数目 From bdd75cc157773b7518711e56191c25533f145be5 Mon Sep 17 00:00:00 2001 From: gedoor Date: Sun, 9 May 2021 23:07:16 +0800 Subject: [PATCH 19/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/http/OkHttpUtils.kt | 23 ++++++++++ .../java/io/legado/app/lib/webdav/WebDav.kt | 42 +++---------------- 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt index bb50bf60a..efdc5839a 100644 --- a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt +++ b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt @@ -123,4 +123,27 @@ fun Request.Builder.postJson(json: String?) { fun Request.Builder.mkCol() { method("MKCOL", null) +} + +fun Request.Builder.propFind(fields: List?) { + var propFind = + """ + + + %s + + """ + // 添加RequestBody对象,可以只返回的属性。如果设为null,则会返回全部属性 + // 注意:尽量手动指定需要返回的属性。若返回全部属性,可能后由于Prop.java里没有该属性名,而崩溃。 + if (fields.isNullOrEmpty()) { + method("PROPFIND", null) + } else { + val requestProps = StringBuilder() + for (p in fields) { + requestProps.append("\n") + } + propFind = String.format(propFind, requestProps.toString() + "\n") + val requestBody = propFind.toRequestBody("text/plain".toMediaType()) + method("PROPFIND", requestBody) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 8d20fdd17..654a6d277 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -1,9 +1,6 @@ package io.legado.app.lib.webdav -import io.legado.app.help.http.mkCol -import io.legado.app.help.http.newCall -import io.legado.app.help.http.okHttpClient -import io.legado.app.help.http.text +import io.legado.app.help.http.* import okhttp3.* import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.asRequestBody @@ -18,21 +15,6 @@ import java.util.* @Suppress("unused", "MemberVisibilityCanBePrivate") class WebDav(urlStr: String) { - companion object { - // 指定返回哪些属性 - private const val DIR = - """ - - - - - - - - %s - - """ - } private val url: URL = URL(urlStr) private val httpUrl: String? by lazy { @@ -64,26 +46,17 @@ class WebDav(urlStr: String) { /** * 列出当前路径下的文件 * - * @param propsList 指定列出文件的哪些属性 + * @param fields 指定列出文件的哪些属性 * @return 文件列表 */ - suspend fun listFiles(propsList: ArrayList = ArrayList()): List { - propFindResponse(propsList)?.let { body -> + suspend fun listFiles(fields: ArrayList = ArrayList()): List { + propFindResponse(fields)?.let { body -> return parseDir(body) } return ArrayList() } - private suspend fun propFindResponse(propsList: ArrayList): String? { - val requestProps = StringBuilder() - for (p in propsList) { - requestProps.append("\n") - } - val requestPropsStr: String = if (requestProps.toString().isEmpty()) { - DIR.replace("%s", "") - } else { - String.format(DIR, requestProps.toString() + "\n") - } + private suspend fun propFindResponse(fields: ArrayList?): String? { val url = httpUrl val auth = HttpAuth.auth if (url != null && auth != null) { @@ -91,10 +64,7 @@ class WebDav(urlStr: String) { okHttpClient.newCall { url(url) addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - // 添加RequestBody对象,可以只返回的属性。如果设为null,则会返回全部属性 - // 注意:尽量手动指定需要返回的属性。若返回全部属性,可能后由于Prop.java里没有该属性名,而崩溃。 - val requestBody = requestPropsStr.toRequestBody("text/plain".toMediaType()) - method("PROPFIND", requestBody) + propFind(fields) }.text() }.onFailure { it.printStackTrace() From 621be37d198433a8a028dfe203dfe2149c106360 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 13:57:21 +0800 Subject: [PATCH 20/45] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B9=A6=E7=AD=BEbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/legado/app/ui/book/toc/BookmarkAdapter.kt | 9 ++++++--- .../java/io/legado/app/ui/book/toc/BookmarkFragment.kt | 2 -- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt index 73fe4fe93..43a6ac72d 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkAdapter.kt @@ -27,14 +27,17 @@ class BookmarkAdapter(context: Context, val callback: Callback) : } override fun registerListener(holder: ItemViewHolder, binding: ItemBookmarkBinding) { - getItem(holder.layoutPosition)?.let { bookmark -> - binding.root.setOnClickListener { + binding.root.setOnClickListener { + getItem(holder.layoutPosition)?.let { bookmark -> callback.onClick(bookmark) } - binding.root.onLongClick { + } + binding.root.onLongClick { + getItem(holder.layoutPosition)?.let { bookmark -> callback.onLongClick(bookmark) } } + } interface Callback { diff --git a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt index f2ed00882..976436e56 100644 --- a/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt +++ b/app/src/main/java/io/legado/app/ui/book/toc/BookmarkFragment.kt @@ -1,6 +1,5 @@ package io.legado.app.ui.book.toc -import android.annotation.SuppressLint import android.app.Activity import android.content.Intent import android.os.Bundle @@ -74,7 +73,6 @@ class BookmarkFragment : VMBaseFragment(R.layout.fragment_ activity?.finish() } - @SuppressLint("InflateParams") override fun onLongClick(bookmark: Bookmark) { requireContext().alert(R.string.bookmark) { setMessage(bookmark.chapterName) From 737a2d4d723df9ba0e080cdb3fdff3e0749c5c60 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 15:36:40 +0800 Subject: [PATCH 21/45] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=96=B9=E6=B3=95viewPager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/main/bookshelf/BookshelfFragment.kt | 37 +++++++++---------- .../main/res/layout/fragment_bookshelf.xml | 2 +- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 090edd420..116261ded 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -5,11 +5,14 @@ import android.os.Bundle import android.view.Menu import android.view.MenuItem import android.view.View -import android.view.ViewGroup import androidx.appcompat.widget.SearchView -import androidx.fragment.app.* +import androidx.fragment.app.Fragment +import androidx.fragment.app.activityViewModels +import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData +import androidx.viewpager2.adapter.FragmentStateAdapter import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator import io.legado.app.R import io.legado.app.base.VMBaseFragment import io.legado.app.constant.AppConst @@ -44,7 +47,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b private val binding by viewBinding(FragmentBookshelfBinding::bind) override val viewModel: BookshelfViewModel by viewModels() private val activityViewModel: MainViewModel by activityViewModels() - private lateinit var adapter: FragmentStatePagerAdapter + private lateinit var adapter: FragmentStateAdapter private lateinit var tabLayout: TabLayout private var bookGroupLiveData: LiveData>? = null private val bookGroups = mutableListOf() @@ -107,10 +110,12 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b tabLayout.isTabIndicatorFullWidth = false tabLayout.tabMode = TabLayout.MODE_SCROLLABLE tabLayout.setSelectedTabIndicatorColor(requireContext().accentColor) - tabLayout.setupWithViewPager(binding.viewPagerBookshelf) binding.viewPagerBookshelf.offscreenPageLimit = 1 - adapter = TabFragmentPageAdapter(childFragmentManager) + adapter = TabFragmentPageAdapter() binding.viewPagerBookshelf.adapter = adapter + TabLayoutMediator(tabLayout, binding.viewPagerBookshelf) { tab, i -> + tab.text = bookGroups[i].groupName + }.attach() } private fun initBookGroupData() { @@ -240,29 +245,21 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b }.show() } - private inner class TabFragmentPageAdapter(fm: FragmentManager) : - FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + private inner class TabFragmentPageAdapter : + FragmentStateAdapter(this) { - override fun getPageTitle(position: Int): CharSequence { - return bookGroups[position].groupName - } - - override fun getItemPosition(`object`: Any): Int { - return POSITION_NONE - } - - override fun getItem(position: Int): Fragment { + override fun getItemId(position: Int): Long { val group = bookGroups[position] - return BooksFragment.newInstance(position, group.groupId) + return group.groupId } - override fun getCount(): Int { + override fun getItemCount(): Int { return bookGroups.size } - override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as BooksFragment + override fun createFragment(position: Int): Fragment { val group = bookGroups[position] + val fragment = BooksFragment.newInstance(position, group.groupId) fragmentMap[group.groupId] = fragment return fragment } diff --git a/app/src/main/res/layout/fragment_bookshelf.xml b/app/src/main/res/layout/fragment_bookshelf.xml index 4fbff35c3..0986b9bea 100644 --- a/app/src/main/res/layout/fragment_bookshelf.xml +++ b/app/src/main/res/layout/fragment_bookshelf.xml @@ -13,7 +13,7 @@ app:title="@string/bookshelf" app:contentLayout="@layout/view_tab_layout_min" /> - From 3d7db7370b773651c8d6fd87f984a340096154bf Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 16:25:46 +0800 Subject: [PATCH 22/45] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=96=B9=E6=B3=95viewPager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/main/MainActivity.kt | 52 +++++------ .../legado/app/ui/main/bookshelf/RootView.kt | 88 +++++++++++++++++++ app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/fragment_bookshelf.xml | 8 +- 4 files changed, 119 insertions(+), 31 deletions(-) create mode 100644 app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 55a1498f4..d62a7b596 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -3,12 +3,11 @@ package io.legado.app.ui.main import android.os.Bundle import android.view.KeyEvent import android.view.MenuItem -import android.view.ViewGroup import androidx.activity.viewModels import androidx.fragment.app.Fragment -import androidx.fragment.app.FragmentManager -import androidx.fragment.app.FragmentStatePagerAdapter import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.bottomnavigation.BottomNavigationView import io.legado.app.BuildConfig import io.legado.app.R @@ -43,7 +42,7 @@ class MainActivity : VMBaseActivity(), private var bookshelfReselected: Long = 0 private var exploreReselected: Long = 0 private var pagePosition = 0 - private val fragmentMap = hashMapOf() + private val fragmentMap = hashMapOf() override fun getViewBinding(): ActivityMainBinding { return ActivityMainBinding.inflate(layoutInflater) @@ -53,8 +52,12 @@ class MainActivity : VMBaseActivity(), ATH.applyEdgeEffectColor(viewPagerMain) ATH.applyBottomNavigationColor(bottomNavigationView) viewPagerMain.offscreenPageLimit = 3 - viewPagerMain.adapter = TabFragmentPageAdapter(supportFragmentManager) - viewPagerMain.addOnPageChangeListener(this@MainActivity) + viewPagerMain.adapter = TabFragmentPageAdapter() + viewPagerMain.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + this@MainActivity.onPageSelected(position) + } + }) bottomNavigationView.elevation = if (AppConfig.elevation < 0) elevation else AppConfig.elevation.toFloat() bottomNavigationView.setOnNavigationItemSelectedListener(this@MainActivity) @@ -105,6 +108,10 @@ class MainActivity : VMBaseActivity(), } } + fun getViewPager(): ViewPager2 { + return binding.viewPagerMain + } + private fun upVersion() { if (LocalConfig.versionCode != appInfo.versionCode) { LocalConfig.versionCode = appInfo.versionCode @@ -186,36 +193,29 @@ class MainActivity : VMBaseActivity(), } } - private inner class TabFragmentPageAdapter(fm: FragmentManager) : - FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { + private inner class TabFragmentPageAdapter : + FragmentStateAdapter(this) { - private fun getId(position: Int): Int { + override fun getItemId(position: Int): Long { return when (position) { 2 -> if (AppConfig.isShowRSS) 2 else 3 - else -> position + else -> position.toLong() } } - override fun getItemPosition(`object`: Any): Int { - return POSITION_NONE + override fun getItemCount(): Int { + return if (AppConfig.isShowRSS) 4 else 3 } - override fun getItem(position: Int): Fragment { - return when (getId(position)) { - 0 -> BookshelfFragment() - 1 -> ExploreFragment() - 2 -> RssFragment() + override fun createFragment(position: Int): Fragment { + val id = getItemId(position) + val fragment = when (id) { + 0L -> BookshelfFragment() + 1L -> ExploreFragment() + 2L -> RssFragment() else -> MyFragment() } - } - - override fun getCount(): Int { - return if (AppConfig.isShowRSS) 4 else 3 - } - - override fun instantiateItem(container: ViewGroup, position: Int): Any { - val fragment = super.instantiateItem(container, position) as Fragment - fragmentMap[getId(position)] = fragment + fragmentMap[id] = fragment return fragment } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt new file mode 100644 index 000000000..938116e4e --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt @@ -0,0 +1,88 @@ +package io.legado.app.ui.main.bookshelf + +import android.content.Context +import android.gesture.GestureOverlayView.ORIENTATION_HORIZONTAL +import android.util.AttributeSet +import android.view.MotionEvent +import android.view.View +import android.view.ViewConfiguration +import android.widget.LinearLayout +import androidx.viewpager2.widget.ViewPager2 +import io.legado.app.R +import io.legado.app.ui.main.MainActivity +import io.legado.app.utils.activity +import kotlin.math.absoluteValue +import kotlin.math.sign + +class RootView : LinearLayout { + + constructor(context: Context) : super(context) + constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) + + private var touchSlop = 0 + private var initialX = 0f + private var initialY = 0f + + private val parentViewPager: ViewPager2 + get() { + return (activity as MainActivity).getViewPager() + } + + private val childViewPager: View get() = findViewById(R.id.view_pager_bookshelf) + + init { + touchSlop = ViewConfiguration.get(context).scaledTouchSlop + } + + private fun canChildScroll(orientation: Int, delta: Float): Boolean { + val direction = -delta.sign.toInt() + return when (orientation) { + 0 -> childViewPager.canScrollHorizontally(direction) + 1 -> childViewPager.canScrollVertically(direction) + else -> throw IllegalArgumentException() + } + } + + override fun onInterceptTouchEvent(e: MotionEvent): Boolean { + handleInterceptTouchEvent(e) + return super.onInterceptTouchEvent(e) + } + + private fun handleInterceptTouchEvent(e: MotionEvent) { + val orientation = parentViewPager.orientation + // Early return if child can't scroll in same direction as parent + if (!canChildScroll(orientation, -1f) && !canChildScroll(orientation, 1f)) { + return + } + + if (e.action == MotionEvent.ACTION_DOWN) { + initialX = e.x + initialY = e.y + parent.requestDisallowInterceptTouchEvent(true) + } else if (e.action == MotionEvent.ACTION_MOVE) { + val dx = e.x - initialX + val dy = e.y - initialY + val isVpHorizontal = orientation == ORIENTATION_HORIZONTAL + // assuming ViewPager2 touch-slop is 2x touch-slop of child + val scaledDx = dx.absoluteValue * if (isVpHorizontal) .5f else 1f + val scaledDy = dy.absoluteValue * if (isVpHorizontal) 1f else .5f + + if (scaledDx > touchSlop || scaledDy > touchSlop) { + + if (isVpHorizontal == (scaledDy > scaledDx)) { + // Gesture is perpendicular, allow all parents to intercept + parent.requestDisallowInterceptTouchEvent(false) + } else { + // Gesture is parallel, query child if movement in that direction is possible + if (canChildScroll(orientation, if (isVpHorizontal) dx else dy)) { + // Child can scroll, disallow all parents to intercept + parent.requestDisallowInterceptTouchEvent(true) + } else { + // Child cannot scroll, allow all parents to intercept + parent.requestDisallowInterceptTouchEvent(false) + } + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a387ecb36..80c952ab8 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -5,7 +5,7 @@ android:layout_height="match_parent" android:orientation="vertical"> - - + app:contentLayout="@layout/view_tab_layout_min" + app:title="@string/bookshelf" /> - \ No newline at end of file + \ No newline at end of file From 05aba32e70cb9a4a4920f48321e8c3f67ecea73d Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 16:27:04 +0800 Subject: [PATCH 23/45] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=96=B9=E6=B3=95viewPager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 484779471..e48366fc0 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,10 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/05/10** +* 修复书签bug +* 修改弃用类ViewPager + **2021/05/09** * 网页访问404依然返回body * 添加书籍批量导出 From 35db345a5d1570fd329bde3a82da422f869dfa56 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 16:30:29 +0800 Subject: [PATCH 24/45] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BF=87=E6=9C=9F?= =?UTF-8?q?=E6=96=B9=E6=B3=95viewPager?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/ui/main/MainActivity.kt | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index d62a7b596..7158cf76d 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -5,7 +5,6 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.activity.viewModels import androidx.fragment.app.Fragment -import androidx.viewpager.widget.ViewPager import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.bottomnavigation.BottomNavigationView @@ -35,8 +34,7 @@ import io.legado.app.utils.toastOnUi class MainActivity : VMBaseActivity(), BottomNavigationView.OnNavigationItemSelectedListener, - BottomNavigationView.OnNavigationItemReselectedListener, - ViewPager.OnPageChangeListener by ViewPager.SimpleOnPageChangeListener() { + BottomNavigationView.OnNavigationItemReselectedListener { override val viewModel: MainViewModel by viewModels() private var exitTime: Long = 0 private var bookshelfReselected: Long = 0 @@ -55,7 +53,15 @@ class MainActivity : VMBaseActivity(), viewPagerMain.adapter = TabFragmentPageAdapter() viewPagerMain.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { override fun onPageSelected(position: Int) { - this@MainActivity.onPageSelected(position) + pagePosition = position + when (position) { + 0, 1, 3 -> bottomNavigationView.menu.getItem(position).isChecked = true + 2 -> if (AppConfig.isShowRSS) { + bottomNavigationView.menu.getItem(position).isChecked = true + } else { + bottomNavigationView.menu.getItem(3).isChecked = true + } + } } }) bottomNavigationView.elevation = @@ -127,18 +133,6 @@ class MainActivity : VMBaseActivity(), } } - override fun onPageSelected(position: Int) = with(binding) { - pagePosition = position - when (position) { - 0, 1, 3 -> bottomNavigationView.menu.getItem(position).isChecked = true - 2 -> if (AppConfig.isShowRSS) { - bottomNavigationView.menu.getItem(position).isChecked = true - } else { - bottomNavigationView.menu.getItem(3).isChecked = true - } - } - } - override fun onKeyUp(keyCode: Int, event: KeyEvent?): Boolean { event?.let { when (keyCode) { From 14f9bc8f14ceb4e094aaad77dfea49efbc271663 Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 19:57:44 +0800 Subject: [PATCH 25/45] =?UTF-8?q?=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/lib/theme/ATH.kt | 8 ++++---- .../io/legado/app/ui/widget/recycler/ItemTouchCallback.kt | 4 ---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/theme/ATH.kt b/app/src/main/java/io/legado/app/lib/theme/ATH.kt index cbe1c2ebb..dcecc9577 100644 --- a/app/src/main/java/io/legado/app/lib/theme/ATH.kt +++ b/app/src/main/java/io/legado/app/lib/theme/ATH.kt @@ -16,7 +16,7 @@ import android.widget.ScrollView import androidx.annotation.ColorInt import androidx.appcompat.app.AlertDialog import androidx.recyclerview.widget.RecyclerView -import androidx.viewpager.widget.ViewPager +import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.bottomnavigation.BottomNavigationView import io.legado.app.R import io.legado.app.help.AppConfig @@ -219,9 +219,9 @@ object ATH { } } - fun setEdgeEffectColor(viewPager: ViewPager?, @ColorInt color: Int) { + fun setEdgeEffectColor(viewPager: ViewPager2?, @ColorInt color: Int) { try { - val clazz = ViewPager::class.java + val clazz = ViewPager2::class.java for (name in arrayOf("mLeftEdge", "mRightEdge")) { val field = clazz.getDeclaredField(name) field.isAccessible = true @@ -280,7 +280,7 @@ object ATH { fun applyEdgeEffectColor(view: View?) { when (view) { is RecyclerView -> view.edgeEffectFactory = DEFAULT_EFFECT_FACTORY - is ViewPager -> setEdgeEffectColor(view, ThemeStore.primaryColor(view.context)) + is ViewPager2 -> setEdgeEffectColor(view, ThemeStore.primaryColor(view.context)) is ScrollView -> setEdgeEffectColor(view, ThemeStore.primaryColor(view.context)) } } diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt index ef9872298..8e856bf3a 100644 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt +++ b/app/src/main/java/io/legado/app/ui/widget/recycler/ItemTouchCallback.kt @@ -6,17 +6,14 @@ import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import androidx.viewpager.widget.ViewPager /** * Created by GKF on 2018/3/16. */ - @Suppress("MemberVisibilityCanBePrivate") class ItemTouchCallback(private val callback: Callback) : ItemTouchHelper.Callback() { private var swipeRefreshLayout: SwipeRefreshLayout? = null - private var viewPager: ViewPager? = null /** * 是否可以拖拽 @@ -107,7 +104,6 @@ class ItemTouchCallback(private val callback: Callback) : ItemTouchHelper.Callba super.onSelectedChanged(viewHolder, actionState) val swiping = actionState == ItemTouchHelper.ACTION_STATE_DRAG swipeRefreshLayout?.isEnabled = !swiping - viewPager?.requestDisallowInterceptTouchEvent(swiping) } override fun clearView(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder) { From feba6cb797038a738600eeda3fa387c0ed88e39d Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 20:13:19 +0800 Subject: [PATCH 26/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/legado/app/help/http/OkHttpUtils.kt | 27 ------------ .../java/io/legado/app/lib/webdav/WebDav.kt | 43 ++++++++++++++++--- .../legado/app/ui/book/cache/CacheActivity.kt | 2 +- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt index efdc5839a..2c8206123 100644 --- a/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt +++ b/app/src/main/java/io/legado/app/help/http/OkHttpUtils.kt @@ -119,31 +119,4 @@ fun Request.Builder.postJson(json: String?) { val requestBody = json.toRequestBody("application/json; charset=UTF-8".toMediaType()) post(requestBody) } -} - -fun Request.Builder.mkCol() { - method("MKCOL", null) -} - -fun Request.Builder.propFind(fields: List?) { - var propFind = - """ - - - %s - - """ - // 添加RequestBody对象,可以只返回的属性。如果设为null,则会返回全部属性 - // 注意:尽量手动指定需要返回的属性。若返回全部属性,可能后由于Prop.java里没有该属性名,而崩溃。 - if (fields.isNullOrEmpty()) { - method("PROPFIND", null) - } else { - val requestProps = StringBuilder() - for (p in fields) { - requestProps.append("\n") - } - propFind = String.format(propFind, requestProps.toString() + "\n") - val requestBody = propFind.toRequestBody("text/plain".toMediaType()) - method("PROPFIND", requestBody) - } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 654a6d277..06f178cbf 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -1,6 +1,8 @@ package io.legado.app.lib.webdav -import io.legado.app.help.http.* +import io.legado.app.help.http.newCall +import io.legado.app.help.http.okHttpClient +import io.legado.app.help.http.text import okhttp3.* import okhttp3.MediaType.Companion.toMediaType import okhttp3.RequestBody.Companion.asRequestBody @@ -15,6 +17,21 @@ import java.util.* @Suppress("unused", "MemberVisibilityCanBePrivate") class WebDav(urlStr: String) { + companion object { + // 指定返回哪些属性 + private const val DIR = + """ + + + + + + + + %s + + """ + } private val url: URL = URL(urlStr) private val httpUrl: String? by lazy { @@ -46,17 +63,26 @@ class WebDav(urlStr: String) { /** * 列出当前路径下的文件 * - * @param fields 指定列出文件的哪些属性 + * @param propsList 指定列出文件的哪些属性 * @return 文件列表 */ - suspend fun listFiles(fields: ArrayList = ArrayList()): List { - propFindResponse(fields)?.let { body -> + suspend fun listFiles(propsList: ArrayList = ArrayList()): List { + propFindResponse(propsList)?.let { body -> return parseDir(body) } return ArrayList() } - private suspend fun propFindResponse(fields: ArrayList?): String? { + private suspend fun propFindResponse(propsList: ArrayList): String? { + val requestProps = StringBuilder() + for (p in propsList) { + requestProps.append("\n") + } + val requestPropsStr: String = if (requestProps.toString().isEmpty()) { + DIR.replace("%s", "") + } else { + String.format(DIR, requestProps.toString() + "\n") + } val url = httpUrl val auth = HttpAuth.auth if (url != null && auth != null) { @@ -64,7 +90,10 @@ class WebDav(urlStr: String) { okHttpClient.newCall { url(url) addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - propFind(fields) + // 添加RequestBody对象,可以只返回的属性。如果设为null,则会返回全部属性 + // 注意:尽量手动指定需要返回的属性。若返回全部属性,可能后由于Prop.java里没有该属性名,而崩溃。 + val requestBody = requestPropsStr.toRequestBody("text/plain".toMediaType()) + method("PROPFIND", requestBody) }.text() }.onFailure { it.printStackTrace() @@ -119,7 +148,7 @@ class WebDav(urlStr: String) { return kotlin.runCatching { okHttpClient.newCall { url(url) - mkCol() + method("MKCOL", null) addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) }.close() }.isSuccess diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt index 87e52de40..f30512e1a 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt @@ -275,7 +275,7 @@ class CacheActivity : VMBaseActivity() } else { toastOnUi(R.string.no_book) } - } else if (exportPosition > 0) { + } else if (exportPosition >= 0) { adapter.getItem(exportPosition)?.let { book -> Snackbar.make(binding.titleBar, R.string.exporting, Snackbar.LENGTH_INDEFINITE) .show() From 7d67ae2e859966343acf73a1ef12ecb769544d9e Mon Sep 17 00:00:00 2001 From: gedoor Date: Mon, 10 May 2021 20:20:03 +0800 Subject: [PATCH 27/45] =?UTF-8?q?=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/lib/webdav/WebDav.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 06f178cbf..6052e68ff 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -63,17 +63,19 @@ class WebDav(urlStr: String) { /** * 列出当前路径下的文件 * - * @param propsList 指定列出文件的哪些属性 * @return 文件列表 */ - suspend fun listFiles(propsList: ArrayList = ArrayList()): List { - propFindResponse(propsList)?.let { body -> + suspend fun listFiles(): List { + propFindResponse()?.let { body -> return parseDir(body) } return ArrayList() } - private suspend fun propFindResponse(propsList: ArrayList): String? { + /** + * @param propsList 指定列出文件的哪些属性 + */ + private suspend fun propFindResponse(propsList: List = emptyList()): String? { val requestProps = StringBuilder() for (p in propsList) { requestProps.append("\n") From b6565c8cb9d6b5ae62f3cb73dfd97d8c2ae05bf7 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 08:43:50 +0800 Subject: [PATCH 28/45] =?UTF-8?q?=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/main/bookshelf/RootView.kt | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt index 938116e4e..0e8225fc0 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt @@ -23,12 +23,10 @@ class RootView : LinearLayout { private var initialX = 0f private var initialY = 0f - private val parentViewPager: ViewPager2 - get() { - return (activity as MainActivity).getViewPager() - } - - private val childViewPager: View get() = findViewById(R.id.view_pager_bookshelf) + private val parentViewPager: ViewPager2? + get() = (activity as? MainActivity)?.getViewPager() + private val childViewPager: View + get() = findViewById(R.id.view_pager_bookshelf) init { touchSlop = ViewConfiguration.get(context).scaledTouchSlop @@ -49,7 +47,7 @@ class RootView : LinearLayout { } private fun handleInterceptTouchEvent(e: MotionEvent) { - val orientation = parentViewPager.orientation + val orientation = parentViewPager?.orientation ?: return // Early return if child can't scroll in same direction as parent if (!canChildScroll(orientation, -1f) && !canChildScroll(orientation, 1f)) { return From c0634eb5cf1c149612f96f4bd524e1d075b0d148 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 09:13:09 +0800 Subject: [PATCH 29/45] =?UTF-8?q?=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/book/cache/CacheActivity.kt | 10 ++++------ app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 5 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt index f30512e1a..8b95ed50d 100644 --- a/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/cache/CacheActivity.kt @@ -256,18 +256,16 @@ class CacheActivity : VMBaseActivity() when (AppConfig.exportType) { 1 -> viewModel.exportEPUB(path, book) { exportSize-- + toastOnUi(it) if (exportSize <= 0) { - binding.titleBar.snackbar(it) - } else { - toastOnUi(it) + binding.titleBar.snackbar(R.string.complete) } } else -> viewModel.export(path, book) { exportSize-- + toastOnUi(it) if (exportSize <= 0) { - binding.titleBar.snackbar(it) - } else { - toastOnUi(it) + binding.titleBar.snackbar(R.string.complete) } } } diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index b2067adb5..a854f5d40 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -823,5 +823,6 @@ 高刷 使用屏幕最高刷新率 导出所有 + 完成 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 1899df105..604cfcaed 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -827,5 +827,6 @@ 高刷 使用螢幕最高刷新率 导出所有 + 完成 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 238ed1a32..987c5e6db 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -827,5 +827,6 @@ 高刷 使用屏幕最高刷新率 导出所有 + 完成 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73982b13e..bb353c4aa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -828,5 +828,6 @@ 高刷 使用屏幕最高刷新率 export_all + complete From 907599b7d22601f12c8d91984212d993c488075f Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 14:19:01 +0800 Subject: [PATCH 30/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/main/bookshelf/RootView.kt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt index 0e8225fc0..95ee7b755 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt @@ -25,7 +25,7 @@ class RootView : LinearLayout { private val parentViewPager: ViewPager2? get() = (activity as? MainActivity)?.getViewPager() - private val childViewPager: View + private val childViewPager: View? get() = findViewById(R.id.view_pager_bookshelf) init { @@ -35,8 +35,8 @@ class RootView : LinearLayout { private fun canChildScroll(orientation: Int, delta: Float): Boolean { val direction = -delta.sign.toInt() return when (orientation) { - 0 -> childViewPager.canScrollHorizontally(direction) - 1 -> childViewPager.canScrollVertically(direction) + 0 -> childViewPager?.canScrollHorizontally(direction) ?: false + 1 -> childViewPager?.canScrollVertically(direction) ?: false else -> throw IllegalArgumentException() } } From 18828dd1db96f644e34d2a21d0dc10a775ae4b5b Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 14:37:03 +0800 Subject: [PATCH 31/45] =?UTF-8?q?=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/lib/webdav/WebDav.kt | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index 6052e68ff..cb65fc109 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -190,12 +190,13 @@ class WebDav(urlStr: String) { val url = httpUrl val auth = HttpAuth.auth if (url != null && auth != null) { - okHttpClient.newCall { - url(url) - put(fileBody) - addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - }.close() - return true + return kotlin.runCatching { + okHttpClient.newCall { + url(url) + put(fileBody) + addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) + }.close() + }.isSuccess } return false } @@ -206,12 +207,13 @@ class WebDav(urlStr: String) { val url = httpUrl val auth = HttpAuth.auth if (url != null && auth != null) { - okHttpClient.newCall { - url(url) - put(fileBody) - addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - }.close() - return true + return kotlin.runCatching { + okHttpClient.newCall { + url(url) + put(fileBody) + addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) + }.close() + }.isSuccess } return false } @@ -220,10 +222,12 @@ class WebDav(urlStr: String) { val url = httpUrl val auth = HttpAuth.auth if (url != null && auth != null) { - return okHttpClient.newCall { - url(url) - addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) - }.byteStream() + return kotlin.runCatching { + okHttpClient.newCall { + url(url) + addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) + }.byteStream() + }.getOrNull() } return null } From 3c37fd31904f96e6d1d455397ea2dc76c5be8ccb Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 14:43:00 +0800 Subject: [PATCH 32/45] =?UTF-8?q?=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/ui/main/MainActivity.kt | 4 ++++ .../java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index 7158cf76d..b7d448502 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -197,6 +197,10 @@ class MainActivity : VMBaseActivity(), } } + override fun containsItem(itemId: Long): Boolean { + return fragmentMap.containsKey(itemId) + } + override fun getItemCount(): Int { return if (AppConfig.isShowRSS) 4 else 3 } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 116261ded..7a7113054 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -253,6 +253,10 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b return group.groupId } + override fun containsItem(itemId: Long): Boolean { + return fragmentMap.containsKey(itemId) + } + override fun getItemCount(): Int { return bookGroups.size } From 7ba47a113b3ddbe1eb214fdb09e5be54a9cf6eab Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 14:52:49 +0800 Subject: [PATCH 33/45] =?UTF-8?q?=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/rss/article/RssSortActivity.kt | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) 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 b2bdb2920..eb3f34b9f 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 @@ -22,6 +22,7 @@ class RssSortActivity : VMBaseActivity() private lateinit var adapter: TabFragmentPageAdapter + private val fragmentMap = hashMapOf() private val upSourceResult = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { @@ -99,12 +100,20 @@ class RssSortActivity : VMBaseActivity Date: Tue, 11 May 2021 15:09:03 +0800 Subject: [PATCH 34/45] =?UTF-8?q?=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/page/ContentTextView.kt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt index 314051adc..1be7ce084 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/page/ContentTextView.kt @@ -23,6 +23,7 @@ import io.legado.app.ui.widget.dialog.PhotoDialog import io.legado.app.utils.activity import io.legado.app.utils.getCompatColor import io.legado.app.utils.getPrefBoolean +import io.legado.app.utils.toastOnUi import kotlinx.coroutines.CoroutineScope import kotlin.math.min @@ -178,7 +179,11 @@ class ContentTextView(context: Context, attrs: AttributeSet?) : View(context, at val div = (lineBottom - lineTop - h) / 2 RectF(textChar.start, lineTop + div, textChar.end, lineBottom - div) } - canvas.drawBitmap(it, null, rectF, null) + kotlin.runCatching { + canvas.drawBitmap(it, null, rectF, null) + }.onFailure { e -> + context.toastOnUi(e.localizedMessage) + } } } } From cbd02352e6a191608ce72240e61a25781c99cb8b Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 15:35:54 +0800 Subject: [PATCH 35/45] =?UTF-8?q?=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/lib/webdav/WebDav.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt index cb65fc109..389c273a0 100644 --- a/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt +++ b/app/src/main/java/io/legado/app/lib/webdav/WebDav.kt @@ -92,6 +92,7 @@ class WebDav(urlStr: String) { okHttpClient.newCall { url(url) addHeader("Authorization", Credentials.basic(auth.user, auth.pass)) + addHeader("Depth", "1") // 添加RequestBody对象,可以只返回的属性。如果设为null,则会返回全部属性 // 注意:尽量手动指定需要返回的属性。若返回全部属性,可能后由于Prop.java里没有该属性名,而崩溃。 val requestBody = requestPropsStr.toRequestBody("text/plain".toMediaType()) From 2d4f9c0b28f19f335f1e3d67b6b9b8323ea9bad0 Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 15:53:52 +0800 Subject: [PATCH 36/45] =?UTF-8?q?=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 e48366fc0..3de6114c5 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/05/11** +* 修复bug + **2021/05/10** * 修复书签bug * 修改弃用类ViewPager From 187942099f0a358046bfb379db6561c80d0d3d2f Mon Sep 17 00:00:00 2001 From: gedoor Date: Tue, 11 May 2021 20:33:14 +0800 Subject: [PATCH 37/45] =?UTF-8?q?=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 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 3de6114c5..1de59413b 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -4,7 +4,9 @@ * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 **2021/05/11** -* 修复bug +* 修复部分webDav bug +* 修复图片太大时会崩溃的bug +* 修复其它一些bug **2021/05/10** * 修复书签bug From e2e8713bc8cc8be284d2c7199675f9952648095f Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 08:26:51 +0800 Subject: [PATCH 38/45] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=A2=84=E4=B8=8B?= =?UTF-8?q?=E8=BD=BDbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 3 +++ .../main/java/io/legado/app/service/help/ReadBook.kt | 12 ++++++------ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 1de59413b..bd696f3fe 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -3,6 +3,9 @@ * 关注合作公众号 **[小说拾遗]** 获取好看的小说。 * 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 +**2021/05/12** +* 修复预下载bug + **2021/05/11** * 修复部分webDav bug * 修复图片太大时会崩溃的bug diff --git a/app/src/main/java/io/legado/app/service/help/ReadBook.kt b/app/src/main/java/io/legado/app/service/help/ReadBook.kt index 88e7e6fa3..31adc1e33 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadBook.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadBook.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.delay import kotlinx.coroutines.launch import splitties.init.appCtx +import kotlin.math.max import kotlin.math.min @@ -141,9 +142,9 @@ object ReadBook { GlobalScope.launch(Dispatchers.IO) { val maxChapterIndex = min(chapterSize - 1, durChapterIndex + AppConfig.preDownloadNum) - for (i in 2..maxChapterIndex) { + for (i in durChapterIndex.plus(2)..maxChapterIndex) { delay(1000) - download(durChapterIndex + i) + download(i) } } } @@ -171,11 +172,10 @@ object ReadBook { } loadContent(durChapterIndex.minus(1), upContent, false) GlobalScope.launch(Dispatchers.IO) { - val maxChapterIndex = - min(chapterSize - 1, durChapterIndex + AppConfig.preDownloadNum) - for (i in 2..maxChapterIndex) { + val minChapterIndex = max(0, durChapterIndex - 5) + for (i in durChapterIndex.minus(2) downTo minChapterIndex) { delay(1000) - download(durChapterIndex - i) + download(i) } } } From 3e237ffb7d71dcafa2844277ba383656e101fc5f Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 09:21:12 +0800 Subject: [PATCH 39/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 3 +++ .../java/io/legado/app/model/analyzeRule/QueryTTF.java | 7 ++++--- build.gradle | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 01b29ff29..29aa9966e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,6 +97,9 @@ android { jvmTarget = "1.8" } buildToolsVersion '30.0.3' + tasks.withType(JavaCompile) { + options.compilerArgs << "-Xlint:unchecked" + } } resourcePlaceholders { diff --git a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java index 041a6539b..7fb875627 100644 --- a/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java +++ b/app/src/main/java/io/legado/app/model/analyzeRule/QueryTTF.java @@ -11,7 +11,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; -@SuppressWarnings({"FieldCanBeLocal", "rawtypes", "StatementWithEmptyBody", "unused"}) +@SuppressWarnings({"FieldCanBeLocal", "StatementWithEmptyBody", "unused"}) public class QueryTTF { private static class Header { public int majorVersion; @@ -223,7 +223,8 @@ public class QueryTTF { private final List loca = new LinkedList<>(); private final CmapLayout Cmap = new CmapLayout(); private final List glyf = new LinkedList<>(); - private final Pair[] pps = new Pair[]{ + @SuppressWarnings("unchecked") + private final Pair[] pps = new Pair[]{ Pair.of(3, 10), Pair.of(0, 4), Pair.of(3, 1), @@ -515,7 +516,7 @@ public class QueryTTF { private int getGlyfIndex(int code) { if (code == 0) return 0; int fmtKey = 0; - for (@SuppressWarnings("unchecked") Pair item : pps) { + for (Pair item : pps) { for (CmapRecord record : Cmap.records) { if ((item.getLeft() == record.platformID) && (item.getRight() == record.encodingID)) { fmtKey = record.offset; diff --git a/build.gradle b/build.gradle index 33cfb14a1..e9650f9c8 100644 --- a/build.gradle +++ b/build.gradle @@ -11,6 +11,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:4.2.0' + //noinspection DifferentKotlinGradleVersion classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "de.timfreiheit.resourceplaceholders:placeholders:0.3" } @@ -19,7 +20,7 @@ buildscript { allprojects { repositories { google() - maven { url 'https://maven.aliyun.com/repository/public/'} + maven { url 'https://maven.aliyun.com/repository/public/' } maven { url "https://jitpack.io" } maven { url "https://maven.google.com/" } } From a22ade97d4634d99c04effdd1e2d141009a2f176 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 09:34:40 +0800 Subject: [PATCH 40/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 29aa9966e..ac5387bee 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -97,9 +97,9 @@ android { jvmTarget = "1.8" } buildToolsVersion '30.0.3' - tasks.withType(JavaCompile) { - options.compilerArgs << "-Xlint:unchecked" - } +// tasks.withType(JavaCompile) { +// options.compilerArgs << "-Xlint:unchecked" +// } } resourcePlaceholders { From 03f9eb15385da327d813cd667264fe28fdb01fb8 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 15:02:57 +0800 Subject: [PATCH 41/45] =?UTF-8?q?=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/main/MainActivity.kt | 63 ++++++++++++------- .../ui/main/bookshelf/BookshelfFragment.kt | 20 ++++++ .../recycler/RecyclerViewAtViewPager2.kt | 41 ------------ 3 files changed, 62 insertions(+), 62 deletions(-) delete mode 100644 app/src/main/java/io/legado/app/ui/widget/recycler/RecyclerViewAtViewPager2.kt diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index b7d448502..b3abb11e3 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -5,6 +5,7 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.activity.viewModels import androidx.fragment.app.Fragment +import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.bottomnavigation.BottomNavigationView @@ -30,6 +31,7 @@ import io.legado.app.ui.main.rss.RssFragment import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.observeEvent import io.legado.app.utils.toastOnUi +import java.lang.reflect.Field class MainActivity : VMBaseActivity(), @@ -46,29 +48,32 @@ class MainActivity : VMBaseActivity(), return ActivityMainBinding.inflate(layoutInflater) } - override fun onActivityCreated(savedInstanceState: Bundle?) = with(binding) { - ATH.applyEdgeEffectColor(viewPagerMain) - ATH.applyBottomNavigationColor(bottomNavigationView) - viewPagerMain.offscreenPageLimit = 3 - viewPagerMain.adapter = TabFragmentPageAdapter() - viewPagerMain.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { - override fun onPageSelected(position: Int) { - pagePosition = position - when (position) { - 0, 1, 3 -> bottomNavigationView.menu.getItem(position).isChecked = true - 2 -> if (AppConfig.isShowRSS) { - bottomNavigationView.menu.getItem(position).isChecked = true - } else { - bottomNavigationView.menu.getItem(3).isChecked = true + override fun onActivityCreated(savedInstanceState: Bundle?) { + binding.apply { + ATH.applyEdgeEffectColor(viewPagerMain) + ATH.applyBottomNavigationColor(bottomNavigationView) + viewPagerMain.offscreenPageLimit = 3 + viewPagerMain.adapter = TabFragmentPageAdapter() + viewPagerMain.registerOnPageChangeCallback(object : ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + pagePosition = position + when (position) { + 0, 1, 3 -> bottomNavigationView.menu.getItem(position).isChecked = true + 2 -> if (AppConfig.isShowRSS) { + bottomNavigationView.menu.getItem(position).isChecked = true + } else { + bottomNavigationView.menu.getItem(3).isChecked = true + } } } - } - }) - bottomNavigationView.elevation = - if (AppConfig.elevation < 0) elevation else AppConfig.elevation.toFloat() - bottomNavigationView.setOnNavigationItemSelectedListener(this@MainActivity) - bottomNavigationView.setOnNavigationItemReselectedListener(this@MainActivity) - bottomNavigationView.menu.findItem(R.id.menu_rss).isVisible = AppConfig.isShowRSS + }) + bottomNavigationView.elevation = + if (AppConfig.elevation < 0) elevation else AppConfig.elevation.toFloat() + bottomNavigationView.setOnNavigationItemSelectedListener(this@MainActivity) + bottomNavigationView.setOnNavigationItemReselectedListener(this@MainActivity) + bottomNavigationView.menu.findItem(R.id.menu_rss).isVisible = AppConfig.isShowRSS + } + resetViewPager2TouchSlop() } override fun onPostCreate(savedInstanceState: Bundle?) { @@ -85,6 +90,22 @@ class MainActivity : VMBaseActivity(), }, 3000) } + /** + * 重新设置viewpager2的滑动灵敏度 + */ + private fun resetViewPager2TouchSlop() = kotlin.runCatching { + val recyclerViewField: Field = ViewPager2::class.java.getDeclaredField("mRecyclerView") + recyclerViewField.isAccessible = true + + val recyclerView = recyclerViewField.get(binding.viewPagerMain) as RecyclerView + + val touchSlopField: Field = RecyclerView::class.java.getDeclaredField("mTouchSlop") + touchSlopField.isAccessible = true + + val touchSlop = touchSlopField.get(recyclerView) as Int + touchSlopField.set(recyclerView, touchSlop * 4) + } + override fun onNavigationItemSelected(item: MenuItem): Boolean = with(binding) { when (item.itemId) { R.id.menu_bookshelf -> viewPagerMain.setCurrentItem(0, false) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 7a7113054..390de88b0 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -10,7 +10,9 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData +import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter +import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import io.legado.app.R @@ -36,6 +38,7 @@ import io.legado.app.ui.main.MainViewModel import io.legado.app.ui.main.bookshelf.books.BooksFragment import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding +import java.lang.reflect.Field /** * 书架界面 @@ -63,6 +66,23 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b setSupportToolbar(binding.titleBar.toolbar) initView() initBookGroupData() + resetViewPager2TouchSlop() + } + + /** + * 重新设置viewpager2的滑动灵敏度 + */ + private fun resetViewPager2TouchSlop() = kotlin.runCatching { + val recyclerViewField: Field = ViewPager2::class.java.getDeclaredField("mRecyclerView") + recyclerViewField.isAccessible = true + + val recyclerView = recyclerViewField.get(binding.viewPagerBookshelf) as RecyclerView + + val touchSlopField: Field = RecyclerView::class.java.getDeclaredField("mTouchSlop") + touchSlopField.isAccessible = true + + val touchSlop = touchSlopField.get(recyclerView) as Int + touchSlopField.set(recyclerView, touchSlop * 4) } override fun onCompatCreateOptionsMenu(menu: Menu) { diff --git a/app/src/main/java/io/legado/app/ui/widget/recycler/RecyclerViewAtViewPager2.kt b/app/src/main/java/io/legado/app/ui/widget/recycler/RecyclerViewAtViewPager2.kt deleted file mode 100644 index 79132f627..000000000 --- a/app/src/main/java/io/legado/app/ui/widget/recycler/RecyclerViewAtViewPager2.kt +++ /dev/null @@ -1,41 +0,0 @@ -package io.legado.app.ui.widget.recycler - -import android.content.Context -import android.util.AttributeSet -import android.view.MotionEvent -import androidx.recyclerview.widget.RecyclerView -import kotlin.math.abs - -class RecyclerViewAtViewPager2(context: Context, attrs: AttributeSet?) : - RecyclerView(context, attrs) { - - private var startX: Int = 0 - private var startY: Int = 0 - - override fun dispatchTouchEvent(ev: MotionEvent): Boolean { - when (ev.action) { - MotionEvent.ACTION_DOWN -> { - startX = ev.x.toInt() - startY = ev.y.toInt() - parent.requestDisallowInterceptTouchEvent(true) - } - MotionEvent.ACTION_MOVE -> { - val endX = ev.x.toInt() - val endY = ev.y.toInt() - val disX = abs(endX - startX) - val disY = abs(endY - startY) - if (disX > disY) { - parent.requestDisallowInterceptTouchEvent(canScrollHorizontally(startX - endX)) - } else { - parent.requestDisallowInterceptTouchEvent(canScrollVertically(startY - endY)) - } - } - MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> parent.requestDisallowInterceptTouchEvent( - false - ) - } - return super.dispatchTouchEvent(ev) - } - - -} \ No newline at end of file From 1c09e1c2c7ea6e456bcbff02e661cfc44535d5ee Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 15:04:16 +0800 Subject: [PATCH 42/45] =?UTF-8?q?=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/main/MainActivity.kt | 19 ------------------ .../ui/main/bookshelf/BookshelfFragment.kt | 20 ------------------- 2 files changed, 39 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index b3abb11e3..65ca55b42 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -5,7 +5,6 @@ import android.view.KeyEvent import android.view.MenuItem import androidx.activity.viewModels import androidx.fragment.app.Fragment -import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.bottomnavigation.BottomNavigationView @@ -31,7 +30,6 @@ import io.legado.app.ui.main.rss.RssFragment import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.observeEvent import io.legado.app.utils.toastOnUi -import java.lang.reflect.Field class MainActivity : VMBaseActivity(), @@ -73,7 +71,6 @@ class MainActivity : VMBaseActivity(), bottomNavigationView.setOnNavigationItemReselectedListener(this@MainActivity) bottomNavigationView.menu.findItem(R.id.menu_rss).isVisible = AppConfig.isShowRSS } - resetViewPager2TouchSlop() } override fun onPostCreate(savedInstanceState: Bundle?) { @@ -90,22 +87,6 @@ class MainActivity : VMBaseActivity(), }, 3000) } - /** - * 重新设置viewpager2的滑动灵敏度 - */ - private fun resetViewPager2TouchSlop() = kotlin.runCatching { - val recyclerViewField: Field = ViewPager2::class.java.getDeclaredField("mRecyclerView") - recyclerViewField.isAccessible = true - - val recyclerView = recyclerViewField.get(binding.viewPagerMain) as RecyclerView - - val touchSlopField: Field = RecyclerView::class.java.getDeclaredField("mTouchSlop") - touchSlopField.isAccessible = true - - val touchSlop = touchSlopField.get(recyclerView) as Int - touchSlopField.set(recyclerView, touchSlop * 4) - } - override fun onNavigationItemSelected(item: MenuItem): Boolean = with(binding) { when (item.itemId) { R.id.menu_bookshelf -> viewPagerMain.setCurrentItem(0, false) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 390de88b0..7a7113054 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -10,9 +10,7 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData -import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.adapter.FragmentStateAdapter -import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayout import com.google.android.material.tabs.TabLayoutMediator import io.legado.app.R @@ -38,7 +36,6 @@ import io.legado.app.ui.main.MainViewModel import io.legado.app.ui.main.bookshelf.books.BooksFragment import io.legado.app.utils.* import io.legado.app.utils.viewbindingdelegate.viewBinding -import java.lang.reflect.Field /** * 书架界面 @@ -66,23 +63,6 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b setSupportToolbar(binding.titleBar.toolbar) initView() initBookGroupData() - resetViewPager2TouchSlop() - } - - /** - * 重新设置viewpager2的滑动灵敏度 - */ - private fun resetViewPager2TouchSlop() = kotlin.runCatching { - val recyclerViewField: Field = ViewPager2::class.java.getDeclaredField("mRecyclerView") - recyclerViewField.isAccessible = true - - val recyclerView = recyclerViewField.get(binding.viewPagerBookshelf) as RecyclerView - - val touchSlopField: Field = RecyclerView::class.java.getDeclaredField("mTouchSlop") - touchSlopField.isAccessible = true - - val touchSlop = touchSlopField.get(recyclerView) as Int - touchSlopField.set(recyclerView, touchSlop * 4) } override fun onCompatCreateOptionsMenu(menu: Menu) { From 57f04955aa677cb0eb8be39b65c9733aacfb9109 Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 15:06:12 +0800 Subject: [PATCH 43/45] =?UTF-8?q?=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/ui/main/MainViewModel.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt index 48afc90ce..692eb90f0 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainViewModel.kt @@ -119,11 +119,11 @@ class MainViewModel(application: Application) : BaseViewModel(application) { if (!BookHelp.hasContent(book, chapter)) { var addToCache = false while (!addToCache) { - if (CacheBook.downloadCount() < 5) { + if (CacheBook.downloadCount() < 10) { CacheBook.download(this, webBook, book, chapter) addToCache = true } else { - delay(1000) + delay(100) } } } From 0917221b8375e9ba8d18892db97abd145aa4601d Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 15:21:51 +0800 Subject: [PATCH 44/45] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/io/legado/app/ui/main/bookshelf/RootView.kt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt index 95ee7b755..4162e6e6e 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/RootView.kt @@ -19,7 +19,7 @@ class RootView : LinearLayout { constructor(context: Context) : super(context) constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) - private var touchSlop = 0 + private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop private var initialX = 0f private var initialY = 0f @@ -28,10 +28,6 @@ class RootView : LinearLayout { private val childViewPager: View? get() = findViewById(R.id.view_pager_bookshelf) - init { - touchSlop = ViewConfiguration.get(context).scaledTouchSlop - } - private fun canChildScroll(orientation: Int, delta: Float): Boolean { val direction = -delta.sign.toInt() return when (orientation) { From 5b7903fb90567f80b35564fea3fd78cb65c53aee Mon Sep 17 00:00:00 2001 From: gedoor Date: Wed, 12 May 2021 20:18:43 +0800 Subject: [PATCH 45/45] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E6=9C=AA=E8=AF=BB=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/updateLog.md | 1 + app/src/main/java/io/legado/app/constant/PreferKey.kt | 1 + app/src/main/java/io/legado/app/help/AppConfig.kt | 6 ++++++ .../legado/app/ui/main/bookshelf/BookshelfFragment.kt | 6 ++++++ .../app/ui/main/bookshelf/books/BooksAdapterGrid.kt | 9 +++++++-- .../app/ui/main/bookshelf/books/BooksAdapterList.kt | 9 +++++++-- app/src/main/res/layout/dialog_bookshelf_config.xml | 10 ++++++++++ app/src/main/res/values-zh-rHK/strings.xml | 1 + app/src/main/res/values-zh-rTW/strings.xml | 1 + app/src/main/res/values-zh/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + 11 files changed, 42 insertions(+), 4 deletions(-) diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index bd696f3fe..4b204b77e 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2021/05/12** * 修复预下载bug +* 添加显示未读开关,书架布局中 **2021/05/11** * 修复部分webDav bug diff --git a/app/src/main/java/io/legado/app/constant/PreferKey.kt b/app/src/main/java/io/legado/app/constant/PreferKey.kt index bd0e86fc6..f60b7c361 100644 --- a/app/src/main/java/io/legado/app/constant/PreferKey.kt +++ b/app/src/main/java/io/legado/app/constant/PreferKey.kt @@ -4,6 +4,7 @@ object PreferKey { const val language = "language" const val themeMode = "themeMode" const val userAgent = "userAgent" + const val showUnread = "showUnread" const val hideStatusBar = "hideStatusBar" const val clickActionTL = "clickActionTopLeft" const val clickActionTC = "clickActionTopCenter" diff --git a/app/src/main/java/io/legado/app/help/AppConfig.kt b/app/src/main/java/io/legado/app/help/AppConfig.kt index a30f5c614..102f9507c 100644 --- a/app/src/main/java/io/legado/app/help/AppConfig.kt +++ b/app/src/main/java/io/legado/app/help/AppConfig.kt @@ -72,6 +72,12 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener { } } + var showUnread: Boolean + get() = appCtx.getPrefBoolean(PreferKey.showUnread, true) + set(value) { + appCtx.putPrefBoolean(PreferKey.showUnread, value) + } + val isTransparentStatusBar: Boolean get() = appCtx.getPrefBoolean(PreferKey.transparentStatusBar, true) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt index 7a7113054..4a3eab128 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookshelfFragment.kt @@ -22,6 +22,7 @@ import io.legado.app.data.entities.BookGroup import io.legado.app.databinding.DialogBookshelfConfigBinding import io.legado.app.databinding.DialogEditTextBinding import io.legado.app.databinding.FragmentBookshelfBinding +import io.legado.app.help.AppConfig import io.legado.app.lib.dialogs.alert import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.accentColor @@ -170,6 +171,7 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b .apply { rgLayout.checkByIndex(bookshelfLayout) rgSort.checkByIndex(bookshelfSort) + swShowUnread.isChecked = AppConfig.showUnread } customView { alertBinding.root } okButton { @@ -183,6 +185,10 @@ class BookshelfFragment : VMBaseFragment(R.layout.fragment_b putPrefInt(PreferKey.bookshelfSort, rgSort.getCheckedIndex()) changed = true } + if (AppConfig.showUnread != swShowUnread.isChecked) { + AppConfig.showUnread = swShowUnread.isChecked + changed = true + } if (changed) { activity?.recreate() } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt index 62834745e..9eabfbd45 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterGrid.kt @@ -7,6 +7,7 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemBookshelfGridBinding +import io.legado.app.help.AppConfig import io.legado.app.utils.invisible import splitties.views.onLongClick @@ -45,8 +46,12 @@ class BooksAdapterGrid(context: Context, private val callBack: CallBack) : binding.rlLoading.show() } else { binding.rlLoading.hide() - binding.bvUnread.setBadgeCount(item.getUnreadChapterNum()) - binding.bvUnread.setHighlight(item.lastCheckCount > 0) + if (AppConfig.showUnread) { + binding.bvUnread.setBadgeCount(item.getUnreadChapterNum()) + binding.bvUnread.setHighlight(item.lastCheckCount > 0) + } else { + binding.bvUnread.invisible() + } } } diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt index 08281b3b0..b93d3430a 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BooksAdapterList.kt @@ -7,6 +7,7 @@ import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.constant.BookType import io.legado.app.data.entities.Book import io.legado.app.databinding.ItemBookshelfListBinding +import io.legado.app.help.AppConfig import io.legado.app.utils.invisible import splitties.views.onLongClick @@ -51,8 +52,12 @@ class BooksAdapterList(context: Context, private val callBack: CallBack) : binding.rlLoading.show() } else { binding.rlLoading.hide() - binding.bvUnread.setHighlight(item.lastCheckCount > 0) - binding.bvUnread.setBadgeCount(item.getUnreadChapterNum()) + if (AppConfig.showUnread) { + binding.bvUnread.setHighlight(item.lastCheckCount > 0) + binding.bvUnread.setBadgeCount(item.getUnreadChapterNum()) + } else { + binding.bvUnread.invisible() + } } } diff --git a/app/src/main/res/layout/dialog_bookshelf_config.xml b/app/src/main/res/layout/dialog_bookshelf_config.xml index 944913f4c..134d4d1c7 100644 --- a/app/src/main/res/layout/dialog_bookshelf_config.xml +++ b/app/src/main/res/layout/dialog_bookshelf_config.xml @@ -101,5 +101,15 @@ + + \ No newline at end of file diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index a854f5d40..302969db3 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -824,5 +824,6 @@ 使用屏幕最高刷新率 导出所有 完成 + 显示未读标志 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 604cfcaed..b826956ca 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -828,5 +828,6 @@ 使用螢幕最高刷新率 导出所有 完成 + 显示未读标志 diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 987c5e6db..1f17b8764 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -828,5 +828,6 @@ 使用屏幕最高刷新率 导出所有 完成 + 显示未读标志 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index bb353c4aa..cd76c1764 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -829,5 +829,6 @@ 使用屏幕最高刷新率 export_all complete + Show unread