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.