Skip to content

feat: redesign about screen#1498

Merged
HashEngineering merged 16 commits into
masterfrom
feat/redesign-about
Jun 24, 2026
Merged

feat: redesign about screen#1498
HashEngineering merged 16 commits into
masterfrom
feat/redesign-about

Conversation

@HashEngineering

@HashEngineering HashEngineering commented Jun 18, 2026

Copy link
Copy Markdown
Collaborator

Issue being fixed or feature implemented

Related PR's and Dependencies

Screenshots / Videos

How Has This Been Tested?

  • QA (Mobile Team)

Checklist:

  • I have performed a self-review of my own code and added comments where necessary
  • I have added or updated relevant unit/integration/functional/e2e tests

Summary by CodeRabbit

  • New Features
    • Added 11 strongly-typed ListItem variants for numbered list designs.
    • Added a Compose-based “About” experience accessible via in-app navigation.
  • Refactor
    • Consolidated TopIntro into a single component with optional additional text and icon support.
    • Deprecated legacy theme typography styles in favor of newer typography.
  • UI/UX Improvements
    • Refreshed ListItem content-block and MenuItem row styling (spacing, typography, and info icon).
  • Bug Fixes
    • Improved foreground service behavior when starting isn’t permitted.
  • Documentation
    • Updated design-system mapping and typography guidance for list components.
  • Chores
    • Made About copyright year dynamic and updated localized About strings.

@HashEngineering HashEngineering self-assigned this Jun 18, 2026
@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 93d4d75b-bc0c-4b87-af94-9195fd66c5fd

📥 Commits

Reviewing files that changed from the base of the PR and between d76764f and f9d6f83.

📒 Files selected for processing (8)
  • .claude/agents/DEVELOPMENT-PATTERNS.md
  • common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt
  • common/src/main/java/org/dash/wallet/common/ui/components/MenuItem.kt
  • common/src/main/java/org/dash/wallet/common/util/DashJExt.kt
  • common/src/main/res/values/strings.xml
  • wallet/res/navigation/nav_home.xml
  • wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt
  • wallet/src/de/schildbach/wallet/ui/more/AboutViewModel.kt
✅ Files skipped from review due to trivial changes (1)
  • .claude/agents/DEVELOPMENT-PATTERNS.md
🚧 Files skipped from review as they are similar to previous changes (4)
  • wallet/res/navigation/nav_home.xml
  • common/src/main/java/org/dash/wallet/common/ui/components/MenuItem.kt
  • wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt
  • common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt

📝 Walkthrough

Walkthrough

Replaces AboutActivity with a Compose-based AboutFragment backed by an AboutViewModel migrated from LiveData to StateFlow. Adds a COMMIT_YEAR build config field from git and parameterizes copyright strings across 20 locales. Introduces eleven typed ListItemVariants composables, extends ListItem with titleColor, consolidates TopIntro, deprecates legacy MyTheme typography, reskins MenuItem, and updates AI agent documentation.

Changes

About Screen: Activity → Compose Fragment

Layer / File(s) Summary
AboutViewModel: LiveData → StateFlow + build config year
wallet/src/de/schildbach/wallet/ui/more/AboutViewModel.kt, wallet/build.gradle
Replaces individual LiveData properties with a single StateFlow-backed AboutViewState snapshot, defaults Firebase tokens to empty strings on load failure, restricts clipboard copy to non-empty values, and adds a COMMIT_YEAR buildConfigField computed from git commit date.
AboutScreen composable, UIState, and new drawables
wallet/src/de/schildbach/wallet/ui/more/AboutScreen.kt, wallet/res/drawable/ic_contact_support_filled.xml, wallet/res/drawable/ic_rate_app_filled.xml, wallet/res/drawable/ic_refresh_blue.xml, wallet/res/values/strings-extra.xml
Introduces the immutable AboutUIState data class, the AboutScreen composable with all sub-composables (DashLogoHeader, AboutSectionTitle, ForceSyncButton), the middleEllipsize helper, and three Compose previews. Adds three new filled/colored vector drawables and eight new about_* string resources.
AboutFragment wiring, navigation, and manifest
wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt, wallet/src/de/schildbach/wallet/ui/more/AboutActivity.kt, wallet/src/de/schildbach/wallet/ui/SettingsFragment.kt, wallet/res/navigation/nav_home.xml, wallet/AndroidManifest.xml, wallet/res/layout/fragment_more.xml
Adds AboutFragment that collects StateFlow state, derives display strings, and renders AboutScreen with callbacks; removes AboutActivity; updates SettingsFragment to navigate via NavController; registers the settings_to_about action and aboutFragment destination; removes AboutActivity from the manifest; switches the contact support icon to the filled variant.
Localized copyright year parameterization (20 locales)
wallet/res/values-*/strings-extra.xml
Updates about_copyright in every locale strings file to replace the hardcoded 2026 year with a %1$d format argument, consuming COMMIT_YEAR at runtime.

