Skip to content

[LLM] feat: Implement 'About' Section via Bottom Tab & License Collection#157

Open
menny wants to merge 1 commit into
mainfrom
feature/colophon-about-licenses
Open

[LLM] feat: Implement 'About' Section via Bottom Tab & License Collection#157
menny wants to merge 1 commit into
mainfrom
feature/colophon-about-licenses

Conversation

@menny
Copy link
Copy Markdown
Member

@menny menny commented May 23, 2026

Add the 'About' screen (The Colophon) as a fourth bottom navigation tab and integrate the Google OSS Licenses plugin to collect and display open-source attributions.

What

  • Integrated the Google OSS Licenses plugin and play-services-oss-licenses library.
  • Enabled buildConfig in the app's buildFeatures.
  • Fully localized all the new strings across English, Arabic, German, Spanish, French, Hebrew, and Russian.
  • Built a scrollable, premium AboutScreen displaying app icon, dynamic version name, translation methodology abstract, links to the GitHub repository/issue tracker, and an outlined button to launch play services licenses activity.
  • Configured a new bottom navigation tab About mapped to AboutScreen.
  • Added a unit test in MainActivityTest.kt to verify correct TabScreen.About tab configurations.

Why

This implements the academic "Colophon" aesthetic defined in DESIGN.md, allowing users to understand the Wikipedia conceptual translation methodology and check open-source attributions, and integrates beautifully with the existing bottom navigation bar.

Fixes #140

…tion

Add the "About" screen (The Colophon) as a fourth bottom navigation tab and integrate the Google OSS Licenses plugin to collect and display open-source attributions.

### What
- Integrated the Google OSS Licenses plugin and play-services-oss-licenses library.
- Enabled `buildConfig` in the app's buildFeatures.
- Fully localized all the new strings across English, Arabic, German, Spanish, French, Hebrew, and Russian.
- Built a scrollable, premium `AboutScreen` displaying app icon, dynamic version name, translation methodology abstract, links to the GitHub repository/issue tracker, and an outlined button to launch play services licenses activity.
- Configured a new bottom navigation tab `About` mapped to `AboutScreen`.
- Added a unit test in `MainActivityTest.kt` to verify correct `TabScreen.About` tab configurations.

### Why
This implements the academic "Colophon" aesthetic defined in DESIGN.md, allowing users to understand the Wikipedia conceptual translation methodology and check open-source attributions, and integrates beautifully with the existing bottom navigation bar.

Commit made by Antigravity.
Fixes #140
@anysoftkeyboard-bot
Copy link
Copy Markdown
Member

This review follows the Robust Maintainer guidelines, focusing on resilience, transparency, and adherence to the established architectural patterns. The addition of the 'Colophon' section is a great step toward the 'Scholarly' aesthetic defined in our design manifest. The localization coverage is excellent.

Copy link
Copy Markdown
Member

@anysoftkeyboard-bot anysoftkeyboard-bot left a comment

Choose a reason for hiding this comment

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

The review identifies critical stability risks due to unprotected startActivity calls that could lead to crashes on certain device configurations, violating the project's zero-tolerance policy for unhandled runtime errors.

border = BorderStroke(1.dp, MaterialTheme.colorScheme.secondary),
modifier = Modifier.fillMaxWidth(),
) {
Text(
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Risk] The startActivity call for OssLicensesMenuActivity is not protected. Any failure to resolve the class or launch the intent will result in a crash. This should be wrapped in a try-catch block to handle ActivityNotFoundException.

.clickable {
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(url))
context.startActivity(intent)
}
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Risk] Launching an external browser using ACTION_VIEW can throw an ActivityNotFoundException on devices without a browser. This call must be protected to ensure system stability.

val aboutTab = TabScreen.About
assertEquals("about", aboutTab.route)
assertEquals(R.string.tab_about, aboutTab.titleRes)
assertEquals(androidx.compose.material.icons.Icons.Default.Info, aboutTab.icon)
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Maintenance] The test uses a full package name inline: androidx.compose.material.icons.Icons.Default.Info. Per guidelines, use imports instead.

horizontalAlignment = Alignment.CenterHorizontally,
) {
// 1. Header
Icon(
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Maintenance] The Icon component uses a tint on a mipmap resource (ic_launcher_foreground). This matches the monochromatic design goal but is fragile for bitmaps. Consider using a dedicated vector or setting tint to Color.Unspecified.

<string name="about_abstract">Janus Glossa is an open-source tool designed to translate concepts within their context, utilizing the crowd-sourced knowledge of Wikipedia.</string>
<string name="about_methodology_title">How it works</string>
<string name="about_methodology_text">Unlike standard dictionaries, Janus Glossa aligns concepts. It finds the encyclopedia entry for your term, then follows the inter-language link to the target language to provide a precise, context-aware translation.</string>
<string name="about_link_source_code">Source Code</string>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Observation] The string content_description_about is defined but remains unused. It should be applied to the app icon in the AboutScreen header or the tab icon to improve accessibility.


<!-- About screen -->
<string name="tab_about">حول</string>
<string name="about_title">Janus Glossa</string>
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Observation] The version string in Arabic (إصدار %1$s) omits the 'v' prefix used in other locales. Consider if strict consistency across languages is required.

fun AboutScreen(modifier: Modifier = Modifier) {
val context = LocalContext.current
val scrollState = rememberScrollState()

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

[Observation] The AboutScreen uses a nested Scaffold. Ensure that it doesn't cause conflicting inset handling with the Scaffold in JanusApp. It appears safe here as the inner Scaffold has no bars.

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.

feat: Implement "About" Modal (The Colophon) with License Collection*

2 participants