Skip to content

Conversation

@utkarshdalal
Copy link
Owner

@utkarshdalal utkarshdalal commented Jan 27, 2026

Summary by cubic

Add manifest-driven installs for DXVK, VKD3D, Box64/WoWBox64, FEXCore, Wine/Proton, and wrapper drivers directly from the version dropdowns. Missing versions are shown muted and install on select with a progress dialog, then update the config automatically.

  • New Features
    • Load and cache component manifest from GitHub; parse items for driver/dxvk/vkd3d/box64/wowbox64/fexcore/wine/proton.
    • Merge manifest entries into version pickers; muted styling for not-installed items; selecting triggers download, install, and config update.
    • ManifestInstaller for content and driver installs with progress, type checks, bionic/glibc detection (blocks glibc Wine/Proton), trust validation, and cleanup.
    • Progress overlay added to Container and Driver dialogs; SettingsListDropdown supports muted items.
    • PrefManager keys for manifest JSON and timestamp.
    • Localized strings for download/install feedback.
    • Robolectric test to ensure manifest IDs match installed IDs.
    • Minor UI: made long dialogs scrollable.

Written for commit 1a2fc32. Summary will update on new commits.

Summary by CodeRabbit

Release Notes

  • New Features

    • Manifest-based installation system for drivers and gaming components
    • Dynamic version selection with per-item metadata and muting support
    • Asynchronous download and installation with real-time progress reporting
    • Support for multiple component types (DXVK, VKD3D, WINE, Proton, Box64, and more)
  • Improvements

    • Added loading dialogs for download and installation operations
    • Enabled vertical scrolling in configuration dialogs
    • Localized status messages for download, installation, and validation feedback across multiple languages

✏️ Tip: You can customize this high-level summary in your review settings.

@coderabbitai
Copy link

coderabbitai bot commented Jan 27, 2026

📝 Walkthrough

Walkthrough

This PR introduces a manifest-based system for downloading, caching, and installing drivers and content components (DXVK, VKD3D, Box64, WINE, Proton, etc.) with asynchronous operations, dynamic version discovery, and multilingual user-facing messages across the UI layer.

Changes

Cohort / File(s) Summary
Manifest Core Infrastructure
app/src/main/java/app/gamenative/utils/ManifestModels.kt, app/src/main/java/app/gamenative/utils/ManifestRepository.kt, app/src/main/java/app/gamenative/utils/ManifestInstaller.kt
New data classes (ManifestEntry, ManifestData, ManifestInstallResult) and singleton services for loading manifests from remote with local caching (1-minute refresh), downloading files to cache with progress reporting, parsing manifest JSON into structured data, and downloading/installing drivers and content with integrity checks, variant detection (bionic/glibc), and type validation.
Preferences & Caching
app/src/main/java/app/gamenative/PrefManager.kt
Added two cached manifest properties: componentManifestJson (string) and componentManifestFetchedAt (timestamp).
Container Configuration UI Overhaul
app/src/main/java/app/gamenative/ui/component/dialog/ContainerConfigDialog.kt
Major refactor: introduced manifest-driven installation flows for multiple components (DXVK, VKD3D, Box64, WowBox64, FEXCore, WINE/Proton); replaced static version lists with dynamic VersionOptionList objects carrying metadata (labels, IDs, muted states); added asynchronous download/install pathways with progress reporting using rememberCoroutineScope and structured concurrency; integrated manifest data loading via ManifestRepository; added per-variant filtering (bionic vs glibc) and conditional activation/installation on version selection when content is not installed.
Dropdown Muting & Dialog Scrolling
app/src/main/java/app/gamenative/ui/component/settings/SettingsListDropdown.kt, app/src/main/java/app/gamenative/ui/screen/settings/ContentsManagerDialog.kt, app/src/main/java/app/gamenative/ui/screen/settings/DriverManagerDialog.kt
Added optional itemMuted: List<Boolean>? parameter to SettingsListDropdown for visual muting of dropdown items; enabled vertical scrolling in ContentsManagerDialog and DriverManagerDialog content areas; added LoadingDialog display in DriverManagerDialog tied to download progress.
Localization
app/src/main/res/values*/strings.xml (en, da, de, fr, it, pt-BR, ro, uk, zh-CN, zh-TW)
Added seven new localized string resources across all supported locales for manifest-related user feedback: manifest_downloading_item, manifest_download_failed, manifest_install_failed, manifest_install_success, manifest_content_untrusted, manifest_type_mismatch, manifest_glibc_not_supported.
Testing
app/src/test/java/app/gamenative/utils/ManifestIdCorrelationTest.kt
New Robolectric unit test class that loads a local manifest, iterates entries (excluding Proton), and verifies driver/content installation via ManifestInstaller, confirming that installed entry IDs match manifest IDs and performing cleanup.

