Przeglądaj źródła

书签添加导出

kunfei 4 lat temu
rodzic
commit
1732deb70e

+ 23 - 0
app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkActivity.kt

@@ -1,10 +1,15 @@
 package io.legado.app.ui.book.bookmark
 package io.legado.app.ui.book.bookmark
 
 
 import android.os.Bundle
 import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
 import androidx.activity.viewModels
 import androidx.activity.viewModels
+import io.legado.app.R
 import io.legado.app.base.VMBaseActivity
 import io.legado.app.base.VMBaseActivity
 import io.legado.app.data.entities.Bookmark
 import io.legado.app.data.entities.Bookmark
 import io.legado.app.databinding.ActivityAllBookmarkBinding
 import io.legado.app.databinding.ActivityAllBookmarkBinding
+import io.legado.app.ui.document.HandleFileContract
+import io.legado.app.utils.launch
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 
 
@@ -17,6 +22,11 @@ class AllBookmarkActivity : VMBaseActivity<ActivityAllBookmarkBinding, AllBookma
     private val adapter by lazy {
     private val adapter by lazy {
         BookmarkAdapter(this, this)
         BookmarkAdapter(this, this)
     }
     }
+    private val exportDir = registerForActivityResult(HandleFileContract()) {
+        it.uri?.let { uri ->
+            viewModel.saveToFile(uri)
+        }
+    }
 
 
     override fun onActivityCreated(savedInstanceState: Bundle?) {
     override fun onActivityCreated(savedInstanceState: Bundle?) {
         initView()
         initView()
@@ -30,6 +40,18 @@ class AllBookmarkActivity : VMBaseActivity<ActivityAllBookmarkBinding, AllBookma
         binding.recyclerView.adapter = adapter
         binding.recyclerView.adapter = adapter
     }
     }
 
 
+    override fun onCompatCreateOptionsMenu(menu: Menu): Boolean {
+        menuInflater.inflate(R.menu.bookmark, menu)
+        return super.onCompatCreateOptionsMenu(menu)
+    }
+
+    override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
+        when (item.itemId) {
+            R.id.menu_export -> exportDir.launch()
+        }
+        return super.onCompatOptionsItemSelected(item)
+    }
+
     override fun onItemClick(bookmark: Bookmark, position: Int) {
     override fun onItemClick(bookmark: Bookmark, position: Int) {
         showDialogFragment(BookmarkDialog(bookmark, position))
         showDialogFragment(BookmarkDialog(bookmark, position))
     }
     }
@@ -44,4 +66,5 @@ class AllBookmarkActivity : VMBaseActivity<ActivityAllBookmarkBinding, AllBookma
         }
         }
         adapter.removeItem(pos)
         adapter.removeItem(pos)
     }
     }
+
 }
 }

+ 31 - 0
app/src/main/java/io/legado/app/ui/book/bookmark/AllBookmarkViewModel.kt

@@ -1,9 +1,17 @@
 package io.legado.app.ui.book.bookmark
 package io.legado.app.ui.book.bookmark
 
 
+import android.annotation.SuppressLint
 import android.app.Application
 import android.app.Application
+import android.net.Uri
+import androidx.documentfile.provider.DocumentFile
 import io.legado.app.base.BaseViewModel
 import io.legado.app.base.BaseViewModel
 import io.legado.app.data.appDb
 import io.legado.app.data.appDb
 import io.legado.app.data.entities.Bookmark
 import io.legado.app.data.entities.Bookmark
+import io.legado.app.utils.*
+import java.io.File
+import java.io.FileOutputStream
+import java.text.SimpleDateFormat
+import java.util.*
 
 
 class AllBookmarkViewModel(application: Application) : BaseViewModel(application) {
 class AllBookmarkViewModel(application: Application) : BaseViewModel(application) {
 
 
@@ -22,4 +30,27 @@ class AllBookmarkViewModel(application: Application) : BaseViewModel(application
         }
         }
     }
     }
 
 
+    @Suppress("BlockingMethodInNonBlockingContext")
+    @SuppressLint("SimpleDateFormat")
+    fun saveToFile(treeUri: Uri) {
+        execute {
+            val dateFormat = SimpleDateFormat("yyMMddHHmmss")
+            if (treeUri.isContentScheme()) {
+                val doc = DocumentFile.fromTreeUri(context, treeUri)
+                    ?.createFile("", "bookmark-${dateFormat.format(Date())}")
+                doc?.let {
+                    context.contentResolver.openOutputStream(doc.uri)!!.use {
+                        GSON.writeToOutputStream(it, appDb.bookmarkDao.all)
+                    }
+                }
+            } else {
+                val path = treeUri.path!!
+                val file = FileUtils.createFileIfNotExist(File(path), "bookmark-${dateFormat.format(Date())}")
+                FileOutputStream(file).use {
+                    GSON.writeToOutputStream(it, appDb.bookmarkDao.all)
+                }
+            }
+        }
+    }
+
 }
 }

+ 5 - 1
app/src/main/java/io/legado/app/ui/rss/read/ReadRssActivity.kt

@@ -276,7 +276,11 @@ class ReadRssActivity : VMBaseActivity<ActivityRssReadBinding, ReadRssViewModel>
             binding.webView.evaluateJavascript("document.documentElement.outerHTML") {
             binding.webView.evaluateJavascript("document.documentElement.outerHTML") {
                 val html = StringEscapeUtils.unescapeJson(it)
                 val html = StringEscapeUtils.unescapeJson(it)
                     .replace("^\"|\"$".toRegex(), "")
                     .replace("^\"|\"$".toRegex(), "")
-                viewModel.readAloud(Jsoup.parse(html).textArray().joinToString("\n"))
+                viewModel.readAloud(
+                    Jsoup.parse(html)
+                        .textArray()
+                        .joinToString("\n")
+                )
             }
             }
         }
         }
     }
     }

+ 8 - 0
app/src/main/res/menu/bookmark.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item
+        android:id="@+id/menu_export"
+        android:title="@string/export" />
+
+</menu>