ActiveConversationTracker
Tracks which conversation the user is currently looking at, so the notification path does not buzz the phone for a message whose bubble is already animating onto the screen.
Only the message screen writes setActive/clearActive, on resume and pause. That is deliberately the only signal MessageAnnouncement.Suppress needs: backgrounding the app pauses the screen, which clears the key on its way out. appForeground is driven from the process lifecycle and only separates MessageAnnouncement.Silent from MessageAnnouncement.Alert.