# 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
pull/219/head
yangyxd 5 years ago
commit 467caf3d23
  1. 13
      app/src/main/java/io/legado/app/help/AppConfig.kt
  2. 26
      app/src/main/java/io/legado/app/ui/config/ThemeConfigFragment.kt
  3. 32
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesAdapter.kt
  4. 16
      app/src/main/java/io/legado/app/ui/rss/article/RssArticlesFragment.kt
  5. 15
      app/src/main/java/io/legado/app/utils/ContextExtensions.kt
  6. BIN
      app/src/main/res/drawable/image_rss_article.jpg
  7. 1
      app/src/main/res/layout/item_rss_article.xml
  8. 10
      app/src/main/res/menu/theme_config.xml

@ -2,7 +2,6 @@ package io.legado.app.help
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.pm.PackageManager
import io.legado.app.App import io.legado.app.App
import io.legado.app.R import io.legado.app.R
import io.legado.app.constant.PreferKey import io.legado.app.constant.PreferKey
@ -141,15 +140,3 @@ object AppConfig {
} }
val Context.channel: String
get() {
try {
val pm = packageManager
val appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
return appInfo.metaData.getString("channel") ?: ""
} catch (e: Exception) {
e.printStackTrace();
}
return ""
}

@ -4,6 +4,9 @@ import android.annotation.SuppressLint
import android.content.SharedPreferences import android.content.SharedPreferences
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.view.Menu
import android.view.MenuInflater
import android.view.MenuItem
import android.view.View import android.view.View
import androidx.preference.Preference import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat import androidx.preference.PreferenceFragmentCompat
@ -20,7 +23,6 @@ import io.legado.app.lib.theme.ATH
import io.legado.app.lib.theme.ColorUtils import io.legado.app.lib.theme.ColorUtils
import io.legado.app.ui.widget.number.NumberPickerDialog import io.legado.app.ui.widget.number.NumberPickerDialog
import io.legado.app.ui.widget.prefs.IconListPreference import io.legado.app.ui.widget.prefs.IconListPreference
import io.legado.app.ui.widget.prefs.NameListPreference
import io.legado.app.utils.* import io.legado.app.utils.*
@ -35,18 +37,13 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), SharedPreferences.OnShar
preferenceScreen.removePreference(it) preferenceScreen.removePreference(it)
} }
} }
findPreference<NameListPreference>(PreferKey.themeMode)?.let {
it.setOnPreferenceChangeListener { _, _ ->
view?.post { App.INSTANCE.applyDayNight() }
true
}
}
upPreferenceSummary("barElevation", AppConfig.elevation.toString()) upPreferenceSummary("barElevation", AppConfig.elevation.toString())
} }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
ATH.applyEdgeEffectColor(listView) ATH.applyEdgeEffectColor(listView)
setHasOptionsMenu(true)
} }
override fun onResume() { override fun onResume() {
@ -59,6 +56,21 @@ class ThemeConfigFragment : PreferenceFragmentCompat(), SharedPreferences.OnShar
super.onPause() super.onPause()
} }
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
super.onCreateOptionsMenu(menu, inflater)
inflater.inflate(R.menu.theme_config, menu)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
R.id.menu_theme_mode -> {
AppConfig.isNightTheme = !AppConfig.isNightTheme
App.INSTANCE.applyDayNight()
}
}
return super.onOptionsItemSelected(item)
}
override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) {
sharedPreferences ?: return sharedPreferences ?: return
when (key) { when (key) {

@ -1,9 +1,8 @@
package io.legado.app.ui.rss.article package io.legado.app.ui.rss.article
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.widget.ImageView
import androidx.core.content.ContextCompat
import com.bumptech.glide.load.DataSource import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener import com.bumptech.glide.request.RequestListener
@ -20,33 +19,30 @@ import org.jetbrains.anko.sdk27.listeners.onClick
import org.jetbrains.anko.textColorResource import org.jetbrains.anko.textColorResource
class RssArticlesAdapter(context: Context, layoutId: Int, private val isGridLayout: Boolean, val callBack: CallBack) : class RssArticlesAdapter(context: Context, layoutId: Int, val callBack: CallBack) :
SimpleRecyclerAdapter<RssArticle>(context, layoutId) { SimpleRecyclerAdapter<RssArticle>(context, layoutId) {
fun emptyImage(image_view: ImageView) { @SuppressLint("CheckResult")
if (isGridLayout)
image_view.setImageResource(R.drawable.rss_img_default)
else
image_view.gone()
}
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) {
tv_title.text = item.title tv_title.text = item.title
tv_pub_date.text = item.pubDate tv_pub_date.text = item.pubDate
if (item.image.isNullOrBlank()) { if (item.image.isNullOrBlank() && !callBack.isGridLayout) {
emptyImage(image_view) image_view.gone()
} else { } else {
ImageLoader.load(context, item.image) val imageLoader = ImageLoader.load(context, item.image)
.addListener(object : RequestListener<Drawable> { if (callBack.isGridLayout) {
imageLoader.placeholder(R.drawable.image_rss_article)
} else {
imageLoader.addListener(object : RequestListener<Drawable> {
override fun onLoadFailed( override fun onLoadFailed(
e: GlideException?, e: GlideException?,
model: Any?, model: Any?,
target: Target<Drawable>?, target: Target<Drawable>?,
isFirstResource: Boolean isFirstResource: Boolean
): Boolean { ): Boolean {
emptyImage(image_view) image_view.gone()
return true return false
} }
override fun onResourceReady( override fun onResourceReady(
@ -61,7 +57,8 @@ class RssArticlesAdapter(context: Context, layoutId: Int, private val isGridLayo
} }
}) })
.into(image_view) }
imageLoader.into(image_view)
} }
if (item.read) { if (item.read) {
tv_title.textColorResource = R.color.tv_text_summary tv_title.textColorResource = R.color.tv_text_summary
@ -80,6 +77,7 @@ class RssArticlesAdapter(context: Context, layoutId: Int, private val isGridLayo
} }
interface CallBack { interface CallBack {
val isGridLayout: Boolean
fun readRss(rssArticle: RssArticle) fun readRss(rssArticle: RssArticle)
} }
} }

@ -43,6 +43,8 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
lateinit var adapter: RssArticlesAdapter 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
override val isGridLayout: Boolean
get() = activityViewModel.isGridLayout
override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) {
viewModel.init(arguments) viewModel.init(arguments)
@ -54,17 +56,15 @@ class RssArticlesFragment : VMBaseFragment<RssArticlesViewModel>(R.layout.fragme
private fun initView() { private fun initView() {
ATH.applyEdgeEffectColor(recycler_view) ATH.applyEdgeEffectColor(recycler_view)
if (activityViewModel.isGridLayout) { recycler_view.layoutManager = if (activityViewModel.isGridLayout) {
recycler_view.setPadding(8,0,8,0) recycler_view.setPadding(8, 0, 8, 0)
recycler_view.layoutManager = GridLayoutManager(requireContext(), 2) GridLayoutManager(requireContext(), 2)
while (recycler_view.itemDecorationCount > 0)
recycler_view.removeItemDecorationAt(0)
} else { } else {
recycler_view.setPadding(0,0,0,0)
recycler_view.layoutManager = LinearLayoutManager(requireContext())
recycler_view.addItemDecoration(VerticalDivider(requireContext())) recycler_view.addItemDecoration(VerticalDivider(requireContext()))
LinearLayoutManager(requireContext())
} }
adapter = RssArticlesAdapter(requireContext(), activityViewModel.layoutId, activityViewModel.isGridLayout, this) adapter = RssArticlesAdapter(requireContext(), activityViewModel.layoutId, this)
recycler_view.adapter = adapter recycler_view.adapter = adapter
loadMoreView = LoadMoreView(requireContext()) loadMoreView = LoadMoreView(requireContext())
adapter.addFooterView(loadMoreView) adapter.addFooterView(loadMoreView)

@ -3,6 +3,7 @@ package io.legado.app.utils
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.* import android.content.*
import android.content.pm.PackageManager
import android.content.res.ColorStateList import android.content.res.ColorStateList
import android.content.res.Configuration import android.content.res.Configuration
import android.graphics.Bitmap import android.graphics.Bitmap
@ -178,4 +179,16 @@ fun Context.openUrl(uri: Uri) {
toast(e.localizedMessage ?: "open url error") toast(e.localizedMessage ?: "open url error")
} }
} }
} }
val Context.channel: String
get() {
try {
val pm = packageManager
val appInfo = pm.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
return appInfo.metaData.getString("channel") ?: ""
} catch (e: Exception) {
e.printStackTrace();
}
return ""
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

@ -43,6 +43,7 @@
android:paddingLeft="16dp" android:paddingLeft="16dp"
android:visibility="gone" android:visibility="gone"
android:scaleType="centerCrop" android:scaleType="centerCrop"
android:src="@drawable/image_rss_article"
app:layout_constraintRight_toRightOf="parent" app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="RtlHardcoded,RtlSymmetry" /> tools:ignore="RtlHardcoded,RtlSymmetry" />

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/menu_theme_mode"
android:title="@string/theme_mode"
app:showAsAction="always" />
</menu>
Loading…
Cancel
Save