Files
EverShelf/evershelf-kiosk/app/src/main/res/layout/activity_setup.xml
T
dadaloop82 754f13111f feat: kiosk setup improvements + webapp scale indicator fixes
kiosk setup wizard:
- Scale step: ask user to power on the scale before scanning (new
  'Accendi la bilancia' card with 'Bilancia accesa → Cerca' button)
- BLE scan: filter results to only show compatible scales (scaleScore>0)
  hiding clearly non-scale BLE devices from the list
- After device selection: run a live connection test — connect to the
  scale, display the live weight, ask 'Corrisponde al peso sulla bilancia?'
  with  Sì /  Riprova / Skip buttons before confirming the device

webapp:
- Scale indicator not live on first load: scaleInit() was firing before
  syncSettingsFromDB() resolved; fixed by chaining .then(scaleInit)
- Scale icon green-on-green: connected state dot changed from #22c55e
  (green, invisible on dark-green header) to white with green border+glow,
  visible on any background color
2026-05-05 18:11:51 +00:00

1275 lines
59 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#0f172a">
<!-- ── Top bar: progress dots + exit button ── -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="56dp"
android:orientation="horizontal"
android:gravity="center_vertical"
android:paddingStart="20dp"
android:paddingEnd="8dp"
android:background="#0f172a">
<LinearLayout
android:id="@+id/setupProgressDots"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="horizontal"
android:gravity="start|center_vertical" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSetupExit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="✕ Esci"
android:textSize="13sp"
android:textColor="#64748b"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.TextButton" />
</LinearLayout>
<!-- Thin divider -->
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#1e293b" />
<!-- ── Scrollable step content ── -->
<ScrollView
android:id="@+id/setupScrollView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:paddingStart="28dp"
android:paddingEnd="28dp"
android:paddingTop="16dp"
android:paddingBottom="24dp">
<!-- ════════════════════════════════════════════
STEP 0 — Language selection
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepLanguage"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="visible">
<ImageView
android:layout_width="160dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_logo"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_marginBottom="24dp"
android:contentDescription="EverShelf" />
<!-- Title shown in all 3 languages so it's always readable -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Scegli la lingua\nChoose your language\nSprache wählen"
android:textColor="#f1f5f9"
android:textSize="22sp"
android:textStyle="bold"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:layout_marginBottom="40dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnLangIt"
android:layout_width="match_parent"
android:layout_height="64dp"
android:text="🇮🇹 Italiano"
android:textSize="18sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed"
android:layout_marginBottom="16dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnLangEn"
android:layout_width="match_parent"
android:layout_height="64dp"
android:text="🇬🇧 English"
android:textSize="18sp"
android:textAllCaps="false"
android:backgroundTint="#1e40af"
android:layout_marginBottom="16dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnLangDe"
android:layout_width="match_parent"
android:layout_height="64dp"
android:text="🇩🇪 Deutsch"
android:textSize="18sp"
android:textAllCaps="false"
android:backgroundTint="#b91c1c" />
</LinearLayout>
<!-- ════════════════════════════════════════════
STEP 1 — Welcome / Intro / Privacy
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepWelcome"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="visible">
<!-- App logo -->
<ImageView
android:layout_width="200dp"
android:layout_height="wrap_content"
android:src="@drawable/ic_logo"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
android:layout_marginBottom="10dp"
android:contentDescription="EverShelf" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="EverShelf Kiosk"
android:textColor="#f1f5f9"
android:textSize="28sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginBottom="4dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="La tua dispensa smart in cucina"
android:textColor="#7c3aed"
android:textSize="15sp"
android:gravity="center"
android:layout_marginBottom="16dp" />
<!-- What is EverShelf -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Trasforma il tuo tablet in un pannello da cucina sempre attivo. Gestisci la dispensa, scansiona i prodotti, ricevi suggerimenti intelligenti — tutto dal tuo server di casa."
android:textColor="#94a3b8"
android:textSize="14sp"
android:gravity="center"
android:lineSpacingExtra="3dp"
android:layout_marginBottom="16dp" />
<!-- Privacy card (highlighted) -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/card_background"
android:padding="16dp"
android:layout_marginBottom="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🔒 Privacy e dati"
android:textColor="#f1f5f9"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="12dp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="top"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="22dp"
android:layout_height="wrap_content"
android:text="💻"
android:textSize="14sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Funziona completamente offline — i tuoi dati restano sul tuo server, dentro casa tua."
android:textColor="#94a3b8"
android:textSize="14sp"
android:lineSpacingExtra="2dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="top"
android:layout_marginBottom="10dp">
<TextView
android:layout_width="22dp"
android:layout_height="wrap_content"
android:text="🤖"
android:textSize="14sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Solo l'assistente AI (opzionale) comunica con i server Google Gemini. Puoi usare EverShelf senza AI in modo totalmente offline."
android:textColor="#94a3b8"
android:textSize="14sp"
android:lineSpacingExtra="2dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="top">
<TextView
android:layout_width="22dp"
android:layout_height="wrap_content"
android:text="🚫"
android:textSize="14sp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Nessun account richiesto. Nessun abbonamento. Nessun tracciamento."
android:textColor="#94a3b8"
android:textSize="14sp"
android:lineSpacingExtra="2dp" />
</LinearLayout>
</LinearLayout>
<!-- Feature highlights -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/tip_background"
android:padding="14dp"
android:layout_marginBottom="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="📺 Schermo sempre acceso, modalità kiosk"
android:textColor="#cbd5e1"
android:textSize="14sp"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="📷 Scansione barcode dal browser"
android:textColor="#cbd5e1"
android:textSize="14sp"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="⚖️ Bilancia BLE integrata (nessuna app esterna)"
android:textColor="#cbd5e1"
android:textSize="14sp"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🔄 Aggiornamenti automatici"
android:textColor="#cbd5e1"
android:textSize="14sp"
android:paddingTop="4dp"
android:paddingBottom="4dp" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnWelcomeStart"
android:layout_width="match_parent"
android:layout_height="56dp"
android:text="Inizia la configurazione →"
android:textSize="16sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed" />
</LinearLayout>
<!-- ════════════════════════════════════════════
STEP 1 — Permissions rationale
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepPermissions"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🔐"
android:textSize="52sp"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Permessi necessari"
android:textColor="#f1f5f9"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="6dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="EverShelf Kiosk ha bisogno di questi permessi per funzionare. Ecco perché:"
android:textColor="#94a3b8"
android:textSize="15sp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:layout_marginBottom="28dp" />
<!-- Camera permission card -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/card_background"
android:padding="16dp"
android:gravity="top"
android:layout_marginBottom="12dp">
<TextView
android:layout_width="44dp"
android:layout_height="wrap_content"
android:text="📷"
android:textSize="24sp"
android:gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Fotocamera"
android:textColor="#f1f5f9"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="4dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Per scansionare i codici a barre dei prodotti e fotografare ciò che aggiungi alla dispensa."
android:textColor="#94a3b8"
android:textSize="14sp"
android:lineSpacingExtra="2dp" />
</LinearLayout>
</LinearLayout>
<!-- Microphone permission card -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/card_background"
android:padding="16dp"
android:gravity="top"
android:layout_marginBottom="12dp">
<TextView
android:layout_width="44dp"
android:layout_height="wrap_content"
android:text="🎤"
android:textSize="24sp"
android:gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Microfono"
android:textColor="#f1f5f9"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="4dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Per l'assistente vocale integrato: legge le scadenze e risponde ai comandi vocali."
android:textColor="#94a3b8"
android:textSize="14sp"
android:lineSpacingExtra="2dp" />
</LinearLayout>
</LinearLayout>
<!-- Install packages permission card -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/card_background"
android:padding="16dp"
android:gravity="top"
android:layout_marginBottom="28dp">
<TextView
android:layout_width="44dp"
android:layout_height="wrap_content"
android:text="📦"
android:textSize="24sp"
android:gravity="center" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Installa applicazioni"
android:textColor="#f1f5f9"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="4dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Per installare gli aggiornamenti automatici dell'app kiosk e dell'app Scale Gateway direttamente da GitHub."
android:textColor="#94a3b8"
android:textSize="14sp"
android:lineSpacingExtra="2dp" />
</LinearLayout>
</LinearLayout>
<!-- Permissions granted confirmation (hidden until granted) -->
<LinearLayout
android:id="@+id/permsGrantedCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/card_background"
android:padding="16dp"
android:gravity="center_vertical"
android:layout_marginBottom="20dp"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="✅"
android:textSize="20sp"
android:layout_marginEnd="10dp" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Permessi concessi! Puoi procedere."
android:textColor="#34d399"
android:textSize="14sp" />
</LinearLayout>
<!-- Grant button -->
<com.google.android.material.button.MaterialButton
android:id="@+id/btnGrantPerms"
android:layout_width="match_parent"
android:layout_height="52dp"
android:text="🔓 Concedi i permessi"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed"
android:layout_marginBottom="12dp" />
<!-- Navigation -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnPermsBack"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:text="← Indietro"
android:textSize="14sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#334155"
android:textColor="#64748b"
android:layout_marginEnd="10dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnPermsNext"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="2"
android:text="Avanti →"
android:textSize="14sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#7c3aed"
android:textColor="#a78bfa" />
</LinearLayout>
</LinearLayout>
<!-- ════════════════════════════════════════════
STEP 2 — Server URL + auto-discovery
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepServer"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🌐"
android:textSize="52sp"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Trova il server"
android:textColor="#f1f5f9"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="EverShelf gira sul tuo server di casa (Raspberry Pi, NAS, PC...). Cerca automaticamente nella rete locale o inserisci l'indirizzo manualmente."
android:textColor="#94a3b8"
android:textSize="15sp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:layout_marginBottom="28dp" />
<!-- Auto-discover button -->
<com.google.android.material.button.MaterialButton
android:id="@+id/btnDiscover"
android:layout_width="match_parent"
android:layout_height="52dp"
android:text="🔍 Cerca nella rete locale"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#0f4c8c"
android:layout_marginBottom="8dp" />
<!-- Discover status text -->
<TextView
android:id="@+id/discoverStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="13sp"
android:visibility="gone"
android:lineSpacingExtra="2dp"
android:layout_marginBottom="16dp" />
<!-- Divider with OR -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_marginBottom="16dp">
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1"
android:background="#334155" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text=" oppure inserisci manualmente "
android:textColor="#475569"
android:textSize="12sp" />
<View
android:layout_width="0dp"
android:layout_height="1dp"
android:layout_weight="1"
android:background="#334155" />
</LinearLayout>
<!-- URL input label -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="URL del server"
android:textColor="#cbd5e1"
android:textSize="13sp"
android:textStyle="bold"
android:layout_marginBottom="6dp" />
<EditText
android:id="@+id/setupUrlEdit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="http://192.168.1.100/dispensa/"
android:inputType="textUri"
android:textColor="#f1f5f9"
android:textColorHint="#475569"
android:background="@drawable/input_background"
android:padding="16dp"
android:textSize="15sp"
android:singleLine="true"
android:layout_marginBottom="10dp" />
<!-- Test connection button -->
<com.google.android.material.button.MaterialButton
android:id="@+id/btnSetupTestUrl"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="🔗 Testa connessione"
android:textSize="14sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#334155"
android:textColor="#94a3b8"
android:layout_marginBottom="8dp" />
<!-- URL status -->
<TextView
android:id="@+id/setupUrlStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textSize="13sp"
android:visibility="gone"
android:lineSpacingExtra="2dp"
android:layout_marginBottom="12dp" />
<!-- Tip -->
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="💡 Suggerimento: copia l'URL esatto dal browser (es. http://192.168.1.50/dispensa/ ) incluso il percorso finale."
android:textColor="#64748b"
android:textSize="12sp"
android:background="@drawable/tip_background"
android:padding="12dp"
android:lineSpacingExtra="2dp"
android:layout_marginBottom="28dp" />
<!-- Navigation -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnServerBack"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:text="← Indietro"
android:textSize="14sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#334155"
android:textColor="#64748b"
android:layout_marginEnd="10dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnServerNext"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="2"
android:text="Avanti →"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed" />
</LinearLayout>
</LinearLayout>
<!-- ════════════════════════════════════════════
STEP 3 — Smart scale
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepScale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="⚖️"
android:textSize="52sp"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Bilancia smart"
android:textColor="#f1f5f9"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="EverShelf può integrarsi con le bilance da cucina Bluetooth per pesare automaticamente gli ingredienti."
android:textColor="#94a3b8"
android:textSize="15sp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:layout_marginBottom="24dp" />
<!-- Question card -->
<LinearLayout
android:id="@+id/scaleQuestionCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/card_background"
android:padding="20dp"
android:layout_marginBottom="16dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Hai una bilancia Bluetooth compatibile?"
android:textColor="#f1f5f9"
android:textSize="17sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginBottom="20dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScaleYes"
android:layout_width="match_parent"
android:layout_height="52dp"
android:text="✓ Sì, ho una bilancia"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#059669"
android:layout_marginBottom="10dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScaleNo"
android:layout_width="match_parent"
android:layout_height="52dp"
android:text="→ No, salta questo passaggio"
android:textSize="15sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#334155"
android:textColor="#64748b" />
</LinearLayout>
<!-- Power-on instruction card (shown after YES, before scan) -->
<LinearLayout
android:id="@+id/scalePowerOnCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/card_background"
android:padding="20dp"
android:layout_marginBottom="16dp"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🔋"
android:textSize="40sp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Accendi la bilancia"
android:textColor="#f1f5f9"
android:textSize="18sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginBottom="10dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Assicurati che la bilancia sia accesa e vicina al tablet, poi avvia la scansione."
android:textColor="#94a3b8"
android:textSize="14sp"
android:gravity="center"
android:lineSpacingExtra="3dp"
android:layout_marginBottom="20dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnPowerOnReady"
android:layout_width="match_parent"
android:layout_height="52dp"
android:text="✅ Bilancia accesa — Cerca"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#059669" />
</LinearLayout>
<!-- BLE scan card (shown after YES) -->
<LinearLayout
android:id="@+id/bleSetupCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/card_background"
android:padding="20dp"
android:layout_marginBottom="16dp"
android:visibility="gone">
<TextView
android:id="@+id/tvScanStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Cerca la tua bilancia Bluetooth nelle vicinanze e selezionala dall'elenco."
android:textColor="#94a3b8"
android:textSize="14sp"
android:gravity="center"
android:layout_marginBottom="16dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScanBle"
android:layout_width="match_parent"
android:layout_height="48dp"
android:text="🔍 Cerca bilancia"
android:textSize="14sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed"
android:layout_marginBottom="12dp" />
<TextView
android:id="@+id/tvSelectedScale"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textColor="#34d399"
android:textSize="15sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginBottom="8dp"
android:visibility="gone" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rvScaleDevices"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false" />
</LinearLayout>
<!-- Scale test card (shown after device is selected) -->
<LinearLayout
android:id="@+id/scaleTestCard"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/card_background"
android:padding="20dp"
android:layout_marginBottom="16dp"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="🔗 Test connessione"
android:textColor="#f1f5f9"
android:textSize="17sp"
android:textStyle="bold"
android:gravity="center"
android:layout_marginBottom="12dp" />
<TextView
android:id="@+id/tvTestStatus"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Connessione in corso…"
android:textColor="#94a3b8"
android:textSize="14sp"
android:gravity="center"
android:layout_marginBottom="16dp" />
<!-- Weight display -->
<LinearLayout
android:id="@+id/testWeightBox"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center"
android:background="#1a7c3aed"
android:padding="16dp"
android:layout_marginBottom="16dp"
android:visibility="gone">
<TextView
android:id="@+id/tvTestWeight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="— g"
android:textColor="#f1f5f9"
android:textSize="36sp"
android:textStyle="bold"
android:layout_marginBottom="4dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Il peso che vedi coincide con quello sulla bilancia?"
android:textColor="#94a3b8"
android:textSize="13sp"
android:gravity="center" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="10dp">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnTestRetry"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:text="❌ No, riprova"
android:textSize="13sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#ef4444"
android:textColor="#ef4444"
android:enabled="false"
android:layout_marginEnd="8dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnTestConfirm"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:text="✅ Sì, coincide"
android:textSize="13sp"
android:textAllCaps="false"
android:backgroundTint="#059669"
android:enabled="false" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnTestSkip"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="Salta il test"
android:textSize="13sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.TextButton"
android:textColor="#475569" />
</LinearLayout>
<!-- Step 4 navigation (shown after YES) -->
<LinearLayout
android:id="@+id/step3NextButtons"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScaleBack"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:text="← Indietro"
android:textSize="14sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#334155"
android:textColor="#64748b"
android:layout_marginEnd="10dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScaleNext"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="2"
android:text="Avanti →"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed" />
</LinearLayout>
</LinearLayout>
<!-- ════════════════════════════════════════════
STEP 5 — Screensaver
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepScreensaver"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🌙"
android:textSize="52sp"
android:layout_marginBottom="12dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvScreensaverTitle"
android:text="@string/setup_screensaver_title"
android:textColor="#f1f5f9"
android:textSize="24sp"
android:textStyle="bold"
android:layout_marginBottom="8dp" />
<TextView
android:id="@+id/tvScreensaverDesc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Dopo 5 minuti di inattività mostra un overlay con l&#39;orologio e informazioni utili (statistiche, piano pasti). Lo schermo rimane SEMPRE acceso — questa opzione riguarda solo l&#39;overlay visivo in-app."
android:textColor="#94a3b8"
android:textSize="15sp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:layout_marginBottom="28dp" />
<!-- Toggle card -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/card_background"
android:padding="20dp"
android:gravity="center_vertical"
android:layout_marginBottom="32dp">
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tvScreensaverToggleLabel"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/setup_screensaver_toggle_label"
android:textColor="#f1f5f9"
android:textSize="16sp"
android:textStyle="bold"
android:layout_marginBottom="4dp" />
<TextView
android:id="@+id/tvScreensaverToggleHint"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/setup_screensaver_toggle_hint"
android:textColor="#64748b"
android:textSize="13sp" />
</LinearLayout>
<com.google.android.material.switchmaterial.SwitchMaterial
android:id="@+id/setupSwitchScreensaver"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:checked="false" />
</LinearLayout>
<!-- Navigation -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScreensaverBack"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="1"
android:text="← Indietro"
android:textSize="14sp"
android:textAllCaps="false"
style="@style/Widget.MaterialComponents.Button.OutlinedButton"
android:strokeColor="#334155"
android:textColor="#64748b"
android:layout_marginEnd="10dp" />
<com.google.android.material.button.MaterialButton
android:id="@+id/btnScreensaverNext"
android:layout_width="0dp"
android:layout_height="48dp"
android:layout_weight="2"
android:text="Avanti →"
android:textSize="15sp"
android:textAllCaps="false"
android:backgroundTint="#7c3aed" />
</LinearLayout>
</LinearLayout>
<!-- ════════════════════════════════════════════
STEP 6 — Done
════════════════════════════════════════════ -->
<LinearLayout
android:id="@+id/stepDone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:visibility="gone">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="🎉"
android:textSize="64sp"
android:layout_marginBottom="16dp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tutto pronto!"
android:textColor="#f1f5f9"
android:textSize="28sp"
android:textStyle="bold"
android:layout_marginBottom="8dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="La configurazione è completa. Premi il pulsante per avviare EverShelf in modalità kiosk."
android:textColor="#94a3b8"
android:textSize="15sp"
android:gravity="center"
android:lineSpacingExtra="4dp"
android:layout_marginBottom="28dp" />
<!-- Configuration summary -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/card_background"
android:padding="20dp"
android:layout_marginBottom="32dp">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Riepilogo configurazione"
android:textColor="#94a3b8"
android:textSize="13sp"
android:textAllCaps="true"
android:letterSpacing="0.08"
android:layout_marginBottom="12dp" />
<TextView
android:id="@+id/setupSummaryText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textColor="#cbd5e1"
android:textSize="14sp"
android:lineSpacingExtra="4dp" />
</LinearLayout>
<com.google.android.material.button.MaterialButton
android:id="@+id/btnLaunch"
android:layout_width="match_parent"
android:layout_height="60dp"
android:text="🚀 Avvia EverShelf"
android:textSize="18sp"
android:textAllCaps="false"
android:backgroundTint="#059669" />
</LinearLayout>
</LinearLayout>
</ScrollView>
<!-- ── Credits Footer ── -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:gravity="center_horizontal"
android:background="#0a1120"
android:paddingTop="10dp"
android:paddingBottom="10dp"
android:paddingStart="16dp"
android:paddingEnd="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Creato da Stimpfl Daniel • Open Source"
android:textColor="#475569"
android:textSize="11sp"
android:gravity="center" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="github.com/dadaloop82/EverShelf"
android:textColor="#334155"
android:textSize="10sp"
android:gravity="center"
android:layout_marginTop="2dp" />
</LinearLayout>
</LinearLayout>