feat(node): Refactor Node Detail screen and enhance user feedback#4291
Merged
Conversation
This commit introduces user feedback for actions performed on the Node Detail screen, such as requesting information or running a traceroute. When a user initiates one of these requests, a Snackbar now appears to confirm the action.
Additionally, this change refactors the state management for request cooldowns (`Traceroute` and `Request Neighbor Info`) to be more robust and centralized within the `NodeRequestActions` class.
### Key Changes:
- **User Feedback:**
- Introduced `NodeRequestEffect.ShowFeedback` to trigger UI feedback from the ViewModel.
- The `NodeDetailScreen` now observes these effects and displays a `Snackbar` message (e.g., "Requesting User info from NODE_NAME").
- Added new string resources for the feedback messages.
- **State Management:**
- `NodeRequestActions` now manages the timestamp of the last request for `Traceroute` and `NeighborInfo` for each node.
- `NodeDetailViewModel` now exposes these timestamps as a `StateFlow` derived from the central source, keyed by the current `nodeId`.
- This removes local state management from the ViewModel and ensures cooldowns are tracked correctly per node.
- **Cooldown Logic:**
- The `CooldownButton` composable has been made more robust to handle null initial timestamps, preventing crashes and ensuring the cooldown animation starts correctly only after the first request.
- **Action Refactoring:**
- All request methods in `NodeRequestActions` now accept the node's `longName` to display it in the feedback message.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit introduces a manual data refresh capability on all node metrics screens, allowing users to request up-to-date information from remote nodes. A refresh icon is now present in the top app bar of each metrics screen for non-local devices.
This functionality is powered by the `NodeRequestActions` class, which has been integrated into the `MetricsViewModel`. The view model now exposes an `effects` flow to propagate feedback (e.g., "Requesting power metrics from 'NodeX'") to the UI, which is displayed using a `Snackbar`.
### Key Changes:
- **UI:**
- Added a `Refresh` `IconButton` to the top app bar on the following screens:
- `DeviceMetricsScreen`
- `EnvironmentMetricsScreen`
- `HostMetricsLogScreen`
- `PaxMetricsScreen`
- `PositionLogScreen`
- `PowerMetricsScreen`
- `SignalMetricsScreen`
- `TracerouteLogScreen`
- A `SnackbarHost` has been added to these screens to display feedback messages when a request is initiated.
- **ViewModel & State Management (`MetricsViewModel`, `NodeRequestActions`):**
- `MetricsViewModel` now uses `NodeRequestActions` to handle sending data requests for various telemetry types, position, and traceroute.
- The `effects` from `NodeRequestActions` are exposed to the UI to show `Snackbar` feedback.
- New telemetry request types for `HOST` and `PAX` metrics have been added.
- **Backend (`MeshCommandSender`):**
- The `requestTelemetry` function was updated to handle requests for `HOST` metrics.
- It now correctly sends `PAX` counter requests over the `PAXCOUNTER_APP` port.
- **String Resources:**
- Added new string resources for `request_host_metrics` and `request_pax_metrics`.
- The `getString` utility was improved to handle nested `StringResource` arguments.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors a string resource to improve clarity and conciseness.
The string `exchange_userinfo` has been renamed to `userinfo` in `strings.xml`. Consequently, all references to this resource, such as in the `RemoteDeviceActions` component, have been updated to use the new key and value ("User Info").
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit updates the icons used for the action chips in the `RemoteDeviceActions` component to be more specific and visually representative of the action they trigger. The generic `AreaChart` icon has been replaced with a set of more descriptive Material icons. ### Key Changes: - **Device Metrics:** `AreaChart` replaced with `Router`. - **Environment Metrics:** `AreaChart` replaced with `Thermostat`. - **Air Quality Metrics:** `AreaChart` replaced with `Air`. - **Power Metrics:** `AreaChart` replaced with `Bolt`. - **Local Stats:** `AreaChart` replaced with `Speed`. - **Host Metrics:** `AreaChart` replaced with `Memory`. - **PAX Metrics:** `AreaChart` replaced with `Groups`. Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the "actions" section on the Node Detail screen. The previous layout, which used `AssistChip` components in a `FlowRow`, has been replaced with a more structured and space-efficient list format. A new composable, `TelemetricActionsSection`, has been introduced. This component now displays available remote actions and links to historical data logs in a unified `Column` layout. ### Key Changes: - **New `TelemetricActionsSection`:** - This new composable replaces the deleted `RemoteDeviceActions`. - It presents actions as rows in a list, each containing an icon, a title, a "request" button, and a "history" button. - **UI Redesign:** - Replaced the `AssistChip`-based `FlowRow` with a `Column` of `Row`s, providing a cleaner and more organized look. - Each action now has dedicated buttons to "request" new data and to view "history" (if available). - **Cooldown Indicator:** - A `CircularWavyProgressIndicator` is now used on request buttons to provide visual feedback for actions that have a cooldown period (e.g., Traceroute, Request Neighbor Info). - **Code Consolidation:** - Logic for displaying telemetric actions has been centralized into `TelemetricActionsSection`. - The `MetricsSection` no longer displays links to logs; this responsibility has been moved to the new `TelemetricActionsSection`. Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the node detail screen to improve clarity and code consistency. The title for the telemetry actions section has been changed from "Request" to "Telemetry" for better context. Additionally, various log titles have been shortened by removing the word "Log" (e.g., "Device Metrics Log" is now "Device Metrics").
### Key Changes:
- **UI Text:**
- Changed the title of the actions section from "Request" to "Telemetry".
- Shortened log-related strings in `strings.xml` for a cleaner UI (e.g., "Device Metrics Log" -> "Device Metrics", "Traceroute Log" -> "Traceroute").
- **Code Style:**
- Applied minor code reformatting across `MetricsSection.kt`, `TelemetricActionsSection.kt`, and `DeviceActions.kt` to improve readability and adhere to style guidelines. This includes removing redundant empty lines and simplifying lambda expressions.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the telemetric actions section on the node detail screen to improve usability and visual clarity. The "History" and "Refresh" icon buttons have been updated with better affordances and consolidated into a more intuitive layout.
### Key Changes:
- **Replaced `IconButton` with `OutlinedIconButton`:** Standard `IconButton`s for actions have been replaced with `OutlinedIconButton` to provide a clearer visual boundary.
- **Introduced Tooltips:** Added `TooltipBox` to the action buttons ("View Logs" and "Request Telemetry") to explicitly describe their function (e.g., "Air Quality Metrics logs").
- **New "Logs" Icon:** The generic "History" icon (`Icons.Filled.History`) has been replaced with a more descriptive "Area Chart" icon (`Icons.Filled.AreaChart`) to better represent viewing historical data/logs.
- **Conditional Visibility:** The "View Logs" button is now wrapped in an `AnimatedVisibility` block, so it only appears if log data is available for that specific metric.
- **Improved `CooldownIconButton`:** The custom `CooldownIconButton` now uses `OutlinedIconButton` internally for visual consistency with other actions.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit updates the icon used for the "Logs" action in the `TelemetricActionsSection`. The `Icons.Filled.AreaChart` icon has been replaced with `Icons.Default.StackedLineChart` to better represent the telemetric log data. Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the handling of cooldown buttons by centralizing the logic into two reusable composables: `CooldownIconButton` and `CooldownOutlinedIconButton`.
Previously, cooldown logic was implemented separately in `TelemetricActionsSection` and the now-deleted `CooldownButton.kt`. This refactoring eliminates code duplication and simplifies the implementation of buttons that require a cooldown period after being pressed.
### Key Changes:
- **New Composable:**
- Introduced `CooldownOutlinedIconButton.kt`, which provides generic `CooldownIconButton` and `CooldownOutlinedIconButton` composables. These components manage their own cooldown state and animation based on a provided timestamp and duration.
- **Component Refactoring:**
- `TelemetricActionsSection` now uses the new `CooldownOutlinedIconButton` to handle actions like requesting telemetry or neighbor info, removing its local implementation.
- The `TracerouteLog` screen has been updated to use `CooldownIconButton` for its refresh functionality.
- **Code Deletion:**
- Deleted `CooldownButton.kt`, which contained specific implementations for `TracerouteButton`, `TracerouteChip`, and `RequestNeighborsButton`. This functionality is now covered by the new generic cooldown components.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit updates `IconButton`, `OutlinedIconButton`, and `FilledTonalIconButton` to explicitly set their default colors using the corresponding `IconButtonDefaults` functions (e.g., `IconButtonDefaults.iconButtonColors()`).
While this doesn't change the immediate visual appearance, it improves code clarity and robustness. By explicitly providing the default color sets, the components are less susceptible to unintended visual changes that might arise from future modifications to underlying Material Design components.
### Key Changes:
- **`CooldownOutlinedIconButton.kt`**:
- `IconButton` now includes `colors = IconButtonDefaults.iconButtonColors()`.
- `OutlinedIconButton` now includes `colors = IconButtonDefaults.outlinedIconButtonColors()` and `shapes = IconButtonDefaults.shapes()`.
- **`TelemetricActionsSection.kt`**:
- The `OutlinedIconButton` used for displaying logs has been changed to a `FilledTonalIconButton`.
- The new `FilledTonalIconButton` explicitly sets `colors = IconButtonDefaults.filledTonalIconButtonColors()` and `shapes = IconButtonDefaults.shapes()`.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the "Telemetry" section on the node detail screen to display key metrics directly inline, rather than in a separate section. This makes vital information like environmental and power data more accessible at a glance. The `TelemetricActionsSection` is now split into two distinct cards: one for general actions and another for telemetry requests. This improves visual organization. ### Key Changes: - **Inline Metrics Display:** - `TelemetricFeature` now supports an optional `content` composable to display data directly within its row. - Power and Environment metric rows now expand to show the latest data (e.g., battery level, temperature) when available. - **UI Reorganization:** - The `TelemetricActionsSection` has been separated from the primary `DeviceActions` and now resides in its own `ElevatedCard`. - The main "Actions" card is now solely for user-facing actions like messaging and management. - The `MetricsSection` composable has been removed, as its content is now integrated into the `TelemetricActionsSection`. - **Styling Updates:** - The "Telemetry" header has been updated to use `titleMedium` style for better visual hierarchy. - Padding and spacing have been adjusted for a cleaner layout. Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the presentation of device metrics by replacing the large, square `InfoCard` with a more compact, row-based design. The new `InfoCard` is more space-efficient and aligns better with Material Design 3 guidelines.
The `MetricsSection.kt` file has been removed, and its logic for displaying environment and power metrics has been integrated directly into the `TelemetricActionsSection` as expandable content. This simplifies the component structure.
### Key Changes:
- **`InfoCard` Redesign:**
- Reworked `InfoCard` to use a `Row` layout instead of a `Column` within a `Box`.
- The new design displays an icon, label, and value horizontally, using `MaterialTheme.typography.labelSmall` for the title and `labelLargeEmphasized` for the value.
- The component now accepts an optional `ImageVector` or a drawable resource `@DrawableRes` for the icon.
- Removed `DrawableInfoCard` and merged its functionality into the unified `InfoCard`.
- **Component & Layout Simplification:**
- Deleted `MetricsSection.kt` and its associated `EnvironmentCard` and `PowerCard` composables.
- `EnvironmentMetrics` and `PowerMetrics` now use a `FlowRow` with `Arrangement.SpaceEvenly` to arrange the new compact `InfoCard` components, creating a flexible grid.
- The expandable content for environment and power metrics within `TelemetricActionsSection` now directly calls `EnvironmentMetrics` and `PowerMetrics`.
- **Code Cleanup:**
- Removed unnecessary `remember` blocks and simplified modifier chains in `TelemetricActionsSection.kt`.
- Updated copyright year to 2026 in modified files.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit introduces a reusable `SectionCard` composable to standardize the appearance of card-based sections within the node detail screen. All major sections (`NodeDetailsSection`, `PositionSection`, `AdministrationSection`, `DeviceDetailsSection`, and `TelemetricActionsSection`) have been refactored to use this new component.
This change centralizes styling for section cards, including background color, shape, and title presentation, leading to a cleaner and more maintainable UI.
### Key Changes:
- **`SectionCard.kt`**: Added a new file containing the `SectionCard` and `InfoItem` composables.
- `SectionCard` wraps content in an `ElevatedCard` with a consistent title style and padding.
- `InfoItem` is a generic component for displaying a label-value pair with an icon, extracted from `NodeDetailsSection`.
- **Component Refactoring**:
- `NodeDetailsSection`, `PositionSection`, `AdministrationSection`, `DeviceDetailsSection`, and `TelemetricActionsSection` now use `SectionCard` to render their content, removing duplicated card and title logic.
- **`NodeDetailScreen.kt`**:
- The main screen has been reorganized to better manage state and UI components.
- Logic for handling overlays like bottom sheets (`Compass`, `FirmwareReleaseInfo`) and dialogs (`SharedContact`) is now centralized.
- The main content area (`NodeDetailContent`) now uses `AnimatedContent` for smoother loading of node data.
- The content layout is structured into a `Column` of the newly refactored section components.
- **Copyright**: Updated copyright year to 2026 in modified files.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors and refines the UI of the Node Detail screen for a more polished and consistent appearance. Changes focus on typography, spacing, component structure, and the introduction of a reusable `SectionDivider`.
### Key Changes:
- **Typography & Spacing:**
- Increased font size for section titles (`titleLarge`) and item values (`titleMedium`) to improve hierarchy and readability.
- Adjusted padding and spacing throughout the screen for a cleaner layout, moving from `16.dp` to `20.dp` for horizontal section padding.
- Increased the boldness of item labels for better visual weight.
- **Component Refactoring:**
- Introduced a new `SectionDivider` composable to replace `HorizontalDivider` and `InsetDivider`, ensuring a consistent divider style across all sections.
- `TelemetricActionsSection` now uses `ListItem` for each feature row, providing a more structured and standard layout.
- The `InfoCard` component has been updated with a new background color (`surfaceContainerLow`), larger shape, and refined padding and icon styling.
- **Visual Polish:**
- Icon colors in `InfoCard` and `TelemetricActionsSection` are now tinted with `MaterialTheme.colorScheme.primary` for better brand alignment.
- The icon size in `InfoCard` has been adjusted for better balance.
- Removed `ElevatedCard` wrappers around `TelemetricActionsSection` and primary actions, integrating them directly into `SectionCard`.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the `NodeDetailScreen` and its related ViewModels to centralize business logic and data fetching within a single `NodeDetailViewModel`. The previous separation of concerns between `NodeDetailViewModel` and `MetricsViewModel` has been eliminated, simplifying the data flow and component lifecycle.
`NodeDetailViewModel` now directly manages the entire UI state (`NodeDetailUiState`) by combining multiple data flows from various repositories (`NodeRepository`, `MeshLogRepository`, `RadioConfigRepository`, etc.). This includes node information, metrics, available logs, and device hardware details.
The `NodeDetailScreen` is updated to be a more stateless composable, primarily observing `NodeDetailUiState` and delegating all actions and data-fetching logic to the unified `ViewModel`.
### Key Changes:
- **ViewModel Consolidation:** All data-sourcing logic from the now-removed `MetricsViewModel` has been moved into `NodeDetailViewModel`.
- **Centralized UI State:** Introduced `NodeDetailUiState` data class to hold all state required by the screen, including the `node`, `ourNode`, `metricsState`, and `environmentState`.
- **Simplified Data Flow:**
- `NodeDetailViewModel` now uses `combine` to build `NodeDetailUiState` from multiple repository flows.
- Data collection for metrics (device, power, position, etc.) is now initiated within the `NodeDetailViewModel`'s `initializeFlows` function.
- **Navigation-Aware Initialization:** The `ViewModel` now uses `SavedStateHandle` to get the `nodeId` from the navigation route, allowing it to start fetching data immediately upon creation.
- **Screen Simplification:** `NodeDetailScreen` no longer injects or interacts with `MetricsViewModel`. It now takes a single `NodeDetailViewModel` and observes its `uiState`.
- **Dependency Cleanup:** Removed `MetricsViewModel` from `NodeDetailScreen` and its related composables. All business logic, such as determining the direct message route, is now handled within `NodeDetailViewModel`.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors `NodeDetailViewModel`, `MetricsViewModel`, and their associated action classes (`NodeRequestActions`, `NodeManagementActions`) to eliminate direct management of `CoroutineScope`.
The `start(coroutineScope: ...)` pattern has been removed from the action classes. Instead, the `viewModelScope` is now passed directly from the ViewModel to the action methods as needed. This simplifies the lifecycle management of these components, making them stateless regarding the coroutine context.
`NodeDetailViewModel` is significantly streamlined. It now uses a reactive, flow-based approach (`flatMapLatest`, `combine`) to build its UI state. This replaces manual flow collection and state updates within `init` and `initializeFlows` blocks, resulting in more declarative and maintainable code.
### Key Changes:
- **CoroutineScope Handling:**
- Removed the `scope` property and `start()` method from `NodeRequestActions` and `NodeManagementActions`.
- All action methods now accept a `CoroutineScope` as the first parameter, with ViewModels providing their `viewModelScope`.
- **`NodeDetailViewModel` Refactoring:**
- Replaced multiple `viewModelScope.launch` blocks and `MutableStateFlow.update` calls with a reactive pipeline using `flatMapLatest` and `combine` on the `activeNodeId`.
- This change centralizes state derivation, making it more resilient and easier to follow.
- The `initializeFlows` method and its complex logic have been removed.
- **Fallback Node Creation:**
- Added a `createFallbackNode` suspend function in `NodeDetailViewModel` to gracefully handle cases where a node with a given ID is not yet in the database. This prevents potential nullability issues and provides a better user experience.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit updates the `NodeRequestActions` class to use the `update` extension function for modifying `MutableStateFlow` instances.
This change replaces the more verbose `_state.value = _state.value + ...` pattern with the concise and thread-safe `_state.update { it + ... }` syntax. The updated flows are `_lastRequestNeighborTimes` and `_lastTracerouteTimes`.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit explicitly qualifies the `getString` calls within the `ContextExt.kt` helper functions to resolve ambiguity. By specifying `org.jetbrains.compose.resources.getString`, we ensure the correct multiplatform resource function is used, preventing potential conflicts with other `getString` functions that might be in the scope, such as Android's `Context.getString`. Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors parts of the `feature/node` module to align with best practices. ### Key Changes: - **Visibility Modifiers:** Constants `COOL_DOWN_TIME_MS` and `REQUEST_NEIGHBORS_COOL_DOWN_TIME_MS` in `CooldownOutlinedIconButton.kt` are now marked as `internal` to restrict their visibility to within the module. - **Resource Handling:** Switched from the legacy `getString` function to the composable-aware `stringResource` for resolving string resources in `TelemetricActionsSection.kt`. This ensures proper context handling and removes an unnecessary import. Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the `NodeDetailViewModel` to use the Molecule library, abstracting the UI state generation logic into a new `NodeDetailPresenter`. This change simplifies the ViewModel by delegating all state collection and transformation to a dedicated, testable, and reusable composable function.
The new `NodeDetailPresenter` is responsible for collecting data from various repositories (Node, MeshLog, RadioConfig, etc.) and composing it into a `NodeDetailUiState`. This improves separation of concerns and makes the state logic more declarative and easier to follow. The ViewModel now primarily manages the Molecule scope and handles user actions.
### Key Changes:
- **`NodeDetailPresenter.kt`:** A new file containing a `@Composable` presenter function that consolidates all state logic for the node detail screen.
- **`NodeDetailViewModel.kt`:**
- Removed manual `Flow` collection and combination logic (`flatMapLatest`, `combine`).
- Integrated `launchMolecule` to drive the `NodeDetailPresenter` and produce the `uiState`.
- Deleted now-redundant private helper functions for creating fallback nodes and determining available logs, as this logic is now in the presenter.
- **Dependencies:** Added `molecule-runtime` to the `feature/node` module to support this pattern.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit enhances the Node Detail screen by introducing support for displaying traceroute results and making informational text selectable.
Traceroute request and result logs are now fetched and processed in the `NodeDetailPresenter`. This data is then passed to the UI state to be displayed, providing users with route information to a specific node. Additionally, the `InfoCard` component now wraps its text content in a `SelectionContainer`, allowing users to copy values like Node ID or firmware version.
### Key Changes:
- **`NodeDetailPresenter.kt`**:
- Added state flows to collect traceroute requests (`tracerouteRequests`) and results (`tracerouteResults`).
- `remember(nodeId)` is now used for state collection to ensure flows are re-subscribed only when the `nodeId` changes, improving efficiency.
- Included traceroute data in the `produceState` block for `NodeDetailMetricsState`.
- Replaced `stringResource` with the non-composable `getString` for `fallback_node_name` to optimize composition.
- **`InfoCard.kt`**:
- Wrapped the `Column` containing the title and value text with a `SelectionContainer`, making the text user-selectable.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit refactors the Node Details screen to provide a more organized and detailed view of node information. It also introduces a copy-on-long-press functionality for all info items.
The details section has been restructured into logical groups (Identification, Signal, etc.) using dividers for better readability. New information such as Node ID, Public Key, Hops Away, RSSI, SNR, and verification/MQTT status is now displayed.
### Key Changes:
- **Node Details Refactor:**
- The `NodeDetailsSection` is reorganized into distinct rows for better visual separation:
- Name and Role
- Node Identification (Node ID, Node Number)
- Last Heard and Hops Away
- User ID and Uptime
- Signal Metrics (SNR, RSSI)
- Connectivity/Verification Status (via MQTT, Manually Verified)
- Added new fields: `Node ID`, `Public Key`, `Hops Away`, `SNR`, and `RSSI`.
- The `PublicKey` is displayed in a monospace font for readability.
- **feat(ui): Copy on Long-Press:**
- A `combinedClickable` with an `onLongClick` handler is added to the `InfoItem` composable.
- Long-pressing any information field (e.g., Short Name, Node ID, Public Key) now copies its value to the clipboard.
- **Minor UI Tweaks:**
- Adjusted button weights and icon sizes in the `PositionSection` for better layout balance on smaller screens.
- Removed the `SelectionContainer` from `NodeDetailsSection` as the new copy functionality makes it redundant.
- The toast message for a failed geo-intent in `LinkedCoordinatesItem` has been removed.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
This commit enhances the accessibility of the Node Detail screen, focusing on improving the user experience for those using screen readers and other accessibility services. Key changes include adding content descriptions, ensuring minimum touch target sizes, and providing clear actions for interactive elements.
### Key Changes:
- **Semantic Properties:**
- `SectionCard` titles are now marked as headings (`semantics { heading() }`), allowing screen reader users to navigate between sections more efficiently.
- The loading indicator now has a content description ("Loading") for better context.
- `InfoItem` and `InfoCard` components now merge their descendant's content descriptions, so a screen reader announces the label and value as a single, coherent unit (e.g., "Label: Value").
- **Improved Interactivity:**
- All tappable/long-pressable items (`InfoItem`, `InfoCard`, `PublicKeyItem`, `LinkedCoordinatesItem`) now have a `Role.Button` to clearly communicate their interactive nature.
- Long-press-to-copy actions now have an explicit `onLongClickLabel` ("Copy"), making the functionality discoverable for accessibility users.
- A minimum touch target size of 48dp has been applied to interactive components like `InfoItem` and `InfoCard` to meet accessibility guidelines.
- **Content Descriptions and Icons:**
- Decorative icons now have their `contentDescription` set to `null` to avoid redundant announcements by screen readers.
- `LinkedCoordinatesItem` now exposes a custom accessibility action for copying coordinates, making the feature more accessible.
- **Component Refactoring:**
- The Public Key display was extracted into a dedicated `PublicKeyItem` composable for better code organization and to apply the same accessibility enhancements.
Signed-off-by: James Rich <2199651+jamesarich@users.noreply.github.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #4291 +/- ##
=====================================
Coverage 0.00% 0.00%
=====================================
Files 3 3
Lines 23 28 +5
Branches 7 8 +1
=====================================
- Misses 23 28 +5 ☔ View full report in Codecov by Sentry. |
# Conflicts: # core/strings/src/commonMain/composeResources/values/strings.xml
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Refactors the Node Detail screen to use the Molecule presenter pattern and enhances the user experience with better feedback mechanisms and consolidated UI components.
Changes