# Conflicts:
#	app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt
#	app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt
#	app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt
#	app/src/main/res/layout/item_rss_article_1.xml
pull/219/head
yangyxd 5 years ago
commit 9321dda593
  1. 1
      app/src/main/assets/updateLog.md
  2. 14
      app/src/main/java/io/legado/app/data/AppDatabase.kt
  3. 1
      app/src/main/java/io/legado/app/data/entities/RssSource.kt
  4. 4
      app/src/main/java/io/legado/app/service/help/ReadBook.kt
  5. 5
      app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt
  6. 10
      app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt
  7. 17
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt
  8. 38
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt
  9. 28
      app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt
  10. 19
      app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt
  11. 5
      app/src/main/res/layout/item_rss_article_1.xml
  12. 1
      app/src/main/res/values-zh-rHK/strings.xml
  13. 1
      app/src/main/res/values/strings.xml
  14. 24
      app/src/main/res/xml/pref_main.xml

@ -5,6 +5,7 @@
**2020/05/18** **2020/05/18**
* 修复http://alanskycn.gitee.io/书源导入失败问题,被屏蔽UA了 * 修复http://alanskycn.gitee.io/书源导入失败问题,被屏蔽UA了
* Rss列表添加样式切换
**2020/05/17** **2020/05/17**
* 自动翻页功能完成 * 自动翻页功能完成

@ -19,7 +19,7 @@ import kotlinx.coroutines.launch
ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class, ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class, RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class,
RssStar::class, TxtTocRule::class], RssStar::class, TxtTocRule::class],
version = 12, version = 13,
exportSchema = true exportSchema = true
) )
abstract class AppDatabase : RoomDatabase() { abstract class AppDatabase : RoomDatabase() {
@ -31,7 +31,7 @@ abstract class AppDatabase : RoomDatabase() {
fun createDatabase(context: Context): AppDatabase { fun createDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME) return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
.fallbackToDestructiveMigration() .fallbackToDestructiveMigration()
.addMigrations(migration_10_11, migration_11_12) .addMigrations(migration_10_11, migration_11_12, migration_12_13)
.addCallback(object : Callback() { .addCallback(object : Callback() {
override fun onDestructiveMigration(db: SupportSQLiteDatabase) { override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
GlobalScope.launch { Restore.restoreDatabase(Backup.backupPath) } GlobalScope.launch { Restore.restoreDatabase(Backup.backupPath) }
@ -62,6 +62,16 @@ abstract class AppDatabase : RoomDatabase() {
) )
} }
} }
private val migration_12_13 = object : Migration(12, 13) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(
"""
ALTER TABLE rssSources ADD articleStyle INTEGER NOT NULL DEFAULT 0
"""
)
}
}
} }
abstract fun bookDao(): BookDao abstract fun bookDao(): BookDao

@ -24,6 +24,7 @@ data class RssSource(
var sourceGroup: String? = null, var sourceGroup: String? = null,
var enabled: Boolean = true, var enabled: Boolean = true,
var sortUrl: String? = null, var sortUrl: String? = null,
var articleStyle: Int = 0,
//列表规则 //列表规则
var ruleArticles: String? = null, var ruleArticles: String? = null,
var ruleNextPage: String? = null, var ruleNextPage: String? = null,

@ -148,7 +148,7 @@ object ReadBook {
} }
private fun curPageChanged() { private fun curPageChanged() {
callBack?.upPageProgress() callBack?.pageChanged()
if (BaseReadAloudService.isRun) { if (BaseReadAloudService.isRun) {
readAloud(!BaseReadAloudService.pause) readAloud(!BaseReadAloudService.pause)
} }
@ -344,7 +344,7 @@ object ReadBook {
interface CallBack { interface CallBack {
fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true) fun upContent(relativePosition: Int = 0, resetPageOffset: Boolean = true)
fun upView() fun upView()
fun upPageProgress() fun pageChanged()
fun contentLoadFinish() fun contentLoadFinish()
} }
} }

