From 11ee883c8477cb2e257555058f890134e5cd2f0d Mon Sep 17 00:00:00 2001 From: Alibek Omarov Date: Thu, 7 May 2026 23:40:14 +0500 Subject: [PATCH] android: show build info for mod's downloaded libraries --- .../su/xash/engine/model/GameLibDownloader.kt | 30 +++++++++++- .../GameSettingsPreferenceFragment.kt | 47 +++++++++++++++++++ .../res/layout/fragment_game_settings.xml | 3 +- .../app/src/main/res/values-ru/strings.xml | 4 ++ android/app/src/main/res/values/strings.xml | 4 ++ .../app/src/main/res/xml/game_preferences.xml | 24 ++++++++++ 6 files changed, 109 insertions(+), 3 deletions(-) diff --git a/android/app/src/main/java/su/xash/engine/model/GameLibDownloader.kt b/android/app/src/main/java/su/xash/engine/model/GameLibDownloader.kt index 720e3bbb..952dd945 100644 --- a/android/app/src/main/java/su/xash/engine/model/GameLibDownloader.kt +++ b/android/app/src/main/java/su/xash/engine/model/GameLibDownloader.kt @@ -53,7 +53,14 @@ class GameLibDownloader(private val context: Context) { val modKey: String, val platformArch: String, val filename: String, - val sha256: String + val sha256: String, + val sourceJson: String? + ) + + data class SourceInfo( + val url: String?, + val branch: String?, + val commit: String? ) private fun manifestCacheFile(): File = File(context.cacheDir, "hlsdk-manifest.json") @@ -140,9 +147,27 @@ class GameLibDownloader(private val context: Context) { if (filename.isEmpty() || sha256.isEmpty()) return null - return ManifestEntry(modKey, platformArch, filename, sha256.lowercase()) + val sourceJson = build.optJSONObject("source")?.toString() + return ManifestEntry(modKey, platformArch, filename, sha256.lowercase(), sourceJson) } + fun getSourceInfo(gamedir: String): SourceInfo? { + val raw = prefs.getString("${gamedir}_source", null) ?: return null + return try { + val o = JSONObject(raw) + SourceInfo( + url = o.optString("url").ifEmpty { null }, + branch = o.optString("branch").ifEmpty { null }, + commit = o.optString("commit").ifEmpty { null }, + ) + } catch (_: Exception) { + null + } + } + + fun getDownloadTime(gamedir: String): Long = + prefs.getLong("${gamedir}_download_time", 0L) + sealed class Lookup { data class Available(val entry: ManifestEntry) : Lookup() object NotInManifest : Lookup() @@ -282,6 +307,7 @@ class GameLibDownloader(private val context: Context) { prefs.edit() .putString("${gamedir}_sha256", entry.sha256) .putString("${gamedir}_filename", entry.filename) + .putString("${gamedir}_source", entry.sourceJson) .putLong("${gamedir}_download_time", System.currentTimeMillis()) .apply() diff --git a/android/app/src/main/java/su/xash/engine/ui/settings/GameSettingsPreferenceFragment.kt b/android/app/src/main/java/su/xash/engine/ui/settings/GameSettingsPreferenceFragment.kt index fd3e8519..f78d1689 100644 --- a/android/app/src/main/java/su/xash/engine/ui/settings/GameSettingsPreferenceFragment.kt +++ b/android/app/src/main/java/su/xash/engine/ui/settings/GameSettingsPreferenceFragment.kt @@ -1,11 +1,17 @@ package su.xash.engine.ui.settings +import android.content.Intent import android.os.Bundle +import androidx.core.net.toUri import androidx.preference.ListPreference +import androidx.preference.Preference import androidx.preference.PreferenceFragmentCompat import androidx.preference.SwitchPreferenceCompat import su.xash.engine.R import su.xash.engine.model.Game +import su.xash.engine.model.GameLibDownloader +import java.text.DateFormat +import java.util.Date class GameSettingsPreferenceFragment(val game: Game) : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -26,6 +32,8 @@ class GameSettingsPreferenceFragment(val game: Game) : PreferenceFragmentCompat( enableYaPBBots.isVisible = true } + populateDownloadedBuildInfo() + val separatePackages = findPreference("separate_libraries")!! val clientPackage = findPreference("client_package")!! val serverPackage = findPreference("server_package")!! @@ -43,4 +51,43 @@ class GameSettingsPreferenceFragment(val game: Game) : PreferenceFragmentCompat( true } } + + private fun populateDownloadedBuildInfo() { + val downloader = GameLibDownloader(requireContext()) + val source = downloader.getSourceInfo(game.basedir.name) ?: return + val downloadedAt = downloader.getDownloadTime(game.basedir.name) + + val urlPref = findPreference("source_url")!! + urlPref.isVisible = true + urlPref.summary = source.url ?: "—" + urlPref.isEnabled = source.url != null + urlPref.setOnPreferenceClickListener { + source.url?.let { + startActivity(Intent(Intent.ACTION_VIEW, it.toUri())) + } + true + } + + val branchPref = findPreference("source_branch")!! + branchPref.isVisible = true + branchPref.summary = source.branch ?: "—" + + val commitPref = findPreference("source_commit")!! + commitPref.isVisible = true + commitPref.summary = source.commit ?: "—" + commitPref.isEnabled = source.commit != null && source.url != null + commitPref.setOnPreferenceClickListener { + // FIXME: GitHub-styled URL! + val target = "${source.url!!.trimEnd('/')}/commit/${source.commit}" + startActivity(Intent(Intent.ACTION_VIEW, target.toUri())) + true + } + + val timePref = findPreference("downloaded_at")!! + timePref.isVisible = true + timePref.summary = if (downloadedAt > 0L) + DateFormat.getDateTimeInstance().format(Date(downloadedAt)) + else + "—" + } } diff --git a/android/app/src/main/res/layout/fragment_game_settings.xml b/android/app/src/main/res/layout/fragment_game_settings.xml index 702dd55e..188a9604 100644 --- a/android/app/src/main/res/layout/fragment_game_settings.xml +++ b/android/app/src/main/res/layout/fragment_game_settings.xml @@ -16,8 +16,9 @@ diff --git a/android/app/src/main/res/values-ru/strings.xml b/android/app/src/main/res/values-ru/strings.xml index dd9f2ff9..bdaaf7a9 100644 --- a/android/app/src/main/res/values-ru/strings.xml +++ b/android/app/src/main/res/values-ru/strings.xml @@ -42,4 +42,8 @@ Не удалось связаться с сервером игровых библиотек Не удалось загрузить манифест сборок:\n\n%1$s\n\nИгровые библиотеки сейчас недоступны для загрузки. Можно запустить движок и без них, но он, скорее всего, не найдёт игровые DLL. Запустить всё равно + Репозиторий исходников + Ветка + Коммит + Загружено diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index 66fb97ca..928e6179 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -44,4 +44,8 @@ Cannot reach game library server Failed to download the build manifest:\n\n%1$s\n\nGame libraries cannot be downloaded right now. You can launch the engine anyway, but it likely won\'t find the game DLLs. Launch anyway + Source repository + Branch + Commit + Downloaded diff --git a/android/app/src/main/res/xml/game_preferences.xml b/android/app/src/main/res/xml/game_preferences.xml index 5210e8ff..fa11819f 100644 --- a/android/app/src/main/res/xml/game_preferences.xml +++ b/android/app/src/main/res/xml/game_preferences.xml @@ -46,4 +46,28 @@ app:title="@string/preferences_server_package" app:useSimpleSummaryProvider="true" app:isPreferenceVisible="false" /> + + + + + + + +