[{"data":1,"prerenderedAt":337},["ShallowReactive",2],{"studies-it-puppypad":3},{"id":4,"title":5,"body":6,"category":315,"description":160,"extension":316,"featured":317,"links":318,"meta":319,"navigation":320,"order":321,"path":322,"period":323,"role":324,"seo":325,"slug":326,"stack":327,"stem":334,"subtitle":335,"summary":318,"__hash__":336},"projects_it\u002Fprojects\u002Fit\u002Fpuppypad.md","PuppyPad",{"type":7,"value":8,"toc":306},"minimark",[9,14,33,45,49,52,74,81,85,111,121,141,148,153,163,180,184,190,204,210,220,226,230,250,253,257],[10,11,13],"h2",{"id":12},"il-contesto","Il contesto",[15,16,17,20,21,24,25,28,29,32],"p",{},[18,19,5],"strong",{}," è un'applicazione Android pensata per connettere tre attori del mondo del welfare animale italiano: ",[18,22,23],{},"utenti privati"," (proprietari \u002F persone che incontrano animali in difficoltà), ",[18,26,27],{},"veterinari",", ",[18,30,31],{},"enti pubblici"," (canili, associazioni, amministrazioni). L'obiettivo è dare una piattaforma unica per segnalare un animale che ha bisogno, instradare la segnalazione al ruolo giusto e tenere traccia della sua storia clinica e sociale nel tempo.",[15,34,35,36,39,40,44],{},"Progetto universitario di gruppo (4 sviluppatori) sviluppato per l'esame di ",[18,37,38],{},"Sviluppo di Mobile Software"," (da cui il nome della repo: ",[41,42,43],"em",{},"SMS",") durante la triennale in Informatica e Tecnologie per la Produzione del Software.",[10,46,48],{"id":47},"il-dominio","Il dominio",[15,50,51],{},"Ogni utente registrato appartiene a uno dei tre ruoli con una home dedicata:",[53,54,55,62,68],"ul",{},[56,57,58,61],"li",{},[18,59,60],{},"Utente privato"," — registra i propri animali, tiene cartella sanitaria (cure, spese), pubblica segnalazioni (cerco aiuto, cerco stallo, offro stallo, cerco animale, offro animale)",[56,63,64,67],{},[18,65,66],{},"Veterinario"," — vede gli animali \"in carico\", risponde alle segnalazioni che riguardano aspetti sanitari, aggiorna cartelle",[56,69,70,73],{},[18,71,72],{},"Ente pubblico"," — gestisce stalli, prende in custodia animali, risponde a segnalazioni di territorio",[15,75,76,77,80],{},"Il flusso centrale sono le ",[18,78,79],{},"segnalazioni"," geolocalizzate: un utente posta un caso, il sistema lo rende visibile ai ruoli pertinenti in base al tipo.",[10,82,84],{"id":83},"architettura","Architettura",[15,86,87,90,91,95,96,99,100,99,103,106,107,110],{},[18,88,89],{},"Single-activity multi-fragment"," con routing basato sul ruolo utente al login: ",[92,93,94],"code",{},"LoginActivity"," → ",[92,97,98],{},"HomeActivity"," \u002F ",[92,101,102],{},"HomeVeterinarioActivity",[92,104,105],{},"HomeEnteActivity",". Navigazione interna via ",[92,108,109],{},"BottomNavigationView"," e Fragment swap.",[15,112,113,116,117,120],{},[18,114,115],{},"Persistenza"," interamente su ",[18,118,119],{},"Firebase",":",[53,122,123,129,135],{},[56,124,125,128],{},[18,126,127],{},"Auth"," — email \u002F password",[56,130,131,134],{},[18,132,133],{},"Realtime Database"," — utenti, animali, segnalazioni, cure, spese come alberi JSON",[56,136,137,140],{},[18,138,139],{},"Storage"," — foto di animali, immagini delle segnalazioni, avatar",[15,142,143,144,147],{},"Nessun Room \u002F SQLite locale: ogni Fragment legge direttamente da Firebase tramite ",[92,145,146],{},"ValueEventListener"," — pattern callback-driven, sincrono, classico dell'ecosistema Android pre-Coroutines.",[15,149,150,120],{},[18,151,152],{},"Organizzazione del codice",[154,155,161],"pre",{"className":156,"code":158,"language":159,"meta":160},[157],"language-text","com.example.provalogin\u002F\n├── Model\u002F        ← 7 POJO (Animal, Utente, Segnalazioni, Cure, Spesa, Image, Follow)\n├── Fragment\u002F     ← 20 Fragment (home ruoli, dettagli, form, QR scanner)\n├── Adapter\u002F      ← 8 RecyclerView adapter\n└── Recycler\u002F     ← utility\n","text","",[92,162,158],{"__ignoreMap":160},[15,164,165,168,169,28,172,175,176,179],{},[18,166,167],{},"Localizzazione",": italiano di default, più 4 locali (EN, FR, ES, DE) via resource qualifiers (",[92,170,171],{},"values-en\u002F",[92,173,174],{},"values-fr\u002F",", …). Persistenza della lingua in ",[92,177,178],{},"SharedPreferences",".",[10,181,183],{"id":182},"decisioni-tecniche-chiave","Decisioni tecniche chiave",[15,185,186,189],{},[18,187,188],{},"1. Firebase invece di backend custom."," Scelta voluta: un gruppo di 4 studenti triennali con un semestre di tempo doveva poter iterare sul dominio (3 ruoli, segnalazioni, cartella, QR), non scrivere un backend da zero. Realtime DB dà sincronizzazione cross-device gratis; Auth gestisce password reset e persistence; Storage risolve l'upload immagini. Il cost-benefit è ovvio per un progetto didattico.",[15,191,192,195,196,199,200,203],{},[18,193,194],{},"2. Geolocalizzazione delle segnalazioni."," Uso di ",[92,197,198],{},"FusedLocationProvider"," per ottenere la posizione dell'utente al momento della creazione di una segnalazione. Permessi fine\u002Fcoarse location dichiarati in ",[92,201,202],{},"AndroidManifest.xml",", richiesta runtime a partire da API 23. Le coordinate finiscono nella Realtime DB insieme al resto del record.",[15,205,206,209],{},[18,207,208],{},"3. QR code per identificazione animali."," Libreria ZXing + CodeScanner per generare e scansionare QR associati ai singoli animali. Un veterinario può così identificare un animale registrato senza dover cercare manualmente.",[15,211,212,215,216,219],{},[18,213,214],{},"4. Internazionalizzazione seria per un progetto d'esame."," 5 locale supportate non come esercizio performativo ma perché il dominio tocca potenziali utenti non italofoni (turisti, residenti stranieri, volontariato internazionale). Tutte le stringhe UI sono esternalizzate in ",[92,217,218],{},"strings.xml"," — rivedibile da non-developer.",[15,221,222,225],{},[18,223,224],{},"5. Separation of concerns livello Adapter \u002F Fragment."," 8 adapter RecyclerView specifici per tipo di dato (animali, segnalazioni, cure, spese, immagini, utenti); 20 Fragment ognuno focalizzato su una singola schermata. Niente mega-classi da 2000 righe.",[10,227,229],{"id":228},"cosa-non-rifarei-oggi","Cosa non rifarei oggi",[53,231,232,238,244],{},[56,233,234,237],{},[18,235,236],{},"Niente MVVM \u002F ViewModel \u002F LiveData",": il progetto è del 2023 ma segue pattern del 2019. Oggi userei Jetpack Compose + ViewModel + StateFlow + Kotlin coroutines",[56,239,240,243],{},[18,241,242],{},"Niente cache locale",": ogni schermata rifà la query. Room + sync strategy migliorerebbe UX offline",[56,245,246,249],{},[18,247,248],{},"Firebase Realtime DB"," per dati strutturati è discutibile: Firestore ha query più potenti e costa meno sulle letture frequenti che facciamo",[15,251,252],{},"Ma il punto di un progetto universitario non è shippare perfezione — è consegnare qualcosa che funzioni e imparare cosa rifaresti diverso. Questo case study è quel \"diverso\".",[10,254,256],{"id":255},"numeri","Numeri",[53,258,259,266,284,290,300],{},[56,260,261,262,265],{},"~",[18,263,264],{},"5.500 righe Java"," su 49 file",[56,267,268,271,272,271,275,271,278,271,281],{},[18,269,270],{},"41 layout XML"," · ",[18,273,274],{},"8 activity",[18,276,277],{},"20+ Fragment",[18,279,280],{},"7 model",[18,282,283],{},"8 adapter",[56,285,286,289],{},[18,287,288],{},"3 ruoli utente"," con home dedicata",[56,291,292,295,296,299],{},[18,293,294],{},"5 locale"," (IT, EN, FR, ES, DE) · ",[18,297,298],{},"5 tipi"," di segnalazione",[56,301,302,305],{},[18,303,304],{},"4 sviluppatori"," in un semestre · ~67 commit",{"title":160,"searchDepth":307,"depth":307,"links":308},2,[309,310,311,312,313,314],{"id":12,"depth":307,"text":13},{"id":47,"depth":307,"text":48},{"id":83,"depth":307,"text":84},{"id":182,"depth":307,"text":183},{"id":228,"depth":307,"text":229},{"id":255,"depth":307,"text":256},"studies","md",false,null,{},true,20,"\u002Fprojects\u002Fit\u002Fpuppypad","2023","Sviluppo di Mobile Software · triennale in Informatica",{"title":5,"description":160},"puppypad",[328,329,330,331,332,333],"Android (Java)","Firebase (Auth · Realtime DB · Storage)","Google Play Services","ZXing (QR code)","Glide","Multi-lingua (5 locale)","projects\u002Fit\u002Fpuppypad","App Android multi-ruolo per il welfare animale — utenti, veterinari, enti pubblici collaborano su segnalazioni geolocalizzate e cartella sanitaria condivisa.","LTuGfkNIk5HZ8rhmjF3Q9Ir-zetviw_mI4DiLuVsvwk",1781346783506]