优化导入,导入前可以选择需导入那些源

pull/306/head
gedoor 4 years ago
parent 9203e3697e
commit 9a98bc0a8d
  1. 10
      app/src/main/java/io/legado/app/ui/association/ImportBookSourceActivity.kt
  2. 4
      app/src/main/java/io/legado/app/ui/association/ImportBookSourceViewModel.kt
  3. 4
      app/src/main/java/io/legado/app/ui/association/ImportReplaceRuleActivity.kt
  4. 150
      app/src/main/java/io/legado/app/ui/association/ImportRssSourceActivity.kt
  5. 23
      app/src/main/java/io/legado/app/ui/association/ImportRssSourceViewModel.kt
  6. 2
      app/src/main/res/layout/item_source_import.xml

@ -206,6 +206,12 @@ class ImportBookSourceActivity : VMBaseActivity<ImportBookSourceViewModel>(
} else { } else {
"新书源" "新书源"
} }
}
}
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.apply {
cb_source_name.setOnCheckedChangeListener { buttonView, isChecked -> cb_source_name.setOnCheckedChangeListener { buttonView, isChecked ->
if (buttonView.isPressed) { if (buttonView.isPressed) {
selectStatus[holder.layoutPosition] = isChecked selectStatus[holder.layoutPosition] = isChecked
@ -214,10 +220,6 @@ class ImportBookSourceActivity : VMBaseActivity<ImportBookSourceViewModel>(
} }
} }
override fun registerListener(holder: ItemViewHolder) {
}
} }
} }

@ -19,7 +19,7 @@ import java.io.File
class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) { class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) {
val errorLiveData = MutableLiveData<String>() val errorLiveData = MutableLiveData<String>()
val successLiveData = MutableLiveData<ArrayList<BookSource>>() val successLiveData = MutableLiveData<Boolean>()
val allSources = arrayListOf<BookSource>() val allSources = arrayListOf<BookSource>()
val sourceCheckState = arrayListOf<Boolean>() val sourceCheckState = arrayListOf<Boolean>()
@ -112,7 +112,7 @@ class ImportBookSourceViewModel(app: Application) : BaseViewModel(app) {
sourceCheckState.add(has) sourceCheckState.add(has)
selectStatus.add(!has) selectStatus.add(!has)
} }
successLiveData.postValue(allSources) successLiveData.postValue(true)
} }
} }

@ -32,7 +32,11 @@ class ImportReplaceRuleActivity : VMBaseActivity<ImportReplaceRuleViewModel>(
}) })
viewModel.successLiveData.observe(this, Observer { viewModel.successLiveData.observe(this, Observer {
rotate_loading.hide() rotate_loading.hide()
if (it.size > 0) {
successDialog(it) successDialog(it)
} else {
errorDialog("格式不对")
}
}) })
initData() initData()
} }

