Sei sulla pagina 1di 26

Model API

Per interfacciare client e server viene definita uninterfaccia condivisa per la comunicazione. Vengono quindi definite una serie di interfacce e classi astratte condivise sia dal client che dal server di backend. Ogni classe provvista di un serializzatore XML, in grado di creare una rappresentazione delloggetto trasportabile su rete e di deserializzare lo stesso. Gli oggetti del dominio applicativo sono i seguenti: User: un utente del sistema, importato da Facebook e possessore di un ID, un nome e un certo numero di interessi. Interest: un interesse, anchesso importato da Facebook e corrispondente ad una pagina a cui lutente ha messo Mi Piace. E fornito di un ID univoco, un nome e una categoria. Preferences: una mappa associativa contenente le preferenze dellutente Position: una posizione geografica, associata ad un utente UserQuery: rappresentazione di uninterrogazione su un insieme di utenti. Permette di combinare in AND logico pi criteri di interrogazione, quali una lista di ID degli utenti da recuperare, una lista di interessi da possedere, un certo grado di compatibilit con un utente dato (Compatibility) o la presenza degli utenti entro una certa area geografica (Neighbourhood).

Escludendo una parte definita nella libreria comune, limplementazione varia a seconda della piattaforma in uso: lato server viene implementata la persistenza degli oggetti sul Datastore e le UserQuery si traducono in interrogazioni sul database; lato client le interrogazioni vengono effettuate tramite chiamate remote alle API. La creazione degli oggetti viene astratta dallimplementazione in uso tramite il factory pattern. La libreria stata testata, nelle sue due implementazioni (lato server e client), tramite test JUnit, per assicurare che le implementazioni siano coerenti con le specifiche, oltre che per testare laccuratezza dei formati di serializzazione. Maggiori approfondimenti sul formato di serializzazione per ogni classe e dei metodi supportati, si invita il lettore a fare riferimento alla documentazione del package it.unisannio.aroundme.model.

Client Android
Async API
Data la natura network-bound dellapplicazione, stato necessario sviluppare un sistema efficiente per lesecuzione asincrona dei task. Le applicazioni Android hanno la peculiarit di essere eseguite pressoch integralmente da un singolo thread: la UI non thread-safe e ogni manipolazione sulla stessa va effettuata nel thread principale in cui questa vive (main thread o UI thread). Questo pone dei problemi di sincronizzazione nel momento in cui si rende necessario aggiornare linterfaccia utente con i dati recuperati dalla rete. La piattaforma Android permette nativamente di mandare messaggi da eseguire sul main thread e fornisce una classe semplificata per eseguire task in background i cui risultati devono trovare applicazione nellUI thread (AsyncTask). Essa per presenta alcuni problemi di performance nel caso in cui vengano avviati molti task contemporaneamente (es. numerose immagini mostrate contemporaneamente in una griglia). Inoltre il modello duso abbastanza rigido (estensione di una classe con override di metodi per definire loperazione da svolgere in background e lazione da compiere nel main thread a task completato) ci ha indotti a ricercare una soluzione alternativa per poter avere un maggior riutilizzo di codice e una logica maggiormente disaccoppiata. Il package it.unisannio.aroundme.async contiene pertanto alcune classi di utilit ampiamente utilizzate nel codice client, che sfruttano le API per la concorrenza messe a disposizione da Java (java.util.concurrent) per implementare in modo flessibile lesecuzione in background delle operazioni. AsyncQueue: una classe in grado di eseguire in maniera dei task in background utilizzando un pool di thread di dimensioni configurabili. Offre la possibilit di mettere in pausa e riprendere lesecuzione dei task messi in coda. ListenableFuture: unimplementazione di java.util.concurrent.Future che notifica un listener nel main thread (o in un altro thread configurabile che supporti il Thread Looper pattern utilizzato da Android) al termine dellesecuzione di un task in background. Permette inoltre di interrompere un task in esecuzione e di ottenere informazioni sullo stato dello stesso (terminato correttamente, terminato con errori). FutureListener: uninterfaccia che definisce due metodi che ricevono eventi circa lesecuzione di un task in background (in caso di successo e di errori).