Sequence Diagram(s)

sequenceDiagram
    participant UI as ContainerConfigDialog
    participant Repo as ManifestRepository
    participant Installer as ManifestInstaller
    participant CM as ContentsManager<br/>AdrenotoolsManager
    participant Cache as PrefManager

    UI->>Repo: loadManifest()
    activate Repo
    Repo->>Cache: Check cached manifest
    alt Cache miss or stale
        Repo->>Repo: fetchManifestJson (HTTP)
        Repo->>Repo: parseManifest
    end
    Repo->>Cache: Store manifest & timestamp
    Repo-->>UI: ManifestData
    deactivate Repo

    UI->>UI: Build VersionOptionList from manifest

    Note over UI: User selects a version<br/>not yet installed
    UI->>Installer: downloadAndInstallContent<br/>(or downloadAndInstallDriver)
    activate Installer
    Installer->>Repo: downloadToCache(url, onProgress)
    activate Repo
    Repo-->>Installer: File (with progress updates)
    deactivate Repo
    Installer->>CM: Install content/driver
    activate CM
    CM-->>Installer: Success/Failure
    deactivate CM
    Installer-->>UI: ManifestInstallResult
    deactivate Installer

    UI->>UI: Update config on install completion
    UI->>UI: Refresh UI (new version now active)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

  • PR #224: Modifies ContainerConfigDialog.kt initialization and version-selection logic, adjusting versionsLoaded and LaunchedEffect gating for stable indices alongside manifest-driven refactoring.
  • PR #303: Introduces manifest-driven Wine/Proton handling in ContainerConfigDialog, adding dynamic manifest-based version lists and install/import flows.
  • PR #436: Modifies PrefManager.kt to add new stored preference properties, expanding the preference storage mechanism.

Poem

🐰 Hops through manifests with glee,
Downloads cached for all to see,
Async installs, no delays—
Drivers dance in myriad ways!
Variants checked, versions free,
Manifest magic, configured with spree!

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 2.44% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'Contents manifest download' directly describes the main feature introduced: adding manifest-based download and installation functionality for game contents and drivers.

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

✨ Finishing touches
  • 📝 Generate docstrings

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.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 12

🤖 Fix all issues with AI agents
In `@app/src/main/java/app/gamenative/utils/ManifestInstaller.kt`:
- Around line 136-147: The override of
ContentsManager.OnInstallFinishedCallback.onFailed in ManifestInstaller.kt must
accept a nullable Exception because the Java implementation may pass null;
update the method signature in the anonymous object passed to
mgr.extraContentFile to declare the second parameter as Exception? (nullable)
and adjust any use of that parameter (err) accordingly (e.g., assign the
nullable exception to err or handle null safely) so Kotlin's nullability matches
the Java call sites without unsafe casts.
- Around line 165-179: The code currently calls latch.await() with no timeout
after invoking mgr.finishInstallContent and overrides
ContentsManager.OnInstallFinishedCallback.onFailed(e: Exception) which can hang
indefinitely or crash on null; change to use latch.await(timeout, unit) (e.g.,
30 seconds) and check the boolean result to treat timeout as failure, ensure the
catch block still counts down, and update the onFailed signature to accept a
nullable Exception (Exception?) or safely handle a potential null before using
it so the callback and timeout path both set success=false and return promptly;
locate these changes around mgr.finishInstallContent,
ContentsManager.OnInstallFinishedCallback, onFailed/onSucceed, and the
latch.await call.

