Skip to content

Commit e50c8c6

Browse files
authored
Merge pull request #33 from SwevenSoftware/feature/android-developer-fix
improved android developer manual
2 parents 2bd7684 + f90645e commit e50c8c6

8 files changed

Lines changed: 63 additions & 48 deletions

File tree

assets/android/MVVM.png

18.1 KB
Loading

assets/android/class_diagram.png

-23.9 KB
Loading

manutentore/android/architettura.md

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,29 +17,50 @@ nav_order: 3
1717
{:toc}
1818
</details>
1919

20-
L'architettura scelta per l'applicazione mobile è il MVVM (Model View ViewModel).
21-
Questa architetura è ottima per separare logica da presentazione, ma non solo, è particolarmente utile per gestire con efficacia e scalabilità le chiamate API.
22-
Ogni funzionalità infatti segue questa architettura, con alcune aggiunte per soddisfare le necessità intrinseche ad ogni funzionalità.
23-
24-
Questo si denota dal nostro diagramma dei package:
20+
## Diagramma dei pacchetti
21+
Vediamo qui il nostro diagramma dei package:
2522

2623
![](/assets/android/package_diagram.png)
2724

28-
Il package "ui" gestiscono i file della view e del viewmodel, il package "data" gestisce il model e il package "services" contiene le interfacce API.
29-
Invece il package "res" contiene tutti i file xml e png per gestire l'aspetto e le icone dell'applicazione.
25+
I package all'interno di "ui" gestiscono i file della View e del Viewmodel e eventuali altre classi.
26+
Il package "data" gestisce il Model con le sue data class e le repositories.
27+
Il package "services" contiene le interfacce API, il NetworkClient e le data class per le risposte del server.
28+
Infine il package "res" contiene tutti i file xml e png per gestire l'aspetto, la navigazione e le icone dell'applicazione.
3029

31-
Nello specifico quindi ogni funzionalità ricrea il MVVM, come descritto in questo diagramma delle classi, specifico per la funzionalità UserRooms:
30+
## Pattern architetturale: MVVM
31+
L'architettura scelta per l'applicazione mobile è il MVVM (Model View ViewModel).
32+
Questa architetura è ottima per separare logica da presentazione, ma non solo, è particolarmente utile per gestire con efficacia e scalabilità le chiamate API.
33+
Ogni funzionalità infatti segue questa architettura, a volte con alcune aggiunte per soddisfare le necessità intrinseche di ogni funzionalità.
34+
Nello specifico quindi ogni funzionalità ricrea il MVVM, in cui si va a separare la UI dalla business logic:
35+
- la View utilizza linguaggi di markup, nel nostro caso .xml, e si utilizza il two-way data binding per comunicare con essa.
36+
- il ViewModel fa da intermediario tra il Model e la View grazie a LiveData. Invoca i metodi del Model per poi fornire i dati ottenuti alla View in una forma facilmente utilizzabile.
37+
- il Model comunica con il server e contiene dati e logica di validazione.
38+
39+
![](/assets/android/MVVM.png)
40+
41+
## Diagramma delle classi
42+
Vediamo ora un diagramma delle classi, in questo caso della funzionalità UserRooms ma utilizzato in generale da quasi tutte le pagine:
3243

3344
![](/assets/android/class_diagram.png)
3445

3546
Da questo diagramma possiamo vedere come sono implementati i metodi e le classi del MVVM.
36-
Per prima cosa viene creato il model, per gestire gli oggetti in entrata dal lato server.
47+
Per prima cosa viene creato il Model, per gestire gli oggetti in entrata dal lato server.
3748
La chiamata Get all'API viene fatta dall'interfaccia APIRooms, creata dalla UserRepository tramite il nostro Retrofit Builder, implementato nel file NetworkClient.
3849
In NetworkClient vengono anche gestiti i certificati http tramite la libreria Okhttp3.
39-
L'UserRoomsFragment gestisce assieme ai file XML la view e alla propria creazione, tramite un UserRoomsViewModelFactory, crea il nostro viewModel: UserRoomsViewModel.
50+
L'UserRoomsFragment gestisce assieme ai file .xml la View, con cui comunica tramite data binding. Alla propria creazione, tramite un UserRoomsViewModelFactory, crea il nostro ViewModel: UserRoomsViewModel.
4051
I dati che vengono ricevuti dal server tramite Retrofit vengono inseriti all'interno di LiveData, i quali vengono letti da UserRoomsFragment e UserRoomsViewModel tramite observers definiti nelle relative classi.
41-
Questi observers si occupano di gestire e notificare alla view i cambiamenti agli oggetti, in modo da poter aggiornare i dati visti dall'utente nell'applicazione.
52+
Questi observers si occupano di gestire e notificare alla View i cambiamenti agli oggetti, in modo da poter aggiornare i dati visti dall'utente nell'applicazione.
4253

4354
Come introdotto prima, ogni funzionalità ha dei bisogni aggiuntivi propri, in questo caso ad esempio è stato necessario implementare un UserRoomsAdapter per gestire dinamicamente gli oggetti della lista prenotazioni, implementata tramite uno standard RecyclerView.
4455

56+
## Espansione
57+
Vista la natura modulare di questa applicazione è possibile estenderla in modo semplice visto che ogni pagina è indipendente dalle altre. Se si volessero aggiungere ulteriori funzionalità
58+
è sufficiente seguire i pattern già utilizzati per le altre pagine e quindi avere:
59+
- un file .xml all'interno del package "layout";
60+
- creare un nuovo package all'interno di "ui", contenente almeno un Fragment ed un ViewModel che comunicano con il layout tramite data binding;
61+
- se si desidera utilizzare API del server, creare un'interfaccia all'interno di "apis", una Repository all'interno di "repositories" ed eventuali data class all'interno di "model" e "gsonReceive".
62+
Infine, una volta creata la nuova pagina, è possibile inserirla all'interno dei file nel package "navigation" per renderla accessibile da altre pagine tramite la navigazione standard di Android.
63+
64+
Seguendo la struttura dei package appena definita, è anche possibile aggiungere test di unità delle rispettive classi all'interno della cartella "com.sweven.blockcovid (test)".
65+
4566
{% include prev_next.liquid %}

manutentore/android/contribuzione.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,10 @@ Come indicato all'interno della sezione [Contributing del README](https://github
2323