@ -523,9 +523,10 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
} }
/** /**
* 更新进度条 * 页面改变
*/ */
override fun upPageProgress() { override fun pageChanged() {
autoPageProgress = 0
launch { launch {
seek_read_page.progress = ReadBook.durPageIndex seek_read_page.progress = ReadBook.durPageIndex
} }

@ -13,7 +13,7 @@ import io.legado.app.R
import io.legado.app.base.BaseFragment import io.legado.app.base.BaseFragment
import io.legado.app.constant.EventBus import io.legado.app.constant.EventBus
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
import io.legado.app.help.channel import io.legado.app.help.AppConfig
import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.ATH
import io.legado.app.service.WebService import io.legado.app.service.WebService
import io.legado.app.ui.about.AboutActivity import io.legado.app.ui.about.AboutActivity
@ -79,7 +79,13 @@ class MyFragment : BaseFragment(R.layout.fragment_my_config), FileChooserDialog.
observeEvent<Boolean>(EventBus.WEB_SERVICE_STOP) { observeEvent<Boolean>(EventBus.WEB_SERVICE_STOP) {
webServicePre?.isChecked = false webServicePre?.isChecked = false
} }
if (requireContext().channel == "google") { findPreference<NameListPreference>(PreferKey.themeMode)?.let {
it.setOnPreferenceChangeListener { _, _ ->
view?.post { App.INSTANCE.applyDayNight() }
true
}
}
if (AppConfig.isGooglePlay) {
findPreference<PreferenceCategory>("aboutCategory") findPreference<PreferenceCategory>("aboutCategory")
?.removePreference(findPreference("donate")) ?.removePreference(findPreference("donate"))
} }

@ -8,16 +8,18 @@ import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target import com.bumptech.glide.request.target.Target
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.adapter.ItemViewHolder import io.legado.app.base.adapter.ItemViewHolder
import io.legado.app.base.adapter.SimpleRecyclerAdapter
import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssArticle
import io.legado.app.help.ImageLoader import io.legado.app.help.ImageLoader
import io.legado.app.utils.gone import io.legado.app.utils.gone
import io.legado.app.utils.visible import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_rss_article.view.* import kotlinx.android.synthetic.main.item_rss_article.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource import org.jetbrains.anko.textColorResource
class RssArticlesAdapter(context: Context, private val layoutId: Int, callBack: CallBack) : class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack) :
RssArticlesBaseAdapter(context, layoutId, callBack) { SimpleRecyclerAdapter<RssArticle>(context, layoutId) {
override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) { override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) {
with(holder.itemView) { with(holder.itemView) {
@ -60,4 +62,15 @@ class RssArticlesAdapter(context: Context, private val layoutId: Int, callBack:
} }
} }
override fun registerListener(holder: ItemViewHolder) {
holder.itemView.onClick {
getItem(holder.layoutPosition)?.let {
callBack.readRss(it)
}
}
}
interface CallBack {
fun readRss(rssArticle: RssArticle)
}
} }