Design System: ListItemVariants, TopIntro, MenuItem, MyTheme

Layer / File(s) Summary
MyTheme deprecations and TopIntro consolidation
common/src/main/java/org/dash/wallet/common/ui/components/MyTheme.kt, common/src/main/java/org/dash/wallet/common/ui/components/TopIntro.kt, wallet/src/de/schildbach/wallet/ui/more/SettingsScreen.kt, wallet/src/de/schildbach/wallet/ui/more/ToolsScreen.kt, wallet/src/de/schildbach/wallet/ui/more/masternode_keys/Masternode*.kt
Marks 14 legacy MyTheme typography properties as @Deprecated with replaceWith mappings to Typography.* equivalents; consolidates TopIntro into one overload accepting textTwo, textThree, and an icon slot; removes explicit padding modifiers from all TopIntro call sites.
ListItemVariants (ListItem1–11), ListItem titleColor, MenuItem, and utilities
common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt, common/src/main/java/org/dash/wallet/common/ui/components/ListItem.kt, common/src/main/java/org/dash/wallet/common/ui/components/MenuItem.kt, common/src/main/java/org/dash/wallet/common/util/DashJExt.kt, common/src/main/res/drawable/ic_menu_info.xml, common/src/main/res/values/strings.xml
Adds ListItemVariants.kt with a shared ListItemRow scaffold and eleven public composables (ListItem1ListItem11); extends ListItem with an optional titleColor parameter and updates helpTextAbove color to textSecondary; reskins MenuItem with updated corner radius, padding, spacing, typography, and the new ic_menu_info drawable; adds NetworkParameters.isMainNet() extension function; adds missing info string resource.
AI agent documentation updates
.claude/agents/DEVELOPMENT-PATTERNS.md, .claude/agents/figma-to-compose.md
Updates DEVELOPMENT-PATTERNS.md to document the two-layer ListItem architecture (numbered variants and general-purpose), adds titleColor to the parameters table, documents List10 stacked helpTextAbove/title pattern, and updates quick-reference and example code. Updates figma-to-compose.md with List1List11 mappings and corrected Body typography references to MyTheme.Typography.* fields.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant SettingsFragment
    participant NavController
    participant AboutFragment
    participant AboutViewModel
    participant AboutScreen

    User->>SettingsFragment: tap "About Dash"
    SettingsFragment->>NavController: navigate(R.id.settings_to_about)
    NavController->>AboutFragment: instantiate & attach
    AboutFragment->>AboutViewModel: collect uiState StateFlow
    AboutViewModel-->>AboutFragment: AboutViewState emissions
    AboutFragment->>AboutFragment: formatDeviceSyncStatus() / formatServerUpdate()
    AboutFragment->>AboutScreen: render(AboutUIState, callbacks)
    User->>AboutScreen: tap force sync or contact support
    AboutScreen-->>AboutFragment: onForceSyncClick() / onContactSupportClick()
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested reviewers

  • abaranouski

Poem

🐰 Hop hop, the Activity's gone away,
A Fragment in Compose has come to stay!
StateFlow replaces LiveData's old song,
Eleven ListItem variants, built strong.
The copyright year flows fresh from git's embrace,
✨ A cleaner design system takes its place!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 44.74% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The PR title 'feat: redesign about screen' directly reflects the primary change—a complete redesign of the About screen from Activity-based to Fragment-based Compose UI, including new ViewModel state management and supporting UI infrastructure.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/redesign-about

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🧹 Nitpick comments (1)
common/src/main/java/org/dash/wallet/common/ui/components/TopIntro.kt (1)

33-63: ⚡ Quick win

Remove the commented legacy TopIntro code path.

The old implementation and commented-out parameter should be deleted now that the consolidated composable is in place; keeping both increases drift and review noise.

✂️ Suggested cleanup
-//@Composable
-//fun TopIntro(
-//    heading: String,
-//    text: String? = null,
-//    modifier: Modifier = Modifier.padding(top = 10.dp, start = 20.dp, end = 20.dp, bottom = 20.dp)
-//) {
-//    ...
-//}
@@
-//    modifier: Modifier = Modifier.padding(top = 10.dp, start = 20.dp, end = 20.dp, bottom = 20.dp),

