* Show unique notifications per contact
Instead of a single notification for all messages, each contact now has its own, unique notification. This uses the `NotificationCompat.MessagingStyle` and the contact's name to create distinct notifications, enhancing message organization.
* feat: Add notification tap action to open contacts tab
This is done by:
- Adding an intent extra to the notification with the contact key for future use to navigate to the message thread.
- Adding a new action to the MainActivity to handle the intent.
- Updating the message notification to include the intent.
* Open message notification to the correct conversation
Adds an extra to the message notification intent to open the correct conversation. This ensures that when a user taps on a message notification, they are taken to the conversation with the sender of that message.
* Highlight the node in the node list tab when the user taps on the node chip in messages
* Represent main tabs as enum for more reliable referencing
* Extract tab labels to string resources for easier translation
Annotate resource IDs with their corresponding Android types
* Index off nodes actually in the adapter since they are sorted
* Update viewmodel when tab changes to prevent jumping to other tabs in onResume
* Mark strings as non-translatable for now
- enforce Unidirectional Data Flow removing nodeDB updates via `MainActivity`/`UIState`
- merge `MyNodeInfoDao` into `NodeInfoDao`
- move node list re-indexing to database
This required creation of new interfaces in order to break the
static coupling. This also allowed for the removal of some plumbing
of dependencies of these implementations since they are now directly
injected.
reverts b765ac4453 (causing: Fatal Exception: java.lang.IllegalStateException: onAttach called multiple times with different Context! Hilt Fragments should not be retained).