diff --git a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt index e119d01a1..5cfd1d7b3 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/conversation/ConversationsFragment.kt @@ -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 -> diff --git a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt index 74c230959..5512287f8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/notifications/NotificationsFragment.kt @@ -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) diff --git a/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt index 3991dc74a..7104a74e8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/search/fragments/SearchStatusesFragment.kt @@ -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(), 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 { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt index 97b64fd39..fba5b725b 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/timeline/TimelineFragment.kt @@ -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() { diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadActivity.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadActivity.kt index 4db214de6..83888d02a 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadActivity.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadActivity.kt @@ -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 = diff --git a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt index e19be4bce..7c27491d3 100644 --- a/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt +++ b/app/src/main/java/com/keylesspalace/tusky/components/viewthread/ViewThreadFragment.kt @@ -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. * diff --git a/app/src/main/java/com/keylesspalace/tusky/util/RelativeTimeUpdater.kt b/app/src/main/java/com/keylesspalace/tusky/util/RelativeTimeUpdater.kt index 9af2323db..d065f1eb8 100644 --- a/app/src/main/java/com/keylesspalace/tusky/util/RelativeTimeUpdater.kt +++ b/app/src/main/java/com/keylesspalace/tusky/util/RelativeTimeUpdater.kt @@ -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) { 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) } } }