Skip to content

Commit

Permalink
Refactor "trending hashtags" code (#3595)
Browse files Browse the repository at this point in the history
- Fix codeformatting
- Add new refreshing state
- Disable LogConditional lint rule
- Update lint-baseline
  • Loading branch information
connyduck committed Jun 10, 2023
1 parent 071e007 commit f23c0cc
Show file tree
Hide file tree
Showing 13 changed files with 323 additions and 468 deletions.
374 changes: 167 additions & 207 deletions app/lint-baseline.xml

Large diffs are not rendered by default.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,19 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.fragment.app.commit
import com.keylesspalace.tusky.BottomSheetActivity
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.databinding.ActivityTrendingBinding
import com.keylesspalace.tusky.util.viewBinding
import dagger.android.DispatchingAndroidInjector
import dagger.android.HasAndroidInjector
import javax.inject.Inject

class TrendingActivity : BottomSheetActivity(), HasAndroidInjector {
class TrendingActivity : BaseActivity(), HasAndroidInjector {

@Inject
lateinit var dispatchingAndroidInjector: DispatchingAndroidInjector<Any>

@Inject
lateinit var eventHub: EventHub

private val binding: ActivityTrendingBinding by viewBinding(ActivityTrendingBinding::inflate)

override fun onCreate(savedInstanceState: Bundle?) {
Expand All @@ -44,10 +40,8 @@ class TrendingActivity : BottomSheetActivity(), HasAndroidInjector {

setSupportActionBar(binding.includedToolbar.toolbar)

val title = getString(R.string.title_public_trending_hashtags)

supportActionBar?.run {
setTitle(title)
setTitle(R.string.title_public_trending_hashtags)
setDisplayHomeAsUpEnabled(true)
setDisplayShowHomeEnabled(true)
}
Expand All @@ -63,10 +57,6 @@ class TrendingActivity : BottomSheetActivity(), HasAndroidInjector {
override fun androidInjector() = dispatchingAndroidInjector

companion object {
const val TAG = "TrendingActivity"

@JvmStatic
fun getIntent(context: Context) =
Intent(context, TrendingActivity::class.java)
fun getIntent(context: Context) = Intent(context, TrendingActivity::class.java)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,15 +20,12 @@ import android.view.ViewGroup
import androidx.recyclerview.widget.DiffUtil
import androidx.recyclerview.widget.ListAdapter
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.adapter.TrendingDateViewHolder
import com.keylesspalace.tusky.adapter.TrendingTagViewHolder
import com.keylesspalace.tusky.databinding.ItemTrendingCellBinding
import com.keylesspalace.tusky.databinding.ItemTrendingDateBinding
import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.viewdata.TrendingViewData

class TrendingAdapter(
private val trendingListener: LinkListener
private val onViewTag: (String) -> Unit
) : ListAdapter<TrendingViewData, RecyclerView.ViewHolder>(TrendingDifferCallback) {

init {
Expand All @@ -42,7 +39,6 @@ class TrendingAdapter(
ItemTrendingCellBinding.inflate(LayoutInflater.from(viewGroup.context))
TrendingTagViewHolder(binding)
}

else -> {
val binding =
ItemTrendingDateBinding.inflate(LayoutInflater.from(viewGroup.context))
Expand All @@ -52,38 +48,15 @@ class TrendingAdapter(
}

override fun onBindViewHolder(viewHolder: RecyclerView.ViewHolder, position: Int) {
bindViewHolder(viewHolder, position, null)
}

override fun onBindViewHolder(
viewHolder: RecyclerView.ViewHolder,
position: Int,
payloads: List<*>
) {
bindViewHolder(viewHolder, position, payloads)
}

private fun bindViewHolder(
viewHolder: RecyclerView.ViewHolder,
position: Int,
payloads: List<*>?
) {
when (val header = getItem(position)) {
when (val viewData = getItem(position)) {
is TrendingViewData.Tag -> {
val maxTrendingValue = currentList
.flatMap { trendingViewData ->
trendingViewData.asTagOrNull()?.tag?.history.orEmpty()
}
.mapNotNull { it.uses.toLongOrNull() }
.maxOrNull() ?: 1

val holder = viewHolder as TrendingTagViewHolder
holder.setup(header, maxTrendingValue, trendingListener)
holder.setup(viewData, onViewTag)
}

is TrendingViewData.Header -> {
val holder = viewHolder as TrendingDateViewHolder
holder.setup(header.start, header.end)
holder.setup(viewData.start, viewData.end)
}
}
}
Expand Down Expand Up @@ -112,14 +85,7 @@ class TrendingAdapter(
oldItem: TrendingViewData,
newItem: TrendingViewData
): Boolean {
return false
}

override fun getChangePayload(
oldItem: TrendingViewData,
newItem: TrendingViewData
): Any? {
return null
return oldItem == newItem
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
* You should have received a copy of the GNU General Public License along with Tusky; if not,
* see <http://www.gnu.org/licenses>. */

package com.keylesspalace.tusky.adapter
package com.keylesspalace.tusky.components.trending

import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.R
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,36 +15,29 @@

package com.keylesspalace.tusky.components.trending

import android.content.Context
import android.content.res.Configuration
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.view.accessibility.AccessibilityManager
import androidx.core.content.ContextCompat
import androidx.fragment.app.Fragment
import androidx.lifecycle.ViewModelProvider
import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.GridLayoutManager.SpanSizeLookup
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.SimpleItemAnimator
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout.OnRefreshListener
import at.connyduck.sparkbutton.helpers.Utils
import com.keylesspalace.tusky.BottomSheetActivity
import com.keylesspalace.tusky.PostLookupFallbackBehavior
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.StatusListActivity
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.components.trending.viewmodel.TrendingViewModel
import com.keylesspalace.tusky.databinding.FragmentTrendingBinding
import com.keylesspalace.tusky.db.AccountManager
import com.keylesspalace.tusky.di.Injectable
import com.keylesspalace.tusky.di.ViewModelFactory
import com.keylesspalace.tusky.interfaces.ActionButtonActivity
import com.keylesspalace.tusky.interfaces.LinkListener
import com.keylesspalace.tusky.interfaces.RefreshableFragment
import com.keylesspalace.tusky.interfaces.ReselectableFragment
import com.keylesspalace.tusky.util.hide
Expand All @@ -56,48 +49,20 @@ import kotlinx.coroutines.launch
import javax.inject.Inject

class TrendingFragment :
Fragment(),
Fragment(R.layout.fragment_trending),
OnRefreshListener,
LinkListener,
Injectable,
ReselectableFragment,
RefreshableFragment {

private lateinit var bottomSheetActivity: BottomSheetActivity

@Inject
lateinit var viewModelFactory: ViewModelFactory

@Inject
lateinit var accountManager: AccountManager

@Inject
lateinit var eventHub: EventHub

private val viewModel: TrendingViewModel by lazy {
ViewModelProvider(this, viewModelFactory)[TrendingViewModel::class.java]
}
private val viewModel: TrendingViewModel by viewModels { viewModelFactory }

private val binding by viewBinding(FragmentTrendingBinding::bind)

private lateinit var adapter: TrendingAdapter

override fun onAttach(context: Context) {
super.onAttach(context)
bottomSheetActivity = if (context is BottomSheetActivity) {
context
} else {
throw IllegalStateException("Fragment must be attached to a BottomSheetActivity!")
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

adapter = TrendingAdapter(
this
)
}
private val adapter = TrendingAdapter(::onViewTag)

override fun onConfigurationChanged(newConfig: Configuration) {
super.onConfigurationChanged(newConfig)
Expand All @@ -106,14 +71,6 @@ class TrendingFragment :
setupLayoutManager(columnCount)
}

override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
return inflater.inflate(R.layout.fragment_trending, container, false)
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
setupSwipeRefreshLayout()
setupRecyclerView()
Expand Down Expand Up @@ -175,25 +132,19 @@ class TrendingFragment :
}

override fun onRefresh() {
viewModel.invalidate()
}

override fun onViewUrl(url: String) {
bottomSheetActivity.viewUrl(url, PostLookupFallbackBehavior.OPEN_IN_BROWSER)
}

override fun onViewTag(tag: String) {
bottomSheetActivity.startActivityWithSlideInAnimation(StatusListActivity.newHashtagIntent(requireContext(), tag))
viewModel.invalidate(true)
}

override fun onViewAccount(id: String) {
bottomSheetActivity.viewAccount(id)
fun onViewTag(tag: String) {
(requireActivity() as BaseActivity).startActivityWithSlideInAnimation(StatusListActivity.newHashtagIntent(requireContext(), tag))
}

private fun processViewState(uiState: TrendingViewModel.TrendingUiState) {
Log.d(TAG, uiState.loadingState.name)
when (uiState.loadingState) {
TrendingViewModel.LoadingState.INITIAL -> clearLoadingState()
TrendingViewModel.LoadingState.LOADING -> applyLoadingState()
TrendingViewModel.LoadingState.REFRESHING -> applyRefreshingState()
TrendingViewModel.LoadingState.LOADED -> applyLoadedState(uiState.trendingViewData)
TrendingViewModel.LoadingState.ERROR_NETWORK -> networkError()
TrendingViewModel.LoadingState.ERROR_OTHER -> otherError()
Expand All @@ -203,8 +154,9 @@ class TrendingFragment :
private fun applyLoadedState(viewData: List<TrendingViewData>) {
clearLoadingState()

adapter.submitList(viewData)

if (viewData.isEmpty()) {
adapter.submitList(emptyList())
binding.recyclerView.hide()
binding.messageView.show()
binding.messageView.setup(
Expand All @@ -213,16 +165,16 @@ class TrendingFragment :
null
)
} else {
val viewDataWithDates = listOf(viewData.first().asHeaderOrNull()) + viewData

adapter.submitList(viewDataWithDates)

binding.recyclerView.show()
binding.messageView.hide()
}
binding.progressBar.hide()
}

private fun applyRefreshingState() {
binding.swipeRefreshLayout.isRefreshing = true
}

private fun applyLoadingState() {
binding.recyclerView.hide()
binding.messageView.hide()
Expand Down Expand Up @@ -297,8 +249,6 @@ class TrendingFragment :
companion object {
private const val TAG = "TrendingFragment"

fun newInstance(): TrendingFragment {
return TrendingFragment()
}
fun newInstance() = TrendingFragment()
}
}

0 comments on commit f23c0cc

Please sign in to comment.