I task da eseguire sono disaccoppiati dalle Async API: pu essere eseguito in background qualsiasi classe che implementi java.util.concurrent.Callable<T>. Per i dettagli sullutilizzo delle API si rimanda il lettore alla Javadoc inclusa nel progetto.

Network Helpers
Si sono definite alcune classi di utilit che permettono di interagire in modo conveniente con la rete e il server di backend, oltre che supportare lesecuzione asincrona tramite le Async API. HttpTask e HttpStatusException: Definisce un client HTTP sulla base di HttpURLConnection, offrendo uninterfaccia semplificata per la lettura e la scrittura di oggetti utilizzando il protocollo HTTP come mezzo di trasporto. Identity: Decorator per User, che aggiunge alcuni metodi per memorizzare il token di accesso necessario allautenticazione e per effettuare il login Picture: Client per le immagini fornite da Facebook per utenti e pagine. Recupera dalla rete le immagini necessarie, le decodifica e le mette in una cache in memoria (secondo una logica LRU) per minimizzare gli accessi in rete. Fornisce un metodo di utilit per aggiornare asincronamente delle ImageView con le immagini recuperate dalla rete, gestendo in modo corretto eventuali problemi di concorrenza dovuti al riciclo delle viste.

Analisi dell'interfaccia utente


Panoramica delle viste
Lapplicazione composta da quattro viste principali e una vista di servizio Viste principali Vista Lista La vista Lista consente di: o Visualizzare un listato di tutti utenti intorno a te o Impostare il filtro di visualizzazione tramite linguetta (Eccetto in caso di notifica) o Accedere al profilo di ogni utente visualizzato o Visualizzare nome, foto, distanza e compatibilit di ogni utente in lista o Accedere alle impostazioni e al profilo personale tramite menu o Passare alla vista mappa tramite ActionBar o Passare al profilo personale tramite ActionBar Vista Mappa La vista Mappa consente di o Visualizzare la posizione geografica di ogni utente o Impostare il filtro di visualizzazione tramite linguetta (Eccetto in caso di notifica) o Accedere al profilo di ogni utente visualizzato o Visualizzare compatibilit, nome e foto di ogni utente visualizzato o Accedere alle impostazioni e al profilo personale tramite menu o Passare alla vista lista tramite ActionBar o Passare al profilo personale tramite ActionBar Vista Profilo La vista profilo consente di: o Visualizzare nome e foto di un utente o Accedere al profilo Facebook di un utente o Visualizzare tutti gli interessi di un utente o Passare alla vista lista o alla vista mappa tramite menu o Accedere alle impostazioni tramite menu Preferenze Nelle preferenze possibile o Abilitare/disabilitare il servizio notifiche o Selezionare la suoneria della notifica o Abilitare / disabilitare la vibrazione in caso di notifica o Selezionare il livello di compatibilit minima o Selezionare la distanza massima di rilevamento o Abilitare / disabilitare il tracking della posizione o Uscire dall applicazione disabilitandone i servizi o Rimuovere laccount dal server Viste di servizio AroundMe provvista di una sola vista di servizio: Vista login o Iscrive un utente al servizio o Ottiene i permessi per lutilizzo dei dati di Facebook o Accede ad un account preesistente o Controlla il funzionamento del servizio di localizzazione

Vista lista
Questa la vista che si presenta allavvio dell applicazione. In questa vista possibile visualizzare tutti gli utenti che si trovano attorno a te e che rispettino i criteri di visualizzazione. Per ogni utente possibile visualizzare la distanza e la compatibilit.

inoltre possibile accedere alla vista profilo dedicata ad ogni singolo utente e modificare il filtro di visualizzazione aprendo la linguetta in basso al centro. Layout Il layout definito all interno del file listview.xml il quale composto dalla seguente struttura:
FrameLayout ListView
list_entry list_entry ...

Ogni entry della vista lista definita nel file list_entry.xml a sua volta composta in questo modo:

LinearLayout (Hor) LinearLayout (Ver)


ImageView imgPhoto TextView txtName

LinearLayout (Hor)
TextView txtDistance TextView txtCompatibility

Linflating degli elementi della lista gestita da un ArrayAdapter che carica per ogni utente le relative informazioni esso definito in it.unisannio.aroundme.adapters.UserAdapter. Consultare la javadoc per maggiori informazioni sull utilizzo di UserAdapter.

Vista Mappa
Questa vista permette allutente di visualizzare le persone nella loro posizione ed eventualmente accedere alle informazioni rapide delle persone visualizzate, cliccando sul marker, oppure visualizzarne il profilo in vista profilo. Le informazioni rapide sono visualizzate all interno di un balloon che si genera al click di un marker. Cliccando sul balloon si accede alla vista profilo della persona selezionata.

Layout Il layout di questa vista definito nel file map_view.xml ed composto nel seguente modo:

Frame Layout
com.google.android.maps.MapView map

Al click di un marker compare un balloon che a sua volta definito in user_balloon_overlay.xml seguendo questo schema strutturale:
LinearLayout (Hor) balloon_main_layout LinearLayout (Ver) balloon_inner_layout
ImageView balloon_overlay_close ImageView balloon_item_image TextView balloon_item_title TextView balloon_item_snippet

LinearLayout (Hor)

L inflating del balloon gestita da it.unisannio.aroundme.overlay.UserBalloonOverlayView che estende BalloonOverlayView. Per maggioni informazioni consultare la javadoc riguardo UserBalloonOverlayView.

Vista Profilo
Questa la vista dedicata alla visualizzazione in dettaglio di ogni utente. possibile accedere a questa vista da qualsiasi punto dell applicazione. La vista composta da una parte di intestazione fissa che contiene la foto, il nome e il link al profilo Facebook. Inoltre possibile visualizzare gli interessi dell utente sulla griglia nella parte inferiore della vista. Ogni interesse rappresentato in questo modo:

Layout
Il layout della vista definito in profileview.xml e segue questa struttura che per ragioni di spazio necessario suddividerla in due parti:

LinearLayout (Ver)
View
RelativeLayout
relativeLayout1

View

TextView
txtLikeBar

View

GridView
grdInterests

Esplodendo relativeLayout1:

LinearLayout(Hor) LinearLayout(Ver)
ImageView imgPhoto TextView txtName ImageView imgfbProfile

Ogni elemento di grdInterests definito in like_grd_elem.xml con questa struttura:

LinearLayout
ImageView ImgInterest TextView txtInterest

Linflating del singolo interesse viene gestito da it.unisannio.aroundme.adapters.InterestAdapter che si occupa di caricare e visualizzare correttamente ogni interesse allinterno della vista. Per maggiori informazioni consultare la javadoc di InterestAdapter.

Vista Preferenze
In questa vista possibile gestire le impostazioni dell applicazione dalla suoneria alle preferenze di notifica da parte del server. anche possibile chiudere completamente lapplicazione ed eliminarsi del servizio.

Layout A differenza delle altre viste, questa ha un layout predefinito negli schemi di Android come PreferenceActivity. Per AroundMe, utilizzata una versione modificata (SherlockPreferenceActivity) per supportare lActionBarSherlock. I settaggi dellActivity sono comunque definiti nel file res>xml>preferences.xml con una sintassi leggermente diversa da quella di uno dei layout visti precedentemente.

PreferenceCategory o CheckBoxPreference (notification.active) o RingtonePreference (notification.sound) o CheckBoxPreference (notification.vibrate) o it.unisannio.aroundme.widgets.RankSliderDialogPreference (query.rank) o it.unisannio.aroundme.widgets.RadiusSliderDialogPreference (query.radius) PreferenceCategory o CheckBoxPreference (tracking.enabled) o Preference (logout) o Preference (delete)

Fragment Activity
Per includere lo stesso elemento in diverse viste, si ricorre ad una activity indipendente che estenda Fragment. Questo il caso del drawer ovvero la linguetta in basso che consente di personalizzare la query di visualizzazione all interno di una delle due viste di insieme. Il drawer infatti definito come Fragment in it.unisannio.aroundme.activities.UserQueryFragment. Unaltra delle peculiarit di questa vista la possibilit di passare da un filtro ad un altro tramite lo scorrimento a destra e a sinistra.

