use updateRelativeTimePeriodically everywhere (#4916)

This commit is contained in:
Konrad Pozniak 2025-02-17 15:16:41 +01:00 committed by GitHub
commit 36a4de9b40
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 32 additions and 52 deletions

View file

@ -26,7 +26,6 @@ import androidx.core.view.MenuProvider
import androidx.fragment.app.viewModels
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.paging.LoadState
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
@ -37,7 +36,6 @@ import com.google.android.material.color.MaterialColors
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.StatusListActivity
import com.keylesspalace.tusky.adapter.StatusBaseViewHolder
import com.keylesspalace.tusky.appstore.ConversationsLoadingEvent
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
@ -53,6 +51,7 @@ import com.keylesspalace.tusky.util.ensureBottomPadding
import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.isAnyLoading
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.updateRelativeTimePeriodically
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.viewdata.AttachmentViewData
import com.mikepenz.iconics.IconicsDrawable
@ -61,9 +60,6 @@ import com.mikepenz.iconics.utils.colorInt
import com.mikepenz.iconics.utils.sizeDp
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import kotlin.time.DurationUnit
import kotlin.time.toDuration
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@ -91,7 +87,7 @@ class ConversationsFragment :
val statusDisplayOptions = StatusDisplayOptions(
animateAvatars = preferences.getBoolean(PrefKeys.ANIMATE_GIF_AVATARS, false),
mediaPreviewEnabled = accountManager.activeAccount?.mediaPreviewEnabled ?: true,
mediaPreviewEnabled = accountManager.activeAccount?.mediaPreviewEnabled != false,
useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false),
showBotOverlay = preferences.getBoolean(PrefKeys.SHOW_BOT_OVERLAY, true),
useBlurhash = preferences.getBoolean(PrefKeys.USE_BLURHASH, true),
@ -177,19 +173,7 @@ class ConversationsFragment :
}
}
viewLifecycleOwner.lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.RESUMED) {
val useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false)
while (!useAbsoluteTime) {
adapter.notifyItemRangeChanged(
0,
adapter.itemCount,
StatusBaseViewHolder.Key.KEY_CREATED
)
delay(1.toDuration(DurationUnit.MINUTES))
}
}
}
updateRelativeTimePeriodically(preferences, adapter)
viewLifecycleOwner.lifecycleScope.launch {
eventHub.events.collect { event ->

View file

@ -47,7 +47,6 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.BaseActivity
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.adapter.StatusBaseViewHolder
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.components.notifications.requests.NotificationRequestsActivity
@ -70,15 +69,13 @@ import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.openLink
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
import com.keylesspalace.tusky.util.updateRelativeTimePeriodically
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.viewdata.AttachmentViewData
import com.keylesspalace.tusky.viewdata.NotificationViewData
import com.keylesspalace.tusky.viewdata.TranslationViewData
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
import kotlin.time.DurationUnit
import kotlin.time.toDuration
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@ -267,19 +264,11 @@ class NotificationsFragment :
accountManager.activeAccount?.let { account ->
notificationService.clearNotificationsForAccount(account)
}
val useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false)
while (!useAbsoluteTime) {
adapter.notifyItemRangeChanged(
0,
adapter.itemCount,
StatusBaseViewHolder.Key.KEY_CREATED
)
delay(1.toDuration(DurationUnit.MINUTES))
}
}
}
updateRelativeTimePeriodically(preferences, adapter)
viewLifecycleOwner.lifecycleScope.launch {
viewModel.notificationPolicy.collect {
notificationsPolicyAdapter.updateState(it)

View file

@ -60,6 +60,7 @@ import com.keylesspalace.tusky.util.StatusDisplayOptions
import com.keylesspalace.tusky.util.copyToClipboard
import com.keylesspalace.tusky.util.openLink
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
import com.keylesspalace.tusky.util.updateRelativeTimePeriodically
import com.keylesspalace.tusky.view.showMuteAccountDialog
import com.keylesspalace.tusky.viewdata.AttachmentViewData
import com.keylesspalace.tusky.viewdata.StatusViewData
@ -101,6 +102,14 @@ class SearchStatusesFragment : SearchFragment<StatusViewData.Concrete>(), Status
pendingMediaDownloads = savedInstanceState?.getStringArrayList(PENDING_MEDIA_DOWNLOADS_STATE_KEY)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
adapter?.let {
updateRelativeTimePeriodically(preferences, it)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
pendingMediaDownloads?.let {

View file

@ -39,7 +39,6 @@ import at.connyduck.sparkbutton.helpers.Utils
import com.google.android.material.color.MaterialColors
import com.google.android.material.snackbar.Snackbar
import com.keylesspalace.tusky.R
import com.keylesspalace.tusky.adapter.StatusBaseViewHolder
import com.keylesspalace.tusky.appstore.EventHub
import com.keylesspalace.tusky.appstore.PreferenceChangedEvent
import com.keylesspalace.tusky.appstore.StatusComposedEvent
@ -296,13 +295,7 @@ class TimelineFragment :
}
}
updateRelativeTimePeriodically(preferences) {
adapter.notifyItemRangeChanged(
0,
adapter.itemCount,
StatusBaseViewHolder.Key.KEY_CREATED
)
}
updateRelativeTimePeriodically(preferences, adapter)
}
override fun onDestroyView() {

View file

@ -39,6 +39,9 @@ class ViewThreadActivity : BottomSheetActivity() {
setDisplayShowHomeEnabled(true)
setDisplayShowTitleEnabled(true)
}
setTitle(R.string.title_view_thread)
val id = intent.getStringExtra(ID_EXTRA)!!
val url = intent.getStringExtra(URL_EXTRA)!!
val fragment =

View file

@ -50,6 +50,7 @@ import com.keylesspalace.tusky.util.hide
import com.keylesspalace.tusky.util.openLink
import com.keylesspalace.tusky.util.show
import com.keylesspalace.tusky.util.startActivityWithSlideInAnimation
import com.keylesspalace.tusky.util.updateRelativeTimePeriodically
import com.keylesspalace.tusky.util.viewBinding
import com.keylesspalace.tusky.viewdata.AttachmentViewData.Companion.list
import com.keylesspalace.tusky.viewdata.StatusViewData
@ -247,6 +248,8 @@ class ViewThreadFragment :
}
}
updateRelativeTimePeriodically(preferences, adapter)
viewModel.loadThread(thisThreadsStatusId)
}
@ -289,11 +292,6 @@ class ViewThreadFragment :
}
}
override fun onResume() {
super.onResume()
requireActivity().title = getString(R.string.title_view_thread)
}
/**
* Create a job to implement a delayed-visible progress bar.
*

View file

@ -7,6 +7,8 @@ import androidx.fragment.app.Fragment
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.coroutineScope
import androidx.lifecycle.repeatOnLifecycle
import androidx.recyclerview.widget.RecyclerView
import com.keylesspalace.tusky.adapter.StatusBaseViewHolder
import com.keylesspalace.tusky.settings.PrefKeys
import kotlin.time.Duration.Companion.minutes
import kotlinx.coroutines.delay
@ -19,17 +21,19 @@ private val UPDATE_INTERVAL = 1.minutes
* if setting absoluteTimeView is false.
* Start updates when the Fragment becomes visible and stop when it is hidden.
*/
fun Fragment.updateRelativeTimePeriodically(preferences: SharedPreferences, callback: Runnable) {
fun Fragment.updateRelativeTimePeriodically(preferences: SharedPreferences, adapter: RecyclerView.Adapter<out RecyclerView.ViewHolder>) {
val lifecycle = viewLifecycleOwner.lifecycle
lifecycle.coroutineScope.launch {
// This child coroutine will launch each time the Fragment moves to the STARTED state
lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) {
val useAbsoluteTime = preferences.getBoolean(PrefKeys.ABSOLUTE_TIME_VIEW, false)
if (!useAbsoluteTime) {
while (true) {
callback.run()
delay(UPDATE_INTERVAL)
}
while (!useAbsoluteTime) {
adapter.notifyItemRangeChanged(
0,
adapter.itemCount,
StatusBaseViewHolder.Key.KEY_CREATED
)
delay(UPDATE_INTERVAL)
}
}
}