Add scanning

This commit is contained in:
Raffaele Mignone 2020-07-09 15:52:43 +02:00
parent 35190a2541
commit 5d2e7c8c02
Signed by: norangebit
GPG Key ID: F5255658CB220573

View File

@ -113,6 +113,35 @@ Per questo motivo si è scelto di utilizzare il livello LOW che permette di rile
### Scansione
Le operazioni di scansione sono meno limitate dalle funzionalità dell'API di android e per questo motivo si ha avuto maggiore libertà di scelta.
In particolare è stato possibile settare sia l'intervallo temporale che deve intercorrere tra una scansione e la successiva, sia la durata della singola scansione.
Si è scelto di far trascorrere un minuto tra una scansione e la prossima e di avere una scansione della durata di un secondo.
Per quanto detto già in precedenza in base ai vari dispositivi e alle varie condizioni di funzionamento l'intervallo tra una scansione e la prossima potrebbe essere più ampio rispetto a quello stabilito.
Entrambi i parametri sono stati settati tramite una costante in modo tale da rendere la configurazione del comportamento facilmente cambiabile.
Quando l'applicazione rivela un beacon nelle vicinanze esso viene trasmesso ad un'ulteriore componete applicativa tramite l'impiego del `LocalBroadcastManager` @BroadcastsOverview.
Questa componente non consuma direttamente il beacon, ma ha il compito di smistarlo ad ulteriori componenti in base alla modalità di funzionamento dell'applicazione.
Il codice necessario a smistare i dati di contatto è stato riportato nel listato @lst:contact-receiver.
Come si può notare a linea 2, la prima operazione consiste nel recupero dei dati di contatto dall'`Intent`, mentre dala linea 7 si seleziona la funzione da invocare in base alla modalità di funzionamento.
``` {.kotlin .numberLines #lst:contact-receiver caption="Codice necessario allo smistamento dei dati di contatto."}
// ...
val contactData = intent?.getSerializableExtra(CONTACT_DATA_KEY)
as ContactData?
val mode = getMod(context)
val onMode = when (mode) {
Mode.MOD_A -> this::contactOnModeA
Mode.MOD_B -> this::contactOnModeB
Mode.MOD_C -> this::contactOnModeC
}
onMode(context, contactData)
```
Nel caso della modalità *A* il beacon viene trasmesso alla classe `NetworkReceiver` che si occupa di trasmettere il contatto al server remoto.
Mentre nel caso delle modalità *B* e *C* il beacon viene consumato dalla classe `StoreReceiver` la quale si occupa della memorizzazione permanete del contatto all'interno di un database locale.
### Stima della distanza