Also applies to: 70-70

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@common/src/main/java/org/dash/wallet/common/ui/components/TopIntro.kt` around
lines 33 - 63, Remove the entire commented-out `TopIntro` composable function
implementation. Delete all lines containing the old `TopIntro` function
definition along with its parameters (heading, text, modifier) and
implementation details including the Column layout and Text composables. This
includes any related commented code on line 70 as well. The consolidated
composable implementation should remain active while all legacy commented code
paths are completely removed to reduce code drift and review noise.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.claude/agents/DEVELOPMENT-PATTERNS.md:
- Around line 275-276: The documentation for the ListItem component's title
property in DEVELOPMENT-PATTERNS.md incorrectly states that title uses Body M
Regular typography, but the actual ListItem implementation in
common/src/main/java/org/dash/wallet/common/ui/components/ListItem.kt at line
188 renders it with MyTheme.Typography.LabelLarge. Update the title typography
description in the documentation table at lines 275-276 to correctly reflect
LabelLarge instead of Body M Regular, and apply the same correction to the other
occurrence mentioned at lines 298-299 to ensure consistency between
documentation and implementation.
- Around line 217-223: Add language identifiers to the fenced code blocks in the
DEVELOPMENT-PATTERNS.md file that are triggering markdownlint MD040.
Specifically, locate the two code blocks containing the file paths for
ListItemVariants.kt and ListItem.kt, and modify their opening fence markers from
triple backticks to include the `text` language identifier (e.g., ```text
instead of ```). This applies to both the
common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt
block and the
common/src/main/java/org/dash/wallet/common/ui/components/ListItem.kt block.

In
`@common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt`:
- Around line 257-264: The Icon composable for the trailing icon in ListItem7
has contentDescription set to null but is clickable when onTrailingIconClick is
provided. Make the contentDescription parameter conditional based on whether
onTrailingIconClick is null: provide a meaningful accessibility label describing
the action when the icon is clickable, and only use null when the icon is not
clickable. This ensures screen readers can properly announce the action to
users.
- Around line 354-355: The secondaryText in the ListItem10 composable is
currently using MyTheme.Colors.textPrimary for its color, which removes the
visual hierarchy between primary and secondary text. Change the color parameter
of the Text composable rendering secondaryText from MyTheme.Colors.textPrimary
to the appropriate secondary color token (likely MyTheme.Colors.textSecondary)
to maintain proper visual hierarchy and distinguish it from the primaryText
element.

In `@common/src/main/java/org/dash/wallet/common/ui/components/MenuItem.kt`:
- Line 148: The contentDescription for the info icon in the MenuItem component
is hardcoded as the English string "Info" rather than using a localized string
resource. Replace the hardcoded "Info" string with a call to stringResource()
that references a string resource identifier from your strings.xml file,
ensuring the accessibility label can be properly localized for different
languages. Define or reuse an appropriate string resource key in your res/values
directory structure that contains the "Info" text so it can be translated.

In `@wallet/res/navigation/nav_home.xml`:
- Around line 390-393: The aboutFragment navigation destination in nav_home.xml
has a hardcoded android:label value of "About" which prevents proper
localization. Replace the hardcoded label text with a string resource reference
using android:label="`@string/about_title`" (or another appropriate resource
name). If the string resource does not already exist in your strings.xml files,
add the about_title string resource with the value "About" to ensure it can be
properly translated across different locales.

In `@wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt`:
- Around line 149-153: The openGithubLink() function calls startActivity(intent)
unconditionally without verifying if any application can handle the ACTION_VIEW
intent, which will crash the app with ActivityNotFoundException if no handler
exists. Guard the startActivity call by first checking if
intent.resolveActivity(packageManager) returns a non-null value before launching
it; if it returns null, handle the case gracefully such as displaying a
user-friendly message or skipping the action.
- Around line 116-129: The code can format invalid or uninitialized timestamps
(such as 0L) into epoch-era dates, which provides poor user experience. Before
each call to DateUtils.formatDateTime() in the when block, add explicit checks
to ensure the timestamp values are valid (greater than 0). For
dbPrefs.lastSyncTimestamp used in the second branch and else branch, and
dbPrefs.preloadedOnTimestamp used in the third branch, wrap each
DateUtils.formatDateTime() call with a conditional check that returns a
user-friendly fallback string like "never" when the timestamp is zero or
negative, otherwise call DateUtils.formatDateTime() with the valid timestamp.

In `@wallet/src/de/schildbach/wallet/ui/more/AboutViewModel.kt`:
- Around line 52-66: Consolidate the separate state flows
(_exploreRemoteTimestamp, _exploreIsSyncing, _firebaseInstallationId,
_firebaseCloudMessagingToken) into a single UIState data class to prevent
stale/mixed snapshots. Create a new data class that contains all these fields,
replace the individual MutableStateFlow declarations with a single _uiState
MutableStateFlow<UIState>, and expose it as a public immutable uiState property
using asStateFlow(). Update all places where these individual fields are mutated
to instead update the corresponding field within the _uiState.value copy
operation. This ensures the UI observes a consistent, atomic state snapshot
rather than individual flows that can go out of sync.

---

Nitpick comments:
In `@common/src/main/java/org/dash/wallet/common/ui/components/TopIntro.kt`:
- Around line 33-63: Remove the entire commented-out `TopIntro` composable
function implementation. Delete all lines containing the old `TopIntro` function
definition along with its parameters (heading, text, modifier) and
implementation details including the Column layout and Text composables. This
includes any related commented code on line 70 as well. The consolidated
composable implementation should remain active while all legacy commented code
paths are completely removed to reduce code drift and review noise.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: d4c946a5-feb4-410e-9315-1ab0a2edf815

📥 Commits

Reviewing files that changed from the base of the PR and between a141bc3 and 1d6291a.

📒 Files selected for processing (46)
  • .claude/agents/DEVELOPMENT-PATTERNS.md
  • .claude/agents/figma-to-compose.md
  • common/src/main/java/org/dash/wallet/common/ui/components/ListItem.kt
  • common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt
  • common/src/main/java/org/dash/wallet/common/ui/components/MenuItem.kt
  • common/src/main/java/org/dash/wallet/common/ui/components/MyTheme.kt
  • common/src/main/java/org/dash/wallet/common/ui/components/TopIntro.kt
  • common/src/main/res/drawable/ic_menu_info.xml
  • wallet/AndroidManifest.xml
  • wallet/build.gradle
  • wallet/res/drawable/ic_contact_support.xml
  • wallet/res/drawable/ic_contact_support_filled.xml
  • wallet/res/drawable/ic_rate.xml
  • wallet/res/drawable/ic_rate_app_filled.xml
  • wallet/res/drawable/ic_refresh_blue.xml
  • wallet/res/layout/activity_about.xml
  • wallet/res/layout/fragment_more.xml
  • wallet/res/navigation/nav_home.xml
  • wallet/res/values-de/strings-extra.xml
  • wallet/res/values-el/strings-extra.xml
  • wallet/res/values-es/strings-extra.xml
  • wallet/res/values-fa/strings-extra.xml
  • wallet/res/values-fil/strings-extra.xml
  • wallet/res/values-fr/strings-extra.xml
  • wallet/res/values-id/strings-extra.xml
  • wallet/res/values-it/strings-extra.xml
  • wallet/res/values-ja/strings-extra.xml
  • wallet/res/values-ko/strings-extra.xml
  • wallet/res/values-nl/strings-extra.xml
  • wallet/res/values-pl/strings-extra.xml
  • wallet/res/values-pt/strings-extra.xml
  • wallet/res/values-ru/strings-extra.xml
  • wallet/res/values-sk/strings-extra.xml
  • wallet/res/values-uk/strings-extra.xml
  • wallet/res/values-zh-rTW/strings-extra.xml
  • wallet/res/values-zh/strings-extra.xml
  • wallet/res/values/strings-extra.xml
  • wallet/src/de/schildbach/wallet/ui/SettingsFragment.kt
  • wallet/src/de/schildbach/wallet/ui/more/AboutActivity.kt
  • wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt
  • wallet/src/de/schildbach/wallet/ui/more/AboutScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/AboutViewModel.kt
  • wallet/src/de/schildbach/wallet/ui/more/SettingsScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/ToolsScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/masternode_keys/MasternodeKeyChainScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/masternode_keys/MasternodeKeysScreen.kt
💤 Files with no reviewable changes (9)
  • wallet/res/drawable/ic_contact_support.xml
  • wallet/res/layout/activity_about.xml
  • wallet/src/de/schildbach/wallet/ui/more/masternode_keys/MasternodeKeyChainScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/SettingsScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/ToolsScreen.kt
  • wallet/src/de/schildbach/wallet/ui/more/masternode_keys/MasternodeKeysScreen.kt
  • wallet/res/drawable/ic_rate.xml
  • wallet/src/de/schildbach/wallet/ui/more/AboutActivity.kt
  • wallet/AndroidManifest.xml

Comment thread .claude/agents/DEVELOPMENT-PATTERNS.md
Comment thread .claude/agents/DEVELOPMENT-PATTERNS.md Outdated
Comment thread common/src/main/java/org/dash/wallet/common/ui/components/ListItemVariants.kt Outdated
Comment thread common/src/main/java/org/dash/wallet/common/ui/components/MenuItem.kt Outdated
Comment thread wallet/res/navigation/nav_home.xml Outdated
Comment thread wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt Outdated
Comment thread wallet/src/de/schildbach/wallet/ui/more/AboutFragment.kt
Comment thread wallet/src/de/schildbach/wallet/ui/more/AboutViewModel.kt Outdated
@HashEngineering HashEngineering merged commit e6b4aa7 into master Jun 24, 2026
3 checks passed
@HashEngineering HashEngineering deleted the feat/redesign-about branch June 24, 2026 20:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants