{"id":20899345,"url":"https://github.com/davidemodolo/healthyplus","last_synced_at":"2026-05-13T13:52:58.365Z","repository":{"id":152556099,"uuid":"363963542","full_name":"davidemodolo/HealthyPlus","owner":"davidemodolo","description":"Applicazione sviluppata per il progetto di testi \"Healthy Plus - Riprogettazione ed evoluzione di un’applicazione per il monitoraggio di sani stili di vita.\" che si compone per ora di un modulo per il tracking di attività fisica e uno per la gestione dei pasti.","archived":false,"fork":false,"pushed_at":"2021-08-23T16:00:08.000Z","size":100409,"stargazers_count":1,"open_issues_count":0,"forks_count":2,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-06T02:09:24.949Z","etag":null,"topics":["android","fitness","fitness-tracker","health","kotlin","meal","meal-planner","workout","workout-tracker"],"latest_commit_sha":null,"homepage":"","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/davidemodolo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-05-03T14:48:40.000Z","updated_at":"2025-05-21T17:02:47.000Z","dependencies_parsed_at":null,"dependency_job_id":"37a3922b-d1c6-4a98-9961-bd9ee2485c58","html_url":"https://github.com/davidemodolo/HealthyPlus","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/davidemodolo/HealthyPlus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidemodolo%2FHealthyPlus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidemodolo%2FHealthyPlus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidemodolo%2FHealthyPlus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidemodolo%2FHealthyPlus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/davidemodolo","download_url":"https://codeload.github.com/davidemodolo/HealthyPlus/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/davidemodolo%2FHealthyPlus/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264465879,"owners_count":23612584,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","fitness","fitness-tracker","health","kotlin","meal","meal-planner","workout","workout-tracker"],"created_at":"2024-11-18T11:13:51.544Z","updated_at":"2026-05-13T13:52:53.340Z","avatar_url":"https://github.com/davidemodolo.png","language":"Kotlin","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Healthy Plus\n\nApplicazione sviluppata per il progetto di testi \"Healthy Plus - Riprogettazione ed evoluzione di un’applicazione per il monitoraggio di sani stili di vita.\" che si compone per ora di un modulo per il tracking di attività fisica e uno per la gestione dei pasti.\n\nData la natura open del progetto, di seguito sono riportate le istruzioni per aggiungere un nuovo modulo così come la struttura dei database.\n\n## Database in locale \n\nHo fatto una tabella per i pasti salvati di Meal Planner e una per gli allenamenti di Fitness Tracker.\n\nOgni tabella ha le entry che sono poi l'oggetto rispettivamente di tipo Meal e Workout (che si trovano nei file **Meal.kt** e **Workout.kt**).\n\n```kotlin\n@Entity(tableName = \"meals\")\ndata class Meal(\n    @PrimaryKey(autoGenerate = true)\n    var id: Int,\n    var name: String,\n    var foodList: String,\n    var date: String,\n    var ispreset: Boolean,\n    var isdone: Boolean\n)\n```\n\n```kotlin\n@Entity(tableName = \"workouts\")\ndata class Workout(\n    @PrimaryKey(autoGenerate = true)\n    var id: Int,\n    var name: String,\n    var exerciseList: String,\n    var date: String,\n    var ispreset: Boolean,\n    var isdone: Boolean\n)\n```\n\nPer la creazione ho utilizzato la libreria [\"Room\"](https://developer.android.com/training/data-storage/room) che necessita di alcuni componenti. Per quanto riguarda il modulo Meal Planner, le query sono nel file **MealDAO.kt**; vengono richiamate all'interno delle coroutine (ovvero dei processi paralleli per non appesantire quello principale) nella classe **MealRepository.kt** che a loro volta vengono richiamate nel progetto usando la **MealSharedViewModel.kt** in modo da avere l'accesso da qualsiasi punto del modulo Meal Planner. Discorso analogo per Fitness Tracker.\n\nPer aggiungere una nuova tabella, una soluzione può essere il copiare la cartella **mealdb** o **workoutdb** andando poi a modificare i necessari nomi.\n\n## Database NoSQL Firebase\n\nPer il backup online dei dati è stato utilizzato il \"back-end as service\" Firebase con una struttura del tipo:\n- raccolta dei documenti utente (ognuno con un userID come chiave):\n- - dentro il documento, sono presenti i campi della registrazione (_nome_, _cognome_, _email_ e _data di nascita_) e le raccolte relative ai dati dei moduli:\n- - - per ora, i dati presenti sono una lista di **Meal** nella raccolta \"meals\" e una lista di **Workout** nella lista \"workouts\".\n\nIn geneale la struttura si può semplificare come nell'immagine di seguito:\n\n\u003cimg src=\"https://github.com/davide-mod/HealthyPlus/blob/master/databasescheme.png\" width=\"400\" alt=\"Struttura Firebase\"\u003e\n\n-------\n\n## Come aggiungere un nuovo modulo\n\nPremessa: ho già inserito nel codice del progetto delle righe commentate di un ipotetico \"NuovoModulo\"\n\n##### Per aggiungere un nuovo modulo al progetto i passi sono essenzialmente 4:\n\n1. Creare un nuovo package (es. *com.modolo.healthyplus.nuovomodulo*) dove inserire tutti i fragment necessari con i relativi layout nella cartella */res/layout*\n\n2. Aggiungere al file _/res/navigation/_**nav_graph.xml** tutti i fragment che vogliamo utilizzare. Es: \n\n   ```xml\n   \u003cfragment\n       android:id=\"@+id/nuovoModuloFragment\"\n       tools:layout=\"@layout/fragment_nuovomodulo\"\n       android:name=\"com.modolo.healthyplus.nuovomodulo.NuovoModuloFragment\"\n       android:label=\"NuovoModuloFragment\" /\u003e\n   ```\n\n3. Aggiungere al file _/res/menu/_**item_nav_view.xml** l'oggetto che sarà poi selezionabile nel drawer (o hamburger menu). Es: \n\n   ```xml\n   \u003citem\n       android:id=\"@+id/itemNuovoModulo\"\n       android:icon=\"@drawable/icon_nuovomodulo\"\n       android:title=\"@string/nuovomodulo_title\" /\u003e\n   ```\n\n4. Modificare il file **MainActivity.kt** come segue: nel navigation listener aggiungere, per l'appunto, un nuovo listener: \n\n   ```kotlin\n   R.id.itemNuovoModulo -\u003e { //questo id è quello inserito nel /res/menu/item_nav_view.xml\n       findNavController(R.id.nav_host_fragment).navigate(R.id.nuovoModuloFragment)\n   }\n   ```\n\n##### Se poi si vuole poi rendere il nuovo modulo nascosto o visibile in base ad una \"SharedPreference\" bisogna effettuare un paio di passaggi extra:\n\n1. Modificare ulteriormente il file **MainActivity.kt** come segue:\n\n   1. aggiungere una nuova preferenza che determinerà la visibilità della voce \"Nuovo Modulo\" nel drawer: \n\n      ```kotlin\n      private val MOD_NUOVO_MODULO = \"nuovo\"\n      ```\n\n   2. nel metodo `onCreate` leggere la preferenza del punto 1. e impostare la visibilità nel drawer dell'elemento: \n\n      ```kotlin\n      val nuovoModulo = sharedPref?.getBoolean(MOD_NUOVO_MODULO, true)\n      setDrawerElementVisible(R.id.itemNuovoModulo, nuovoModulo!!)\n      ```\n\n2. Modificare il file _/res/layout/_**framgment_user.xml** aggiungendo la checkbox nel LinearLayout per selezionare la visibilità: \n\n   ```xml\n   \u003cCheckBox\n       android:id=\"@+id/checkNuovoModulo\"\n       android:layout_width=\"wrap_content\"\n       android:layout_height=\"wrap_content\"\n       android:layout_marginStart=\"@dimen/marginStandard\"\n       android:layout_marginTop=\"@dimen/marginStandard\"\n       android:text=\"@string/nuovomodulo_title\"\n       android:textSize=\"@dimen/buttonText\" /\u003e\n   ```\n\n3. Modificare il file _/userpage/_**UserFragment.kt** come segue:\n\n   1. aggiungere anche qui la preferenza: \n\n      ```kotlin\n      private val MOD_NUOVO_MODULO = \"nuovo\"\n      ```\n\n   2. recuperare il valore e modificare la checkbox del punto 2. (all'interno del metodo `onCreateView`): \n\n      ```kotlin\n      val checkNuovoModulo = linear.findViewById\u003cCheckBox\u003e(R.id.checkNuovoModulo)\n      val nuovoModulo = sharedPref?.getBoolean(MOD_NUOVO_MODULO, true)\n      checkNuovoModulo.isChecked = nuovoModulo!!\n      ```\n\n   3. modificare il `savePref.setOnClickListener{...}` aggiungendo la nuova preferenza: \n\n      ```kotlin\n      editor?.putBoolean(MOD_NUOVO_MODULO, checkNuovoModulo.isChecked)\n      (activity as MainActivity?)?.setDrawerElementVisible(R.id.itemNuovoModulo, checkNuovoModulo.isChecked)\n      ```\n\n##### Si può poi aggiungere una scheda nella schermata di login in un istante:\n\nHo predisposto due tipi di \"carte\" nella schermata di Login, singolo oggetto ma con due costruttori: uno con solo titolo, l'altro con titolo, descrizione, colore del titolo e id dell'immagine che si vuole impostare. Il codice si trova all'interno di _com.modolo.healthyplus/_**LoginFragment.kt** e consiste nell'aggiungere:\n\n- ```kotlin\n  cardList.add(LoginCard(\"Nuovo Modulo\"))\n  ```\n\n  oppure\n\n- ```kotlin\n  cardList.add(LoginCard(\n  \"Nuovo Modulo\",\n  \"Descrizione nuovo modulo\",\n  ContextCompat.getColor(requireContext(), R.color.main_nuovomodulo),\n  R.drawable.cardimg_nuovomodulo)\n  )\n  ```\n\nNel primo caso avremo una carta con titolo \"Nuovo Modulo\" nero e immagine stock, nel secondo una carta con lo stesso titolo, però impostato del colore \"main_nuovomodulo\", una descrizione e \"cardimg_nuovomodulo\" come immagine.\n\n-------\n\nIn ogni caso se si aprono i file sopra descritti si troveranno le righe di codice qui presenti, commentate.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidemodolo%2Fhealthyplus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdavidemodolo%2Fhealthyplus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdavidemodolo%2Fhealthyplus/lists"}