# 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**
* 修复http://alanskycn.gitee.io/书源导入失败问题,被屏蔽UA了
* Rss列表添加样式切换
**2020/05/17**
* 自动翻页功能完成

@ -19,7 +19,7 @@ import kotlinx.coroutines.launch
ReplaceRule::class, SearchBook::class, SearchKeyword::class, Cookie::class,
RssSource::class, Bookmark::class, RssArticle::class, RssReadRecord::class,
RssStar::class, TxtTocRule::class],
version = 12,
version = 13,
exportSchema = true
)
abstract class AppDatabase : RoomDatabase() {
@ -31,7 +31,7 @@ abstract class AppDatabase : RoomDatabase() {
fun createDatabase(context: Context): AppDatabase {
return Room.databaseBuilder(context, AppDatabase::class.java, DATABASE_NAME)
.fallbackToDestructiveMigration()
.addMigrations(migration_10_11, migration_11_12)
.addMigrations(migration_10_11, migration_11_12, migration_12_13)
.addCallback(object : Callback() {
override fun onDestructiveMigration(db: SupportSQLiteDatabase) {
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

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

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

@ -523,9 +523,10 @@ class ReadBookActivity : VMBaseActivity<ReadBookViewModel>(R.layout.activity_boo
}
/**
* 更新进度条
* 页面改变
*/
override fun upPageProgress() {
override fun pageChanged() {
autoPageProgress = 0
launch {
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.constant.EventBus
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.service.WebService
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) {
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")
?.removePreference(findPreference("donate"))
}

@ -8,16 +8,18 @@ import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import io.legado.app.R
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.help.ImageLoader
import io.legado.app.utils.gone
import io.legado.app.utils.visible
import kotlinx.android.synthetic.main.item_rss_article.view.*
import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource
class RssArticlesAdapter(context: Context, private val layoutId: Int, callBack: CallBack) :
RssArticlesBaseAdapter(context, layoutId, callBack) {
class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle>(context, layoutId) {
override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList<Any>) {
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 androidx.lifecycle.LiveData
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.VMBaseFragment
import io.legado.app.data.entities.RssArticle
import io.legado.app.help.AppConfig
import io.legado.app.lib.theme.ATH
import io.legado.app.ui.rss.read.ReadRssActivity
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.view_load_more.view.*
import kotlinx.android.synthetic.main.view_refresh_recycler.*
import org.jetbrains.anko.padding
class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragment_rss_articles),
RssArticlesBaseAdapter.CallBack {
RssArticlesAdapter.CallBack {
companion object {
fun create(sortName: String, sortUrl: String): RssArticlesFragment {
@ -42,7 +39,7 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
get() = getViewModelOfActivity(RssSortViewModel::class.java)
override val viewModel: RssArticlesViewModel
get() = getViewModel(RssArticlesViewModel::class.java)
lateinit var adapter: RssArticlesBaseAdapter
lateinit var adapter: RssArticlesAdapter
private lateinit var loadMoreView: LoadMoreView
private var rssArticlesData: LiveData<List<RssArticle>>? = null
@ -54,36 +51,11 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
initData()
}
fun switchLayout() {
refresh_recycler_view.startLoading()
initView()
initData()
}
private fun initView() {
ATH.applyEdgeEffectColor(recycler_view)
var rssLayoutConfig = activityViewModel.rssSource?.let { AppConfig.getRssLayout(it) }
var layoutId = R.layout.item_rss_article
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.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext()))
adapter = RssArticlesAdapter(requireContext(), activityViewModel.layoutId, this)
recycler_view.adapter = adapter
loadMoreView = LoadMoreView(requireContext())
adapter.addFooterView(loadMoreView)

@ -9,12 +9,12 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.Observer
import io.legado.app.App
import io.legado.app.R
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.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 org.jetbrains.anko.startActivityForResult
@ -43,10 +43,6 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
return super.onCompatCreateOptionsMenu(menu)
}
override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
return super.onPrepareOptionsMenu(menu)
}
override fun onCompatOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
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 -> {
switchLayout()
viewModel.switchLayout()
upFragments()
}
}
return super.onCompatOptionsItemSelected(item)
@ -77,17 +74,6 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
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?) {
super.onActivityResult(requestCode, resultCode, data)
when (requestCode) {
@ -102,6 +88,10 @@ class RssSortActivity : VMBaseActivity<RssSortViewModel>(R.layout.activity_rss_a
private inner class TabFragmentPageAdapter internal constructor(fm: FragmentManager) :
FragmentStatePagerAdapter(fm, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
override fun getItemPosition(`object`: Any): Int {
return POSITION_NONE
}
override fun getPageTitle(position: Int): CharSequence? {
return fragments.keys.elementAt(position)
}

@ -4,6 +4,7 @@ import android.app.Application
import android.content.Intent
import androidx.lifecycle.MutableLiveData
import io.legado.app.App
import io.legado.app.R
import io.legado.app.base.BaseViewModel
import io.legado.app.data.entities.RssArticle
import io.legado.app.data.entities.RssReadRecord
@ -15,6 +16,11 @@ class RssSortViewModel(application: Application) : BaseViewModel(application) {
var rssSource: RssSource? = null
val titleLiveData = MutableLiveData<String>()
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) {
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) {
execute {
App.db.rssArticleDao().insertRecord(RssReadRecord(rssArticle.link))

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

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

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

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

Loading…
Cancel
Save