Preserve Manage device state across resume while preventing cross-account cache leaks by tracking synced user IDs and clearing stale local device data on account changes. Replace the mock device remote data source with Apollo-backed API queries/mutations using me.locations so Manage only shows devices belonging to the authenticated user.
Made-with: Cursor
Add LocationTimeSeries GraphQL query and DeviceTimeSeriesRepository.
Extend DevicePanelState with chart data/loading/offset; MapViewModel fetches via location _id and maps with DashboardChartMapper.
Wire MapScreen preview with sample chart data.
Made-with: Cursor
- Map cityList rows without coordinates; fall back en/ru/be for display names
- Replace local city cache on sync when opening city screen
- Use SharedFlow + prefs reads so re-selecting the same city (e.g. Minsk) notifies dashboard
Made-with: Cursor
Sign out of Firebase and clear API and local profile if the GraphQL exchange or token save fails after Firebase Google sign-in, so the user is not left in a half-authenticated state. Rename the exchange helper to exchangeFirebaseIdTokenWithBackend for clarity.
Login: ignore duplicate Google taps while loading and disable the Google button during the flow. Credential Manager: treat GetCredentialInterruptedException as cancellation and rethrow CancellationException so coroutines cancel correctly.
Tests: assert signOut is invoked when the backend exchange fails.
Made-with: Cursor
Introduce EmailRegisterScreen (Compose) with contract, validation, and
loading UX matching the email sign-in layout. Register submits via
AuthService.registerWithEmail; success navigates to Manage and clears
the login stack.
Email login Register action opens the new route instead of handling
registration on the same screen.
Made-with: Cursor
Add loginLocal and register Apollo mutations, LocalEmailAuthStore for profile snapshot when not using Firebase, extend AuthService/FirebaseAuthService with session handoff vs Google, wire EmailLoginViewModel, refresh Manage on resume, and expand unit tests.
Made-with: Cursor
Port legacy Google Maps heatmap behavior: PM2.5-style buckets, tier colors, halos under markers. Draw halos in Overlay.draw with live projection so heat tracks during pan (no debounced bitmap). Radioactivity uses single green tier to match marker styling.
Made-with: Cursor
Group nearby markers into count bubbles; cluster tap zooms to member bounds.
Rebuild overlays on a debounced map listener so clusters track pan and zoom.
Add cluster bubble layout, strings, and pixel-distance clustering with a 48dp
base threshold scaled down when zoomed in so clustering stays less aggressive.
Made-with: Cursor
- AirMQChart: add bottom padding so fill extends below line and thick line stays in bounds
- DeviceSensorDropdown: show border on selected item when dropdown is opened
Made-with: Cursor
- Add DashboardScreenContract and DashboardViewModel with dummy data
- Extend MetricGauge with pager, page indicators, sensor config
- Integrate AirMQChart and city selector
- ManageScreen: scaffold contentWindowInsets for edge-to-edge header
- Add compose-foundation dependency for HorizontalPager
Made-with: Cursor
- Dashboard: apply background before statusBarsPadding so gradient extends under status bar
- Map: add statusBarsPadding to layer selector so it no longer overlaps status bar
- NavGraph: set white status bar icons (isAppearanceLightStatusBars=false) on main tab screens
Made-with: Cursor
- Add AirMQChart Composable with 4-segment background, rounded corners, fake piece
- Support single-line and multiline datasets with cubic Bezier curves
- Add value labels (max, mid, min) on left, last value on right
- Add bottom row with time labels and center label (e.g. sensor name)
- Include touch marker, empty state (threshold 3 points), multiline preview
- Add ChartConfig, ChartData, ChartDataGenerator, ChartUtils
- Add chart/sensor colors to Color.kt
- Integrate test chart in DashboardScreen, use in MapUiComponents device panel
Made-with: Cursor
- Match device item design to reference (ic_chip, status chips, trailing icon)
- Add header (Your devices) and footer to device list
- CTA at bottom, centered 46% width, same style for Sign in/Add device
- Window background #FAFAFA, LegacyBackground on list area
- No spacing between device items, no horizontal margin on list
- Add DeviceItem.extra, ic_go_to_location drawable
- Replace personal data with User/user@example.com
- Strengthen app-recreation-core rule: path check before edits
- Restore real auth logic in ManageViewModel
Made-with: Cursor
- Remove Facebook provider from Login flow
- Add EmailLoginScreen with gradient background, email/password fields
- Add EmailLoginScreenContract and EmailLoginViewModel with stub logic
- Add navigation: Sign in with email -> EmailLoginScreen
- Use back arrow icon instead of back text
- Move header above email field, add Register button
- Update run command to launch app after install
- Add ic_arrow_back drawable, update strings
Made-with: Cursor
- Add authGoogleNew GraphQL mutation and token exchange in AuthServiceImpl
- Add ApiTokenStore and SharedPreferencesApiTokenStore for API token persistence
- Add ApolloAuthInterceptor to inject Bearer token on GraphQL requests
- Introduce FirebaseSessionManager for testable Firebase auth orchestration
- Update LoginViewModel to surface backend auth errors
- Add unit tests for Firebase failure, backend failure, and auth state
Made-with: Cursor
Extract Google sign-in into a dedicated manager with explicit cancel handling, update shared social button variants, and switch manage UI state from enum modes to a direct authorization flag.
Made-with: Cursor
This updates the settings account section to show/logout based on authenticated user state, refines auth service naming, and aligns app signing/Firebase config changes needed for successful Google authentication.
Made-with: Cursor
Refactor AuthService to use AuthProvider and User, add Firebase-backed auth wiring for login/manage flows, and fix app-level Google services configuration so Credential Manager sign-in works reliably.
Made-with: Cursor
Port the old sign-in UI and behavior (gradient, branded social buttons, policy footer, and continue-anonymous dialog) and add Login contract/ViewModel stubs while keeping unauthorized Manage-to-Login navigation intact.
Made-with: Cursor
Apply legacy-accurate manage header/CTA styling, add reusable button icon support with previews, and include related map/navigation polish updates in this working tree.
Made-with: Cursor
This copies old locale resources into the 2026 app, reuses legacy string keys where possible, and moves user-facing runtime text to string resources with missing entries added for all supported locales.
Made-with: Cursor
Add contract-driven state/action/event view models for manage and settings, migrate settings UI toward legacy preference rows (with anonymous stub behavior), and back SettingsServiceImpl with SharedPreferences for real toggle/city storage.
Made-with: Cursor
Restore the old map sensor control styling and interaction in Compose, and add previews for collapsed/expanded, search, and device panel states to speed up UI iteration.
Made-with: Cursor
Remove current launcher XML/webp assets and copy the full mipmap icon set from the legacy repo so app icon matches the original branding.
Made-with: Cursor