[{"data":1,"prerenderedAt":342},["ShallowReactive",2],{"studies-en-puppypad":3},{"id":4,"title":5,"body":6,"category":320,"description":161,"extension":321,"featured":322,"links":323,"meta":324,"navigation":325,"order":326,"path":327,"period":328,"role":329,"seo":330,"slug":331,"stack":332,"stem":339,"subtitle":340,"summary":323,"__hash__":341},"projects_en\u002Fprojects\u002Fen\u002Fpuppypad.md","PuppyPad",{"type":7,"value":8,"toc":311},"minimark",[9,14,33,49,53,56,78,85,89,115,122,142,149,154,164,182,186,192,206,212,222,228,232,252,259,263],[10,11,13],"h2",{"id":12},"context","Context",[15,16,17,20,21,24,25,28,29,32],"p",{},[18,19,5],"strong",{}," is an Android app designed to connect three actors in the Italian animal-welfare ecosystem: ",[18,22,23],{},"private users"," (pet owners and passers-by who encounter animals in distress), ",[18,26,27],{},"veterinarians",", and ",[18,30,31],{},"public entities"," (shelters, associations, local authorities). The goal: a single platform to report an animal in need, route that report to the right role, and track the animal's clinical and social history over time.",[15,34,35,36,39,40,44,45,48],{},"Group university project (4 developers) built for the ",[18,37,38],{},"Mobile Software Development"," exam (hence the repo name: ",[41,42,43],"em",{},"SMS"," — ",[41,46,47],{},"Sviluppo di Mobile Software",") during the BSc in Computer Science.",[10,50,52],{"id":51},"the-domain","The domain",[15,54,55],{},"Each registered user belongs to one of three roles, with a dedicated home screen:",[57,58,59,66,72],"ul",{},[60,61,62,65],"li",{},[18,63,64],{},"Private user"," — registers their own animals, maintains their health record (cures, expenses), posts reports (looking for help, looking for a foster home, offering a foster home, looking for an animal, offering an animal)",[60,67,68,71],{},[18,69,70],{},"Veterinarian"," — sees assigned animals, responds to reports involving clinical matters, updates health records",[60,73,74,77],{},[18,75,76],{},"Public entity"," — manages foster homes, takes custody of animals, responds to territory-level reports",[15,79,80,81,84],{},"The central flow is the ",[18,82,83],{},"geolocated report",": a user posts a case, and the system surfaces it to the relevant roles based on type.",[10,86,88],{"id":87},"architecture","Architecture",[15,90,91,94,95,99,100,103,104,103,107,110,111,114],{},[18,92,93],{},"Single-activity multi-fragment"," with role-based routing at login: ",[96,97,98],"code",{},"LoginActivity"," → ",[96,101,102],{},"HomeActivity"," \u002F ",[96,105,106],{},"HomeVeterinarioActivity",[96,108,109],{},"HomeEnteActivity",". Internal navigation via ",[96,112,113],{},"BottomNavigationView"," and fragment swapping.",[15,116,117,118,121],{},"Persistence is entirely on ",[18,119,120],{},"Firebase",":",[57,123,124,130,136],{},[60,125,126,129],{},[18,127,128],{},"Auth"," — email \u002F password",[60,131,132,135],{},[18,133,134],{},"Realtime Database"," — users, animals, reports, cures, expenses as JSON trees",[60,137,138,141],{},[18,139,140],{},"Storage"," — animal photos, report images, avatars",[15,143,144,145,148],{},"No local Room \u002F SQLite: each Fragment reads from Firebase via ",[96,146,147],{},"ValueEventListener"," — a callback-driven, synchronous pattern, classic pre-Coroutines Android.",[15,150,151,121],{},[18,152,153],{},"Code layout",[155,156,162],"pre",{"className":157,"code":159,"language":160,"meta":161},[158],"language-text","com.example.provalogin\u002F\n├── Model\u002F        ← 7 POJOs (Animal, Utente, Segnalazioni, Cure, Spesa, Image, Follow)\n├── Fragment\u002F     ← 20 Fragments (role homes, details, forms, QR scanner)\n├── Adapter\u002F      ← 8 RecyclerView adapters\n└── Recycler\u002F     ← utilities\n","text","",[96,163,159],{"__ignoreMap":161},[15,165,166,169,170,173,174,177,178,181],{},[18,167,168],{},"Localisation",": Italian by default, plus 4 more locales (EN, FR, ES, DE) via resource qualifiers (",[96,171,172],{},"values-en\u002F",", ",[96,175,176],{},"values-fr\u002F",", …). Language preference persisted in ",[96,179,180],{},"SharedPreferences",".",[10,183,185],{"id":184},"key-technical-decisions","Key technical decisions",[15,187,188,191],{},[18,189,190],{},"1. Firebase instead of a custom backend."," Deliberate choice: a team of 4 undergrads with one semester to ship needed to iterate on the domain (3 roles, reports, health record, QR), not write a backend from scratch. Realtime DB gives cross-device sync for free; Auth handles password reset and session persistence; Storage solves image uploads. The cost\u002Fbenefit is obvious for a coursework setting.",[15,193,194,197,198,201,202,205],{},[18,195,196],{},"2. Geolocated reports."," ",[96,199,200],{},"FusedLocationProvider"," is used to capture the user's position at the moment a report is created. Fine \u002F coarse location permissions declared in ",[96,203,204],{},"AndroidManifest.xml",", requested at runtime from API 23 onward. Coordinates are stored alongside the rest of the report record.",[15,207,208,211],{},[18,209,210],{},"3. QR codes for animal identification."," ZXing + CodeScanner libraries to generate and scan QR codes tied to individual animals. A vet can identify a registered animal without having to search manually.",[15,213,214,217,218,221],{},[18,215,216],{},"4. Serious i18n for a university project."," 5 supported locales — not as performative busywork, but because the domain touches non-Italian-speaking users (tourists, foreign residents, international volunteering). All UI strings externalised in ",[96,219,220],{},"strings.xml"," so non-developers can review them.",[15,223,224,227],{},[18,225,226],{},"5. Adapter \u002F Fragment separation of concerns."," 8 RecyclerView adapters specialised by data type (animals, reports, cures, expenses, images, users); 20 Fragments each focused on a single screen. No mega-classes creeping past 2,000 lines.",[10,229,231],{"id":230},"what-i-wouldnt-do-the-same-way-today","What I wouldn't do the same way today",[57,233,234,240,246],{},[60,235,236,239],{},[18,237,238],{},"No MVVM \u002F ViewModel \u002F LiveData",": the project is from 2023 but follows 2019 patterns. Today I'd use Jetpack Compose + ViewModel + StateFlow + Kotlin coroutines",[60,241,242,245],{},[18,243,244],{},"No local cache",": every screen refetches. Room + a sync strategy would improve offline UX",[60,247,248,251],{},[18,249,250],{},"Firebase Realtime DB"," for structured data is debatable: Firestore has more powerful queries and costs less on the frequent reads we do",[15,253,254,255,258],{},"But the point of a university project isn't to ship perfection — it's to ship something that works and learn what you'd do differently. This case study ",[41,256,257],{},"is"," that \"differently\".",[10,260,262],{"id":261},"numbers","Numbers",[57,264,265,272,290,296,305],{},[60,266,267,268,271],{},"~",[18,269,270],{},"5,500 lines of Java"," across 49 files",[60,273,274,277,278,277,281,277,284,277,287],{},[18,275,276],{},"41 XML layouts"," · ",[18,279,280],{},"8 activities",[18,282,283],{},"20+ Fragments",[18,285,286],{},"7 models",[18,288,289],{},"8 adapters",[60,291,292,295],{},[18,293,294],{},"3 user roles"," with dedicated homes",[60,297,298,301,302],{},[18,299,300],{},"5 locales"," (IT, EN, FR, ES, DE) · ",[18,303,304],{},"5 report types",[60,306,307,310],{},[18,308,309],{},"4 developers"," · one semester · ~67 commits",{"title":161,"searchDepth":312,"depth":312,"links":313},2,[314,315,316,317,318,319],{"id":12,"depth":312,"text":13},{"id":51,"depth":312,"text":52},{"id":87,"depth":312,"text":88},{"id":184,"depth":312,"text":185},{"id":230,"depth":312,"text":231},{"id":261,"depth":312,"text":262},"studies","md",false,null,{},true,20,"\u002Fprojects\u002Fen\u002Fpuppypad","2023","Mobile Software Development · BSc in Computer Science",{"title":5,"description":161},"puppypad",[333,334,335,336,337,338],"Android (Java)","Firebase (Auth · Realtime DB · Storage)","Google Play Services","ZXing (QR)","Glide","Multi-language (5 locales)","projects\u002Fen\u002Fpuppypad","Multi-role Android app for animal welfare — pet owners, vets and public entities collaborate on geolocated reports and a shared animal health record.","4qLJMn9mdm4oGt-fShimVpxy-UwZl-HxTxLZt7sMZ48",1781346783513]