diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt index 660227b238..07e862d976 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/view/AvatarView.kt @@ -51,6 +51,10 @@ class AvatarView @JvmOverloads constructor( avatar.scaleY = 1f } + fun hasStory(): Boolean { + return storyRing.visible + } + fun setStoryRingFromState(storyViewState: StoryViewState) { when (storyViewState) { StoryViewState.NONE -> hideStoryRing() diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 964b6f90e3..d595381279 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -75,6 +75,7 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientExporter import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.recipients.ui.bottomsheet.RecipientBottomSheetDialogFragment +import org.thoughtcrime.securesms.stories.viewer.StoryViewerActivity import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.ExpirationUtil @@ -268,10 +269,9 @@ class ConversationSettingsFragment : DSLSettingsFragment( recipient = state.recipient, storyViewState = state.storyViewState, onAvatarClick = { avatar -> - if (!state.recipient.isSelf) { - // startActivity(StoryViewerActivity.createIntent(requireContext(), state.recipient.id)) - - // TODO [stories] -- If recipient has a story, go to story viewer. + if (avatar.hasStory()) { + startActivity(StoryViewerActivity.createIntent(requireContext(), state.recipient.id)) + } else if (!state.recipient.isSelf) { requireActivity().apply { startActivity( AvatarPreviewActivity.intentFromRecipientId(this, state.recipient.id), diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/AvatarPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/AvatarPreference.kt index 48686538bd..599d2d13c7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/AvatarPreference.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/AvatarPreference.kt @@ -28,7 +28,7 @@ object AvatarPreference { class Model( val recipient: Recipient, val storyViewState: StoryViewState, - val onAvatarClick: (View) -> Unit, + val onAvatarClick: (AvatarView) -> Unit, val onBadgeClick: (Badge) -> Unit ) : PreferenceModel() { override fun areItemsTheSame(newItem: Model): Boolean { diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java index 6cab2a502c..6f3fbd8d8f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationParentFragment.java @@ -112,6 +112,7 @@ import org.thoughtcrime.securesms.ShortcutLauncherActivity; import org.thoughtcrime.securesms.TransportOption; import org.thoughtcrime.securesms.components.emoji.RecentEmojiPageModel; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; +import org.thoughtcrime.securesms.stories.viewer.StoryViewerActivity; import org.thoughtcrime.securesms.util.Debouncer; import org.thoughtcrime.securesms.util.LifecycleDisposable; import org.thoughtcrime.securesms.verify.VerifyIdentityActivity; @@ -1246,6 +1247,10 @@ public class ConversationParentFragment extends Fragment }); } + private void handleStoryRingClick() { + startActivity(StoryViewerActivity.createIntent(requireContext(), recipient.getId(), -1L)); + } + private void handleConversationSettings() { if (isGroupConversation()) { handleManageGroup(); @@ -2121,6 +2126,7 @@ public class ConversationParentFragment extends Fragment if (manuallySelected) recordTransportPreference(newTransport); }); + titleView.setOnStoryRingClickListener(v -> handleStoryRingClick()); titleView.setOnClickListener(v -> handleConversationSettings()); titleView.setOnLongClickListener(v -> handleDisplayQuickContact()); unblockButton.setOnClickListener(v -> handleUnblock()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java index 4cfd578bc5..b51fc6b987 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationTitleView.java @@ -128,6 +128,16 @@ public class ConversationTitleView extends RelativeLayout { avatar.setStoryRingFromState(storyViewState); } + public void setOnStoryRingClickListener(@NonNull OnClickListener onStoryRingClickListener) { + avatar.setOnClickListener(v -> { + if (avatar.hasStory()) { + onStoryRingClickListener.onClick(v); + } else { + performClick(); + } + }); + } + public void setVerified(boolean verified) { this.verified.setVisibility(verified ? View.VISIBLE : View.GONE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index db6ce9a501..28998c8d7c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -169,7 +169,7 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF if (recipient.isSelf()) { avatar.setOnClickListener(v -> { dismiss(); - viewModel.onMessageClicked(requireActivity()); + viewModel.onNoteToSelfClicked(requireActivity()); }); } 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 e1537287d4..4c3463101d 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 @@ -32,6 +32,7 @@ import org.thoughtcrime.securesms.groups.ui.addtogroup.AddToGroupsActivity; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; +import org.thoughtcrime.securesms.stories.viewer.StoryViewerActivity; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; import org.thoughtcrime.securesms.verify.VerifyIdentityActivity; @@ -135,6 +136,14 @@ final class RecipientDialogViewModel extends ViewModel { return adminActionBusy; } + void onNoteToSelfClicked(@NonNull Activity activity) { + if (storyViewState.getValue() == null || storyViewState.getValue() == StoryViewState.NONE) { + onMessageClicked(activity); + } else { + activity.startActivity(StoryViewerActivity.createIntent(activity, recipientDialogRepository.getRecipientId(), -1L)); + } + } + void onMessageClicked(@NonNull Activity activity) { recipientDialogRepository.getRecipient(recipient -> CommunicationActions.startConversation(activity, recipient, null)); } @@ -164,7 +173,11 @@ final class RecipientDialogViewModel extends ViewModel { } void onAvatarClicked(@NonNull Activity activity) { - activity.startActivity(ConversationSettingsActivity.forRecipient(activity, recipientDialogRepository.getRecipientId())); + if (storyViewState.getValue() == null || storyViewState.getValue() == StoryViewState.NONE) { + activity.startActivity(ConversationSettingsActivity.forRecipient(activity, recipientDialogRepository.getRecipientId())); + } else { + activity.startActivity(StoryViewerActivity.createIntent(activity, recipientDialogRepository.getRecipientId(), -1L)); + } } void onMakeGroupAdminClicked(@NonNull Activity activity) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt index 9c6652ab54..cfd64e7bbd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/StoryViewerActivity.kt @@ -38,6 +38,7 @@ class StoryViewerActivity : PassphraseRequiredActivity() { private const val ARG_START_RECIPIENT_ID = "start.recipient.id" private const val ARG_START_STORY_ID = "start.story.id" + @JvmStatic fun createIntent(context: Context, recipientId: RecipientId, storyId: Long = -1L): Intent { return Intent(context, StoryViewerActivity::class.java) .putExtra(ARG_START_RECIPIENT_ID, recipientId) diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index 5b1e3af9c3..10e1aef644 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -59,7 +59,6 @@ import org.thoughtcrime.securesms.util.DateUtils import org.thoughtcrime.securesms.util.LifecycleDisposable import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.fragments.requireListener -import org.thoughtcrime.securesms.util.hasThumbnail import org.thoughtcrime.securesms.util.views.TouchInterceptingFrameLayout import org.thoughtcrime.securesms.util.visible import java.util.Locale