@ -4,14 +4,12 @@ import android.os.Bundle
import android.view.View import android.view.View
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView
import io.legado.app.App import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.VMBaseFragment import io.legado.app.base.VMBaseFragment
import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssArticle
import io.legado.app.help.AppConfig
import io.legado.app.lib.theme.ATH import io.legado.app.lib.theme.ATH
import io.legado.app.ui.rss.read.ReadRssActivity import io.legado.app.ui.rss.read.ReadRssActivity
import io.legado.app.ui.widget.recycler.LoadMoreView import io.legado.app.ui.widget.recycler.LoadMoreView
@ -22,10 +20,9 @@ import io.legado.app.utils.startActivity
import kotlinx.android.synthetic.main.fragment_rss_articles.* import kotlinx.android.synthetic.main.fragment_rss_articles.*
import kotlinx.android.synthetic.main.view_load_more.view.* import kotlinx.android.synthetic.main.view_load_more.view.*
import kotlinx.android.synthetic.main.view_refresh_recycler.* import kotlinx.android.synthetic.main.view_refresh_recycler.*
import org.jetbrains.anko.padding
class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles), class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles),
RssArticlesBaseAdapter.CallBack { RssArticlesAdapter.CallBack {
companion object { companion object {
fun create(sortName: String, sortUrl: String): RssArticlesFragment { fun create(sortName: String, sortUrl: String): RssArticlesFragment {
@ -42,7 +39,7 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
get() = getViewModelOfActivity(RssSortViewModel::class.java) get() = getViewModelOfActivity(RssSortViewModel::class.java)
override val viewModel: RssArticlesViewModel override val viewModel: RssArticlesViewModel
get() = getViewModel(RssArticlesViewModel::class.java) get() = getViewModel(RssArticlesViewModel::class.java)
lateinit var adapter: RssArticlesBaseAdapter lateinit var adapter: RssArticlesAdapter
private lateinit var loadMoreView: LoadMoreView private lateinit var loadMoreView: LoadMoreView
private var rssArticlesData: LiveData<List<RssArticle>>? = null private var rssArticlesData: LiveData<List<RssArticle>>? = null
@ -54,36 +51,11 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
initData() initData()
} }
fun switchLayout() {
refresh_recycler_view.startLoading()
initView()
initData()
}
private fun initView() { private fun initView() {
ATH.applyEdgeEffectColor(recycler_view) ATH.applyEdgeEffectColor(recycler_view)
recycler_view.layoutManager = LinearLayoutManager(requireContext())
var rssLayoutConfig = activityViewModel.rssSource?.let { AppConfig.getRssLayout(it) } recycler_view.addItemDecoration(VerticalDivider(requireContext()))
var layoutId = R.layout.item_rss_article adapter = RssArticlesAdapter(requireContext(), activityViewModel.layoutId, this)
if (rssLayoutConfig == 1)
layoutId = R.layout.item_rss_article_1
else if (rssLayoutConfig == 2)
layoutId = R.layout.item_rss_article_2
if (rssLayoutConfig == 2) {
recycler_view.setPadding(8, 0, 8, 0)
recycler_view.layoutManager = GridLayoutManager(requireContext(), 2)
while (recycler_view.itemDecorationCount > 0)
recycler_view.removeItemDecorationAt(0)
adapter = RssArticlesGridAdapter(requireContext(), layoutId, this)
} else {
recycler_view.padding = 0
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
adapter = RssArticlesAdapter(requireContext(), layoutId, this)
}
recycler_view.adapter = adapter recycler_view.adapter = adapter
loadMoreView = LoadMoreView(requireContext()) loadMoreView = LoadMoreView(requireContext())
adapter.addFooterView(loadMoreView) adapter.addFooterView(loadMoreView)

@ -9,12 +9,12 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.base.VMBaseActivity import io.legado.app.base.VMBaseActivity
import io.legado.app.help.AppConfig
import io.legado.app.ui.rss.source.edit.RssSourceEditActivity import io.legado.app.ui.rss.source.edit.RssSourceEditActivity
import io.legado.app.utils.* import io.legado.app.utils.getViewModel
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.activity_rss_artivles.* import kotlinx.android.synthetic.main.activity_rss_artivles.*
import org.jetbrains.anko.startActivityForResult import org.jetbrains.anko.startActivityForResult
@ -43,10 +43,6 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
return super.onCompatCreateOptionsMenu(menu) return super.onCompatCreateOptionsMenu(menu)
} }
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
return super.onPrepareOptionsMenu(menu)
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean { override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) { when (item.itemId) {
R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let { R.id.menu_edit_source -> viewModel.rssSource?.sourceUrl?.let {
@ -58,7 +54,8 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
} }
} }
R.id.menu_switch_layout -> { R.id.menu_switch_layout -> {
switchLayout() viewModel.switchLayout()
upFragments()
} }
} }
return super.onCompatOptionsItemSelected(item) return super.onCompatOptionsItemSelected(item)
@ -77,17 +74,6 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
adapter.notifyDataSetChanged() adapter.notifyDataSetChanged()
} }
/** 切换布局 */
private fun switchLayout() {
if (viewModel.rssSource == null) return
var i = AppConfig.getRssLayout(viewModel.rssSource!!) + 1
if (i > 2) i = 0
AppConfig.setRssLayout(viewModel.rssSource!!, i)
fragments?.forEach {
it.value?.switchLayout()
};
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data) super.onActivityResult(requestCode, resultCode, data)
when (requestCode) { when (requestCode) {
@ -102,6 +88,10 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
private inner class TabFragmentPageAdapter internal constructor(fm: FragmentManager) : private inner class TabFragmentPageAdapter internal constructor(fm: FragmentManager) :
FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItemPosition(`object`: Any): Int {
return POSITION_NONE
}
override fun getPageTitle(position: Int): CharSequence? { override fun getPageTitle(position: Int): CharSequence? {
return fragments.keys.elementAt(position) return fragments.keys.elementAt(position)
} }

@ -4,6 +4,7 @@ import android.app.Application
import android.content.Intent import android.content.Intent
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import io.legado.app.App import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel import io.legado.app.base.BaseViewModel
import io.legado.app.data.entities.RssArticle import io.legado.app.data.entities.RssArticle
import io.legado.app.data.entities.RssReadRecord import io.legado.app.data.entities.RssReadRecord
@ -15,6 +16,11 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
var rssSource: RssSource? = null var rssSource: RssSource? = null
val titleLiveData = MutableLiveData<String>() val titleLiveData = MutableLiveData<String>()
var order = System.currentTimeMillis() var order = System.currentTimeMillis()
val layoutId
get() = when (rssSource?.articleStyle) {
1 -> R.layout.item_rss_article_1
else -> R.layout.item_rss_article
}
fun initData(intent: Intent, finally: () -> Unit) { fun initData(intent: Intent, finally: () -> Unit) {
execute { execute {
@ -32,6 +38,19 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
} }
} }
fun switchLayout() {
rssSource?.let {
if (it.articleStyle < 1) {
it.articleStyle = it.articleStyle + 1
} else {
it.articleStyle = 0
}
execute {
App.db.rssSourceDao().update(it)
}
}
}
fun read(rssArticle: RssArticle) { fun read(rssArticle: RssArticle) {
execute { execute {
App.db.rssArticleDao().insertRecord(RssReadRecord(rssArticle.link)) App.db.rssArticleDao().insertRecord(RssReadRecord(rssArticle.link))

@ -43,14 +43,15 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_gravity="center" android:layout_gravity="center"
android:text="@string/app_name" android:text="@string/app_name"
android:textSize="10sp" android:textSize="11sp"
android:maxLines="1" android:maxLines="1"
android:paddingLeft="12dp" android:paddingLeft="12dp"
android:paddingRight="12dp" android:paddingRight="12dp"
android:paddingTop="10dp" android:paddingTop="10dp"
app:layout_constraintTop_toBottomOf="@+id/tv_title" app:layout_constraintTop_toBottomOf="@+id/tv_title"
app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent" /> app:layout_constraintRight_toRightOf="parent"
tools:ignore="SmallSp" />
<View <View
android:layout_marginTop="12dp" android:layout_marginTop="12dp"

@ -670,6 +670,7 @@
<string name="click_to_apply">點擊加入</string> <string name="click_to_apply">點擊加入</string>
<string name="middle"></string> <string name="middle"></string>
<string name="information">信息</string> <string name="information">信息</string>
<string name="switchLayout">切換佈局</string>
<!--color--> <!--color-->
<string name="primary">主色調</string> <string name="primary">主色調</string>

@ -676,6 +676,7 @@
<string name="information">信息</string> <string name="information">信息</string>
<string name="hideHeader">隐藏页眉</string> <string name="hideHeader">隐藏页眉</string>
<string name="hideFooter">隐藏页脚</string> <string name="hideFooter">隐藏页脚</string>
<string name="switchLayout">切换布局</string>
<!--color--> <!--color-->
<string name="primary">主色调</string> <string name="primary">主色调</string>

@ -20,14 +20,24 @@
android:icon="@drawable/ic_cfg_replace" android:icon="@drawable/ic_cfg_replace"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.SwitchPreference <io.legado.app.ui.widget.prefs.NameListPreference
android:defaultValue="false" android:defaultValue="0"
android:key="isEInkMode" android:entries="@array/theme_mode"
android:title="@string/eink_theme" android:entryValues="@array/theme_mode_v"
android:summary="@string/eink_theme_desc" android:key="themeMode"
android:icon="@drawable/ic_cfg_e_lnk" android:title="@string/theme_mode"
android:summary="@string/theme_mode_desc"
android:icon="@drawable/ic_cfg_theme"
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<!-- <io.legado.app.ui.widget.prefs.SwitchPreference
android:defaultValue="false"
android:key="isEInkMode"
android:title="@string/eink_theme"
android:summary="@string/eink_theme_desc"
android:icon="@drawable/ic_cfg_e_lnk"
app:iconSpaceReserved="false" />-->
<io.legado.app.ui.widget.prefs.SwitchPreference <io.legado.app.ui.widget.prefs.SwitchPreference
android:defaultValue="false" android:defaultValue="false"
android:key="webService" android:key="webService"
@ -38,6 +48,7 @@
app:iconSpaceReserved="false" /> app:iconSpaceReserved="false" />
<io.legado.app.ui.widget.prefs.PreferenceCategory <io.legado.app.ui.widget.prefs.PreferenceCategory
android:title="@string/setting"
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:allowDividerAbove="true" app:allowDividerAbove="true"
app:allowDividerBelow="false" > app:allowDividerBelow="false" >
@ -67,6 +78,7 @@
</io.legado.app.ui.widget.prefs.PreferenceCategory> </io.legado.app.ui.widget.prefs.PreferenceCategory>
<io.legado.app.ui.widget.prefs.PreferenceCategory <io.legado.app.ui.widget.prefs.PreferenceCategory
android:title="@string/other"
android:key="aboutCategory" android:key="aboutCategory"
app:allowDividerAbove="true" app:allowDividerAbove="true"
app:allowDividerBelow="false" app:allowDividerBelow="false"

Loading…
Cancel
Save