From f093d2a310627aa3ee5a2820339f8a18bd251e81 Mon Sep 17 00:00:00 2001 From: "Begonia, HE" <163421589+BegoniaHe@users.noreply.github.com> Date: Wed, 14 Jan 2026 05:12:31 +0100 Subject: feat(java): integrate Adoptium API for Java runtime download Add automatic Java (Temurin) download and installation feature: - Add Adoptium API v3 integration to fetch latest Java releases - Support JRE and JDK image types with version selection (8/11/17/21) - Implement platform detection for macOS, Linux, and Windows - Add SHA256 checksum verification for downloaded archives - Add tar.gz extraction support with Unix permission preservation - Handle macOS-specific Java path structure (Contents/Home/bin) - Add frontend UI with version selector and download progress - Register Tauri commands: fetch_adoptium_java, download_adoptium_java, fetch_available_java_versions Dependencies added: sha2, flate2, tar, dirs --- ui/src/App.svelte | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) (limited to 'ui/src/App.svelte') diff --git a/ui/src/App.svelte b/ui/src/App.svelte index 9b7fe93..02cc173 100644 --- a/ui/src/App.svelte +++ b/ui/src/App.svelte @@ -57,6 +57,16 @@ is_64bit: boolean; } + interface JavaDownloadInfo { + version: string; + release_name: string; + download_url: string; + file_name: string; + file_size: number; + checksum: string | null; + image_type: string; + } + let versions: Version[] = []; let selectedVersion = ""; let currentAccount: Account | null = null; @@ -70,6 +80,13 @@ let javaInstallations: JavaInstallation[] = []; let isDetectingJava = false; + let availableJavaVersions: number[] = []; + let selectedJavaVersion = 21; + let selectedImageType: "jre" | "jdk" = "jre"; + let isDownloadingJava = false; + let javaDownloadStatus = ""; + let showJavaDownloadModal = false; + // Login UI State let isLoginModalOpen = false; let loginMode: "select" | "offline" | "microsoft" = "select"; @@ -144,6 +161,59 @@ settings.java_path = path; } + async function openJavaDownloadModal() { + showJavaDownloadModal = true; + javaDownloadStatus = ""; + try { + availableJavaVersions = await invoke("fetch_available_java_versions"); + // Default selection logic + if (availableJavaVersions.includes(21)) { + selectedJavaVersion = 21; + } else if (availableJavaVersions.includes(17)) { + selectedJavaVersion = 17; + } else if (availableJavaVersions.length > 0) { + selectedJavaVersion = availableJavaVersions[availableJavaVersions.length - 1]; + } + } catch (e) { + console.error("Failed to fetch available Java versions:", e); + javaDownloadStatus = "Error fetching Java versions: " + e; + } + } + + function closeJavaDownloadModal() { + if (!isDownloadingJava) { + showJavaDownloadModal = false; + } + } + + async function downloadJava() { + isDownloadingJava = true; + javaDownloadStatus = `Downloading Java ${selectedJavaVersion} ${selectedImageType.toUpperCase()}...`; + + try { + const result: JavaInstallation = await invoke("download_adoptium_java", { + majorVersion: selectedJavaVersion, + imageType: selectedImageType, + customPath: null, + }); + + javaDownloadStatus = `Java ${selectedJavaVersion} installed at ${result.path}`; + settings.java_path = result.path; + + await detectJava(); + + setTimeout(() => { + showJavaDownloadModal = false; + status = `Java ${selectedJavaVersion} is ready to use!`; + }, 1500); + } catch (e) { + console.error("Failed to download Java:", e); + javaDownloadStatus = "Download failed: " + e; + } finally { + isDownloadingJava = false; + } + } + // --- Auth Functions --- function openLoginModal() { @@ -460,6 +530,12 @@ > {isDetectingJava ? "Detecting..." : "Auto Detect"} + {#if javaInstallations.length > 0} @@ -782,6 +858,98 @@ {/if} + {#if showJavaDownloadModal} +
+ MC 1.20.5+ requires Java 21, MC 1.17-1.20.4 requires Java 17, older versions require Java 8 +
+{javaDownloadStatus}
++ Provided by { e.preventDefault(); openLink("https://adoptium.net"); }}>Eclipse Adoptium +
+