diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 533d8bdc1..df11ed5f9 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -5,6 +5,7 @@ **2020/05/18** * 修复http://alanskycn.gitee.io/书源导入失败问题,被屏蔽UA了 +* Rss列表添加样式切换 **2020/05/17** * 自动翻页功能完成 diff --git a/app/src/main/java/io/legado/app/data/AppDatabase.kt b/app/src/main/java/io/legado/app/data/AppDatabase.kt index d2256dd85..0bf73c868 100644 --- a/app/src/main/java/io/legado/app/data/AppDatabase.kt +++ b/app/src/main/java/io/legado/app/data/AppDatabase.kt @@ -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 diff --git a/app/src/main/java/io/legado/app/data/entities/RssSource.kt b/app/src/main/java/io/legado/app/data/entities/RssSource.kt index a7948e6e7..e30707446 100644 --- a/app/src/main/java/io/legado/app/data/entities/RssSource.kt +++ b/app/src/main/java/io/legado/app/data/entities/RssSource.kt @@ -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, diff --git a/app/src/main/java/io/legado/app/service/help/ReadBook.kt b/app/src/main/java/io/legado/app/service/help/ReadBook.kt index b7338596c..4b196ec48 100644 --- a/app/src/main/java/io/legado/app/service/help/ReadBook.kt +++ b/app/src/main/java/io/legado/app/service/help/ReadBook.kt @@ -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() } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 0c25c6086..6b267daa0 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -523,9 +523,10 @@ class ReadBookActivity : VMBaseActivity(R.layout.activity_boo } /** - * 更新进度条 + * 页面改变 */ - override fun upPageProgress() { + override fun pageChanged() { + autoPageProgress = 0 launch { seek_read_page.progress = ReadBook.durPageIndex } diff --git a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt index d948923e8..88bb95afe 100644 --- a/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt +++ b/app/src/main/java/io/legado/app/ui/main/my/MyFragment.kt @@ -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(EventBus.WEB_SERVICE_STOP) { webServicePre?.isChecked = false } - if (requireContext().channel == "google") { + findPreference(PreferKey.themeMode)?.let { + it.setOnPreferenceChangeListener { _, _ -> + view?.post { App.INSTANCE.applyDayNight() } + true + } + } + if (AppConfig.isGooglePlay) { findPreference("aboutCategory") ?.removePreference(findPreference("donate")) } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt index 1fdfcdaaa..7b56df2aa 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt @@ -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(context, layoutId) { override fun convert(holder: ItemViewHolder, item: RssArticle, payloads: MutableList) { 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) + } } \ No newline at end of file diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt index 4d174ab4a..201675028 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt @@ -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(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(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>? = null @@ -54,36 +51,11 @@ class RssArticlesFragment : VMBaseFragment(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) diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt index 3f5dbc0e7..41fad7292 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortActivity.kt @@ -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(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(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(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(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) } diff --git a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt index 4b1149f2e..e65dd37f4 100644 --- a/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/rss/article/RssSortViewModel.kt @@ -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() 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)) diff --git a/app/src/main/res/layout/item_rss_article_1.xml b/app/src/main/res/layout/item_rss_article_1.xml index a030e477a..9c46e1aaf 100644 --- a/app/src/main/res/layout/item_rss_article_1.xml +++ b/app/src/main/res/layout/item_rss_article_1.xml @@ -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" /> 點擊加入 信息 + 切換佈局 主色調 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 5c4fedd62..9442a252a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -676,6 +676,7 @@ 信息 隐藏页眉 隐藏页脚 + 切换布局 主色调 diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml index 4486f5276..e25834b5f 100644 --- a/app/src/main/res/xml/pref_main.xml +++ b/app/src/main/res/xml/pref_main.xml @@ -20,14 +20,24 @@ android:icon="@drawable/ic_cfg_replace" app:iconSpaceReserved="false" /> - + + @@ -67,6 +78,7 @@