diff --git a/evershelf-kiosk/app/src/main/kotlin/it/dadaloop/evershelf/kiosk/KioskActivity.kt b/evershelf-kiosk/app/src/main/kotlin/it/dadaloop/evershelf/kiosk/KioskActivity.kt index 7ce6595..e41e8ff 100644 --- a/evershelf-kiosk/app/src/main/kotlin/it/dadaloop/evershelf/kiosk/KioskActivity.kt +++ b/evershelf-kiosk/app/src/main/kotlin/it/dadaloop/evershelf/kiosk/KioskActivity.kt @@ -88,6 +88,11 @@ class KioskActivity : AppCompatActivity() { private lateinit var downloadProgressBar: ProgressBar private lateinit var downloadProgressText: TextView private lateinit var bannerProgressBar: ProgressBar + // Step 3: server-reachability check card + private lateinit var serverStatusCard: LinearLayout + private lateinit var serverCheckIcon: TextView + private lateinit var serverCheckText: TextView + private lateinit var serverCheckDetail: TextView private var pendingApkDownloadUrl: String = "" private var pendingInstallFile: java.io.File? = null private var pendingInstallPkg: String = "" @@ -189,6 +194,10 @@ class KioskActivity : AppCompatActivity() { downloadProgressBar = findViewById(R.id.downloadProgressBar) downloadProgressText = findViewById(R.id.downloadProgressText) bannerProgressBar = findViewById(R.id.bannerProgressBar) + serverStatusCard = findViewById(R.id.serverStatusCard) + serverCheckIcon = findViewById(R.id.serverCheckIcon) + serverCheckText = findViewById(R.id.serverCheckText) + serverCheckDetail = findViewById(R.id.serverCheckDetail) btnDismissUpdate.setOnClickListener { updateBanner.visibility = View.GONE bannerProgressBar.visibility = View.GONE @@ -523,6 +532,58 @@ class KioskActivity : AppCompatActivity() { scaleStatusDetail.setTextColor(0xFF34d399.toInt()) } + /** + * Pings the configured EverShelf server to verify it is reachable and that the + * error-reporting API endpoint responds. Called every time step 3 is entered so + * the user knows whether install failures will be automatically sent to GitHub Issues. + */ + private fun checkServerReachability() { + val url = prefs.getString(KEY_URL, "") ?: "" + serverCheckIcon.text = "⏳" + serverCheckText.text = getString(R.string.wizard_server_checking) + serverCheckText.setTextColor(0xFF94a3b8.toInt()) + serverCheckDetail.visibility = View.GONE + + if (url.isEmpty()) { + serverCheckIcon.text = "⚠️" + serverCheckText.text = getString(R.string.wizard_server_error) + serverCheckText.setTextColor(0xFFfbbf24.toInt()) + serverCheckDetail.text = getString(R.string.wizard_server_error_detail) + serverCheckDetail.visibility = View.VISIBLE + return + } + + Thread { + var reachable = false + try { + val base = url.trimEnd('/') + val conn = java.net.URL("$base/api/?action=check_update") + .openConnection() as java.net.HttpURLConnection + conn.requestMethod = "GET" + conn.connectTimeout = 5000 + conn.readTimeout = 5000 + val code = conn.responseCode + conn.disconnect() + reachable = code in 200..499 // any HTTP response = server is up + } catch (_: Exception) {} + runOnUiThread { + if (reachable) { + serverCheckIcon.text = "✅" + serverCheckText.text = getString(R.string.wizard_server_ok) + serverCheckText.setTextColor(0xFF34d399.toInt()) + serverCheckDetail.text = getString(R.string.wizard_server_ok_detail) + serverCheckDetail.visibility = View.VISIBLE + } else { + serverCheckIcon.text = "⚠️" + serverCheckText.text = getString(R.string.wizard_server_error) + serverCheckText.setTextColor(0xFFfbbf24.toInt()) + serverCheckDetail.text = getString(R.string.wizard_server_error_detail) + serverCheckDetail.visibility = View.VISIBLE + } + } + }.start() + } + /** * Central UI updater for the download/install progress. * - Updates the wizard status card if it is currently visible (step 3). @@ -1223,6 +1284,33 @@ class KioskActivity : AppCompatActivity() { runOnUiThread { activeInstallBtn?.text = getString(R.string.install_btn_retry) } ErrorReporter.reportMessage("install_failure", "PackageInstaller status=$status msg=$msg pkg=$targetPkg") + // Generic failure on an already-installed package often means + // a signature conflict with the old version. Offer uninstall as + // last resort (only after the system installer already failed). + val pkgInstalled = try { + packageManager.getPackageInfo(targetPkg, 0); true + } catch (_: Exception) { false } + if (pkgInstalled) { + runOnUiThread { + pendingInstallFile = file + pendingInstallPkg = targetPkg + androidx.appcompat.app.AlertDialog.Builder(this@KioskActivity) + .setTitle("⚠️ Installazione fallita") + .setMessage("Installazione fallita (status=$status).\n\n" + + "Se la versione precedente usa una firma diversa " + + "bisogna prima disinstallarla.\n\n" + + "Disinstalla ora e riprova automaticamente?") + .setPositiveButton("Disinstalla e riprova") { _, _ -> + startActivityForResult( + Intent(Intent.ACTION_DELETE, + android.net.Uri.parse("package:$targetPkg")), + UNINSTALL_REQUEST + ) + } + .setNegativeButton("Annulla", null) + .show() + } + } } } } diff --git a/evershelf-kiosk/app/src/main/res/layout/activity_kiosk.xml b/evershelf-kiosk/app/src/main/res/layout/activity_kiosk.xml index 337ca2a..da984be 100644 --- a/evershelf-kiosk/app/src/main/res/layout/activity_kiosk.xml +++ b/evershelf-kiosk/app/src/main/res/layout/activity_kiosk.xml @@ -316,7 +316,54 @@ android:textSize="15sp" android:gravity="center" android:lineSpacingExtra="4dp" - android:layout_marginBottom="24dp" /> + android:layout_marginBottom="16dp" /> + + + + + + + + + + + + + 🚀 Ohne Waage starten 📥 Scale Gateway installieren 📥 Scale Gateway aktualisieren + + + Server-Verbindung wird geprüft… + Server erreichbar ✅ + Fehlerberichterstattung aktiv — Installationsfehler werden automatisch an GitHub Issues gesendet. + Server nicht erreichbar ⚠️ + Fehler werden GitHub Issues nicht erreichen. URL in Schritt 2 prüfen. diff --git a/evershelf-kiosk/app/src/main/res/values-it/strings.xml b/evershelf-kiosk/app/src/main/res/values-it/strings.xml index e4dd82f..722122b 100644 --- a/evershelf-kiosk/app/src/main/res/values-it/strings.xml +++ b/evershelf-kiosk/app/src/main/res/values-it/strings.xml @@ -37,4 +37,11 @@ 🚀 Avvia senza bilancia 📥 Installa Scale Gateway 📥 Aggiorna Scale Gateway + + + Verifica connessione server… + Server raggiungibile ✅ + Segnalazione errori attiva — i problemi di installazione vengono inviati automaticamente alle GitHub Issues. + Server non raggiungibile ⚠️ + Gli errori non raggiungeranno GitHub Issues. Verifica l\'URL inserito al passaggio 2. diff --git a/evershelf-kiosk/app/src/main/res/values/strings.xml b/evershelf-kiosk/app/src/main/res/values/strings.xml index 0dbb3f8..6b2d495 100644 --- a/evershelf-kiosk/app/src/main/res/values/strings.xml +++ b/evershelf-kiosk/app/src/main/res/values/strings.xml @@ -36,4 +36,11 @@ 🚀 Launch without scale 📥 Install Scale Gateway 📥 Update Scale Gateway + + + Checking server connection… + Server reachable ✅ + Error reporting is active — install failures will be sent to GitHub Issues automatically. + Server not reachable ⚠️ + Install errors won\'t reach GitHub Issues. Check the URL entered in step 2.