-
-
Notifications
You must be signed in to change notification settings - Fork 85
Contents manifest download #448
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
📝 WalkthroughWalkthroughThis 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
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)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~50 minutes Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches
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. Comment |
There was a problem hiding this 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:
- Adding a comment explaining why
PROTONentries are filtered out (line 25)- Moving to an integration test directory or adding
@Ignoreannotation for regular CI runs- 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: RedundantisInstalledcheck will always be false.Line 201's
availableIds.contains(key)can never be true because:
availableIds = options.keys.toSet()(line 197)- Line 200 guards with
!options.containsKey(key)- If the key isn't in options, it won't be in availableIds either
The manifest entry logic works correctly (duplicates are avoided), but
isInstalledis effectively dead code anddisplayLabelon line 202 will always useentry.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(
| 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() | ||
| } | ||
| }) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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.
| 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 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| 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.
| // 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" |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| // 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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| <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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| <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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| <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.
| <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> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
There was a problem hiding this 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
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.
Written for commit 1a2fc32. Summary will update on new commits.
Summary by CodeRabbit
Release Notes
New Features
Improvements
✏️ Tip: You can customize this high-level summary in your review settings.