2424
Modifiche al codice sorgente (per ogni _branch_ e per _Pull Request_) scatenano i processi di [_continuous-integration_](/glossario#continuous-integration) attraverso _GitHub Actions_, seguendo due workflow (`.github/workflows`):
2525
- `build-app`
26-
- Compila il codice
26+
- Compila il codice;
2727
- `detekt-analysis`
28-
- Esegue un'analisi statica del codice
28+
- Esegue un'analisi statica del codice;
29+
- `code-coverage`
30+
- Calcola la code coverage e la carica su [Codecov](https://codecov.io/).
2931

3032
{% include prev_next.liquid %}

manutentore/android/installazione.md

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,36 +33,19 @@ Per preparare l'ambiente di lavoro per lo sviluppo dell'applicazione mobile Bloc
3333
1. scaricare ed installare Android Studio, disponibile al seguente link: [Android Studio](https://developer.android.com/studio);
3434
2. scaricare l'ultima release dell'applicazione, in formato .zip, disponibile al seguente link: [BlockCOVID-Android](https://github.com/SwevenSoftware/BlockCOVID-android/releases);
3535
3. estrarne il contenuto in una cartella qualsiasi;
36-
4. tramite Android Studio, aprire la cartella in cui è stata estratta la release come progetto;
36+
4. tramite Android Studio, aprire la cartella in cui è stata estratta la release come progetto.
3737

38-
### Apk bundle
38+
### APK bundle
3939

40-
#### Android studio
40+
#### Android Studio
4141
{: .no_toc }
42-
Android studio offre la possibilità di realizzare un bundle `apk`
42+
Android Studio offre la possibilità di realizzare un bundle `apk`
4343
della propria applicazione direttamente all'interno dell'IDE. Questa
4444
funzione è disponibile all'interno di *Build > Generate signed
45-
bundle/APK*
45+
bundle/APK*.
4646

47-
#### Gradle
48-
{: .no_toc }
49-
Gradle permette di generare un bundle non firmato della propria
50-
applicazione tramite
51-
52-
```sh
53-
./gradlew assemble
54-
```
55-
56-
nella root del progetto. In questo caso per l'installazione su un
57-
dispositivo è necessario firmare l'applicativo generato (rialsciato da
58-
gradle nel percorso `app/build/output/apk`). È possibile firmare l'apk
59-
generato tramite il tool apksigner rilasciato ufficialmente dal team
60-
di sviluppo android. Maggiori informazioni sul suo utilizzo nella
61-
[documentazione
62-
ufficiale](https://developer.android.com/studio/command-line/apksigner)
63-
64-
### Testing
65-
È possibile testare il comportamento dell'applicazione sempre tramite Android Studio:
47+
## Esecuzione
48+
È possibile eseguire l'applicazione per testarne il comportamento sempre tramite Android Studio:
6649

6750
- Attivare la modalità debug sul proprio dispositivo Android;
6851
- fare la build del progetto tramite Android Studio tramite ***Build >

manutentore/android/tecnologie.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ Android SDK fornisce le librerie API e gli strumenti per sviluppatori necessari
2525

2626
- - -
2727

28-
### Kotlin 1.4.32
28+
### Kotlin 1.5.20
2929

3030
Kotlin è un linguaggio di programmazione general purpose, multi-paradigma, open source sviluppato dall'azienda di software JetBrains. Kotlin si basa sulla JVM (Java Virtual Machine) e dal 2019 viene utilizzato da Google per lo sviluppo Android.
3131

3232
[https://kotlinlang.org/](https://kotlinlang.org/)
3333

3434
- - -
3535

36-
### Gradle 6.5
36+
### Gradle 6.7.1
3737
Gradle è uno strumento di automazione della build open source progettato per essere abbastanza flessibile da creare quasi tutti i tipi di software. Gradle viene eseguito sulla JVM e per utilizzarlo è necessario disporre di un Java Development Kit (JDK)
3838

3939
[https://docs.gradle.org/current/userguide/userguide.html](https://docs.gradle.org/current/userguide/userguide.html)

manutentore/android/testing.md

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,22 @@ nav_order: 4
2020
## Test di unità
2121
I test di unità sono stati sviluppati utilizzando Junit e Mockito.
2222
Per eseguirli tramite Android Studio è sufficiente fare tasto destro sul file di test all'interno della cartella "com.sweven.blockcovid (test)" e cliccare su "Run Test with Coverage".
23+
Alternativamente è possibile eseguirli tramite JaCoCo tramite il comando:
24+
```sh
25+
./gradlew clean test jacocoTestReport
26+
```
27+
dalla root del progetto. Verrà generato un report con il code coverage all'interno della cartella "/app/build/reports/jacoco/jacocoTestReport/html/index.html".
2328

2429
## Test di sistema
25-
I test di sistema invece sono stati sviluppati tramite Espresso.
26-
Per eseguirli tramite Android Studio è sufficiente fare tasto destro sul file di test all'interno della cartella "com.sweven.blockcovid (androidTest)" e cliccare su "Run Test with Coverage".
27-
Prima di eseguire questi test è necessario fare il run sul dispositivo mobile o sulla macchina virtuale e assicurarsi di essere sulla pagina di login. Inoltre è necessario disabilitare le animazioni del dispositivo Android tramite le Opzioni sviluppatore.
30+
I test di sistema invece sono stati sviluppati tramite Espresso, situati nella cartella "/tests".
31+
Per eseguirli tramite Android Studio è sufficiente copiarli all'interno della cartella "androidTest", fare tasto destro sul file di test e cliccare su "Run Test with Coverage".
32+
Prima di eseguire questi test è necessario fare il run sul dispositivo mobile o sulla macchina virtuale e assicurarsi di essere sulla pagina di login.
33+
Inoltre è necessario disabilitare le animazioni del dispositivo Android tramite le Opzioni sviluppatore.
2834

2935
## GitHub Actions
30-
Il servizio di [Continuous Integration](/glossario#continuous-integration) che è stato deciso di utilizzare è GitHub Actions, fornito appunto da GitHub. Questo permette di creare dei workflow personalizzati, ovvero dei processi automatici creati sulla base delle proprie esigenze. Ciò ha l'obiettivo di automatizzare il ciclo di vita di sviluppo del software grazie ad un ampia gamma di strumenti e servizi.
36+
Il servizio di [Continuous Integration](/glossario#continuous-integration) che è stato deciso di utilizzare è GitHub Actions, fornito appunto da GitHub.
37+
Questo permette di creare dei workflow personalizzati, ovvero dei processi automatici creati sulla base delle proprie esigenze.
38+
Ciò ha l'obiettivo di automatizzare il ciclo di vita di sviluppo del software grazie ad un ampia gamma di strumenti e servizi.
39+
La code coverage viene automaticamente calcolata ed aggiornata ad ogni push su GitHub tramite [Codecov](https://codecov.io/).
3140

3241
{% include prev_next.liquid %}

manutentore/index.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,16 @@ Lo scopo del Manuale Manutentore è presentare le procedure di installazione e s
1515

1616
Il prodotto BlockCOVID permette di tracciare l'utilizzo di postazioni e stanze di lavoro all'interno di aziende.
1717
Il progetto si articola su 3 moduli:
18-
- [Server](/manutentore/server): espone le API utilizzate dai client Android e Web, fornisce la business logic e permette di persistere i dati su database e servizio blockchain,
19-
- [Android](/manutentore/android): permette ai dipendenti di prenotare ed utilizzare le postazioni di lavoro, e agli addetti alle pulizie di segnalare le stanze sanificate,
18+
- [Server](/manutentore/server): espone le API utilizzate dai client Android e Web, fornisce la business logic e permette di persistere i dati su database e servizio blockchain;
19+
- [Android](/manutentore/android): permette ai dipendenti di prenotare ed utilizzare le postazioni di lavoro, e agli addetti alle pulizie di segnalare le stanze sanificate;
2020
- [Web](/manutentore/web): mette a disposizione degli amministratori una piattaforma web per reperire informazioni sull'utilizzo delle postazioni, con possibilità di creare e modificare stanze e di generare i report che verranno aggiunti alla blockchain.
2121

2222
## Tipologie di utenti
2323

2424
All'interno del progetto vengono considerate 3 tipologie di utenti (si noti che ogni account può essere associato a più di una tipologia di utente):
25-
- **User**: generalmente associato ad un dipendente, permette di effettuare prenotazioni ed utilizzare le postazioni
26-
- **Cleaner**: tipologia di utente utilizzato dagli addetti alle pulizie per segnalare la sanificazione delle stanze
27-
- **Admin**: utenti che hanno permessi di modifica di stanze e account, nonché di visualizzazione di tutte le prenotazioni presenti nel sistema
25+
- **User**: generalmente associato ad un dipendente, permette di effettuare prenotazioni ed utilizzare le postazioni:
26+
- **Cleaner**: tipologia di utente utilizzato dagli addetti alle pulizie per segnalare la sanificazione delle stanze:
27+
- **Admin**: utenti che hanno permessi di modifica di stanze e account, nonché di visualizzazione di tutte le prenotazioni presenti nel sistema.
2828

2929
## Riferimenti informativi
3030
- [Documentazione Spring](https://spring.io/projects/)

0 commit comments

Comments
 (0)