In `@app/src/main/java/app/gamenative/utils/ManifestRepository.kt`:
- Around line 23-25: Replace the debug value for the manifest refresh interval:
set ONE_DAY_MS back to the 24-hour constant instead of 60_000L so the manifest
refresh uses 24*60*60*1000L; update the declaration of ONE_DAY_MS in
ManifestRepository (remove or uncomment the correct value and delete the
1-minute override) so all code that references ONE_DAY_MS uses the intended
daily interval.

In `@app/src/main/res/values-da/strings.xml`:
- Around line 855-861: The Danish resource file contains English manifest_*
strings; update or remove them so Danish localization is consistent. For each
string key (manifest_downloading_item, manifest_download_failed,
manifest_install_failed, manifest_install_success, manifest_content_untrusted,
manifest_type_mismatch, manifest_glibc_not_supported) either provide a proper
Danish translation or delete the entries so the app falls back to the base
locale; ensure placeholders like %1$s are preserved exactly in translated
values.

In `@app/src/main/res/values-de/strings.xml`:
- Around line 926-932: Replace the English values for the manifest strings with
German translations by updating the string resources named
manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
and manifest_glibc_not_supported; for example use translations like
"Herunterlade %1$s…", "Download fehlgeschlagen: %1$s", "Installation von %1$s
fehlgeschlagen", "%1$s installiert", "Der Inhalt ist nicht vertrauenswürdig und
wurde nicht installiert.", "Heruntergeladener Inhalt stimmt nicht mit dem
erwarteten Typ überein.", and "GLIBC-Builds werden nicht unterstützt." so the
German locale shows correct localized UI text.

In `@app/src/main/res/values-fr/strings.xml`:
- Around line 988-994: The French resource file contains English manifest_*
strings; update each string resource (manifest_downloading_item,
manifest_download_failed, manifest_install_failed, manifest_install_success,
manifest_content_untrusted, manifest_type_mismatch,
manifest_glibc_not_supported) with proper French translations (or remove the
keys to allow fallback to base locale) so the UI shows localized text; ensure
placeholders like %1$s are preserved exactly in the translated strings.

In `@app/src/main/res/values-it/strings.xml`:
- Around line 984-990: Translate the seven English strings in the Italian
resource file so they are proper Italian translations: update the values for
manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
and manifest_glibc_not_supported in strings.xml to Italian while preserving
placeholders (e.g., %1$s), punctuation, and surrounding XML structure.