Per questa ragione stato necessario suddividere ulteriormente questa vista in altre due componenti: uno per gestire la tolleranza ed uno per gestire il filtraggio. Layout Il layout introduce un nuovo elemento: il ViewPager, che consente di fare lo slide tra diverse view. Il layout composto in questa maniera: Fragment Drawer ViewPager filters_page_interest fiilters_page_nearby

Il ViewPager utilizza it.unisannio.aroundme.adapters.ArrayPagerAdapter per maggiori informazioni si rimanda alla javadoc Filters page interest Questa view definita in filters_page_interest.xml ed rappresentata in questo modo:

LinearLayout (Ver)
View ListView listInterestFilter

Ogni elemento del listInterestFilter definito nel file interest_filter_entry.xml in questo modo:

LinearLayout (Hor)
CheckBox checkUsed ImageView imgMyInterest TextView txtMyInterest

Anche questi elementi sono gestiti da un adapter che tiene in considerazione lo stato della UserQuery definito in it.unisannio.aroundme.adapters.InterestFilterAdapter. Per approfondimenti consultare la javadoc.

Filters page nearby Questa view definita in filters_page_nearby.xml ed rappresentata in questo modo:

LinearLayout (Ver)
View TextView textView1 slider_view_radius sliderDistance View TextView textView2 slider_view_rank sliderCompatibility

slider_view_radius e slider_view_rank sono a loro volta definiti rispettivamente in slider_view_radius.xml e slider_view_rank.xml

Servizio di tracciamento
Allavvio dellapplicazione, viene avviato un servizio in background che periodicamente invia la posizione corrente dellutente dal server. Il servizio rileva la posizione solo per spostamenti di 5 metri e ad intervalli minimi di 60 secondi, costanti definite in un file di configurazione. Rilevazioni pi distanziate nel tempo e nello spazio comportano un miglioramento della durata della batteria, a discapito di una minore accuratezza. Vengono utilizzati, se disponibili, sia il GPS che il Network Provider e le misurazioni effettuate dai due servizi vengono interpolate per ottenere una stima quanto pi possibile accurata della posizione. Ad ogni rilevazione ritenuta affidabile, il servizio provvede ad aggiornare la posizione dellutente sul server di backend.

Servizio di notifica
Il C2DM offre una libreria client, che permette di creare un servizio in background che riceve eventi dal server remoto, quali larrivo di un nuovo messaggio, la registrazione e la deregistrazione del dispositivo, eventuali errori. Ogni dispositivo ha un ID univoco associato, assegnato dal server remoto, che nella nostra implementazione viene associata allutente e viene impiegata per inviare una notifica al device Android. Alla ricezione di un messaggio remoto, viene visualizzata una notifica nella barra di sistema, che rimandando al profilo dellutente (singolo utente) o alla vista in lista (notifica aggregata di pi utenti).

Server
Google App Engine
Lapplicazione utilizza, come back-end server, Google App Engine. Il Google App Engine una piattaforma di hosting che consente di avviare web applications sollevando gli sviluppatori dai problemi relativi alla gestione e alla manutenzione del server al variare dei volumi di traffico. Tutte le web applications che utilizzano un dominio .appspot.com, che non superino 1 GB di storage e che ricevono meno di 5 milioni di visite al mese, possono essere hostate gratuitamente. Oltre tali limiti, il prezzo del servizio varia in relazione al traffico ricevuto e allo spazio occupato. Il Google App Engine supporta diversi tipi di linguaggi di programmazione tra cui il Pyton e Java. Tramite il Java Runtime Environment dellApp Engine, possibile sviluppare applicazioni che utilizzino tecnologie quali Java Servlets e Java Server Pages (JSP). Le web applications sono eseguite in uninfrastruttura che limita alcune operazioni quali lapertura di socket o laccesso al sistema operativo sottostante. Tali operazioni lanciano una RuntimeException. Le ultime versioni del Google App Engine utilizzano Jetty come servlet container, prediligendolo soprattutto per la flessibilit e le dimensioni contenute.

