Fix launch responsiveness of story viewer.

This commit is contained in:
Alex Hart 2022-05-27 14:40:34 -03:00 committed by Greyson Parrelli
parent 4758369f79
commit b2b6f98294
6 changed files with 25 additions and 6 deletions

View file

@ -2,7 +2,6 @@ package org.thoughtcrime.securesms.badges.gifts.flow
import android.content.DialogInterface
import android.view.KeyEvent
import android.widget.EditText
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.activity.OnBackPressedCallback

View file

@ -4,12 +4,13 @@ import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import androidx.lifecycle.LiveDataReactiveStreams
import androidx.viewpager2.widget.ViewPager2
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.recipients.RecipientId
import org.thoughtcrime.securesms.stories.StoryViewerArgs
import org.thoughtcrime.securesms.stories.viewer.page.StoryViewerPageFragment
import org.thoughtcrime.securesms.util.LifecycleDisposable
/**
* Fragment which manages a vertical pager fragment of stories.
@ -26,6 +27,8 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
}
)
private val lifecycleDisposable = LifecycleDisposable()
private val storyViewerArgs: StoryViewerArgs by lazy { requireArguments().getParcelable(ARGS)!! }
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
@ -38,7 +41,8 @@ class StoryViewerFragment : Fragment(R.layout.stories_viewer_fragment), StoryVie
storyPager.isUserInputEnabled = !it
}
LiveDataReactiveStreams.fromPublisher(viewModel.state).observe(viewLifecycleOwner) { state ->
lifecycleDisposable.bindTo(viewLifecycleOwner)
lifecycleDisposable += viewModel.state.observeOn(AndroidSchedulers.mainThread()).subscribe { state ->
adapter.setPages(state.pages)
if (state.pages.isNotEmpty() && storyPager.currentItem != state.page) {
storyPager.setCurrentItem(state.page, state.previousPage > -1)

View file

@ -268,14 +268,19 @@ class StoryViewerPageFragment :
when (parentState.crossfadeSource) {
is StoryViewerState.CrossfadeSource.TextModel -> storyCrossfader.setSourceView(parentState.crossfadeSource.storyTextPostModel)
is StoryViewerState.CrossfadeSource.ImageUri -> storyCrossfader.setSourceView(parentState.crossfadeSource.imageUri, parentState.crossfadeSource.imageBlur)
else -> onReadyToAnimate()
}
onReadyToAnimate()
} else {
viewModel.setIsSelectedPage(false)
}
}
lifecycleDisposable += viewModel.state.observeOn(AndroidSchedulers.mainThread()).subscribe { state ->
if (!state.isReady) {
return@subscribe
}
if (state.posts.isNotEmpty() && state.selectedPostIndex in state.posts.indices) {
val post = state.posts[state.selectedPostIndex]

View file

@ -7,6 +7,7 @@ import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.schedulers.Schedulers
import org.signal.core.util.BreakIteratorCompat
import org.signal.core.util.concurrent.SignalExecutors
import org.signal.core.util.logging.Log
import org.thoughtcrime.securesms.conversation.ConversationMessage
import org.thoughtcrime.securesms.database.DatabaseObserver
import org.thoughtcrime.securesms.database.NoSuchMessageException
@ -28,6 +29,10 @@ import org.thoughtcrime.securesms.util.Base64
*/
open class StoryViewerPageRepository(context: Context) {
companion object {
private val TAG = Log.tag(StoryViewerPageRepository::class.java)
}
private val context = context.applicationContext
private fun getStoryRecords(recipientId: RecipientId): Observable<List<MessageRecord>> {
@ -104,7 +109,11 @@ open class StoryViewerPageRepository(context: Context) {
}
val conversationObserver = DatabaseObserver.Observer {
refresh(SignalDatabase.mms.getMessageRecord(record.id))
try {
refresh(SignalDatabase.mms.getMessageRecord(record.id))
} catch (e: NoSuchMessageException) {
Log.w(TAG, "Message deleted during content refresh.", e)
}
}
ApplicationDependencies.getDatabaseObserver().registerConversationObserver(record.threadId, conversationObserver)

View file

@ -5,7 +5,8 @@ data class StoryViewerPageState(
val selectedPostIndex: Int = 0,
val replyState: ReplyState = ReplyState.NONE,
val isFirstPage: Boolean = false,
val isDisplayingInitialState: Boolean = false
val isDisplayingInitialState: Boolean = false,
val isReady: Boolean = false
) {
/**
* Indicates which Reply method is available when the user swipes on the dialog

View file

@ -63,6 +63,7 @@ class StoryViewerPageViewModel(
}
state.copy(
isReady = true,
posts = posts,
replyState = resolveSwipeToReplyState(state, startIndex),
selectedPostIndex = startIndex,