In `@app/src/main/res/values-pt-rBR/strings.xml`:
- Around line 855-861: The pt-BR strings file currently contains English text
for the manifest_* entries; replace each of the keys manifest_downloading_item,
manifest_download_failed, manifest_install_failed, manifest_install_success,
manifest_content_untrusted, manifest_type_mismatch, and
manifest_glibc_not_supported with Portuguese (Brazil) translations (or remove
the entries to let the app fall back to the base locale). Preserve
formatting/placeholders like %1$s and punctuation when translating (e.g.,
"Downloading %1$s..." -> "Baixando %1$s...", "Download failed: %1$s" -> "Falha
no download: %1$s", etc.), and ensure the updated strings remain valid XML
string values.

In `@app/src/main/res/values-ro/strings.xml`:
- Around line 993-999: Replace the English strings with Romanian translations
for the manifest-related resources: manifest_downloading_item,
manifest_download_failed, manifest_install_failed, manifest_install_success,
manifest_content_untrusted, manifest_type_mismatch, and
manifest_glibc_not_supported; update each <string name="..."> value in the
Romanian strings.xml to the appropriate Romanian text (keeping the %1$s
placeholders intact and preserving punctuation) so the UI displays localized
messages for RO users.

In `@app/src/main/res/values-uk/strings.xml`:
- Around line 992-998: The Ukrainian resource file contains English manifest
messages; translate or remove the strings so the UI isn't mixed-language. Update
the entries for manifest_downloading_item, manifest_download_failed,
manifest_install_failed, manifest_install_success, manifest_content_untrusted,
manifest_type_mismatch, and manifest_glibc_not_supported in the
values-uk/strings.xml by providing appropriate Ukrainian translations (or delete
these keys to fall back to the base locale) ensuring placeholders like %1$s are
preserved exactly.

In `@app/src/main/res/values-zh-rCN/strings.xml`:
- Around line 981-987: Replace the English manifest-related string values in the
Chinese localization with proper Chinese translations for the listed resource
names: manifest_downloading_item, manifest_download_failed,
manifest_install_failed, manifest_install_success, manifest_content_untrusted,
manifest_type_mismatch, and manifest_glibc_not_supported; update their text
content in values-zh-rCN/strings.xml so each string resource contains the
corresponding Simplified Chinese translation while keeping the resource names
unchanged.

In `@app/src/main/res/values-zh-rTW/strings.xml`:
- Around line 985-991: The Traditional Chinese resource file contains English
manifest strings (manifest_downloading_item, manifest_download_failed,
manifest_install_failed, manifest_install_success, manifest_content_untrusted,
manifest_type_mismatch, manifest_glibc_not_supported); update these entries with
proper zh‑rTW translations for each key or remove the keys to allow fallback to
the base locale. Locate the string resources in the values-zh-rTW resource group
and replace the English text for each manifest_* key with the correct
Traditional Chinese translations (or delete the specific <string> elements) so
UI displays localized messages.
🧹 Nitpick comments (4)
app/src/test/java/app/gamenative/utils/ManifestIdCorrelationTest.kt (1)

22-37: Consider documenting why PROTON is excluded and classifying this as an integration test.

This test performs actual downloads and installations, making it an integration test rather than a unit test. It may be slow and flaky due to network dependencies. Consider:

  1. Adding a comment explaining why PROTON entries are filtered out (line 25)
  2. Moving to an integration test directory or adding @Ignore annotation for regular CI runs
  3. Using a test category/tag for selective execution
// Example documentation:
// PROTON entries are excluded because [reason here - e.g., large file size, special handling required]
val items = manifest.items.filterKeys { it != ManifestContentTypes.PROTON }
app/src/main/java/app/gamenative/ui/component/dialog/ContainerConfigDialog.kt (3)

197-205: Redundant isInstalled check will always be false.

Line 201's availableIds.contains(key) can never be true because:

  1. availableIds = options.keys.toSet() (line 197)
  2. Line 200 guards with !options.containsKey(key)
  3. If the key isn't in options, it won't be in availableIds either

The manifest entry logic works correctly (duplicates are avoided), but isInstalled is effectively dead code and displayLabel on line 202 will always use entry.id.

♻️ Suggested simplification
-    val availableIds = options.keys.toSet()
     manifest.forEach { entry ->
         val key = entry.id.lowercase(Locale.ENGLISH)
         if (!options.containsKey(key)) {
-            val isInstalled = availableIds.contains(key)
-            val displayLabel = if (isInstalled) entry.name else entry.id
-            addOption(displayLabel, entry.id, isManifest = true, isInstalled = isInstalled)
+            addOption(entry.id, entry.id, isManifest = true, isInstalled = false)
         }
     }

439-443: Consider logging swallowed exceptions.

Silent catch (_: Exception) blocks make debugging difficult. Consider logging these failures for diagnostics.

♻️ Suggested improvement
             try {
                 AdrenotoolsManager(context).enumarateInstalledDrivers()
-            } catch (_: Exception) {
+            } catch (e: Exception) {
+                Timber.w(e, "Failed to enumerate installed drivers")
                 emptyList()
             }

502-512: Same concern: consider logging the swallowed exception.

♻️ Suggested improvement
-                } catch (_: Exception) {
+                } catch (e: Exception) {
+                    Timber.w(e, "Failed to sync contents")
                     InstalledContentLists(

Comment on lines +136 to +147
mgr.extraContentFile(uri, object : ContentsManager.OnInstallFinishedCallback {
override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception) {
failReason = reason
err = e
latch.countDown()
}

override fun onSucceed(profileArg: ContentProfile) {
profile = profileArg
latch.countDown()
}
})
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Java-Kotlin nullability mismatch: Exception parameter can be null from Java.

Looking at ContentsManager.java, onFailed is called with null exception in several places (e.g., callback.onFailed(InstallFailedReason.ERROR_BADTAR, null)). The Kotlin override should explicitly declare the parameter as nullable to match the Java behavior.

🔧 Suggested fix
             mgr.extraContentFile(uri, object : ContentsManager.OnInstallFinishedCallback {
-                override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception) {
+                override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception?) {
                     failReason = reason
                     err = e
                     latch.countDown()
                 }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
mgr.extraContentFile(uri, object : ContentsManager.OnInstallFinishedCallback {
override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception) {
failReason = reason
err = e
latch.countDown()
}
override fun onSucceed(profileArg: ContentProfile) {
profile = profileArg
latch.countDown()
}
})
mgr.extraContentFile(uri, object : ContentsManager.OnInstallFinishedCallback {
override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception?) {
failReason = reason
err = e
latch.countDown()
}
override fun onSucceed(profileArg: ContentProfile) {
profile = profileArg
latch.countDown()
}
})
🤖 Prompt for AI Agents
In `@app/src/main/java/app/gamenative/utils/ManifestInstaller.kt` around lines 136
- 147, The override of ContentsManager.OnInstallFinishedCallback.onFailed in
ManifestInstaller.kt must accept a nullable Exception because the Java
implementation may pass null; update the method signature in the anonymous
object passed to mgr.extraContentFile to declare the second parameter as
Exception? (nullable) and adjust any use of that parameter (err) accordingly
(e.g., assign the nullable exception to err or handle null safely) so Kotlin's
nullability matches the Java call sites without unsafe casts.

