diff --git a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt index d55691f3f6..fd2409a725 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/MainActivity.kt @@ -846,7 +846,7 @@ class MainActivity : val detailLocation = extras.getParcelableCompat(KEY_DETAIL_LOCATION, MainNavigationDetailLocation::class.java) if (detailLocation != null) { - mainNavigationViewModel.goTo(detailLocation) + goTo(detailLocation) return } diff --git a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt index c643b94240..830351d301 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/calls/log/CallLogAdapter.kt @@ -324,13 +324,16 @@ class CallLogAdapter( return } - presentRecipientDetails(model.call.peer, model.call.searchQuery) + presentRecipientDetails(model.call) presentCallInfo(model.call, model.call.date) presentCallType(model) } - private fun presentRecipientDetails(recipient: Recipient, searchQuery: String?) { - binding.callRecipientAvatar.setAvatar(Glide.with(binding.callRecipientAvatar), recipient, true) + private fun presentRecipientDetails(call: CallLogRow.Call) { + val recipient = call.peer + val searchQuery = call.searchQuery + binding.callRecipientAvatar.setAvatar(Glide.with(binding.callRecipientAvatar), recipient, false) + binding.callRecipientAvatar.setOnClickListener { onCallClicked(call) } binding.callRecipientBadge.setBadgeFromRecipient(recipient) binding.callRecipientName.text = if (searchQuery != null) { SearchUtil.getHighlightedSpan( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java index a7391c1c56..b634b55fe8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java @@ -30,11 +30,12 @@ import com.bumptech.glide.request.target.SimpleTarget; import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.transition.Transition; +import org.signal.core.util.ContextUtil; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.avatar.fallback.FallbackAvatar; import org.thoughtcrime.securesms.avatar.fallback.FallbackAvatarDrawable; -import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity; +import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavigator; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.SystemContactPhoto; @@ -53,9 +54,7 @@ import java.util.List; import java.util.Objects; public final class AvatarImageView extends AppCompatImageView { - private static final int SIZE_LARGE = 1; - private static final int SIZE_SMALL = 2; @SuppressWarnings("unused") private static final String TAG = Log.tag(AvatarImageView.class); @@ -156,10 +155,10 @@ public final class AvatarImageView extends AppCompatImageView { public void setAvatar(@NonNull RequestManager requestManager, @Nullable Recipient recipient, boolean quickContactEnabled, boolean useSelfProfileAvatar, boolean useBlurGradient) { setAvatar(requestManager, recipient, new AvatarOptions.Builder(this) - .withUseSelfProfileAvatar(useSelfProfileAvatar) - .withQuickContactEnabled(quickContactEnabled) - .withUseBlurGradient(useBlurGradient) - .build()); + .withUseSelfProfileAvatar(useSelfProfileAvatar) + .withQuickContactEnabled(quickContactEnabled) + .withUseBlurGradient(useBlurGradient) + .build()); } private void setAvatar(@Nullable Recipient recipient, @NonNull AvatarOptions avatarOptions) { @@ -182,8 +181,8 @@ public final class AvatarImageView extends AppCompatImageView { if (!photo.equals(recipientContactPhoto) || shouldBlur != blurred || !Objects.equals(chatColors, this.chatColors) || !Objects.equals(initials, this.initials)) { requestManager.clear(this); - this.chatColors = chatColors; - this.initials = initials; + this.chatColors = chatColors; + this.initials = initials; recipientContactPhoto = photo; FallbackAvatarProvider activeFallbackPhotoProvider = this.fallbackAvatarProvider; @@ -215,12 +214,12 @@ public final class AvatarImageView extends AppCompatImageView { List> transforms = Collections.singletonList(new CircleCrop()); RequestBuilder request = requestManager.load(photo.contactPhoto) - .fallback(fallback) - .error(fallback) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .downsample(DownsampleStrategy.CENTER_INSIDE) - .transform(new MultiTransformation<>(transforms)) - .addListener(redownloadRequestListener); + .fallback(fallback) + .error(fallback) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .downsample(DownsampleStrategy.CENTER_INSIDE) + .transform(new MultiTransformation<>(transforms)) + .addListener(redownloadRequestListener); if (wasUnblurred) { blurred = shouldBlur; @@ -260,17 +259,12 @@ public final class AvatarImageView extends AppCompatImageView { private void setAvatarClickHandler(@NonNull final Recipient recipient, boolean quickContactEnabled) { if (quickContactEnabled) { super.setOnClickListener(v -> { - Context context = getContext(); + FragmentActivity activity = ContextUtil.requireFragmentActivity(getContext()); + if (recipient.isPushGroup()) { - context.startActivity(ConversationSettingsActivity.forGroup(context, recipient.requireGroupId().requirePush()), - ConversationSettingsActivity.createTransitionBundle(context, this)); + ConversationSettingsNavigator.navigate(activity, recipient); } else { - if (context instanceof FragmentActivity) { - RecipientBottomSheetDialogFragment.show(((FragmentActivity) context).getSupportFragmentManager(), recipient.getId(), null); - } else { - context.startActivity(ConversationSettingsActivity.forRecipient(context, recipient.getId()), - ConversationSettingsActivity.createTransitionBundle(context, this)); - } + RecipientBottomSheetDialogFragment.show(activity.getSupportFragmentManager(), recipient.getId(), null); } }); } else { @@ -283,13 +277,13 @@ public final class AvatarImageView extends AppCompatImageView { Drawable fallback = new FallbackAvatarDrawable(getContext(), new FallbackAvatar.Resource.Group(color)).circleCrop(); Glide.with(this) - .load(avatarBytes) - .dontAnimate() - .fallback(fallback) - .error(fallback) - .diskCacheStrategy(DiskCacheStrategy.ALL) - .circleCrop() - .into(this); + .load(avatarBytes) + .dontAnimate() + .fallback(fallback) + .error(fallback) + .diskCacheStrategy(DiskCacheStrategy.ALL) + .circleCrop() + .into(this); } public void setNonAvatarImageResource(@DrawableRes int imageResource) { @@ -308,7 +302,8 @@ public final class AvatarImageView extends AppCompatImageView { } } - private static class DefaultFallbackAvatarProvider implements FallbackAvatarProvider {} + private static class DefaultFallbackAvatarProvider implements FallbackAvatarProvider { + } private static class RecipientContactPhoto { diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsActivity.kt index 1481a57869..de44460525 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsActivity.kt @@ -1,12 +1,9 @@ package org.thoughtcrime.securesms.components.settings.conversation -import android.app.Activity import android.content.Context import android.content.Intent import android.os.Bundle -import android.view.View import androidx.core.app.ActivityCompat -import androidx.core.app.ActivityOptionsCompat import com.google.android.material.transition.platform.MaterialContainerTransformSharedElementCallback import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.DSLSettingsActivity @@ -36,35 +33,6 @@ open class ConversationSettingsActivity : DSLSettingsActivity(), ConversationSet } companion object { - - @JvmStatic - fun createTransitionBundle(context: Context, avatar: View, windowContent: View): Bundle? { - return if (context is Activity) { - ActivityOptionsCompat.makeSceneTransitionAnimation( - context, - *arrayOf( - androidx.core.util.Pair.create(avatar, "avatar"), - androidx.core.util.Pair.create(windowContent, "window_content") - ) - ).toBundle() - } else { - null - } - } - - @JvmStatic - fun createTransitionBundle(context: Context, avatar: View): Bundle? { - return if (context is Activity) { - ActivityOptionsCompat.makeSceneTransitionAnimation( - context, - avatar, - "avatar" - ).toBundle() - } else { - null - } - } - @JvmStatic fun forGroup(context: Context, groupId: GroupId): Intent { val startBundle = ConversationSettingsFragmentArgs.Builder(null, groupId, null) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsNavigator.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsNavigator.kt new file mode 100644 index 0000000000..9b4c1f04e8 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsNavigator.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2026 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.components.settings.conversation + +import androidx.fragment.app.FragmentActivity +import org.thoughtcrime.securesms.main.MainNavigationChatDetailRouter +import org.thoughtcrime.securesms.main.MainNavigationDetailLocation +import org.thoughtcrime.securesms.recipients.Recipient + +/** + * Routes to the conversation settings screen, handling split-pane vs. standalone activity automatically. + */ +object ConversationSettingsNavigator { + @JvmStatic + fun navigate( + activity: FragmentActivity, + recipient: Recipient + ) { + if (activity is MainNavigationChatDetailRouter) { + activity.goToChatDetail(MainNavigationDetailLocation.Chats.ConversationSettings(recipient.id)) + return + } + + val intent = if (recipient.isPushGroup) { + ConversationSettingsActivity.forGroup(activity, recipient.requireGroupId()) + } else { + ConversationSettingsActivity.forRecipient(activity, recipient.id) + } + activity.startActivity(intent) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallInfoCallbacks.kt b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallInfoCallbacks.kt index 683e79463c..b92d03323f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallInfoCallbacks.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/webrtc/v2/CallInfoCallbacks.kt @@ -15,7 +15,7 @@ import org.thoughtcrime.securesms.BaseActivity import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.calls.links.CallLinks import org.thoughtcrime.securesms.calls.links.EditCallLinkNameDialogFragment -import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity +import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavigator import org.thoughtcrime.securesms.components.webrtc.controls.CallInfoView import org.thoughtcrime.securesms.components.webrtc.controls.ControlsAndInfoViewModel import org.thoughtcrime.securesms.dependencies.AppDependencies @@ -82,7 +82,7 @@ class CallInfoCallbacks( } override fun onContactDetails(callParticipant: CallParticipant) { - activity.startActivity(ConversationSettingsActivity.forRecipient(activity, callParticipant.recipient.id)) + ConversationSettingsNavigator.navigate(activity, callParticipant.recipient) } override fun onViewSafetyNumber(callParticipant: CallParticipant) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivity.kt index 2416bdb540..98a4c53f5c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivity.kt @@ -8,8 +8,10 @@ import android.view.Window import androidx.activity.viewModels import androidx.core.app.ActivityCompat import androidx.lifecycle.enableSavedStateHandles +import androidx.lifecycle.lifecycleScope import io.reactivex.rxjava3.subjects.PublishSubject import io.reactivex.rxjava3.subjects.Subject +import kotlinx.coroutines.launch import org.signal.core.util.logging.Log import org.signal.core.util.logging.Log.tag import org.thoughtcrime.securesms.MainActivity @@ -17,10 +19,14 @@ import org.thoughtcrime.securesms.PassphraseRequiredActivity import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.app.subscription.GooglePayComponent import org.thoughtcrime.securesms.components.settings.app.subscription.GooglePayRepository +import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavHostFragment import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaController import org.thoughtcrime.securesms.components.voice.VoiceNoteMediaControllerOwner import org.thoughtcrime.securesms.conversation.ConversationIntents import org.thoughtcrime.securesms.jobs.ConversationShortcutUpdateJob +import org.thoughtcrime.securesms.main.MainNavigationChatDetailRouter +import org.thoughtcrime.securesms.main.MainNavigationDetailLocation +import org.thoughtcrime.securesms.messagedetails.MessageDetailsFragment import org.thoughtcrime.securesms.util.ConfigurationUtil import org.thoughtcrime.securesms.util.Debouncer import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme @@ -29,12 +35,11 @@ import java.util.concurrent.TimeUnit /** * Wrapper activity for ConversationFragment. */ -open class ConversationActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner, GooglePayComponent { +open class ConversationActivity : PassphraseRequiredActivity(), VoiceNoteMediaControllerOwner, GooglePayComponent, MainNavigationChatDetailRouter { companion object { private val TAG = tag(ConversationActivity::class.java) - - private const val STATE_WATERMARK = "share_data_watermark" + private const val MESSAGE_DETAILS_FRAGMENT_TAG = "MessageDetailsFragment" } private val theme = DynamicNoActionBarTheme() @@ -137,6 +142,32 @@ open class ConversationActivity : PassphraseRequiredActivity(), VoiceNoteMediaCo .commitNowAllowingStateLoss() } + override fun exitDetailLocation() { + if (!supportFragmentManager.popBackStackImmediate()) { + finish() + } + } + + override fun goToChatDetail(location: MainNavigationDetailLocation.Chats) { + when (location) { + is MainNavigationDetailLocation.Chats.ConversationSettings -> { + lifecycleScope.launch { + val args = ConversationSettingsNavHostFragment.createArgs(location.recipientId) + supportFragmentManager + .beginTransaction() + .replace(R.id.fragment_container, ConversationSettingsNavHostFragment::class.java, args) + .addToBackStack(null) + .commit() + } + } + + is MainNavigationDetailLocation.Chats.MessageDetails -> { + MessageDetailsFragment.create(location.messageId, location.recipientId) + .show(supportFragmentManager, MESSAGE_DETAILS_FRAGMENT_TAG) + } + } + } + override fun dispatchTouchEvent(ev: MotionEvent?): Boolean { return motionEventRelay.offer(ev) || super.dispatchTouchEvent(ev) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt index d0396d5ec8..88564e28ae 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt @@ -12,6 +12,7 @@ import android.view.View import android.view.ViewGroup import androidx.core.view.children import androidx.fragment.app.DialogFragment +import androidx.fragment.app.FragmentActivity import androidx.lifecycle.LifecycleOwner import androidx.media3.common.MediaItem import androidx.recyclerview.widget.RecyclerView @@ -22,7 +23,7 @@ import org.signal.core.util.toOptional import org.thoughtcrime.securesms.BindableConversationItem import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.Unbindable -import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity +import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavigator import org.thoughtcrime.securesms.conversation.ConversationAdapter.ItemClickListener import org.thoughtcrime.securesms.conversation.ConversationAdapterBridge import org.thoughtcrime.securesms.conversation.ConversationHeaderCallbacks @@ -580,7 +581,7 @@ class ConversationAdapterV2( override fun onGroupSettingsClicked() { val recipient = conversationBanner.recipientInfo?.recipient ?: return - context.startActivity(ConversationSettingsActivity.forGroup(context, recipient.requireGroupId())) + ConversationSettingsNavigator.navigate(context as FragmentActivity, recipient) } override fun onShowGroupDescriptionClicked(groupName: String, description: String, linkifyWebLinks: Boolean) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index f66400986d..36da02c4d1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -172,7 +172,6 @@ import org.thoughtcrime.securesms.components.menu.SignalBottomActionBar import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity import org.thoughtcrime.securesms.components.settings.app.subscription.donate.CheckoutFlowActivity import org.thoughtcrime.securesms.components.settings.app.subscription.donate.DonateToSignalFragment -import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity import org.thoughtcrime.securesms.components.snackbars.makeSnackbar import org.thoughtcrime.securesms.components.spoiler.SpoilerAnnotation import org.thoughtcrime.securesms.components.voice.VoiceNoteDraft @@ -302,7 +301,6 @@ import org.thoughtcrime.securesms.mediaoverview.MediaOverviewActivity import org.thoughtcrime.securesms.mediapreview.MediaIntentFactory import org.thoughtcrime.securesms.mediapreview.MediaPreviewV2Activity import org.thoughtcrime.securesms.mediasend.MediaSendActivityResult -import org.thoughtcrime.securesms.messagedetails.MessageDetailsFragment import org.thoughtcrime.securesms.messagerequests.MessageRequestRepository import org.thoughtcrime.securesms.mms.AttachmentManager import org.thoughtcrime.securesms.mms.AudioSlide @@ -582,7 +580,7 @@ class ConversationFragment : private lateinit var conversationItemDecorations: ConversationItemDecorations private lateinit var optionsMenuCallback: ConversationOptionsMenuCallback - private var chatRouter: MainNavigationChatDetailRouter? = null + private lateinit var chatRouter: MainNavigationChatDetailRouter private var animationsAllowed = false private var pinnedShortcutReceiver: BroadcastReceiver? = null @@ -661,7 +659,7 @@ class ConversationFragment : override fun onAttach(context: Context) { super.onAttach(context) - chatRouter = context as? MainNavigationChatDetailRouter + chatRouter = context as MainNavigationChatDetailRouter } override fun onCreate(savedInstanceState: Bundle?) { @@ -3092,7 +3090,7 @@ class ConversationFragment : private fun handleDisplayDetails(conversationMessage: ConversationMessage) { val recipientSnapshot = viewModel.recipientSnapshot ?: return - navigateTo(MainNavigationDetailLocation.Chats.MessageDetails(recipientSnapshot.id, MessageId(conversationMessage.messageRecord.id))) + chatRouter.goToChatDetail(MainNavigationDetailLocation.Chats.MessageDetails(recipientSnapshot.id, MessageId(conversationMessage.messageRecord.id))) } private fun handleDeleteMessages(messageParts: Set) { @@ -3632,7 +3630,7 @@ class ConversationFragment : } else if (messageRecord.hasFailedWithNetworkFailures()) { ConversationDialogs.displayMessageCouldNotBeSentDialog(requireContext(), messageRecord) } else { - navigateTo(MainNavigationDetailLocation.Chats.MessageDetails(recipientId, MessageId(messageRecord.id))) + chatRouter.goToChatDetail(MainNavigationDetailLocation.Chats.MessageDetails(recipientId, MessageId(messageRecord.id))) } } @@ -4306,7 +4304,7 @@ class ConversationFragment : override fun handleManageGroup() { viewModel.recipientSnapshot?.let { recipient -> - navigateTo(MainNavigationDetailLocation.Chats.ConversationSettings(recipient.id)) + chatRouter.goToChatDetail(MainNavigationDetailLocation.Chats.ConversationSettings(recipient.id)) } } @@ -4343,7 +4341,7 @@ class ConversationFragment : override fun handleConversationSettings() { viewModel.recipientSnapshot?.let { recipient -> if (!viewModel.hasMessageRequestState || recipient.isBlocked) { - navigateTo(MainNavigationDetailLocation.Chats.ConversationSettings(recipient.id)) + chatRouter.goToChatDetail(MainNavigationDetailLocation.Chats.ConversationSettings(recipient.id)) } } } @@ -4410,49 +4408,6 @@ class ConversationFragment : } } - /** - * Routes to the appropriate destination based on the current window configuration. - * - * In split-pane mode, delegates to the [MainNavigationChatDetailRouter] to display content in the detail pane. Otherwise, opens the destination as a standalone screen. - */ - private fun navigateTo(location: MainNavigationDetailLocation.Chats) { - val router = chatRouter - if (router != null && resources.isSplitPane()) { - router.goToChatDetail(location) - } else { - when (location) { - is MainNavigationDetailLocation.Chats.MessageDetails -> navigateToMessageDetailsStandalone(location) - is MainNavigationDetailLocation.Chats.ConversationSettings -> navigateToConversationSettingsStandalone(viewModel.recipientSnapshot!!) - } - } - } - - /** - * Opens message details as a standalone (single-pane) screen. Use [navigateTo] as the entry point. - */ - private fun navigateToMessageDetailsStandalone(location: MainNavigationDetailLocation.Chats.MessageDetails) { - MessageDetailsFragment.create(location.messageId, location.recipientId) - .show(requireActivity().supportFragmentManager, MESSAGE_DETAILS_TAG) - } - - /** - * Opens conversation settings as a standalone (single-pane) screen. - */ - private fun navigateToConversationSettingsStandalone(recipient: Recipient) { - val intent = if (recipient.isPushGroup) { - ConversationSettingsActivity.forGroup(requireContext(), recipient.requireGroupId()) - } else { - ConversationSettingsActivity.forRecipient(requireContext(), recipient.id) - } - - val bundle = ConversationSettingsActivity.createTransitionBundle( - requireActivity(), - binding.conversationTitleView.root.findViewById(R.id.contact_photo_image), - binding.toolbar - ) - requireActivity().startActivity(intent, bundle) - } - private inner class OnReactionsSelectedListener : ConversationReactionOverlay.OnReactionSelectedListener { override fun onReactionSelected(messageRecord: MessageRecord, emoji: String?) { reactionDelegate.hide() diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/CallsNavHost.kt b/app/src/main/java/org/thoughtcrime/securesms/main/CallsNavHost.kt index ab6c21a925..1313631826 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/CallsNavHost.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/CallsNavHost.kt @@ -9,11 +9,13 @@ import androidx.activity.compose.LocalActivity import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect +import androidx.compose.ui.platform.LocalResources import androidx.lifecycle.viewmodel.compose.LocalViewModelStoreOwner import androidx.navigation.NavGraphBuilder import androidx.navigation.NavHostController import androidx.navigation.compose.composable import androidx.navigation.toRoute +import org.signal.core.ui.rememberIsSplitPane import org.thoughtcrime.securesms.MainNavigator import org.thoughtcrime.securesms.calls.links.EditCallLinkNameScreen import org.thoughtcrime.securesms.calls.links.details.CallLinkDetailsScreen @@ -25,7 +27,9 @@ private val callLinkRoomIdType = typeOf() fun NavGraphBuilder.callNavGraphBuilder(navHostController: NavHostController) { composable { - EmptyDetailScreen() + if (LocalResources.current.rememberIsSplitPane()) { + EmptyDetailScreen() + } } composable( diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/ChatsNavHost.kt b/app/src/main/java/org/thoughtcrime/securesms/main/ChatsNavHost.kt index 80e023176e..c978373e9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/ChatsNavHost.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/ChatsNavHost.kt @@ -34,6 +34,7 @@ import androidx.compose.ui.graphics.layer.GraphicsLayer import androidx.compose.ui.graphics.layer.drawLayer import androidx.compose.ui.graphics.rememberGraphicsLayer import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.unit.dp import androidx.fragment.compose.AndroidFragment import androidx.fragment.compose.rememberFragmentState @@ -46,6 +47,7 @@ import androidx.navigation.toRoute import kotlinx.coroutines.delay import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import org.signal.core.ui.rememberIsSplitPane import org.thoughtcrime.securesms.MainNavigator import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavHostFragment import org.thoughtcrime.securesms.compose.FragmentBackHandler @@ -70,7 +72,9 @@ fun NavGraphBuilder.chatNavGraphBuilder( chatNavGraphState: ChatNavGraphState ) { composable { - EmptyDetailScreen() + if (LocalResources.current.rememberIsSplitPane()) { + EmptyDetailScreen() + } } composable( @@ -182,8 +186,8 @@ fun NavGraphBuilder.chatNavGraphBuilder( ) { navBackStackEntry -> val navigatorProvider = LocalContext.current as? MainNavigator.NavigatorProvider - val fragmentState = key(route) { rememberFragmentState() } val route = navBackStackEntry.toRoute() + val fragmentState = key(route) { rememberFragmentState() } val arguments: Bundle? by produceState(null, route.recipientId) { value = ConversationSettingsNavHostFragment.createArgs(route.recipientId) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/main/StoriesNavHost.kt b/app/src/main/java/org/thoughtcrime/securesms/main/StoriesNavHost.kt index d369d68735..e9f2789caf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/main/StoriesNavHost.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/main/StoriesNavHost.kt @@ -5,11 +5,15 @@ package org.thoughtcrime.securesms.main +import androidx.compose.ui.platform.LocalResources import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable +import org.signal.core.ui.rememberIsSplitPane fun NavGraphBuilder.storiesNavGraphBuilder() { composable { - EmptyDetailScreen() + if (LocalResources.current.rememberIsSplitPane()) { + EmptyDetailScreen() + } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java index 4654fc7251..72436a25f8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientDialogViewModel.java @@ -18,11 +18,11 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder; import org.signal.core.util.ThreadUtil; import org.signal.core.util.concurrent.SignalExecutors; +import org.signal.storageservice.storage.protos.groups.AccessControl; import org.thoughtcrime.securesms.BlockUnblockDialog; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity; +import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsNavigator; import org.thoughtcrime.securesms.conversation.colors.ColorizerV2; -import org.signal.storageservice.storage.protos.groups.AccessControl; import org.thoughtcrime.securesms.database.GroupTable; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.model.GroupRecord; @@ -233,9 +233,9 @@ final class RecipientDialogViewModel extends ViewModel { VerifyIdentityActivity.startOrShowExchangeMessagesDialog(activity, identityRecord); } - void onAvatarClicked(@NonNull Activity activity) { + void onAvatarClicked(@NonNull FragmentActivity activity) { if (storyViewState.getValue() == null || storyViewState.getValue() == StoryViewState.NONE) { - activity.startActivity(ConversationSettingsActivity.forRecipient(activity, recipientDialogRepository.getRecipientId())); + recipientDialogRepository.getRecipient(recipient -> ConversationSettingsNavigator.navigate(activity, recipient)); } else { activity.startActivity(StoryViewerActivity.createIntent( activity,