Storage
Il Google App Engine utilizza per la persistenza dei dati, un Datastore distribuito non relazionale. Essendo distribuito e avendo la necessit garantire prestazioni ottimali e tempi di accesso quanto pi costanti possibili, il Datastore non permette operazioni dispendiose quali join e filtri di diseguaglianza multipli. Gli oggetti da persistere sono rappresentati, nel Datastore, come entit schemaless: [spiegare che significa, io non lho capito]. Per poter interagire col Datastore vengono utilizzate JDO e JPA unite ad API di basso livello fornite da Google. Per poter lavorare con pi facilit sul Datastore, Google consiglia di utilizzare un framework di alto livello per lavorare direttamente su POJO. Tra i vari frameworks proposti da Google, stato adottato Objectify (http://code.google.com/p/objectifyappengine/). Ci che ne ha influenzato la scelta stata la sua semplicit, eleganza e valida documentazione.

Task Queue
Per eseguire operazioni in background asincrone, il Google App Engine fornisce uno strumento detto Task Queue. Una Task costituita da una Servlet che implementa, tipicamente nel metodo doPost, le operazioni che si vogliono eseguire in background. Le Servlet che agiscono da Task, vengono definite nel file war/WEB-INF/queue.xml. Una Task viene avviata nel seguente modo:

Queue queue = QueueFactory.getQueue("nomeQueue"); queue.add(TaskOptions.Builder.withUrl("/path/to/task").param("key", value));

Tramite il metodo .withUrl() viene fornito lURI della Servlet che agisce da task; tramite il metodo .param() vengono forniti eventuali parametri al task. Le Task sono state utilizzate per eseguire in modo asincrono le operazioni di invio di una notifica al device tramite Android Cloud to Device Messaging Framework.

Android Cloud to Device Messaging Framework


LAndroid Cloud to Device Messaging Framework(C2DM) un servizio fornito da Google che consente linvio, in push, di dati di piccole dimensioni da server verso un dispositivo Android su cui sia presente un Account Google. Date le dimensioni limitate del messaggio che pu essere inviato sul dispositivo (1024 bytes), lutilizzo ideale del servizio quello di notificare al dispositivo la presenza di dati o di aggiornamenti. competenza dellapplicazione recuperare tali dati. Per permettere al server utilizzare tale servizio, bisogna richiedere un token di autorizzazione al ClientLogin server di Google. Il device, tramite delle API fornite da Google, ottiene un codice univoco che lo identifica detto registrationId. Il registrationId deve essere inviato, dunque, al server. A questo punto, il server in grado di mandare messaggi al device effettuando una richiesta verso lURL: https://android.clients.google.com/c2dm/send includendo tra i parametri i dati da inviare al dispositivo, il token di autorizzazione del server e il regitrationId che identifica il device.

RESTful
Il protocollo di comunicazione tra device e server, utilizza lo stile REST. REST (Representational state transfer) uno standard di comunicazione che permette la manipolazione di risorse in remoto. Tale manipolazione avviene tramite i metodi HTTP: GET POST PUT e DELETE. Tale standard prevede un header HTTP e un body spesso codificato in formato XML o JSON. Il funzionamento basilare, in quanto si effettua una richiesta al server specificando il metodo e la risorsa nella request line HTTP. Eg: request line contenente una richiesta di un utente al server HTTP/1.1 GET user/ID In risposta il server restituir una rappresentazione della risorsa utente, nel nostro caso codificata in xml.

RESTful Server
Il Server composto dalle seguenti Servlets tali da implementare il protocollo REST: UserServlet PreferencesServlet PositionServlet

UserServlet (mappata su /user/*)


Servlet utilizzata per la registrazione, la cancellazione e il querying degli utenti. Metodi implementati: doPut: Utilizzato per la registrazione di un utente sul server o Richiesta: LURI deve essere /user/ Il body deve contenere lxml che descrive lutente da registrare. o Risposta: 200 - se loperazione andata a buon fine; 500 - in caso di errori. doDelete: Utilizzato per la cancellazione di un utente dal server o Richiesta: LURI deve essere /user/[userId] Dove [userId] lid dellutente da cancellare o Risposta: 200 - se loperazione andata a buon fine 401 - se luserId non valido 404 - se lutente non stato trovato 500 - in caso di errori doPost: Utilizzato per lesecuzione di una query o Richiesta: LURI deve essere /user/ Il body deve contenere lxml che descrive la query da effettuare. o Risposta: 200 -Restituisce nel body un xml rappresentante una collezione contenente gli utenti ottenuti dalla query; 500 - in caso di errori.

PreferencesServlet (mappata su /preferences/*)


Servlet utilizzata per la gestione delle preferenze degli utenti. Metodi implementati: doPost: Utilizzato per assegnare le preferenze ad un utente o Richiesta: LURI deve essere /user/[userId] Dove [userId] lid dellutente al quale si vogliono assegnare le preferenze Il body deve contenere lxml che descrive le preferenze da associare allutente. o Risposta: 200 - se loperazione andata a buon fine 401 - se luserId non valido 404 - se lutente non stato trovato 500 - in caso di errori doGet: Utilizzato per ottenere le preferenze di un utente o Richiesta: LURI deve essere /user/[userId] Dove [userId] lid dellutente di cui si vogliono ottenere le preferenze o Risposta: 200 - Restituisce nel body un xml rappresentante le preferenze dellutente 401 - se luserId non valido 404 - se lutente non stato trovato 500 - in caso di errori

PositionServlet (mappata su /position/*)


Servlet utilizzata per la gestione delle posizioni degli utenti. Metodi implementati: doGet: Utilizzato per ottenere la posizione di un utente o Richiesta: LURI deve essere /user/[userId] Dove [userId] lid dellutente di cui si vuole ottenere la posizione o Risposta: 200 - Restituisce nel body un xml rappresentante la posizione dellutente 401 - se luserId non valido 404 - se lutente non stato trovato 500 - in caso di errori doPost: Utilizzato per attribuire una posizione ad un utente. Inoltre esegue le task che si occupano di inviare una notifica agli utenti compatibili nelle vicinanze. o Richiesta: LURI deve essere /user/[userId] Dove [userId] lid dellutente al quale si vuole attribuire una posizione Il body deve contenere lxml che descrive la posizione allutente. o Risposta: 200 - se loperazione andata a buon fine 401 - se luserId non valido 404 - se lutente non stato trovato 500 - in caso di errori

Larchitettura server inoltre costituita da un ServletContextListener utilizzato per definire, in fase di caricamento del servlet container, alcune impostazioni necessarie per lutilizzo del Datastore come, ad esempio, la registrazione delle entit da indicizzare.

Autenticazione
Il server inoltre comprende un Servlet Filter mappato in modo tale da filtrare tutte le richieste ricevute. Il Filter stato implementato affinch blocchi tutte le richieste verso Servlet che non includono nellheader un valido AccessToken di Facebook. Le richieste verso Task della TaskQueue sono invece lasciate passare.

Appendice A Risultati unit test

Appendice B-GitLog
Danilo Iannelli (41):
Rimozione di import non necessari Risoluzione errori del Build Path del Client Android Riaggiunti alcuni files che erano stati inavvertitamente rimossi Refactoring dei progetti come "App Engine Connected Android Project" Implementate alcune interfacce lato server Migliorate implementazioni interfacce lato Server Implementato UserQuery compreso algoritmo di vicinanza Aggiunto metodo per il calcolo della compatibilit Finito di implementare UserQueryImpl e InterestQueryImpl Quache fix al Java BuildPath dei progetti Implementata UserQueryServlet, Migliorata UserQueryImpl, Fix Minori Aggiunto metodo per la scrittura di un DOM XML su OutputStream Aggiunte classi per l'invio di notifiche C2DM e PositionReceiverServlet Adeguamento di alcune classi all'ultimo refactoring delle Model API C2DMNotificationSender, Google TaskQueue, Mapping Servlet, ServletFilter, ServletContextListener, ModelFactory Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Minor fixes Minor Fixes Rislti alcuni problemi lato server Corretti alcuni bug lato server ed effettuato un refactoring sui package del progetto. Effettuato deployment su http://aroundme-backend.appspot.com/ Minor Fixes Reimplementata query sulla Posizione considerando che il Datastore non supporta l'utilizzo di pi filtri di disuguaglianza (<, <=, >=, >, !=) nella stessa query. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Inzio testing Appengine, Ottimizzazione query, Documentato Geomodelling Gestione Preferences, PreferencesServlet, cambiato mapping Servlet, Gestione registrationId C2DM, gestione DELETE UserServlet Fine implementazione, a meno di eventuali bug, di PositionQueryTask e C2DMSenderTask. Effettuato nuovo deploy su Appengine. Il Datastore stato svuotato per poter adeguare gli User al nuovo formato che prevede la gestione delle Preferences. Fix Vari su Logger e messaggi di errore. C2DMAuthenticationUtil, Correzione C2DMMessageReceiver e C2DMRegistrationReceiver, Fix Vari Fix MapViewActivity Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Corretta BalloonItemizedOverlay per migliorare la visualizazzione del Balloon Migliorato sistema di notifiche Status Bar Notifications Gestita Registrazione al servizio C2DM Aggiunto metodo per passare da SharedPreferences a it.unisannio.model.Preferences Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Corretto sistema di ricezione di messaggi push C2DM Fixato sistema di notifiche, cambiata versione Appengine API, Fix vari Aggiunta javadoc; PositionQueryTask con Preferences; modificato web.xml Metodi C2DMReceiver.unregister e register, gestita assenza GoogleAccount

TestCase Servlets, Correzione bug servlets, correzione javadoc Refactoring e Javadoc test entit e UserQuery; persistenza ServletTests Merge branch 'master' of http://projects.wootwoot.it/git/aroundme o Corretto bug nell'invio delle notifiche, corretto zoomToSpan Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Test Servlets con Jetty, aggiunti test per ServletFilter

Giuseppe Fusco (2):


Aggiunto GPSTrackingService Aggiunti C2DMMessageReceiver e C2DMRegistrationReceiver

Marco Magnetti (35):


Interfaccia grafica client Android Fixed repository setup modified some icons Inizio a scrivere ProfileActivity.java seguendo il modello fornito. NOT TESTED * Importazione foto in profile view * Intent gestito * Mock method per importazione dei dati da server *Aggiunto l'adapter per Interests *Aggiunta la visualizzazione degli Interests in profile view *Aggiunto file like_grid_elem.xml in repo *Aggiunto file InterestAdapter.java in repo Merge * Aggiunta MapView * Inserito pulsante action bar "to map view" * alcune modifiche su Profile View Merge branch 'master' of http://projects.wootwoot.it/git/aroundme * inizio creazione schermata filtri * formattazione della griglia likes Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Problem fix * Aggiunto slider drawer_contents.xml * Creato adapter per la visualizzazione dei filtri * Varie migliorie grafiche Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Aggiunti Drawable Aggiornata barra a step di 100m Inserito N/A in caso di errore di calcolo della distanza Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Finalmente aggiunto il filtro interessi Minor fixes Eliminato pulsante connect with facebook Inizio integrazione con userQuery e servizi GPS un passo indietro A little refactoring! Interfacciamento completo con UserQuery Aggiornato adapter per i filtri Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Nuovo set di icone!! Merge branch 'master' of http://projects.wootwoot.it/git/aroundme sorry Unificato il menu icone linking con Facebook

Merge branch 'master' of http://projects.wootwoot.it/git/aroundme any fixes Merge branch 'master' of http://projects.wootwoot.it/git/aroundme fixato il calcolo della percentuale Merge branch 'master' of http://projects.wootwoot.it/git/aroundme

Michele Piccirillo (109):


API A Merge branch 'master' of http://projects.wootwoot.it/git/aroundme First commit Test Test Serializer Merge branch 'master' of http://m@projects.wootwoot.it/git/aroundme.git Supporto preliminare ai formati di serializzazione. Some serializer implementation, changed Serializer interface. Aggiunti i serializer mancanti. Manca ancora SerializerUtils.COLLECTION_SERIALIZER Aggiunto Serializer per Collection<T extends Entity>. Minor typo. Added proper .gitignore file Modified .gitignore Removed *.class from repository Refactoring, default impl. Riorganizzazione progetti. Fixed warnings, started implementing Android Model API Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Risistemate le impostazioni di Eclipse Iniziale implementazione API client. Continuo implementazione lato client model API, abbozzo LoginActivity Aggiunto il Facebook SDK, primo login. Minor fixes. Aggiunti Facebook SDK (fix), ActionBarSherlock Added Facebook SDK res, Initial JUnit for Model API, PersistenceService Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Refactor Model API, UserAdapter, DataService. Aggiunta delle ActionBar, ottimizzazioni e fix sparsi. Corretta la parametrizzazione di SerializerUtils#getCollectionSerializer Refactor n.2 delle Model API, semplificazione strutturale, auto login Testing repository Merging branches. Preferences, cached UserQuery, Filter drawer, Identity Merge Aggiunta l'importazione del profilo da Facebook Aggiunto ListViewActivity#onOptionsItemSelected(MenuItem) Aggiornamento librerie ActionBarSherlock, minor fix Merge branch 'master' of http://projects.wootwoot.it/git/aroundme

Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Minor fixes Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Refactoring del servizio di esecuzione in background, altre fix. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Riscrittura del servizio di tracciamento per renderlo funzionante. Aggiunto un fix per il problema di concorrenza delle immagini. Migliorata cache delle Picture, fix ids.xml Risolti i bug introdotti negli ultimi commit. Corretta la chiave per le Google Map. Modifiche minori. Ant buildfile per le Model API, inizio scrittura JUnit Test. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Refactor Serializer, primi test JUnit, pulizia AroundMe-AppEngine Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Ant Buildfile per il deploy delle Model API in AroundMe-AppEngine Aggiunti equals() ai Model. Fix in ListViewActivity. Terminati i JUnit test su tutti i serializzatori. Corretti alcuni bug minori. .gitignore, staging delle librerie Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Pochi altri cambiamenti nella struttura dei package. Registrazione utente, Convertiti JUnit Test a ver. 3, workaround DOMException Lavoro sulla MapView. Minor fixes. Calcolo della compatibilit sulla media degli insiemi degli interessi. Fix nelle Model API. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Aggiunte preferenze (stub). Refactoring completo filtri. Diverse migliorie e fix. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Fixed NullPointerException in PositionTrackingService. Aggiornato Setup#BACKEND_POSITION_PATH alla nuova posizione. Migliorati i messaggi di log. Aggiunta persistenza a UserQueryFragment. Aggiunto a MapViewActivity. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Avanzamento nella PreferencesActivity. Cambiata la distanza da float a int. Cambiamenti minori. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Refactoring ListViewActivity. Spostato l'esecutore di query in un fragment. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme L'applicazione attende il rilevamento di una posizione per avviarsi. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Resa funzionante la MapViewActivity. Fix per possibile NullPointerException in Preferences. Revisione del codice. Risolto il bug della query non eseguita all'apertura. Esternalizzate alcune stringhe. Migliorato lo snippet per il balloon dell'utente sulla mappa. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Migliorata l'impaginazione del profilo. Gestita l'opzione del tracciamento nelle preferenze. Piccole modifiche. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Documentazione Javadoc integrale delle Model API.

Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Esternalizzate tutte le stringhe. Javadoc di HttpTask, HttpStatusException, ListenableFuture, FutureListener. Javadoc di AsyncQueue Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Minor fix (Android lint) Risolto il problema di persistenza degli interessi della UserQuery. Implementato l'invio delle preferenze al server. Implementato l'invio delle preferenze al server. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Risolto il problema dell'avvio delle *ViewActivity con degli ID. Aggiunti logout e cancellazione account. Fine modifiche funzionali all'applicazione. Javadoc di Application, Identity, Picture, Registration, PositionUtils Javadoc completa del client Android. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Unit test completi per le implementazioni delle Model API. Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Minor fix, chiave per la release Minor fix Merge branch 'master' of http://projects.wootwoot.it/git/aroundme Aggiunte delle TestSuite sul server.