Comment on lines +165 to +179
mgr.finishInstallContent(profile, object : ContentsManager.OnInstallFinishedCallback {
override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception) {
latch.countDown()
}

override fun onSucceed(profileArg: ContentProfile) {
success = true
latch.countDown()
}
})
} catch (_: Exception) {
latch.countDown()
}
latch.await()
success
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

latch.await() without timeout can hang indefinitely.

If finishInstallContent fails to invoke the callback (due to an unexpected exception or bug), this will block forever. Additionally, the same Java nullability issue applies to the Exception parameter.

🔧 Suggested fix
             mgr.finishInstallContent(profile, object : ContentsManager.OnInstallFinishedCallback {
-                override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception) {
+                override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception?) {
                     latch.countDown()
                 }

                 override fun onSucceed(profileArg: ContentProfile) {
                     success = true
                     latch.countDown()
                 }
             })
         } catch (_: Exception) {
             latch.countDown()
         }
-        latch.await()
+        if (!latch.await(120, TimeUnit.SECONDS)) {
+            Timber.e("finishInstall timed out")
+        }
         success
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
mgr.finishInstallContent(profile, object : ContentsManager.OnInstallFinishedCallback {
override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception) {
latch.countDown()
}
override fun onSucceed(profileArg: ContentProfile) {
success = true
latch.countDown()
}
})
} catch (_: Exception) {
latch.countDown()
}
latch.await()
success
mgr.finishInstallContent(profile, object : ContentsManager.OnInstallFinishedCallback {
override fun onFailed(reason: ContentsManager.InstallFailedReason, e: Exception?) {
latch.countDown()
}
override fun onSucceed(profileArg: ContentProfile) {
success = true
latch.countDown()
}
})
} catch (_: Exception) {
latch.countDown()
}
if (!latch.await(120, TimeUnit.SECONDS)) {
Timber.e("finishInstall timed out")
}
success
🤖 Prompt for AI Agents
In `@app/src/main/java/app/gamenative/utils/ManifestInstaller.kt` around lines 165
- 179, The code currently calls latch.await() with no timeout after invoking
mgr.finishInstallContent and overrides
ContentsManager.OnInstallFinishedCallback.onFailed(e: Exception) which can hang
indefinitely or crash on null; change to use latch.await(timeout, unit) (e.g.,
30 seconds) and check the boolean result to treat timeout as failure, ensure the
catch block still counts down, and update the onFailed signature to accept a
nullable Exception (Exception?) or safely handle a potential null before using
it so the callback and timeout path both set success=false and return promptly;
locate these changes around mgr.finishInstallContent,
ContentsManager.OnInstallFinishedCallback, onFailed/onSucceed, and the
latch.await call.

