On first launch after upgrading, if the new global key is empty,
fall back to the legacy profile-scoped key from the previous
version. Once found, the value is saved to the global key so
future reads avoid the legacy path.
The language preference was stored with a profile-scoped key
(selected_app_language_{profileId}), causing it to reset to English
on app restart when the active profile was not profile 1.
During startup, initialize() reads the key with default
activeProfileId=1 before the correct profile is loaded, resulting
in a cache miss and fallback to English.
App language is a device-level preference, not per-profile, so
the key should not be scoped. This also fixes replaceFromSyncPayload
to correctly clear both profile-scoped and global keys.
- Introduced a new `IntegrationsSettingsPage` to manage TMDB, MDBList, and Trakt integrations.
- Updated `SettingsNavigationRow` to support both `ImageVector` and `Painter` for icons.
- Created `IntegrationLogo` enum to represent different integration logos.
- Implemented platform-specific logo handling in `IntegrationLogoPainter` for Android and iOS.
- Added new drawable resources for MDBList logo in both Android and common resources.
- Refactored `SearchScreen` to improve query handling and search history recording.
- Updated TraktAuthState to replace device and user codes with pending authorization fields.
- Modified TraktAuthUiState to remove polling fields and include pending authorization timestamp.
- Introduced TraktBrandAsset enum for brand assets.
- Implemented traktBrandPainter function for Android and iOS to provide appropriate brand images.
- Added SVG and XML resources for Trakt brand assets (logo wordmark and favicon).
- Updated iOS app to handle URL callbacks for Trakt authentication.
- Added TraktAuthBridge to manage authentication callback handling.