De UvA app
Ravish Gopal
[email protected]
Begeleider: dr. Robert Belleman 14 Juni 2011
2
Inhoudsopgave 1 2 3 3.1 3.2 3.3 3.4 4 4.1
4.2
4.3
5 5.1 5.2 5.3 6 6.1 6.2 6.3 7 8 9
Abstract . . . . . . . . . . . . . . Inleiding . . . . . . . . . . . . . . Specificatie . . . . . . . . . . . . Rooster . . . . . . . . . . . . . . Campusmap . . . . . . . . . . . . Programma verloop . . . . . . . Evaluatie . . . . . . . . . . . . . Techniek . . . . . . . . . . . . . . Data protocol . . . . . . . . . . . 4.1.1 OData . . . . . . . . . . . 4.1.2 OData4J . . . . . . . . . Softwareplatform . . . . . . . . . 4.2.1 Open Handset Alliance . 4.2.2 Android . . . . . . . . . . 4.2.3 Android SDK . . . . . . . Structuur van Android . . . . . . 4.3.1 Componenten . . . . . . . 4.3.2 Het manifest . . . . . . . 4.3.3 Toegang tot componenten 4.3.4 Applicatie data . . . . . . Design . . . . . . . . . . . . . . . OData structuur . . . . . . . . . Android structuur . . . . . . . . Applicatie ontwerp . . . . . . . . Implementatie . . . . . . . . . . . Resources . . . . . . . . . . . . . OData . . . . . . . . . . . . . . . Activities . . . . . . . . . . . . . Resultaten . . . . . . . . . . . . . Discussie en Aanbevelingen . . . Referenties . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4 5 6 6 6 7 7 12 12 12 14 16 16 17 19 19 19 20 20 21 22 22 22 24 26 26 27 28 30 32 34
Verloop van het programma . . . . . . . . . . . . . . . . . De resultaten van de vragenlijst. . . . . . . . . . . . . . . Het datamodel van het FWNI roostersysteem. . . . . . . . Een weergave van FNWI OData URIs. . . . . . . . . . . . Het marktaandeel van smartphoneplatformen in Amerika. De Android systeem architectuur . . . . . . . . . . . . . . OData ontwerp. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
7 10 13 14 16 18 22
Lijst van figuren 1 2 3 4 5 6 7
3
8 9 10
Klassen diagram van de Android schermen . . . . . . . . . . . . . Ontwerp van de Android applicatie. . . . . . . . . . . . . . . . . Het verloop van het programma. . . . . . . . . . . . . . . . . . .
23 24 30
Lijst van demonstraties 1 2 3 4
Het opslaan van de service root URI . . . . . . . . . . . . . . . . Voorbeeld 1 uit figuur 3: ophalen van de Courses collectie . . . . Voorbeeld 2 uit figuur 3: ophalen van de cursussen voor een student Het ophalen van een eigenschap waarde (key-value) . . . . . . . .
15 15 15 15
1 Abstract
1
4
Abstract
Deze bachelorthesis beschrijft de ontwikkeling van een mobiele applicatie op het Androidplatform ten behoeve van een roostervoorziening voor studenten. De Universiteit van Amsterdam kan hiermee haar studenten een extra dienst aanbieden. Dit softwareproject omvat het proces vanaf de specificatie tot en met de implementatie van het programma. De ontwikkeling is op te delen in twee compontenten: data en weergave. Voor het bemachtigen van benodigde data is het OData protocol gebruikt. Het protocol is vrij nieuw en probeert de transport van data op het web te standaardiseren. De weergave van de data is ontwikkeld op het Androidplatform. Met het besturingssysteem en de uitgebreide ontwikkelomgeving is Android een compleet softwaresysteem voor mobiele applicaties. Het resultaat van de ontwikkeling is een Android applicatie die studenten hun cursuslijst en roosterinformatie per cursusactiviteit laat zien. Het biedt hen ook de mogelijkheid om de roosterinformatie toe te voegen aan hun (synchroniseerbare) agenda. Android leent zich uitstekend voor het ontwikkelen van mobiele applicaties.
2 Inleiding
2
5
Inleiding
De introductie van de Apple iPhone heeft het gebruik van smartphones snel doen stijgen. Alleen al in Nederland is het aantal smartphones gestegen tot 3,3 miljoen in december 2010 (Nu, 2010). Met de populariteit van de smartphones groeit ook het aantal beschikbare applicaties, waaronder applicaties van educatieve instellingen. Studenten gaan vanzelf hun smartphones gebruiken als hulpmiddel bij het studeren (Trelease, R.B., 2008). Universiteiten en hoge scholen kunnen hun studenten een extra studievoorziening geven in de vorm van een mobiele applicatie, oftewel app. Het kunnen aanbieden van een app kan de aantrekkelijkheid van de instelling vergroten. De Universiteit van Amsterdam wil door middel van het proefproject ‘De UvA App’ roosterfaciliteiten aanbieden aan studenten. De Universiteit van Amsterdam heeft tot nog toe geen mobiele applicatie. Het zal met de bouw van de UvA App studenten kunnen voorzien in extra digitale dienstverlening. Aanvankelijk zal dit zich beperken tot roosterfaciliteiten, maar gaandeweg kan de applicatie worden uitgebreid naar meerdere diensten. Voor studenten zal de app vooral handig zijn, zeker als zij de optie hebben het rooster met hun agenda te synchroniseren. Er is nogal eens sprake van een roosterwijziging en dat wordt niet altijd op tijd of niet volledig gecommuniceerd. Op deze manier zal het voor studenten makkelijker zijn om hun rooster bij te houden. Studenten zullen enkel gebaat zijn bij mogelijke uitbreiding van de app. Dit document beschrijft de specificatie, het ontwerp en de implementatie van de UvA App op het Android platform. Door administratieve beperkingen zal de app alleen beschikbaar zijn voor studenten die verbonden zijn bij de Faculteit Natuurkunde, Wiskunde en Informatica. De app zal het voor studenten mogelijk maken om een lijst met de door hun gevolgde cursussen te tonen, het rooster voor een cursus op te vragen en het rooster toe te voegen aan Google Calendar. Als eerst wordt een specificatie van de applicatie beschreven, met daaropvolgend een beschrijving van het softwareplatform. In het derde hoofdstuk wordt het ontwerp van het programma uitgelegd. Daarna volgt een uitleg van de implementatie. In het een na laatste hoofdstuk wordt het programma ge¨evalueerd. Tenslotte volgen de discussie en aanbevelingen.
3 Specificatie
3
6
Specificatie
Dit hoofdstuk omvat de specificatie van de functionaliteiten van het programma.
3.1
Rooster
Dit is het belangrijst. Studenten moeten het volgende kunnen: • bezichtigen van een lijst met cursussen waarvoor de student zich heeft ingeschreven. • bezichtigen van activiteiten per cursus. – een activiteit kan zijn: hoorcollege, werkcollege, practicum, tentamen of hertentamen. • bezichtigen van hun rooster afhankelijk van hun curriculum. – een rooster heeft een: datum, tijd, cursusnaam, docent, locatie en weeknummer. • toevoegen van hun rooster aan hun (Google) agenda. • synchroniseren van het rooster met hun agenda.
3.2
Campusmap
Een overzichtkaart van het Science Park zal voor nieuwe studenten en bezoekers erg nuttig zijn. Gebruikers moeten het volgende kunnen: • bezichtigen van een 2D-weergave van het Science Park met gearceerde gebouwen. • bezichtigen van informatie van een gebouw en diens co¨ordinaten kunnen toevoegen aan Google Maps.
3 Specificatie
3.3
7
Programma verloop
Aan de hand van het onderstaande schema wordt duidelijk gemaakt hoe een gebruiker door de applicatie zal lopen.
Fig. 1: Verloop van het programma In figuur 1 is te zien dat na het starten van het programma, de gebruiker dient in te loggen. Dit zal mogelijk zijn met het studentnummer van de gebruiker. Zodra de gebruiker is ingelogd, volgt een scherm met daarin een lijst van de cursussen die nu actief zijn en door de gebruiker gevolgd worden. Als een cursus uit de lijst wordt geselecteerd, zal een scherm geopend worden waarin de activiteiten voor de desbetreffende cursus in lijstvorm worden getoond. Het selecteren van een activiteit heeft een scherm met de roostergegevens voor die activiteit als resultaat. Hierna kan de gebruiker de verkregen informatie toevoegen aan hun agenda. De stippellijnen geven een potenti¨ele functionaliteit aan. Deze onderdelen hebben een lagere prioriteit.
3.4
Evaluatie
Om de gemaakte keuzes in de specificatie te evalueren en enigszins te onderbouwen is er een korte enquˆete gehouden onder de informaticastudenten die deelnamen aan het afstudeerproject. De enquˆete bevat een negental vragen en heeft de volgende opzet: • drie identificerende vragen over het smartphonegebruik van de studenten, • twee vragen over het roostergebruik, • een vraag over het belang van de ontwikkeling van de applicatie, • een volgende vraag over de mate van belang van verschillende mogelijke functies van de applicatie, • een optie voor het geven van suggesties voor functionaliteiten, • een afsluitende vraag waarin een student zich kan opgeven voor updates van de ontwikkeling van de UvA app.
3 Specificatie
8
De vragenlijst had de volgende resultaten:
(a) Het aandeel van de smartphoneplatformen.
(b) Intensiteit van het smartphonegebruik.
(c) Methode van bijhouden van het rooster.
3 Specificatie
9
(d) Het belang van de ontwikkeling van de UvA app.
(e) Het belang van integratie met andere applicaties.
(f) Het belang van het bekijken van het rooster voor de ingeschreven vakken.
3 Specificatie
10
(g) Het belang van het kunnen toevoegen van het rooster aan de agenda.
(h) Het belang van een campusmap.
Fig. 2: De resultaten van de vragenlijst.
3 Specificatie
11
Gelet op de resultaten van de enquˆete kan het volgende worden gezegd: (a) onder de afstudeerders is Android goed vertegenwoordigd, echter is het niet het dominante platform. Dat is een goede indicatie, maar geenszins een bevestiging voor het kiezen van het Androidplatform; (b) de smartphones worden redelijk intensief gebruikt. Het is een motiverend resultaat voor de ontwikkeling van een mobiele applicatie; (c) het roostergebruik geeft aan dat er veel online geraapleegd wordt en dat de Google Calendar reeds gebruikt wordt. Een roosterapp zou hier dus goed van dienst kunnen zijn; (d) er is zeker behoefte aan een UvA app; (e) integratie van de app wordt vrij belangrijk tot zeer belangrijk gezien. Dat wil zeggen dat de app zou moeten samenwerken met andere applicaties, een goed argument voor de mogelijke uitbreiding van de app; (f) het bekijken van het rooster van ingeschreven vakken wordt vrij belangrijk geacht. Dat is motiverend voor de basisfunctionaliteit; (g) ook het kunnen toevoegen van het rooster aan de agenda wordt als belangrijk bestempeld. Een bevestiging voor de ontwikkeling van de app; (h) er is minder behoefte aan de campusmap. De verklaring is dat de ondervraagden het complex al kennen. Voor nieuwe studenten en bezoekers zou dit wel een handige functie kunnen zijn.
4 Techniek
4
12
Techniek
Dit hoofdstuk geeft een uitleg over de technieken waarmee de applicatie is ontwikkeld. Daarbij zijn er twee componenten te onderscheiden: de gebruikte techniek voor het ophalen van de benodigde data en het softwareplatform waarop de app ontwikkeld is.
4.1
Data protocol
Binnen de Universiteit van Amsterdam heeft de FNWI een eigen structuur voor het curriculum voor de aan de FWNI gelieerde studies. Het academisch jaar is opgebouwd uit twee semesters, waarbij elke semester twee blokken van acht weken en een blok van 4 weken heeft. Omdat dit afwijkt van andere faculteiten, kent de FWNI een eigen roosteringsysteem. De data die benodigd is voor het kunnen weergeven van roosterinformatie in een mobiele applicatie, is beschikbaar gemaakt via het OData protocol. 4.1.1
OData
Het Open Data Protocol (OData) (http://www.odata.org) beschrijft een web protocol voor het aanbieden, ophalen of wijzigen van data over het HTTP protocol aan de hand van HTTP methodes als GET, PUT, POST en DELETE. Het is ontwikkeld door Microsoft om de toegang tot data op het web te standaardiseren en biedt een uniforme manier aan om data te structureren en te representeren. Het protocol is gebouwd aan de hand van bestaande webtechnologie¨en als Atom Publishing Protocol (AtomPub) en JavaScript Object Notation (JSON) en kan daarom data representeren in de formaten AtomPub (XML) en JSON. Webservices kunnnen data door middel van dit protocol aan hun clients serveren. Dit maakt uniforme data toegang op het web mogelijk. Voor het kunnen aanbieden van data met OData dient de data te worden gemodelleerd. Hiervoor maakt OData gebruik van het Entity Data Model (EDM), waarmee de beschikbare data formeel kan worden beschreven. In dit model wordt data beschreven als: • Entiteitcollecties - verzameling van entiteiten, bijvoorbeeld ‘Cursussen’. • Entiteit - instantie van een entiteittype, bijvoorbeeld ‘Wiskunde’ als instantie van de Entiteittype ‘Cursus’. • Eigenschap - eigenschap van een entiteit (primitief type), bijvoorbeeld ‘naam’ als eigenschap van de entiteit ‘Cursus’. • Complexe type - een type dat zelf eigenschappen heeft, maar enkel bestaat als eigenschap van een entiteit. Een voorbeeld is ‘Collegevorm’ als eigenschap van de entiteit ‘Cursus’, met eigenschappen als ‘locatie’, ‘tijd’ en ‘docent’.
4 Techniek
13
De modeltypes beschrijven respectievelijk de OData types: • Collection • Entry • Property • Complex type Een databron kan door middel van een metadata document het data model van de bron weergeven. Dit model geeft inzicht in de structuur en beschikbaarheid van data in de bron. Een ODataservice bestaat uit ‘Collections’ (collecties) van ‘Entries’ (entiteiten). Een collectie van entiteiten wordt ook wel ‘feed’ genoemd. Het FWNI roostersysteem voorziet in ´e´en feed, met een collectie ‘Courses’ (cursussen), en entiteiten van het type ‘Course’ (cursus).
Fig. 3: Het datamodel van het FWNI roostersysteem. Bovenstaande figuur geeft visueel aan hoe de roosterdata gemodelleerd is. StudentCourses is een complex type van de collectie ‘Courses’. De entiteit ‘Course’ heeft ´e´en complex type ‘Activity’. De complexe types ‘Locations’ en ‘Staff’ behoren tot het type ‘Activity’. Voor de applicatie zijn de complexe types StudentCourses, Activities en Locations het belangrijkst.
4 Techniek
14
OData is gebaseerd op REST technieken, wat wil zeggen dat de gemodelleerde databronnen aangesproken kunnen worden door middel van Uniform Resource Identifiers (URIs) (Fielding, R.T., 2000). Een dergelijke URI is opgebouwd uit verschillende onderdelen: • Service root URI - bestaande uit een hostnaam en service identifyer ‘ServiceName.svc’ • Resource path - identificeert welke entiteitencollectie aangesproken moet worden • Query string opties - een parameter die gebruikt kan worden voor zowel het sorteren, filteren of limiteren van de OData respons, als het specificeren van een resultaat door middel van een key-value paar.
Fig. 4: Een weergave van FNWI OData URIs. In deze figuur zijn de verschillende onderdelen van FNWI OData URIs aangegeven. In het eerste voorbeeld wordt de collectie ‘Courses’ aangesproken, waarna een URI is gegeven om de vakkenlijst op te halen van een student met studentnummer ‘12345’. Het OData protocol biedt regels en methoden aan voor het aanbieden en ontvangen van data over het web. Het is een vrij jong protocol en heeft daarom beperkte ondersteuning. OData tracht datatransport te uniformiseren door data eerst te modelleren volgens het EDM model. Na deze abstractie kan de databron de OData feed van collecties van entiteiten en complexe types opbouwen. In de metadata is te zien welke data er beschikbaar is en hoe deze kan worden benaderd. Het protocol maakt het makkelijk om data op te halen door gebruik te maken van REST URIs. Zo kan bijvoorbeeld een Jaguar worden opgehaald met: http://host/Cars.svc/Manufacterers?$filter=Name eq ’Jaguar’. 4.1.2
OData4J
In de UvA app wordt voor het ophalen van de roosterdata de Java library odata4j (OData voor Java) gebruikt (http://code.google.com/p/odata4j). Een Java library is nodig, omdat het Android platform op Java gebaseerd is. De
4 Techniek
15
library voorziet zowel in het produceren als het consumeren van OData feeds. In dit project wordt er enkel geconsumeerd. Odata4J biedt methodes voor het opbouwen van de eerder gespecificeerde URIs, ten behoeve van het ophalen van data. Door middel van enkele voorbeelden zal duidelijk worden gemaakt hoe de methodes van de library kunnen worden gebruikt om de URIs uit figuur 3 te cre¨eren: ODataConsumer consumer = ODataConsumer . create ( " http :// content . datanose . nl / Timetable . svc " ) ; Demonstratie 1: Het opslaan van de service root URI Enumerable < OEntity > courses = consumer . getEntitySet ( " Courses " ) . execute () ; Demonstratie 2: Voorbeeld 1 uit figuur 3: ophalen van de Courses collectie Enumerable < OEntity > studentCourses = consumer . getEntitySet ( " G e t Co u r se s B yS t u de n t " ) . custom ( " id " ," 12345) . execute () ; Demonstratie 3: Voorbeeld 2 uit figuur 3: ophalen van de cursussen voor een student Enumerable < OEntity > studentCourses = consumer . getEntitySet ( " G e t Co u r se s B yS t u de n t " ) . custom ( " id " ," 12345) . execute () ; for ( OEntity course : studentCourses ) { System . out . println ( " Name : " + course . getProperty ( " Name " ) . getValue () ) ; } Demonstratie 4: Het ophalen van een eigenschap waarde (key-value) Aan de hand van deze methodes kan de juiste roosterinformatie worden opgehaald via de ODatafeed.
4 Techniek
4.2
16
Softwareplatform
De applicatie wordt ontwikkeld op het Android platform (http://www.android.com). Eind 2010 is Android (Canalys, 2011) met 32.9 miljoen gebruikers het grootste smartphoneplatform ter wereld. Ter vergelijking, Symbian, voorheen jarenlang ’s werelds grootste platform, heeft 31 miljoen gebruikers.
Fig. 5: Het marktaandeel van smartphoneplatformen in Amerika. In de bovenstaande figuur is te zien hoe het marktaandeel van Android in de Verenigde Staten in rap tempo is gegroeid. Android heeft hier halverwege 2010 al het grootste marktaandeel bemachtigd. In Amerika is Androids grootste concurrent RIM’s BlackBerry OS (http://www.rim.com). Ook dit platform heeft jaren het marktleiderschap gehad, voordat Android dat overnam. Android platform is open source, goed gedocumenteerd en op Java gebaseerd. Dat maakt het een aantrekkelijk platform voor de ontwikkeling van applicaties. 4.2.1
Open Handset Alliance
Nadat Google het startup bedrijfje Android in 2005 had gekocht (Businessweek, 2005) werd in 2007 het Open Handset Alliance opgericht 1 . Het Open Handset Allience is een consortium van verschillende typen bedrijven, zoals netwerkaanbieders, telefoonfabrikanten, processorbedrijven, softwarebedrijven en marketingbedrijven. Het doel van de samenwerking is om de ontwikkeling van mobiele technologie te stimuleren en de kosten van het ontwikkelen en distribueren van mobiele apparaten, diensten en applicaties te reduceren. Het Android platform is het resultaat van de Open Handset Alliance. 1
http://www.openhandsetalliance.com
4 Techniek
17
Android (http://www.android.com) is uitgebracht met de Apache Software License 2. Dit houdt in dat fabrikanten en netwerkaanbieders innovaties op dit platform kunnen doen, zonder open source karakter. Voor alle betrokken partijen zijn er voordelen. Netwerkaanbieders kunnen hierdoor makkelijker differenti¨eren in hun diensten; telefoonfabrikanten hebben lagere ontwikkelingskosten en kunnen zich makkelijker differenti¨eren in de meegeleverde software; processorbedrijven profiteren van de vraag naar system-ona-chip (soc) architecturen en processors; softwarebedrijven kunnen innovaties snel aan een groot publiek tentoon stellen; ontwikkelaars kunnen met de ontwikkelomgeving snel applicaties ontwikkelen en consumenten profiteren van goedkopere toestellen, snel opvolgende innovaties en een alsmaar verbeterende gebruikerservaring. Er zijn op dit moment 82 bedrijven aangesloten bij de Open Handset Alliance. 4.2.2
Android
Android is een softwareplatform bestaande uit een operating systeem, een software laag voor het verbinden van compontenten, een gebruiksvriendelijk interface en een aantal kern applicaties. Het heeft een aantal software- en hardwarekenmerken. De softwarekenmerken zijn: • een op de WebKit engine gebaseerde browser (http://www.webkit.org), • SQLite voor de opslag van data (http://www.sqlite.org), • ondersteuning voor verschillende media (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF), • een voor mobiele apparaten geoptimaliseerde Dalvik Virtual Machine (DVM) (Bornstein, D., 2008), • uitgebreide ontwikkelomgeving. De hardware kenmerken zijn: • netwerkondersteuning (GSM, 3G, HSDPA), • verbindingsmogelijkheden (Bluetooth, Wi-Fi), • geoptimaliseerde grafische library en grafische hardware acceleratie, • camera, GPS, kompas, accelerometer en touch screen.
4 Techniek
18
Fig. 6: De Android systeem architectuur Figuur 6 geeft de architectuur van het Androidsysteem weer. De architectuur kent vijf lagen. Android is gebouwd op de Linux 2.6 kernel die verantwoordelijk is voor geheugenen procesmanagement en beveiliging. Het heeft een betrouwbaar drivermodel en heeft effici¨ente resourcemangement. In de volgende laag zijn libraries toegevoegd, die voorzien in de beschikbaarheid van de bovengenoemde softwarekenmerken. Ze zijn zelf geschreven in C/C++, maar worden aangesproken door Java interfaces. De Dalvik Virtual Machine (DVM) is een run-time byte-code interpreter met een aantal kenmerkende eigenschappen voor de stabiliteit en batterij-effici¨entie van het besturingssysteem. Elke applicatie heeft zijn eigen kopie van de interpreter, zodat processen gescheiden kunnen worden, wat zorgt voor stabiliteit. De DVM runt dex bestanden, die tijdens het compileren worden geconverteerd vanuit standaard java class bestanden. De dex bestanden zijn compacter en effici¨enter dan class bestanden en zijn daarom uitermate geschikt voor mobiele apparaten waar geheugen en batterijcapaciteit beperkt is. De Core libraries zijn geschreven in Java en bevatten Java functionaliteiten. De Application framework laag is eveneens geschreven in Java en bevat een toolkit die door elke applicatie wordt gebruikt. De belangrijkste componten zullen hier beschreven worden. De ActivityManager is verantwoordelijk voor de
4 Techniek
19
levenscyclus van applicaties. De PackageManager houdt bij welke applicaties op het apparaat zijn ge¨ınstalleerd. Content providers zijn specifieke componenten die het mogelijk maken om data tussen applicaties te delen, zoals bijvoorbeeld het ophalen van een telefoonnummer van de Contacten applicatie naar een andere applicatie. De ResourceManager houdt niet-gecodeerde waardes van een applicatie bij, zoals layout beschrijvingen. Android beschikt over een aantal kernapplicaties zoals de ge¨ıntegreerde broswer, een Google calendar, Gmail, Google Maps, SMS applicatie en de zoekfunctie. 4.2.3
Android SDK
De ontwikkelomgeving Android SDK bevat verschillende elementen voor het snel kunnen ontwikkelen van mobiele applicaties. Het biedt ondersteuning voor Eclipse (http://www.eclipse.org) door middel van een extensie die rijk is aan functionaliteiten. Er is een emulator beschikbaar waarmee een virtueel apparaat kan worden ge¨emuleerd voor het ontwerpen en testen van applicaties op het Android platform. Voor debugging is de Dalvik Debug Monitor Service beschikbaar, waarmee managing en debugging van processen in de emulator wordt gefaciliteerd. Android is door de combinatie van het besturingssysteem en deze ontwikkelomgeving, een compleet softwareplatform voor smartphones.
4.3
Structuur van Android
Applicaties dienen te worden geschreven in Java. De tools die de Android SDK verschaffen compileren een geschreven programma naar een ‘Android package’ met een .apk extensie. Dat is nodig om de applicatie te kunnen installeren op een android apparaat. 4.3.1
Componenten
Applicaties kunnen worden gebouwd aan de hand van deze componenten: Een Activity is een enkel scherm met een user interface (UI). Een simpele twitter applicatie kan bijvoorbeeld bestaan uit twee activiteiten: ´e´en voor de lijst met binnengekomen tweets en ´e´en voor het schrijven van een nieuwe tweet. Actvities behoren tot een applicatie, maar zijn daar niet toe gebonden. Een emailapplicatie kan bijvoorbeeld een Activity van de Gallery applicatie gebruiken om een foto uit te zoeken en die aan de email toe te voegen. IntentReceivers zijn later uit te voeren Activities of applicaties die verschillende triggers kunnen hebben. Zo wordt bijvoorbeeld de Telefoonapplicatie gestart zodra een oproep over het GSMnetwerk binnenkomt.
4 Techniek
20
Services zijn processen zonder UI, die op de achtergrond langlopende taken draaien. Een voorbeeld hiervan is het periodiek ophalen van email of het laten doorspelen van muziek terwijl andere applicaties geopend worden. ContentProviders maken het mogelijk om data te delen met andere applicaties. Zo kunnen bijvoorbeeld contactgegevens, die normaal gesproken via de Contactenapplicatie benaderd worden, door andere applicaties worden opgehaald. Google Maps maakt gebruik van een ContentProvider zodra het de Navigation applicatie opstart en co¨ordinaten deelt. BroadcastReceivers zorgen voor globale berichten. Deze worden vooral door het systeem gegenereerd, bijvoorbeeld een bericht dat aangeeft dat de batterij bijna leeg is. Een broadcastreceiver heeft geen UI, maar kan wel notificatieberichten doorgeven aan de statusbalk. 4.3.2
Het manifest
Een belangrijk onderdeel van een applicatie is het AndroidManifest.xml bestand. Het manifest bevat onder andere: • applicatienaam • gebruikerstoestemmingen die benodigd zijn, de UvA app heeft bijvoorbeeld toestemming nodig voor het gebruik van Internet en voor het lezen van en schrijven naar de agenda. • componenten van de applicatie • het minimaal vereiste API-niveau. Hierin worden de applicatie-eigenschappen en de beschikbare compontenten gespecificeerd. Als een component niet in het manifest is gespecificeerd, heeft het Android systeem er geen kennis van en kan deze nooit worden gestart. Het manifest is als het ware de volledige registratie van een applicatie bij het systeem. 4.3.3
Toegang tot componenten
Android stelt aan de hand van de bovenstaande componenten een applicatie in staat om componenten van een andere applicatie te starten. Dit is niet zomaar mogelijk, aangezien een applicatie ge¨ısoleerd uitgevoerd wordt en dus alleen toegang heeft tot data van zijn context. Applicaties die echter gebruik willen maken van deze mogelijkheid dienen dat aan het systeem te communiceren door middel van een zogehete Intent. Een intent is een verzoek aan het systeem voor het starten van een bepaalde component. Het systeem beslist of die component dan wel of niet gestart wordt. Activities, Services en BroadcastReceivers kunnen worden geactiveerd door middel van een intent. ContentProviders dienen op een andere manier geactiveerd
4 Techniek
21
te worden, namelijk via een verzoek van een ContentResolver. De ContentProvider en ContenResolver handelen de data transacties af, terwijl de verzoekende component een query kan aanroepen op de ContentResolver. Intents kunnen worden gebruikt om specifieke componenten aan te roepen, maar het is ook mogelijk om een intent aan te roepen voor een gewenste actie. Het systeem zal dan een component vinden die de gekozen actie het beste kan uitvoeren. Het systeem kijkt daarbij naar ‘intent-filters’, die voor een compontent aangeven welke acties de component kan uitvoeren. Een applicatie die het versturen van foto’s naar Facebook mogelijk maakt, kan een intent-filter specificeren voor het versturen van een foto. Als vanuit de Camera applicatie een intent wordt geplaatst voor het versturen van een foto, zal de ontwikkelde applicatie gestart worden. 4.3.4
Applicatie data
Android biedt een scheiding aan tussen code en bronnen voor het weergeven van de applicatie, zoals de layout, plaatjes of audiobestanden. Deze bronnen dienen te worden gespecificeerd in XML bestanden. Dit heeft als voordeel dat visuele kenmerken van de applicatie makkelijk gewijzigd kunnen worden en dat de weergave configureerbaar is voor bijvoorbeeld verschillende schermgroottes of verschillende taalinstellingen van de gebruikers. Het is mogelijk om variabelen te maken die overal in de applicatie te gebruiken zijn, zoals een String voor een veelgebruikt woord of een veel voorkomende zin. Het is echter niet verplicht om layouts en Strings te specificeren door middel van XML bestanden, ze kunnen ook worden geprogrammeerd.
5 Design
5
22
Design
Hier wordt een uiteenzetting gegeven over het ontwerp van de applicatie. Daarbij wordt er wederom onderscheid gemaakt tussen data en platformspecifieke componenten.
5.1
OData structuur
Om de roostergegevens uit de OData feed goed te kunnen afhandelen zijn de OData entiteiten en complexe types vertaald naar Java klasses in een object ge¨ ori¨enteerde structuur.
Fig. 7: OData ontwerp. De figuur geeft het klassendiagram voor het gekozen ontwerp weer. De Student klasse is de initiator en haalt de cursussen voor een student op. Met de resultaten daarvan maakt hij nieuwe Course objecten aan. Daarna worden in de Course klasse de activiteiten van een cursus opgehaald, waarmee nieuwe Activity objecten worden aangemaakt. In de Activity klasse wordt de locatie van een activiteit opgeslagen door middel van een aanvraag op de OData feed. Ook wordt hier de planning van een activiteit via OData opgevraagd. Daarmee is er voldoende informatie om een Event object te cre¨eren, die de daadwerkelijke roosterinformatie bevat. De evenementen van alle activiteiten van een vak, vormen het rooster voor dat vak. De roosters van de vakken samen, vormen het rooster van de student.
5.2
Android structuur
Aanvankelijk zal de applicatie geen synchronisatiemogelijkheid hebben. Dat wil zeggen dat er enkel Android compontenten met een UI zijn, oftewel Activities. De applicatie zal dus bestaan uit een reeks van Activities, met als eindstation een ContentProvider voor de Calendar. Dat eindstation heeft echter geen UI binnen de applicatie.
5 Design
23
Fig. 8: Klassen diagram van de Android schermen In de bovenstaande figuur is te zien dat er vier hoofd Activities zijn. De UvAppActivity is het startscherm. Hier zal de gebruiker zijn of haar studentnummer kunnen invoeren, waarna de cursussen in de CourseListActivity kunnen worden getoond. Deze Activity heeft een subActivity, genaamd PrefActivity. De PrefActivity kan via het (standaard) menu worden opgeroepen om het opgeslagen studentnummer te kunnen zien of wijzigen. Dit kan van pas komen als een student een verkeerd nummer heeft ingevuld. Het startscherm, UvAppActivity, wordt namelijk slechts de eerste keer getoond. Als een student eenmaal zijn studentnummer heeft ingevoerd, komt hij of zij bij een volgende start direct bij de CourseListActivity. Na het selecteren van een cursus wordt de ActivityListActivity gestart, waarin de activiteiten per cursus in een lijst worden getoond. De activiteiten beschrijven de onderwijsvorm en kunnen dus hoorcolleges, practica, tentamen, etc. zijn. De selectie van een van de activiteiten start de EventListActivity. In dit scherm wordt de rooster informatie van de activiteit getoond. Vanaf deze Activity kan de ContentProvider worden gestart, die de roosterinformatie opslaat in de agenda.
5 Design
5.3
24
Applicatie ontwerp
Fig. 9: Ontwerp van de Android applicatie.
5 Design
25
Het ontwerp laat zien hoe de OData klasses en de Android Activities met elkaar communiceren. De blauw omkaderde klasses zijn Android Activities, de paars omkaderde zijn de OData Plain Old Java Objects (POJOs) en de rood omkaderde klasse is de ContentProvider die de roosterdata naar de agenda schrijft. De groene lijnen geven de creaties van objecten aan, waar de oranje lijnen de returns van ofwel een object ofwel een lijst van dat type object voorstelt. De paarse lijnen geven aan dat er ´e´en enkel object via de Android Activities wordt doorgegeven. Om verwarring tussen Android Activities en Activity objecten uit de odata package te voorkomen, wordt vanaf nu het Android type cursief te getoond, dus Android Activity. De UvAppActivity slaat het studentnummer op en start de CourseListActivity. Deze Activity maakt een Student object aan haalt alle vakken op van die student. Vervolgens worden de vakken getoond in lijstvorm. Als er dan een cursus uit de lijst geselecteerd wordt, wordt de ActivityListActivity gestart. Nu worden de Activity objecten opgehaald en getoond. Ook hier geldt dat er bij de selectie van een van de lijstwaardes de volgende Activity wordt gestart, namelijk de EventListActivity. Op dezelfde wijze wordt via de Activity klasse Event objecten opgehaald in een lijst. Locaties hebben een aparte OData query nodig, en daarom is er een hulpklasse daarvoor aanwezig. De Activity klasse doet een OData query en maakt daarbij een Location object aan. Bij het maken van de Event objecten wordt de locatie toegevoegd aan het Event object, waarna deze objecten de EventListActivity bereiken. Nu kan de roosterinformatie worden getoond. Daarna rest slechts de mogelijkheid om de net opgehaalde roosterdata toe te voegen aan de agenda.
6 Implementatie
6
26
Implementatie
De werking van het programma is hierboven reeds beschreven. In dit deel wordt uitgelegd hoe dat geprogrammeerd is. Het Androidprogramma heeft vier onderdelen: • de libraries voor Android (2.2, API level 8) en odata4j, • de weergaveresources, te vinden in de map ‘res/’, • de package nl.uva.nl.uvapp.odata, de klasses in deze package handelen al het OData verkeer af en zijn leverancier van de roosterdata binnen de app, • de package nl.uva.nl.uvapp, de hoofdpackage waarin slechts Activities zitten die de UI verzorgen voor elk onderdeel van het programma.
6.1
Resources
Tijdens de ontwikkeling zijn resources en programmacode zoveel mogelijk uit elkaar gehouden. Hieronder wordt uitgelegd hoe de resources zijn gestructureerd en waar ze voor dienen. • layout: hierin bevinden zich xml bestanden die de layouts voor de activities beschrijven. De volgende layouts zijn geschreven: – main.xml: hierin is de layout van het startscherm gedeclareerd. Het bevat een imageveld, een tekstveld, en beschrijfbaarveld, een knop en een tekstveld, – courses.xml: hierin is een lijstlayout gedefinieerd. Het bevat naast de lijst ook een tekstveld voor de titel van het scherm, – course row.xml: de course row is een tekstveld, dat een omhulsel vormt voor elke waarde in de lijst van courses.xml, – activities.xml: dit is hetzelfde als courses.xml, alleen dan bedoeld voor een lijst van activiteiten. Het gebruikt course row als omhulsel voor de waardes, – events.xml: dit is een complexere layout, er zijn textvelden om tijd, datum, dag en locatie weer te geven. Daarnaast is er een lijstveld voor de data van een event, – events row.xml: dit is eveneens een tekstveld dat als omhulsel dient. • String: het string.xml bestand is een lijst van variabelen die overal in de app kan worden aangeroepen. Het is handig voor het hergebruiken van strings of het makkelijk aanpassen van tekstveld waardes; • drawable: deze map bevat alle grafische resources; de app icon en het uva logo zijn hier in bewaard. Als een grafische resource niet in deze map wordt geplaatst, kan deze niet gebruikt worden. De Android projectbuilder houdt namelijk elke wijziging bij en bouwt het project dan direct opnieuw op. Zo zijn je resources direct beschikbaar in de applicatie.
6 Implementatie
27
• prefs.xml: dit bestand geeft een layout voor het Preference Menu, waar studenten hun studentnummer kunnen wijzigen. Resources zijn vanuit de code aan te roepen door middel van het sleutelwoord ‘R’, de mapnaam en de id van de resource. In de xml bestanden is het sleutelkarater ‘@’, de mapnaam gevolgd door een slash en de resource id. De app icon is bijvoorbeeld te benaderen door R.drawable.icon of @drawable/icon.
6.2
OData
De algemene werking van de klasses in de odata package is al uitgelegd. Hieronder zal per klasse de belangrijkste methodes worden uitgelegd. • Student – getCourse() - deze functie doet een OData query met de opgeslagen studentnummer op de complexe type GetCoursesByStudent om een lijst van curssussen van de student te krijgen. Met het resultaat wordt voor elke cursus een Course object aangemaakt, die gelijk aan een courseList wordt toegevoegd. Deze courseList wordt door de methode geretourneerd. • Course – getActivities() - hier wordt met een courseID en het type GetActivitiesByCourse een lijst van activiteiten voor die cursus opgehaald. Op dezelfde wijze als hierboven wordt er voor elke waarde in het resultaat een Activity object aangemaakt, die aan de activityList wordt toegevoegd. De lijst wordt geretourneerd. • Activity – getWeekNumbers() - vanuit OData wordt een string met nullen en enen meegegeven als weekpatroon, voor alle weken in het academisch jaar, beginnende bij week 36. Deze functie retourneert een lijst van weeknummers waarin de activiteit plaatsvindt; – getDays() - de dagen waarop een activiteit gepland staat wordt als bitmask opgegeven, wat wil zeggen dat de dagen als machten van 2 worden voorgesteld. Dinsdag is bijvoorbeeld 2 en woensdag 4. Maandag en woensdag kunnen dan worden weergegeven als 5. Deze functie retourneert een lijst van dagen als integers. Maandag is 1, dinsdag 2, enzovoort; – calcYear(LocalDateTime) - deze functie rekent op basis van het weekpatroon uit in welk jaar een activiteit zal plaatsvinden. Dat is nodig om een datum te kunnen berekenen; – getLocalDateTime(int, int, int) - berekent een LocalDateTime object voor een activiteit. Samen met de bovenstaande functies kan een datum worden berekend voor een activiteit op basis van een weeknummer en een dag van de week;
6 Implementatie
28
– getEvents() - deze functie maakt voor een activiteit alle mogelijke events aan, door voor elke week waarin een activiteit plaatsvindt een Event object aan te maken en deze toe te voegen aan de eventList. De functie retourneert deze lijst. • Location: deze klasse is een POJO voor de locatie van een activiteit, • Event – getCalendarAsXML() - deze functie retourneert voor een event object een voor Google Calendar geschikt formaat.
6.3
Activities
• UvAppActivity – setOnClickListener() - als de knop wordt ingedrukt wordt de waarde uit het invoerveld opgehaald. Vervolgens wordt de functie saveStudent() aangeroepen. – saveStudent() - deze functie slaat de zojuist uitgelezen studentnummer op in de app preferenties en start vervolgens een Intent om de CourseListActivity te starten. De student kan overigens het ingevulde studentnummer wijzigen via de PrefsActivity. • CourseListActivity – er zijn standaardfuncties ge¨ımplementeerd voor het openen van het menu. Als de menu-optie wordt geselecteerd start de hieronder beschreven PrefsActivity; – getStudent() - deze functie haalt het studentnummer op uit de app preferenties en maakt een Student object aan; – fillCourseList() - door middel van het Student object wordt de lijst met cursussen opgehaald. De namen van de cursussen worden in een nieuwe String array gezet, die vervolgens aan een ‘ListView’ wordt gekoppeld door middel van een ‘ListAdapter’. De adapter voegt alle waardes van de String array toe aan aan de ‘ListView’, zodat de cursusnamen in een lijstje op het scherm worden getoond; – setOnItemClickListener() - zodra er op een waarde uit de lijst wordt geklikt, wordt de functie startCourseActivitiesView() aangeroepen; – startCourseActivitiesView() - de functie stelt het geselecteerde cursus object beschikbaar en start de ActivityListActivity, zodat de activiteiten voor de gekozen cursus kunnen worden getoond. • PrefsActivity - de student kan het ingevulde studentnummer wijzigen; • ActivityListActivity
6 Implementatie
29
– fillActivityList() - vergelijkbaar met de fillCourseList(), met een Course object worden activiteiten opgehaald, waarna een lijst wordt getoond met de namen van de activiteiten; – setOnItemClickListener() - zodra er op een rij uit de lijst geklikt wordt, zal de de startEventActivitiesView() worden aangeroepen; – startEventActivitiesView() - hier wordt het geselecteerde activiteit object beschikbaar gesteld, waarna de EventListActivity wordt gestart. • EventListActivity – displayEvents() - deze functie laat de roosterinformatie zien, door alle events van een activiteit aan het scherm toe te voegen. – addToCalendar() - deze functie haalt het juiste agendaformaat op uit de Event objecten en voegt deze toe aan de agenda. Android maakt het mogelijk om data tussen Activities te delen. Dit geldt echter voor primitive datatypes. Voor complexe objecten moet er een Android-eigen marshalling methode worden ge¨ımplementeerd, genaamd ‘Parcelable’. Dit is zeer summier gedocumenteerd en vormde een obstakel in de ontwikkeling van de applicatie. De OData specifieke klasses werden v´o´or de Android klasses ontworpen. Het zou veel handiger zijn geweest om direct met ‘Parcelable’ klasses te werken.
7 Resultaten
7
30
Resultaten
De resultaten van de applicatieontwikkeling zullen hier getoond worden door middel van schermafbeeldingen.
(a) Het startscherm
(b) De cursuslijst
(c) Activiteiten voor Spec.Theorie
(d) Planning van het tentamen
Fig. 10: Het verloop van het programma.
7 Resultaten
31
Figuur 10a geeft het startscherm weer. Na invoering van het studentnummer wordt de vakkenlijst getoond. Na selectie van het vak ‘Specificatie Theorie’ zijn er vier activiteiten te zien. Het laatste scherm laat de roosterinformatie voor die activiteit zien. Aan de beelden is te zien dat een student makkelijk zijn vakkenlijst kan inzien en roosterinformatie van een cursusactiviteit kan opvragen. Het programma is simpel van opzet en daarom intu¨ıtief te bedienen. De selecteerbare elementen zijn groot van formaat, waardoor alle functies in de app met ´e´en duim zijn te bedienen. Het is echter zeer onwenselijk om elke keer zo veel te navigeren om bij de roosterinformatie te komen. Hiervoor biedt de knop in het laatste scherm een uitkomst: de roosterinformatie wordt daarmee toegevoegd aan de agenda van de student. De gebruikte taal is Engels, zodat buitenlandse studenten ook direct gebruik kunnen maken van de applicatie.
8 Discussie en Aanbevelingen
8
32
Discussie en Aanbevelingen
Met de ontwikkeling van de applicatie is de UvA app een feit. Het is voor FWNI-studenten mogelijk om te zien voor welke vakken zij zich ingeschreven hebben en wat de roosterinformatie per cursusactiviteit is. Uit resultaten van de korte vragenlijst bleek dat er onder de afstudeerders draagvlak is voor de komst van een UvA app. Ook werd duidelijk dat de roosterfunctionaliteit het belangrijkst is. Vanuit de UvA is er gekozen voor Android, het meest gebruikte smartphoneplatform ter wereld. De Universiteit van Amsterdam vergroot hiermee haar dienstbaarheid aan haar studenten, nu zij ook op het Android platform vertegenwoordigd is. Het OData protocol is helder en biedt een goede manier aan om data te modelleren en te distribueren. Het gebruik van de OData feed binnen Android was aanvakelijk problematisch. Het gebruikte model was geschikt voor de methodes van de odata4j library. Nadat het model gewijzigd was kon de benodigde roosterdata makkelijk worden opgevraagd. In dit project zijn er geen complexe queries nodig geweest. Daarom is de diepte en compexiteit van OData niet aan het licht gekomen. Op basis hiervan is te stellen dat OData voldoet in de basisfunctionaliteit van datatransport. Android is een zeer compleet systeem. Het bezet het volledige smartphone domein door niet alleen een sterk besturingssyteem te leveren, maar ook een uitgebreide ontwikkelomgeving. Applicaties kunnen met vier bouwstenen gebouwd worden die specifieke functionaliteiten hebben. Zo heeft een Activity altijd een UI en kunnen ContentProviders gebruikt worden om data met andere informatie te delen. Als de Google Maps applicatie voor de routebeschrijving de Navigation applicatie opstart, maakt de Maps applicatie gebruik van een ContentProvider om de GPS co¨ordinaten door te geven. De huidige app levert wel roosterfunctionaliteiten, maar de manier om het rooster te bezichtigen is niet handig. De stap tussen het selecteren van een cursus en het tonen van roosterinformatie zou eruit moeten worden gehaald. Ook het handmatig toevoegen van het rooster aan de agenda is niet ideaal. Er zijn regelmatig mutaties in het rooster. Studenten zouden daarom meer gebaat zijn bij een service die het rooster en de agenda synchroniseert. Dan wordt er echt gebruik gemaakt van de kracht van Android. De applicatie heeft nu slechts ´e´en functie. Dit kan makkelijk worden uitgebreid met een campusmap, waarbij de gewenste locatie direct naar de Google Navigation applicatie te sturen is. Voor de reguliere studenten is dat misschien minder interessant, maar bezoekers en nieuwe studenten zouden er zeker baat bij hebben. Verdere mogelijke uitbreidingen zijn: • toegang tot studieweb, • docentinformatie kunnen zoeken en weergeven,
8 Discussie en Aanbevelingen
33
• het ‘inchecken’ van docenten, zodat hun recente locatie direct opvraagbaar is, • beschikbaarheid van de computers (per gebouw) weergeven, • de OV diensttijden rond het Science Park tonen, • voor UvA evenementen kunnen registreren, • de printquota tonen, • marktplaats voor samenvattingen en dictaten, • programmaboekjes van symposia beschikbaar maken, • aanmelden voor tentamens. De UvA zou er goed aan doen om deze applicatie uit te breiden, zodat het voor alle UvA studenten nuttig is en dezelfde functionaliteit aan hen biedt.
9 Referenties
9
34
Referenties 1. Trelease, T.R. (2008). Diffusion of innovations: smartphones and wireless anatomy learning resources. Anatomical Sciences Education, 1, 233-239. 2. Google’s Android becomes the world’s leading smart phone platform. (2011, January 31). Google’s Android becomes the world’s leading smart phone platform. Retrieved March 28, 2011, from http://www.canalys.com/pr/2011/r2011013.html 3. Elgin, B. (2005, August 17). Google Buys Android for Its Mobile Arsenal. Businessweek - Business News, Stock Market & Financial Advice. Retrieved April 10, 2011, from http://www.businessweek.com/technology/content/aug2005/tc20050817 0949 tc024.htm 4. Fielding, R. T. (2000). CHAPTER 5 Representational State Transfer (REST). Architectural styles and the design of network-based software architectures (pp. 76-106). Irvine: University of California. 5. Bornstein, D. (2008). Google I/O - Dalvik Virtual Machine Internals. Proceedings of the Google I/O, http://sites.google.com/site/io/dalvik-vminternals