Comment on lines +23 to +25
// private const val ONE_DAY_MS = 24 * 60 * 60 * 1000L
private const val ONE_DAY_MS = 60_000L
private const val MANIFEST_URL = "https://raw.githubusercontent.com/utkarshdalal/GameNative/refs/heads/master/manifest.json"
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Debug configuration left in production code.

ONE_DAY_MS is set to 60,000ms (1 minute) with the correct 24-hour value commented out. This will cause the manifest to refresh every minute instead of daily, resulting in unnecessary network requests and potential performance issues.

🐛 Proposed fix
-    // private const val ONE_DAY_MS = 24 * 60 * 60 * 1000L
-    private const val ONE_DAY_MS = 60_000L
+    private const val ONE_DAY_MS = 24 * 60 * 60 * 1000L
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// private const val ONE_DAY_MS = 24 * 60 * 60 * 1000L
private const val ONE_DAY_MS = 60_000L
private const val MANIFEST_URL = "https://raw.githubusercontent.com/utkarshdalal/GameNative/refs/heads/master/manifest.json"
private const val ONE_DAY_MS = 24 * 60 * 60 * 1000L
private const val MANIFEST_URL = "https://raw.githubusercontent.com/utkarshdalal/GameNative/refs/heads/master/manifest.json"
🤖 Prompt for AI Agents
In `@app/src/main/java/app/gamenative/utils/ManifestRepository.kt` around lines 23
- 25, Replace the debug value for the manifest refresh interval: set ONE_DAY_MS
back to the 24-hour constant instead of 60_000L so the manifest refresh uses
24*60*60*1000L; update the declaration of ONE_DAY_MS in ManifestRepository
(remove or uncomment the correct value and delete the 1-minute override) so all
code that references ONE_DAY_MS uses the intended daily interval.

Comment on lines +855 to +861
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize manifest messages for Danish.

These manifest_* strings are still English in the da resources, causing inconsistent localization. Please translate them (or omit to fall back to the base locale until translations are ready).

🤖 Prompt for AI Agents
In `@app/src/main/res/values-da/strings.xml` around lines 855 - 861, The Danish
resource file contains English manifest_* strings; update or remove them so
Danish localization is consistent. For each string key
(manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
manifest_glibc_not_supported) either provide a proper Danish translation or
delete the entries so the app falls back to the base locale; ensure placeholders
like %1$s are preserved exactly in translated values.

Comment on lines +926 to +932
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize manifest strings in the German locale.

These entries are currently English, so DE users will see untranslated UI text. Please provide German translations.

💬 Suggested translations
-    <string name="manifest_downloading_item">Downloading %1$s...</string>
-    <string name="manifest_download_failed">Download failed: %1$s</string>
-    <string name="manifest_install_failed">Failed to install %1$s</string>
-    <string name="manifest_install_success">%1$s installed</string>
-    <string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
-    <string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
-    <string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
+    <string name="manifest_downloading_item">Lade %1$s herunter…</string>
+    <string name="manifest_download_failed">Download fehlgeschlagen: %1$s</string>
+    <string name="manifest_install_failed">Installation von %1$s fehlgeschlagen</string>
+    <string name="manifest_install_success">%1$s installiert</string>
+    <string name="manifest_content_untrusted">Inhalt ist nicht vertrauenswürdig und wurde nicht installiert.</string>
+    <string name="manifest_type_mismatch">Heruntergeladener Inhalt entspricht nicht dem erwarteten Typ.</string>
+    <string name="manifest_glibc_not_supported">GLIBC-Builds werden nicht unterstützt.</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
<string name="manifest_downloading_item">Lade %1$s herunter…</string>
<string name="manifest_download_failed">Download fehlgeschlagen: %1$s</string>
<string name="manifest_install_failed">Installation von %1$s fehlgeschlagen</string>
<string name="manifest_install_success">%1$s installiert</string>
<string name="manifest_content_untrusted">Inhalt ist nicht vertrauenswürdig und wurde nicht installiert.</string>
<string name="manifest_type_mismatch">Heruntergeladener Inhalt entspricht nicht dem erwarteten Typ.</string>
<string name="manifest_glibc_not_supported">GLIBC-Builds werden nicht unterstützt.</string>
🤖 Prompt for AI Agents
In `@app/src/main/res/values-de/strings.xml` around lines 926 - 932, Replace the
English values for the manifest strings with German translations by updating the
string resources named manifest_downloading_item, manifest_download_failed,
manifest_install_failed, manifest_install_success, manifest_content_untrusted,
manifest_type_mismatch, and manifest_glibc_not_supported; for example use
translations like "Herunterlade %1$s…", "Download fehlgeschlagen: %1$s",
"Installation von %1$s fehlgeschlagen", "%1$s installiert", "Der Inhalt ist
nicht vertrauenswürdig und wurde nicht installiert.", "Heruntergeladener Inhalt
stimmt nicht mit dem erwarteten Typ überein.", and "GLIBC-Builds werden nicht
unterstützt." so the German locale shows correct localized UI text.