@ -1,19 +1,34 @@
package io.legado.app.ui.association package io.legado.app.ui.association
import android.content.Context
import android.content.DialogInterface
import android.os.Bundle import android.os.Bundle
import android.util.DisplayMetrics
import android.view.LayoutInflater
import android.view.MenuItem
import android.view.View
import android.view.ViewGroup
import androidx.appcompat.widget.Toolbar
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.recyclerview.widget.LinearLayoutManager
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.BaseDialogFragment
import io.legado.app.base.VMBaseActivity import io.legado.app.base.VMBaseActivity
import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.constant.Theme import io.legado.app.constant.Theme
import io.legado.app.data.entities.RssSource import io.legado.app.data.entities.RssSource
import io.legado.app.help.IntentDataHelp import io.legado.app.help.IntentDataHelp
import io.legado.app.help.SourceHelp import io.legado.app.help.SourceHelp
import io.legado.app.lib.dialogs.alert import io.legado.app.lib.dialogs.alert
import io.legado.app.lib.dialogs.noButton
import io.legado.app.lib.dialogs.okButton import io.legado.app.lib.dialogs.okButton
import io.legado.app.utils.applyTint import io.legado.app.utils.applyTint
import io.legado.app.utils.getViewModel import io.legado.app.utils.getViewModel
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.activity_translucence.* import kotlinx.android.synthetic.main.activity_translucence.*
import kotlinx.android.synthetic.main.dialog_recycler_view.*
import kotlinx.android.synthetic.main.item_source_import.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
class ImportRssSourceActivity : VMBaseActivity<ImportRssSourceViewModel>( class ImportRssSourceActivity : VMBaseActivity<ImportRssSourceViewModel>(
@ -32,7 +47,7 @@ class ImportRssSourceActivity : VMBaseActivity<ImportRssSourceViewModel>(
}) })
viewModel.successLiveData.observe(this, Observer { viewModel.successLiveData.observe(this, Observer {
rotate_loading.hide() rotate_loading.hide()
successDialog(it) successDialog()
}) })
initData() initData()
} }
@ -78,16 +93,133 @@ class ImportRssSourceActivity : VMBaseActivity<ImportRssSourceViewModel>(
} }
} }
private fun successDialog(allSource: ArrayList<RssSource>) { private fun successDialog() {
alert("解析结果", "${allSource.size}个订阅源,是否确认导入?") { val bundle = Bundle()
okButton { val allSourceKey = IntentDataHelp.putData(viewModel.allSources, "source")
SourceHelp.insertRssSource(*allSource.toTypedArray()) bundle.putString("allSourceKey", allSourceKey)
val checkStatusKey = IntentDataHelp.putData(viewModel.sourceCheckState, "check")
bundle.putString("checkStatusKey", checkStatusKey)
val selectStatusKey = IntentDataHelp.putData(viewModel.selectStatus, "select")
bundle.putString("selectStatusKey", selectStatusKey)
SourcesDialog().apply {
arguments = bundle
}.show(supportFragmentManager, "SourceDialog")
} }
noButton {
class SourcesDialog : BaseDialogFragment(), Toolbar.OnMenuItemClickListener {
lateinit var adapter: SourcesAdapter
override fun onStart() {
super.onStart()
val dm = DisplayMetrics()
activity?.windowManager?.defaultDisplay?.getMetrics(dm)
dialog?.window?.setLayout(
(dm.widthPixels * 0.9).toInt(),
ViewGroup.LayoutParams.WRAP_CONTENT
)
} }
}.show().applyTint().setOnDismissListener {
finish() override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.dialog_recycler_view, container)
}
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
tool_bar.title = "导入书源"
initMenu()
arguments?.let {
adapter = SourcesAdapter(requireContext())
val allSources =
IntentDataHelp.getData<ArrayList<RssSource>>(it.getString("allSourceKey"))
adapter.sourceCheckState =
IntentDataHelp.getData<ArrayList<Boolean>>(it.getString("checkStatusKey"))!!
adapter.selectStatus =
IntentDataHelp.getData<ArrayList<Boolean>>(it.getString("selectStatusKey"))!!
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.adapter = adapter
adapter.setItems(allSources)
tv_cancel.visible()
tv_cancel.onClick {
dismiss()
}
tv_ok.visible()
tv_ok.onClick {
importSelect()
dismiss()
}
}
}
private fun initMenu() {
tool_bar.setOnMenuItemClickListener(this)
tool_bar.inflateMenu(R.menu.import_source)
}
override fun onMenuItemClick(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_select_all -> {
adapter.selectStatus.forEachIndexed { index, b ->
if (!b) {
adapter.selectStatus[index] = true
}
}
adapter.notifyDataSetChanged()
}
}
return false
}
override fun onDismiss(dialog: DialogInterface) {
super.onDismiss(dialog)
activity?.finish()
} }
private fun importSelect() {
val selectSource = arrayListOf<RssSource>()
adapter.selectStatus.forEachIndexed { index, b ->
if (b) {
selectSource.add(adapter.getItem(index)!!)
}
}
SourceHelp.insertRssSource(*selectSource.toTypedArray())
} }
}
class SourcesAdapter(context: Context) :
SimpleRecyclerAdapter<RssSource>(context, R.layout.item_source_import) {
lateinit var sourceCheckState: ArrayList<Boolean>
lateinit var selectStatus: ArrayList<Boolean>
override fun convert(holder: ItemViewHolder, item: RssSource, payloads: MutableList<Any>) {
holder.itemView.apply {
cb_source_name.isChecked = selectStatus[holder.layoutPosition]
cb_source_name.text = item.sourceName
tv_source_state.text = if (sourceCheckState[holder.layoutPosition]) {
"已存在"
} else {
"新订阅源"
}
}
}
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.apply {
cb_source_name.setOnCheckedChangeListener { buttonView, isChecked ->
if (buttonView.isPressed) {
selectStatus[holder.layoutPosition] = isChecked
}
}
}
}
}
} }

@ -5,6 +5,7 @@ import android.net.Uri
import androidx.documentfile.provider.DocumentFile import androidx.documentfile.provider.DocumentFile
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import com.jayway.jsonpath.JsonPath import com.jayway.jsonpath.JsonPath
import io.legado.app.App
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.entities.RssSource import io.legado.app.data.entities.RssSource
import io.legado.app.help.http.HttpHelper import io.legado.app.help.http.HttpHelper
@ -15,9 +16,12 @@ import java.io.File
class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) { class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) {
val errorLiveData = MutableLiveData<String>() val errorLiveData = MutableLiveData<String>()
val successLiveData = MutableLiveData<ArrayList<RssSource>>() val successLiveData = MutableLiveData<Boolean>()
val allSources = arrayListOf<RssSource>()
val sourceCheckState = arrayListOf<Boolean>()
val selectStatus = arrayListOf<Boolean>()
private val allSources = arrayListOf<RssSource>()
fun importSourceFromFilePath(path: String) { fun importSourceFromFilePath(path: String) {
execute { execute {
@ -39,7 +43,7 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) {
} }
} }
}.onSuccess { }.onSuccess {
successLiveData.postValue(allSources) comparisonSource()
} }
} }
@ -77,7 +81,7 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) {
}.onError { }.onError {
errorLiveData.postValue("ImportError:${it.localizedMessage}") errorLiveData.postValue("ImportError:${it.localizedMessage}")
}.onSuccess { }.onSuccess {
successLiveData.postValue(allSources) comparisonSource()
} }
} }
@ -93,4 +97,15 @@ class ImportRssSourceViewModel(app: Application) : BaseViewModel(app) {
} }
} }
private fun comparisonSource() {
execute {
allSources.forEach {
val has = App.db.rssSourceDao().getByKey(it.sourceUrl) != null
sourceCheckState.add(has)
selectStatus.add(!has)
}
successLiveData.postValue(true)
}
}
} }

@ -15,7 +15,7 @@
<TextView <TextView
android:id="@+id/tv_source_state" android:id="@+id/tv_source_state"
android:layout_width="60dp" android:layout_width="80dp"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>
Loading…
Cancel
Save