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 8e23928f4..c85db5b5c 100644 --- a/app/src/main/java/io/legado/app/base/BaseActivity.kt +++ b/app/src/main/java/io/legado/app/base/BaseActivity.kt @@ -6,6 +6,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.databinding.DataBindingUtil import androidx.databinding.ViewDataBinding import androidx.lifecycle.ViewModel +import com.google.android.material.bottomnavigation.BottomNavigationView abstract class BaseActivity : AppCompatActivity() { @@ -33,7 +34,7 @@ abstract class BaseActivity : AppCompatAct return true } } - return if (item == null) false else onCompatOptionsItemSelected(item) + return item != null && onCompatOptionsItemSelected(item) } open fun onCompatOptionsItemSelected(item: MenuItem): Boolean { diff --git a/app/src/main/java/io/legado/app/data/dao/ExploreSearchUrlDao.kt b/app/src/main/java/io/legado/app/data/dao/ExploreSearchUrlDao.kt new file mode 100644 index 000000000..eef3d93ed --- /dev/null +++ b/app/src/main/java/io/legado/app/data/dao/ExploreSearchUrlDao.kt @@ -0,0 +1,71 @@ +package io.legado.app.data.dao + +import androidx.paging.DataSource +import androidx.room.* +import io.legado.app.data.entities.ExploreSearchUrl + + +@Dao +interface ExploreSearchUrlDao { + + companion object { + private const val ORDER_DEFAULT = "ORDER BY sourceId ASC, defOrder ASC" + private const val ORDER_USAGE = "ORDER BY usage DESC, lastUseTime DESC" + private const val ORDER_TIME = "ORDER BY lastUseTime DESC" + private const val QUERY_NAME = "name LIKE '%' || :name || '%'" + private const val QUERY_ENABLED_EXPLORE = "WHERE type = 0 AND isEnabled = 1" + } + + // 用于发现列表,默认排序 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE $ORDER_DEFAULT") + fun observeExploreUrls(): DataSource.Factory + + // 用于发现列表,按使用次数排序 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE $ORDER_USAGE") + fun observeExploreUrlsByUsage(): DataSource.Factory + + // 用于发现列表,按使用时间排序 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE $ORDER_TIME") + fun observeExploreUrlsByTime(): DataSource.Factory + + // 用于搜索时的发现列表,默认排序 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE AND $QUERY_NAME $ORDER_DEFAULT") + fun observeFilteredExploreUrls(name: String): DataSource.Factory + + // 用于搜索时的发现列表,按使用次数排序 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE AND $QUERY_NAME $ORDER_USAGE") + fun observeFilteredExploreUrlsByUsage(): DataSource.Factory + + // 用于搜索时的发现列表,按使用时间排序 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE AND $QUERY_NAME $ORDER_TIME") + fun observeFilteredExploreUrlsByTime(): DataSource.Factory + + // 获取特定书源的发现 + @Query("SELECT * FROM explore_search_urls $QUERY_ENABLED_EXPLORE AND sourceId = :sourceId") + fun findExploreUrlsBySourceId(sourceId: Int): List + + // 获取特定书源的搜索链接 + @Query("SELECT * FROM explore_search_urls WHERE type = 1 AND sourceId = :sourceId") + fun findSearchUrlsBySourceId(sourceId: Int): List + + // 所有的搜索链接 + @get:Query("SELECT * FROM explore_search_urls WHERE type = 1") + val allSearchUrls: List + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg keywords: ExploreSearchUrl) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(keyword: ExploreSearchUrl): Long + + @Update + fun update(vararg keywords: ExploreSearchUrl) + + @Delete + fun delete(vararg keywords: ExploreSearchUrl) + + // 批量删除特定书源的发现和搜索链接,一般用于更新书源时 + @Query("DELETE FROM explore_search_urls WHERE sourceId = :sourceId") + fun deleteBySourceId(sourceId: Int) + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt b/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt index 919855143..d4a2073c0 100644 --- a/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt +++ b/app/src/main/java/io/legado/app/data/dao/ReplaceRuleDao.kt @@ -44,6 +44,7 @@ interface ReplaceRuleDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(replaceRule: ReplaceRule): Long + @Update fun update(vararg replaceRules: ReplaceRule) diff --git a/app/src/main/java/io/legado/app/data/dao/SearchKeywordDao.kt b/app/src/main/java/io/legado/app/data/dao/SearchKeywordDao.kt new file mode 100644 index 000000000..b2370ceb6 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/dao/SearchKeywordDao.kt @@ -0,0 +1,32 @@ +package io.legado.app.data.dao + +import androidx.paging.DataSource +import androidx.room.* +import io.legado.app.data.entities.SearchKeyword + + +@Dao +interface SearchKeywordDao { + + @Query("SELECT * FROM search_keywords ORDER BY usage DESC") + fun observeByUsage(): DataSource.Factory + + @Query("SELECT * FROM search_keywords ORDER BY lastUseTime DESC") + fun observeByTime(): DataSource.Factory + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg keywords: SearchKeyword) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(keyword: SearchKeyword): Long + + @Update + fun update(vararg keywords: SearchKeyword) + + @Delete + fun delete(vararg keywords: SearchKeyword) + + @Query("DELETE FROM search_keywords") + fun deleteAll() + +} \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/data/entities/ExploreSearchUrl.kt b/app/src/main/java/io/legado/app/data/entities/ExploreSearchUrl.kt new file mode 100644 index 000000000..2df63b4bb --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/ExploreSearchUrl.kt @@ -0,0 +1,29 @@ +package io.legado.app.data.entities + +import android.os.Parcelable +import androidx.room.Entity +import androidx.room.ForeignKey +import androidx.room.Index +import androidx.room.PrimaryKey +import kotlinx.android.parcel.Parcelize + +@Parcelize +@Entity(tableName = "explore_search_urls", + indices = [(Index(value = ["sourceId", "url"], unique = true))], + foreignKeys = [(ForeignKey(entity = Source::class, + parentColumns = ["sourceId"], + childColumns = ["sourceId"], + onDelete = ForeignKey.CASCADE))]) // 删除书源时自动删除章节 +data class ExploreSearchUrl ( + @PrimaryKey(autoGenerate = true) + var esId: Int = 0, // 编号 + var sourceId: Int = 0, // 书源Id + var name: String = "", // 发现名称,搜索可以没有 + var url: String = "", // 地址 + var type: Int = 0, // 类型,0 为发现,1 为搜索 + var isEnabled: Boolean = true, // 是否启用 + var defOrder: Int = 0, // 默认排序,是在编辑书源的时候的顺序 + var usage: Int = 0, // 使用次数,用于按使用次数排序 + var lastUseTime: Long = 0L // 最后一次使用的时间 + ) : Parcelable + diff --git a/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt b/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt new file mode 100644 index 000000000..e8dce4fd9 --- /dev/null +++ b/app/src/main/java/io/legado/app/data/entities/SearchKeyword.kt @@ -0,0 +1,17 @@ +package io.legado.app.data.entities + +import android.os.Parcelable +import androidx.room.Entity +import androidx.room.Index +import androidx.room.PrimaryKey +import kotlinx.android.parcel.Parcelize + + +@Parcelize +@Entity(tableName = "search_keywords", indices = [(Index(value = ["word"], unique = true))]) +data class SearchKeyword ( + @PrimaryKey + var word: String = "", // 搜索关键词 + var usage: Int = 1, // 使用次数 + var lastUseTime: Long = 0 // 最后一次使用时间 +): Parcelable diff --git a/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt b/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt index 464c5746b..8f6077c96 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleActivity.kt @@ -13,6 +13,8 @@ import io.legado.app.data.entities.ReplaceRule import kotlinx.android.synthetic.main.activity_replace_rule.* import org.jetbrains.anko.doAsync import org.jetbrains.anko.toast +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.ItemTouchHelper class ReplaceRuleActivity : AppCompatActivity() { @@ -26,6 +28,7 @@ class ReplaceRuleActivity : AppCompatActivity() { rv_replace_rule.layoutManager = LinearLayoutManager(this) initRecyclerView() initDataObservers() + initSwipeToDelete() } private fun initRecyclerView() { @@ -69,4 +72,28 @@ class ReplaceRuleActivity : AppCompatActivity() { } } } + + private fun initSwipeToDelete() { + ItemTouchHelper(object : ItemTouchHelper.Callback() { + + override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: RecyclerView.ViewHolder): Int { + return ItemTouchHelper.Callback.makeMovementFlags(0, ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT) + } + + override fun onMove( + recyclerView: RecyclerView, + viewHolder: RecyclerView.ViewHolder, + target: RecyclerView.ViewHolder + ): Boolean { + return false + } + + override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) { + toast("You swiped the item!") + TODO() + // remove((viewHolder as TodoViewHolder).todo) + } + }).attachToRecyclerView(rv_replace_rule) + + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleAdapter.kt b/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleAdapter.kt index 717e2bfff..a767cee52 100644 --- a/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/replacerule/ReplaceRuleAdapter.kt @@ -50,13 +50,15 @@ class ReplaceRuleAdapter(context: Context) : class MyViewHolder(view: View) : RecyclerView.ViewHolder(view) { fun bind(rule: ReplaceRule, listener: OnClickListener?, hideDivider: Boolean) = with(itemView) { - cb_enable.text = rule.name - cb_enable.isChecked = rule.isEnabled - divider.isGone = hideDivider - iv_delete.onClick { listener?.delete(rule) } - iv_edit.onClick { listener?.edit(rule) } - cb_enable.onClick { - rule.isEnabled = cb_enable.isChecked + tv_name.text = rule.name + swt_enabled.isChecked = rule.isEnabled + divider.isGone = hideDivider + iv_delete.isGone = true + iv_edit.isGone = true + // iv_delete.onClick { listener?.delete(rule) } + // iv_edit.onClick { listener?.edit(rule) } + swt_enabled.onClick { + rule.isEnabled = swt_enabled.isChecked listener?.update(rule) } } diff --git a/app/src/main/java/io/legado/app/utils/MiscExtensions.kt b/app/src/main/java/io/legado/app/utils/MiscExtensions.kt index 24bf95c9a..1f47d2af9 100644 --- a/app/src/main/java/io/legado/app/utils/MiscExtensions.kt +++ b/app/src/main/java/io/legado/app/utils/MiscExtensions.kt @@ -2,8 +2,8 @@ package io.legado.app.utils import com.jayway.jsonpath.ReadContext -fun ReadContext.readString(path: String) = this.read(path, String::class.java) +fun ReadContext.readString(path: String): String? = this.read(path, String::class.java) -fun ReadContext.readBool(path: String) = this.read(path, Boolean::class.java) +fun ReadContext.readBool(path: String): Boolean? = this.read(path, Boolean::class.java) -fun ReadContext.readInt(path: String) = this.read(path, Int::class.java) \ No newline at end of file +fun ReadContext.readInt(path: String): Int? = this.read(path, Int::class.java) \ No newline at end of file diff --git a/app/src/main/res/layout/item_relace_rule.xml b/app/src/main/res/layout/item_relace_rule.xml index 80295a529..c739121b9 100644 --- a/app/src/main/res/layout/item_relace_rule.xml +++ b/app/src/main/res/layout/item_relace_rule.xml @@ -2,25 +2,12 @@ - - + + + + + + + + + 删除 净化替换 暂无 + 启用