Comment on lines +855 to +861
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize manifest messages for pt-BR.

These newly added manifest_* strings are still English in the pt-BR resources, so Portuguese (Brazil) users will see English UI. Please provide pt-BR translations (or omit these entries to fall back to the base locale until translated).

🤖 Prompt for AI Agents
In `@app/src/main/res/values-pt-rBR/strings.xml` around lines 855 - 861, The pt-BR
strings file currently contains English text for the manifest_* entries; replace
each of the keys manifest_downloading_item, manifest_download_failed,
manifest_install_failed, manifest_install_success, manifest_content_untrusted,
manifest_type_mismatch, and manifest_glibc_not_supported with Portuguese
(Brazil) translations (or remove the entries to let the app fall back to the
base locale). Preserve formatting/placeholders like %1$s and punctuation when
translating (e.g., "Downloading %1$s..." -> "Baixando %1$s...", "Download
failed: %1$s" -> "Falha no download: %1$s", etc.), and ensure the updated
strings remain valid XML string values.

Comment on lines +993 to +999
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize manifest strings in the Romanian locale.

These entries are English, so RO users will see untranslated UI text. Please add Romanian translations.

💬 Suggested translations
-    <string name="manifest_downloading_item">Downloading %1$s...</string>
-    <string name="manifest_download_failed">Download failed: %1$s</string>
-    <string name="manifest_install_failed">Failed to install %1$s</string>
-    <string name="manifest_install_success">%1$s installed</string>
-    <string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
-    <string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
-    <string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
+    <string name="manifest_downloading_item">Se descarcă %1$s...</string>
+    <string name="manifest_download_failed">Descărcarea a eșuat: %1$s</string>
+    <string name="manifest_install_failed">Instalarea %1$s a eșuat</string>
+    <string name="manifest_install_success">%1$s instalat</string>
+    <string name="manifest_content_untrusted">Conținutul nu este de încredere și nu a fost instalat.</string>
+    <string name="manifest_type_mismatch">Conținutul descărcat nu corespunde tipului așteptat.</string>
+    <string name="manifest_glibc_not_supported">Build-urile GLIBC nu sunt acceptate.</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
<string name="manifest_downloading_item">Se descarcă %1$s...</string>
<string name="manifest_download_failed">Descărcarea a eșuat: %1$s</string>
<string name="manifest_install_failed">Instalarea %1$s a eșuat</string>
<string name="manifest_install_success">%1$s instalat</string>
<string name="manifest_content_untrusted">Conținutul nu este de încredere și nu a fost instalat.</string>
<string name="manifest_type_mismatch">Conținutul descărcat nu corespunde tipului așteptat.</string>
<string name="manifest_glibc_not_supported">Build-urile GLIBC nu sunt acceptate.</string>
🤖 Prompt for AI Agents
In `@app/src/main/res/values-ro/strings.xml` around lines 993 - 999, Replace the
English strings with Romanian translations for the manifest-related resources:
manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
and manifest_glibc_not_supported; update each <string name="..."> value in the
Romanian strings.xml to the appropriate Romanian text (keeping the %1$s
placeholders intact and preserving punctuation) so the UI displays localized
messages for RO users.

Comment on lines +992 to +998
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize manifest messages for Ukrainian.

These manifest_* strings are still English in the Ukrainian resources, so users will see mixed-language UI. Please translate them (or remove to fall back to the base locale until translated).

🤖 Prompt for AI Agents
In `@app/src/main/res/values-uk/strings.xml` around lines 992 - 998, The Ukrainian
resource file contains English manifest messages; translate or remove the
strings so the UI isn't mixed-language. Update the entries for
manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
and manifest_glibc_not_supported in the values-uk/strings.xml by providing
appropriate Ukrainian translations (or delete these keys to fall back to the
base locale) ensuring placeholders like %1$s are preserved exactly.

Comment on lines +981 to +987
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Localization missing: strings are in English, not Chinese.

These manifest-related strings are added to the Chinese (Simplified) localization file but remain in English. All other strings in this file are properly translated to Chinese. These should be translated for consistency with the rest of the UI.

Suggested Chinese translations:

-    <string name="manifest_downloading_item">Downloading %1$s...</string>
-    <string name="manifest_download_failed">Download failed: %1$s</string>
-    <string name="manifest_install_failed">Failed to install %1$s</string>
-    <string name="manifest_install_success">%1$s installed</string>
-    <string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
-    <string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
-    <string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
+    <string name="manifest_downloading_item">正在下载 %1$s...</string>
+    <string name="manifest_download_failed">下载失败:%1$s</string>
+    <string name="manifest_install_failed">安装 %1$s 失败</string>
+    <string name="manifest_install_success">%1$s 已安装</string>
+    <string name="manifest_content_untrusted">内容不受信任,未安装。</string>
+    <string name="manifest_type_mismatch">下载的内容与预期类型不匹配。</string>
+    <string name="manifest_glibc_not_supported">不支持 GLIBC 构建。</string>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
<string name="manifest_downloading_item">正在下载 %1$s...</string>
<string name="manifest_download_failed">下载失败:%1$s</string>
<string name="manifest_install_failed">安装 %1$s 失败</string>
<string name="manifest_install_success">%1$s 已安装</string>
<string name="manifest_content_untrusted">内容不受信任,未安装。</string>
<string name="manifest_type_mismatch">下载的内容与预期类型不匹配。</string>
<string name="manifest_glibc_not_supported">不支持 GLIBC 构建。</string>
🤖 Prompt for AI Agents
In `@app/src/main/res/values-zh-rCN/strings.xml` around lines 981 - 987, Replace
the English manifest-related string values in the Chinese localization with
proper Chinese translations for the listed resource names:
manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
and manifest_glibc_not_supported; update their text content in
values-zh-rCN/strings.xml so each string resource contains the corresponding
Simplified Chinese translation while keeping the resource names unchanged.

Comment on lines +985 to +991
<string name="manifest_downloading_item">Downloading %1$s...</string>
<string name="manifest_download_failed">Download failed: %1$s</string>
<string name="manifest_install_failed">Failed to install %1$s</string>
<string name="manifest_install_success">%1$s installed</string>
<string name="manifest_content_untrusted">Content is not trusted and was not installed.</string>
<string name="manifest_type_mismatch">Downloaded content does not match expected type.</string>
<string name="manifest_glibc_not_supported">GLIBC builds are not supported.</string>
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Localize manifest messages for zh‑rTW.

The manifest_* strings remain English in the Traditional Chinese resources, so users will see untranslated UI. Please add zh‑rTW translations (or remove these entries to fall back to the base locale until translated).

🤖 Prompt for AI Agents
In `@app/src/main/res/values-zh-rTW/strings.xml` around lines 985 - 991, The
Traditional Chinese resource file contains English manifest strings
(manifest_downloading_item, manifest_download_failed, manifest_install_failed,
manifest_install_success, manifest_content_untrusted, manifest_type_mismatch,
manifest_glibc_not_supported); update these entries with proper zh‑rTW
translations for each key or remove the keys to allow fallback to the base
locale. Locate the string resources in the values-zh-rTW resource group and
replace the English text for each manifest_* key with the correct Traditional
Chinese translations (or delete the specific <string> elements) so UI displays
localized messages.

Copy link
Contributor

@cubic-dev-ai cubic-dev-ai bot left a comment

Choose a reason for hiding this comment

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

No issues found across 19 files

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