signalapp / signalapp/Signal-iOS

Pinned conversations are hidden above viewport on return to chat list

Open Beginner friendly
#6,296 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Swift
Stars
12.2k
Forks
3.5k
PR merge metrics
No merged PRs in 30d

Description

  • I have searched open and closed issues for duplicates
  • I am submitting a bug report for existing functionality that does not work as intended
  • This isn't a feature request or a discussion topic

Bug description

After viewing a conversation and returning to the list, pinned conversations are hidden above the top of the screen. The list opens to the unpinned "Chats" section instead, and you have to scroll up to reach anything pinned.

This seems to be a side effect of intentional behavior: when you return to the conversation list, Signal scrolls to wherever the thread you were just in, in case it moved due to new messages. The problem is that if that thread is now the most recently active one, it ends up at the very top of the unpinned section, and scrolling to it pushes the entire Pinned section off the top of the screen. The most natural usage pattern (send a message, go back) reliably triggers this.

An extension of that pattern is send a message, leave the app, and do something else, and then later want to return to the app. In that case, I am likely opening the app to find a conversation, and want my pinned conversations visible because that's why I pinned them. Instead, when I open the app, see the last conversation I was in before leaving the app, and tap go back, I am scrolled only to the top of the unpinned "Chats" section, leaving my pinned conversations visible.

The scroll happens in _viewWillAppear in ChatListViewController.swift. After reloading the list, it calls scrollToRow(at: lastViewedThread, at: .none) at line 161. The last-viewed thread is now at the top of the unpinned section, and UIKit puts it at the top of the viewport. The table uses .grouped style with floating section headers, so the "Chats" header sits on top of it, and everything above (the Pinned section) is out of view. Due to the "Chats" header, it makes the me think I'm at the top, which regularly causes my eyes to scan for the chat I am looking for, only to realize, oh right, the chat I want is pinned above and I have to scroll up.

A potential minimal fix: if the last viewed thread is now at the top of the unpinned section and pinned threads exist, scroll to the top instead. The thread is then visible right below the pinned section, and pinned conversations are no longer hidden. In theory, if you are returning to the conversations list after engaging with what is now the most recent thread, then you likely do not need to scroll past the pinned conversations to help the user not feel lost (and right now the current behavior makes me feel lost).

I do not recall Signal Android having this issue. It appears to leave the scroll position alone and pinned conversations stay visible.

Steps to reproduce
  • Have at least one pinned conversation
  • Open any unpinned conversation and send or receive at least one message
  • Tap back to return to the conversation list

Actual result: The list shows the "Chats" section header at the top of the screen. The Pinned section and all pinned conversations are above the visible area.

Expected result: The list shows the top of the conversation list, including pinned conversations.

Device info

Device: iPhone 17 Pro Max

iOS version: 26.5.1

Signal version: 8.18 (1680)

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in Signal/src/ViewControllers/HomeView/Chat List/ChatListViewController.swift, especially _viewWillAppear and the scrollToRow call near line 161. Reproduce with a pinned conversation and an active unpinned conversation, then verify that returning to the list keeps the Pinned section visible instead of showing only the Chats header at the top.

Written by the indexing model from the issue text.

Assessment

Tech stack
swift
Domain
mobile
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
74/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.