Fix crash when entering convo with mention in draft.

This commit is contained in:
Alex Hart
2025-11-07 15:26:36 -04:00
committed by GitHub
parent 85aab85d87
commit aa5f5a9c2a
5 changed files with 32 additions and 6 deletions

View File

@@ -23,6 +23,7 @@ import org.thoughtcrime.securesms.util.doOnEachLayout
*/
class InlineQueryResultsControllerV2(
private val parentFragment: Fragment,
private val threadId: Long,
private val viewModel: InlineQueryViewModelV2,
private val anchor: View,
private val container: ViewGroup,
@@ -110,7 +111,7 @@ class InlineQueryResultsControllerV2(
if (mentionFragment == null) {
mentionFragment = parentFragment.childFragmentManager.findFragmentByTag(MENTION_TAG) as? MentionsPickerFragmentV2
if (mentionFragment == null) {
mentionFragment = MentionsPickerFragmentV2()
mentionFragment = MentionsPickerFragmentV2.create(threadId)
parentFragment.childFragmentManager.commit {
replace(R.id.mention_fragment_container, mentionFragment!!)
runOnCommit { mentionFragment!!.updateList(results.results) }

View File

@@ -6,7 +6,7 @@ import android.os.Looper
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.viewModels
import androidx.core.os.bundleOf
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.material.bottomsheet.BottomSheetBehavior
@@ -17,9 +17,11 @@ import org.signal.core.util.concurrent.addTo
import org.thoughtcrime.securesms.LoggingFragment
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.conversation.ui.inlinequery.InlineQueryViewModelV2
import org.thoughtcrime.securesms.conversation.v2.ConversationRecipientRepository
import org.thoughtcrime.securesms.recipients.Recipient
import org.thoughtcrime.securesms.util.VibrateUtil
import org.thoughtcrime.securesms.util.adapter.mapping.MappingModel
import org.thoughtcrime.securesms.util.viewModel
import org.thoughtcrime.securesms.util.viewholders.RecipientViewHolder
/**
@@ -27,9 +29,27 @@ import org.thoughtcrime.securesms.util.viewholders.RecipientViewHolder
*/
class MentionsPickerFragmentV2 : LoggingFragment() {
companion object {
private val THREAD_ID = "thread.id"
fun create(threadId: Long): MentionsPickerFragmentV2 {
return MentionsPickerFragmentV2().apply {
arguments = bundleOf(THREAD_ID to threadId)
}
}
}
private val lifecycleDisposable: LifecycleDisposable = LifecycleDisposable()
private val viewModel: InlineQueryViewModelV2 by viewModels(
ownerProducer = { requireParentFragment() }
private val conversationRecipientRepository: ConversationRecipientRepository by viewModel(
ownerProducer = { requireParentFragment() },
create = { ConversationRecipientRepository(requireArguments().getLong(THREAD_ID)) }
)
private val viewModel: InlineQueryViewModelV2 by viewModel(
ownerProducer = { requireParentFragment() },
create = { InlineQueryViewModelV2(conversationRecipientRepository) }
)
private lateinit var adapter: MentionsPickerAdapter

View File

@@ -420,7 +420,7 @@ class ConversationFragment :
ConversationIntents.readArgsFromBundle(requireArguments())
}
private val conversationRecipientRepository: ConversationRecipientRepository by lazy {
private val conversationRecipientRepository: ConversationRecipientRepository by viewModel {
ConversationRecipientRepository(args.threadId)
}
@@ -513,6 +513,7 @@ class ConversationFragment :
private val inlineQueryController: InlineQueryResultsControllerV2 by lazy {
InlineQueryResultsControllerV2(
this,
args.threadId,
inlineQueryViewModel,
inputPanel,
(requireView() as ViewGroup),

View File

@@ -1,5 +1,6 @@
package org.thoughtcrime.securesms.conversation.v2
import androidx.lifecycle.ViewModel
import io.reactivex.rxjava3.core.Observable
import io.reactivex.rxjava3.core.Single
import io.reactivex.rxjava3.schedulers.Schedulers
@@ -8,7 +9,7 @@ import org.thoughtcrime.securesms.database.model.GroupRecord
import org.thoughtcrime.securesms.recipients.Recipient
import java.util.Optional
class ConversationRecipientRepository(threadId: Long) {
class ConversationRecipientRepository(threadId: Long) : ViewModel() {
val conversationRecipient: Observable<Recipient> by lazy {
val threadRecipientId = Single.fromCallable {

View File

@@ -8,6 +8,7 @@ import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.ViewModelStoreOwner
import androidx.lifecycle.viewmodel.CreationExtras
/**
@@ -42,9 +43,11 @@ inline fun <reified VM : ViewModel> ComponentActivity.viewModel(
@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModel(
noinline ownerProducer: () -> ViewModelStoreOwner = { this },
noinline create: (CreationExtras) -> VM
): Lazy<VM> {
return viewModels(
ownerProducer = ownerProducer,
factoryProducer = ViewModelFactory.factoryProducer(create)
)
}