Sluttrapport - Høgskolen i Oslo
Transcription
Sluttrapport - Høgskolen i Oslo
Hovedprosjekt ved institutt for Informasjonsteknologi Høgskolen i Oslo og Akershus våren 2015 Madeleine V. K. Rønning, Informasjonsteknologi Emilie Strand, Informasjonsteknologi Rannveig A. Skjerve, Dataingeniør PROSJEKT NR. 2015-24 Studieprogram: Informasjonsteknologi Postadresse: Postboks 4 St. Olavs plass, 0130 Oslo Besøksadresse: Holbergs plass, Oslo TILGJENGELIGHET Offentlig Telefon: 22 45 32 00 Telefaks: 22 45 32 05 BACHELORPROSJEKT HOVEDPROSJEKTETS TITTEL DATO Semitone 26.05.15 ANTALL SIDER / BILAG 114 PROSJEKTDELTAKERE INTERN VEILEDER Rannveig A. Skjerve Madeleine Victoria Kongshavn Rønning Emilie Strand G. Anthony Giannoumis OPPDRAGSGIVER KONTAKTPERSONER Accenture Norge AS Henrik Bjerke og Jonas Korssjøen SAMMENDRAG Konseptutvikling og teknisk implementering av Semitone. Semitone er en mobilapplikasjon for tilgjengeliggjøring av lokale musikkmiljø. 3 STIKKORD Proof Of Concept Java for Android .NET Forord Denne rapporten omhandler konseptutvikling og implementering av mobilapplikasjonen “Semitone”, gjennomført som hovedprosjekt for gruppe 24 på fakultetet for teknologi, kunst og design på Høgskolen i Oslo og Akershus, våren 2015. Kildekode ligger på vedlagt minnepenn. Rapporten er delt i 4 deler ● Innledning og bakgrunn Presentasjon av teknisk, og kontekstuell bakgrunn, samt aktørene som har vært involvert i oppgaven ● Prosessdokumentasjon. Beskrivelse av utviklingsprosessen og de 3 «Scrum-sprintene» vi gjennomførte. ● Produktdokumentasjon Detaljert beskrivelse av det ferdige produktet og testdokumentasjon. ● Avslutning Refleksjoner rundt prosessen, produktet, og mulig videreutvikling for applikasjonen. Vi har laget en ordliste som ligger som vedlegg. Her er forklaringer av tekniske begreper, forkortelser og akronymer vi har brukt, men ikke forklart, i løpet av rapporten. Takk til Accenture Norge, spesielt til Henrik Bjerke og Jonas Korssjøen for hjelp, veiledning og dårlige spøker. Takk til samboer, venner og familie som har holdt ut med programmeringståker og dokumentasjonsforbannelser. Takk også til den usynlige entitenen Sindre Wigre, for å ha reddet oss fra oss selv og våre kompliserte setninger. And last, but definitely not least: Thanks to G. Anthony Giannoumis, for cake, inspiration, support and for teaching us the proper use of “that” and “which”. 3 Innhold Innledning og bakgrunn 1. Presentasjon ................................................................................................................... 9 1.1 Innledning .................................................................................................................... 9 1.2 Involverte aktører ......................................................................................................... 9 1.2.1 Studentgruppen ......................................................................................................... 9 1.2.2 Intern veileder fra HiOA .............................................................................................. 9 1.2.3 Veiledere fra Accenture .............................................................................................. 9 1.3 Presentasjon av de involverte aktørene ......................................................................10 1.3.1 Studentgruppa ..........................................................................................................10 1.3.2 HiOA .........................................................................................................................10 1.3.3 Accenture ..................................................................................................................10 1.4 Oppgaven ...................................................................................................................10 1.4.1 Hva slags oppgave er det?........................................................................................10 1.4.2 Mål for oppgaven ......................................................................................................10 1.5 Bakgrunn ....................................................................................................................10 1.5.1 Behovet .....................................................................................................................10 1.5.2 Eksisterende løsninger ..............................................................................................11 1.6 2. Avgrensning ................................................................................................................11 Faglig bakgrunn..............................................................................................................11 2.1 Proof of concept ..........................................................................................................11 2.2 Scrum .........................................................................................................................11 2.2.1 Sprinter .....................................................................................................................12 2.2.2 Roller i Scrum ...........................................................................................................12 2.2.3 Valget av Scrum ........................................................................................................13 2.2.4 Scrum vs fossefallsmetoden .....................................................................................13 2.3 3. Elevator pitch ..............................................................................................................13 Teknologier ....................................................................................................................14 3.1 EXtensible Markup Language(XML) ...........................................................................14 3.2 JavaScriptObjectNotation (JSON) ...............................................................................14 3.3 REpresentional State Transfer (REST) .......................................................................14 3.4 Java for Android ..........................................................................................................15 3.4.1 Dalvik VM ..................................................................................................................15 4 3.4.2 Valg av programmeringsspråk...................................................................................15 3.5 ASP.NET Web API .....................................................................................................15 3.6 Utviklingsmiljøer ..........................................................................................................15 3.6.1 Android Studio ..........................................................................................................15 3.6.2 Visual Studio .............................................................................................................15 3.7 Eksterne biblioteker og APIer ......................................................................................15 3.7.1 Spring for Android .....................................................................................................15 3.7.2 Robospice .................................................................................................................15 3.7.3 Google Places API ....................................................................................................16 3.7.4 Git .............................................................................................................................16 3.7.5 Azure-server .............................................................................................................16 3.7.6 Entity Framework ......................................................................................................16 3.7.7 Microsoft Azure Blob ................................................................................................16 3.8 Shared preferences .....................................................................................................17 3.9 Valg av ulike teknologier .............................................................................................17 3.9.1 Java for Android ........................................................................................................17 3.9.2 Valg av Azure ............................................................................................................17 3.9.3 Webserver.................................................................................................................17 Prosessdokumentasjon 4. Innledning av samarbeid ................................................................................................19 4.1 Samarbeid i gruppa.....................................................................................................19 4.2 Samarbeid med oppdragsgiver ...................................................................................19 4.3 Samarbeid med veiledere ...........................................................................................19 4.3.1 Intern veileder ved Høgskolen ...................................................................................19 4.3.2 Veiledere ved Accenture ...........................................................................................19 5. Utvikling av kravspesifikasjonen .....................................................................................20 5.1 Første utkast ...............................................................................................................20 5.2 “No fuss, just music” ...................................................................................................20 5.3 Spesifisering av målgruppe .........................................................................................21 5.4 Funksjonalitetskutt ......................................................................................................21 5.4.1 Diskusjoner etter funksjonalitetskutt ..........................................................................21 5.4.2 Use case etter funksjonalitetskuttene ........................................................................22 5.5 Brukertestingens innvirkning på oppgaven ..................................................................22 5 6. Første sprint (03. feb - 24. feb) .......................................................................................23 6.1 Oppstart med Scrum ...................................................................................................23 6.2 Estimering ...................................................................................................................23 6.3 Problemer med Scrum ................................................................................................23 6.4 Realiseringer etter 1. sprint .........................................................................................23 6.5 Retrospektiv ................................................................................................................24 6.5.1 Hva fungerte dårlig, og hvorfor? ................................................................................24 6.5.2 Hva fungerte? ...........................................................................................................25 6.6 Presentasjoner............................................................................................................25 6.6.1 Styringsgruppen i Accenture .....................................................................................25 6.6.2 Veilederen på høyskolen og andre interessenter.......................................................25 7. Andre sprint (24. feb - 07. apr)........................................................................................26 7.1 Planlegging .................................................................................................................26 7.2 Diskusjoner underveis .................................................................................................27 7.3 Avslutting av 2. sprint ..................................................................................................28 7.3.1 Første utsettelse av sluttdato på 2. sprint ..................................................................29 7.3.2 Andre utsettelse av sluttdato på 2. sprint ...................................................................29 7.4 Nødvendig med videre funksjonalitetskutt ...................................................................29 7.5 Retrospektiv ................................................................................................................30 7.5.1 Hva fungerte dårlig, og hvorfor? ................................................................................30 7.5.2 Hva fungerte? ...........................................................................................................30 8. Tredje sprint (08. apr - 01. mai) ......................................................................................31 8.1 Planlegging .................................................................................................................31 8.2 Valget om ikke å estimere tid ......................................................................................31 8.3 Underveis ...................................................................................................................33 8.3.1 Tekniske grunner til at vi ikke ble ferdige ...................................................................33 8.3.2 Andre grunner til at vi ikke ble ferdige .......................................................................33 8.4 Etter sprint ..................................................................................................................33 8.5 Retrospektiv ................................................................................................................35 8.5.1 Hva fungerte dårlig, og hvorfor? ................................................................................35 8.5.2 Hva fungerte? ...........................................................................................................36 6 Produktdokumentasjon 9. Resultater .......................................................................................................................37 9.1 Kravspesifikasjon ........................................................................................................37 9.1.1 Overordnet systembeskrivelse ..................................................................................37 9.1.2 Funksjonelle egenskaper og brukergrensesnitt .........................................................37 9.2 Teknisk beskrivelse av produktet ................................................................................40 9.2.1 Systemets hovedkomponenter ..................................................................................40 9.2.2 Fronteend: Androidapplikasjon ..................................................................................40 9.2.3 Backend ....................................................................................................................55 9.3 Proof of concept ..........................................................................................................62 9.4 Oppfyllelse av krav til funksjonalitet ............................................................................62 9.5 Søkekriterier ...............................................................................................................63 9.5.1 Om geografisk område som søkekriterie ...................................................................63 9.5.2 Om sjanger som søkekriterie.....................................................................................63 9.5.3 Videreutvikling av søkekriterier..................................................................................64 9.6 10. Sammenlignet med konkurrerende løsninger ..............................................................64 Brukertesting ..................................................................................................................65 10.1 Om undersøkelsene: Kvalitativ forskningsmetode ......................................................65 10.2 Forhold rundt testingen ...............................................................................................65 10.3 Hva undersøkte vi? .....................................................................................................65 10.4 Resultater ...................................................................................................................66 10.4.1 For mye funksjonalitet .............................................................................................66 10.4.2 Kommunikasjon mellom brukere .............................................................................66 10.4.3 Billettkjøp ................................................................................................................66 10.4.4 Liste vs. swipefunksjon............................................................................................66 10.4.5 Innlogging ...............................................................................................................66 10.4.6 Mengden informasjon ..............................................................................................66 10.4.7 Brukergrensesnitt ....................................................................................................67 10.5 11. Innvirkninger av testresultat på produktet ...................................................................67 Konklusjon......................................................................................................................68 11.1 Egenevaluering ...........................................................................................................68 11.1.1 Gjennomføring ........................................................................................................68 11.1.2 Samarbeid/gruppeprosessen ..................................................................................68 7 11.1.3 Læringsutbytte ........................................................................................................69 11.2 12. Videre arbeid ..............................................................................................................70 Referanser .....................................................................................................................72 Vedlegg 1. Ordliste ..............................................................................................................................76 2. Styringsdokumenter ...........................................................................................................78 3. Elevator pitch .....................................................................................................................85 4. Brukertester .......................................................................................................................86 5. Prosjektskisse ....................................................................................................................87 6. Brukerveiledning ................................................................................................................89 7. HTTP API References......................................................................................................104 8. Klasseoversikt – applikasjon ............................................................................................107 9. Klasseoversikt – server ....................................................................................................113 8 Innledning og bakgrunn 1. Presentasjon 1.1 Innledning I denne delen presenteres oppgaven og de involverte aktørene. Bakgrunn og mål for oppgaven beskrives, samt hvordan vi har avgrenset den. 1.2 Involverte aktører 1.2.1Studentgruppen Rannveig A. Skjerve, s126247 Dataingeniør s126247@stud.hioa.no Madeleine Victoria Kongshavn Rønning, s188895 Informasjonsteknologi madekoro@hotmail.com Emilie Strand, s188904 Informasjonsteknologi stremilie@gmail.com 1.2.2 Intern veileder fra HiOA G. Anthony Giannoumis george.giannoumis@gmail.com 1.2.3 Veiledere fra Accenture Jonas Korssjøen jonas.korssjoen@accenture.com Henrik Bjerke henrik.bjerke@accenture.com 9 1.3 Presentasjon av de involverte aktørene 1.3.1 Studentgruppa Gruppa har bestått av tre medlemmer fra linjene informasjonsteknologi og dataingeniørfag. Madeleine og Emilie har jobbet sammen på mange prosjekter gjennom studietiden. Rannveig er nyeste tilskudd i gruppa, og har samarbeidet med de to andre på obligatoriske innleveringer siden andre året. Vi har jobbet godt sammen tidligere, og det var derfor et naturlig valg å fortsette samarbeidet inn i bacheloroppgaven. Medlemmene i gruppa har tidligere tatt emner innenfor apputvikling for Android og NETteknologi, som er hovedteknologiene som ble brukt i implementeringen av Semitone. 1.3.2 HiOA Høgskolen i Oslo og Akershus (HiOA) er landets største statlige høgskole, med ca. 16 000 studenter og over 1850 tilsatte. Innenfor fakultetet TKD, teknologi, kunst og design, tilbys høyere utdanning i datafagene Dataingeniør, Informasjonsteknologi og Anvendt Datateknologi. Dette fakultetet har rundt 2800 studenter. 1.3.3 Accenture Accenture er et globalt konsulentselskap som leverer tjenester innenfor rådgivning, teknologi og outsourcing, og har ca. 305 000 ansatte verden rundt. I Norge har Accenture kontorer i Bergen, Stavanger og Oslo, og har kunder innenfor både offentlig og privat sektor. 1.4 Oppgaven 1.4.1 Hva slags oppgave er det? Oppgaven er et proof of concept i regi av Accenture Norge, og har hatt et todelt fokus; Å videreutvikle en idé til et produkt, og en teknisk implementering av dette produktet. 1.4.2 Mål for oppgaven Å utvikle en applikasjon som - 1.5 Tilgjengeliggjør lokale musikkmiljø for flere Fasiliterer «communitybygging» for de lokale musikkmiljøene Gir små ukjente artister en enkel mulighet til å promotere seg selv Bakgrunn 1.5.1 Behovet Vi er en over gjennomsnittet musikkinteressert gruppe. Flere av oss er musikere, og har erfaring med vanskelighetene knyttet til å finne fram til de lokale scenene, og å få musikken vår hørt i havet av små ukjente artister. Selv om det finnes flere verktøy som holder oversikt over konserter nær deg, finnes det få som setter mindre scener og band i fokus. Det finnes heller ikke mange søkbare alternativer med 10 mindre man kan de «riktige» ordene. Subkulturer har dermed ingen plattform for enkelt å nå et interessert publikum utenfor sin egen omgangskrets. 1.5.2 Eksisterende løsninger Programmer som Spotify og SoundCloud gjør det lett å finne ny musikk. Denne typen programmer tilbyr ofte topplister av trendende band og artister. Spotify vil også vise konserter i din by for band du liker. Det er også tjenester som Bandsintown som finner konserter på de kjente scenene i byen din. Det finnes mange ulike plattformer for musikk, men som nevnt glemmer disse ofte de små artistene og viktigheten av lokal tilhørighet. Ukjent musikk drukner i de mer populære og får ikke samme sjanse til å bli hørt. Dette ønsker vi å endre på, og det er her vår løsning skiller seg fra eksisterende løsninger. Appen orienterer seg rundt mindre band i nærmiljøer, og å gjøre deres musikk tilgjengelig for flere. Tjenesten vil, ulikt de store musikkapplikasjonene, etablere et fellesskap der man får utvidet sin kunnskap og kjærlighet for lokal musikk. 1.6 Avgrensning Vi har hatt mange idéer, under videreutviklingen av produktet har vi derfor vært nødt til å begrense antall idéer som skulle legges inn. Oppgaven er avgrenset til å skulle produsere et ‘proof of concept’ og tilpasset en begrenset målgruppe. Et teknisk proof of concept er ikke et ferdig produkt, men et teknisk bevis på at en idé er gjennomførbar. Vi har derfor valgt å fokusere på implementering av hovedfunksjonene og godtatt at noen funksjoner blir stående som “placeholdere”. Spissing av målgruppen har endret omfanget i appen, og har ført til mange kutt av funksjoner. Dette er beskrevet i detalj i avsnitt 5.4 Funksjonalitetskutt. 2. Faglig bakgrunn 2.1 Proof of concept Et proof of concept er en demonstrasjon av at et konsept eller en idé er gjennomførbar. Det vil si at oppgavens fokus ikke har vært på levering av et ferdig produkt, men å produsere en teknisk løsning som viser at det vil være mulig å utvikle idéen til et ferdig produkt. Med andre ord er ikke alle funksjoner implementert, kun de som er nødvendige for å vise idéen. Fokuset har ligget på å finne løsninger på tekniske utfordringer idéen fører med seg, og generelt teste og finne ut hvordan vi best kan oversette konseptet vårt til en fungerende applikasjon. 2.2 Scrum Scrum er et rammeverk for organisering av arbeid i forbindelse med utvikling av programvarebaserte systemer. Teorien er basert på empirisk prosesskontroll, og på inkrementell og iterativt produksjon i selvdrevne tverrfaglige «Scrum team». Scrum team styrer i 11 praksis seg selv, og definerer målene for programutviklingen underveis i kontinuerlig samarbeid med produkteier1. Arbeidsoppgaver knyttet til utvikling av funksjonene som skal utvikles, legges i en prioritert liste kalt Product Backlog. Backlogen endrer seg gjennom hele prosjektet basert på tilbakemelding fra produkteier og erfaringer i teamet. Utviklingen av Semitone har hele tiden vært basert på brukertesting, noe som har ført til at implementerte og planlagte funksjoner ofte har endret karakter. Det var derfor en stor fordel for oss å bruke Scrum, heller enn andre utviklingsrammeverk som ofte krever en fastsatt kravspesifikasjon før implementeringen av produktet kan begynne. 2.2.1 Sprinter Målene oppnås gjennom utvikling av små produktinkrementer kalt sprinter. På begynnelsen av en sprint velges det ut et sett med funksjoner som skal implementeres i løpet av de 1-4 ukene sprinten foregår. Korte sprinter fører til at mye tid går med til planlegging, men lengre sprinter gjør utviklingen mindre smidig. For hver av funksjonene som skal implementeres i prosjektet, lages det oppgavelister. Disse legges i lister kalt “Sprint backlog”, og alle sprinter planlegges ut fra disse. Under hele sprinten gjennomføres det daglige møter, der teammedlemmene oppdaterer hverandre og koordinerer arbeidet videre. Det blir lagt vekt på at disse møtene skal være korte, og de gjennomføres gjerne stående, noe som har gitt disse møtene navnet “stand-up”. Disse gir også oversikt for Scrum-master, og dermed prosjektleder. Ved å holde temaet oppdatert kan man få hjelp tidlig; man får utnyttet hele teamets kompetanse og erfaring ved å fortelle om arbeidsoppgavene sine og om ting som er til hinder. På slutten av en sprint demonstreres produktet av sprinten, et Minimal Viable Product (MVP), til noen utvalgte interesserte. Hensikten med dette er å få tilbakemeldinger og innspill til videre utvikling. Etter dette gjennomfører teamet et «retrospekt» som er et møte der sprinten diskuteres. Teamet går igjennom hva som fungerte og hva som ikke fungerte, og tar med seg disse erfaringene inn i neste sprint. 2.2.2 Roller i Scrum Scrumteam: Et Scrumteam er alle som er involvert i det nødvendige arbeidet. Scrumteamet består av produkteier, Scrum master og et utviklingsteam. Produkteier: Produkteieren representerer interessenter og skal sikre at Scrumteamet jobber med de riktige tingene sett fra et forretningsperspektiv. Hen er ansvarlig for at product backlog er oppdatert og tilgjengelig for interessenter og utviklingsteam. Scrum master: Scrum master er ansvarlig for gjennomføringen av Scrum i Scrumteamet, samt all ekstern kontakt slik at teamet kan jobbe uten distraksjoner. 1 se underkapittel “2.2.2 Roller i Scrum” 12 Utviklingsteam: Et utviklingsteam er et tverrfaglig team som står for selve produksjonen i hver sprint. 2.2.3 Valget av Scrum Det var et ønske fra Accenture at vi skulle benytte oss av Scrum som utviklingsmetode, fordi de bruker det i sine prosjekter. Selv om vi teknisk sett selv er produkteiere har også Accenture, representert av våre veiledere Jonas og Henrik, hatt denne rollen. På denne måten har de fått jevnlige oppdateringer underveis, og ikke bare et ferdig produkt på slutten av semesteret. 2.2.4 Scrum sammenlignet med fossefallsmetoden Scrum er godt egnet for en oppgave som vår ettersom det lar teamet utvikle både krav og løsninger kontinuerlig. Andre metoder, som fossefallsmetoden, krever at man har ferdige spesifikasjoner basert på satte krav før man kan begynne med selve programmeringen. Scrum har flere iterasjoner med tidlig og hyppig feedback. Tidlig feedback på grovstruktur eller enkeltkomponenter kan spare masse tid sammenlignet med å utvikle ferdig og dermed finne store problemstillinger som må gjøres om på. I større og lengre prosjekter kan også bruk av fossefall føre til et utdatert produkt ettersom det ikke får utviklet seg i takt med markedet. Scrum gir derimot flere MVPs som fører til hyppige tilbakemeldinger underveis, og gjør at man får optimalisert produktet på de viktige områdene. En ulempe her er at man kan bli for fokusert på å utbedre det man får feedback på, slik at man ikke får videreutviklet. Det hender jo også at kunden ikke vet best. Med tanke på at vårt prosjekt begynte med kun en idé, og fordi vi ville være åpne for endringer underveis, var fossefallsmetoden ikke et passende valg for oss. Scrum derimot ville gi oss det vi trengte av fleksibilitet, samtidig som det fremdeles var klare strukturer og planer i form av product backlog og sprinter. 2.3 Elevator pitch En elevator pitch er en kort forklaring av et produkt, og hva som gjør det unikt. Man ønsker å fange lytterens oppmerksomhet, og få dem til å ville vite mer. Navnet kommer av at den skal være kort nok til å kunne holdes under en heistur, altså rundt 30 sekunder. Å skrive et elevator pitch er ikke bare en øvelse i retorikk, men er også et nyttig verktøy for definering av et konsept. 13 3. Teknologier 3.1 EXtensible Markup Language (XML) <element> <subelement attribut="informasjon om element"/> <subelement attribut="informasjon om element"> <andre_subelement attribut="informasjon om elementet"/> <subelement> </element> (Figur 3.1 A – ‘‘XML-eksempel’’) XML er et plattformuavhengig markeringsspråk designet for lagring og utveksling av strukturerte data. Dataene struktureres hierarkisk i elementer markert med <starttag> og </sluttag>. Attributter beskriver elementene. XML har hovedsakelig blitt brukt til layoutbeskrivelser for mobilapplikasjonen i dette prosjektet. 3.2 JavaScriptObjectNotation (JSON) "address_components" : [ { "long_name" : "Gothenburg", "short_name" : "Gothenburg", "types" : [ "locality", "political" ] } ] (Figur 3.2 A – ‘’Utdrag fra JSON response fra Google Places Api’’ ) JSON er en tekstbasert representasjonsstandard for utveksling av data. I likhet med XML organiseres JSON hierarkisk, men i motsetning til XML som baserer seg på elementbeskrivelse, bruker JSON objekter for datautvekslingen. JSON har blitt brukt til datautveksling mellom mobilapplikasjonen og server i dette prosjektet. 3.3 REpresentional State Transfer (REST) REST er en arkitektonisk stil for utforming av skalerbare webtjenester. Den baserer seg på en klient-server arkitektur, der ressurser via lett lesbare URI aksesseres og manipuleres gjennom HTTP-metodene. 14 3.4 Java for Android Standard programmeringsspråk for Android-applikasjoner er Java med Android SDK. Logisk programmering blir gjort i Java-syntaks, mens det meste av den visuelle programmering blir gjort i XML. 3.4.1 Dalvik VM I syntaks er standard Java og Java for Android like, men en Androidapplikasjon kjører på en annen type VM enn andre Javaapplikasjoner. Dalvik VM er basert på et subset av Apache Harmony-prosjektet, og kjører ikke Java byte kode, men sitt eget format kalt DEX (Dalvik Executable Format) 3.4.2 Valg av programmeringsspråk Gruppemedlemmene har betydelig erfaring med Java for Android, samtidig var det et tungtveiende argument for oss at vi ville ha en applikasjon som kunne kjøre på iOS også. Vi så på cross-platform-alternativer som Xamarin og Appcelerator Titanium. Etter råd fra veilederne våre på Accenture, valgte vi å bruke Java for Android. På denne måten kunne vi fokusere på å produsere en god app, og kode bra i et språk vi allerede var kjent med. 3.5 ASP.NET Web API ASP.NET er et rammeverk for server med åpen kildekode. Det er i utgangspunktet designet for utvikling av dynamiske websider, men har de siste årene også fått fasiliteter for API-routing som vi har brukt for å lage REST-APIen i Semitone. 3.6 Utviklingsmiljøer 3.6.1 Android Studio For Androidapplikasjonen har vi valgt å bruke Android Studio. Android Studio bygger på JetBrains IntelliJ IDEA Software og er designet spesielt for utvikling til Android. 3.6.2 Visual Studio Visual Studios er en IDE utviklet for Microsofts .NET-teknologi, med støtte for flere språk som blant annet Python, C#, Node.js og HTML/JavaScript. 3.7 Eksterne biblioteker og APIer 3.7.1 Spring for Android Spring-rammeverket er en applikasjon for Java med åpen kildekode, og er en samling av flere rammeverk. Spring for Android er fokusert på REST-kommunikasjon, og har en fullstendig REST-klient som vi har brukt i kommunikasjon fra applikasjonen til server. 3.7.2 Robospice Androidapplikasjoners oppbygging fører til en del utfordringer når det kommer til nettverksoperasjoner. En aktivitet representerer et skjermbilde, og aktivitetens livssyklus er knyttet til skjermbildets synlighet. 15 Robospice håndterer dette ved å la en Singleton Service kjøre lokalt i applikasjonen, og la aktiviteter få tilgang til denne ved hjelp av SpiceManagers. På denne måten kan tjenesten kjøre hele tiden, og nettverksoperasjoner stoppes og startes uten problemer. 3.7.3 Google Places API Google Places API tilbyr flere måter å aksessere lokasjonsdata fra Googles databaser. I Semitone har vi brukt JavaScript-biblioteket for autocomplete i appen og for å få tak i koordinater på serversiden. 3.7.4 Git Git er et system for versjonskontroll- og distribueringssystem. Hver utvikler jobber med sin egen lokale versjon som «flettes» sammen på server. Vi har brukt Git for både server og mobilapplikasjonsprosjektet. Vi har brukt GitHub som Git-server, og vekslet mellom å bruke GitHubs UI og Git kommandolinje. 3.7.5 Azure-server Microsoft Azure er en cloud computing platform, og er integrert med Visual Studio. 3.7.6 Entity Framework Entity Framework er en Object-Relational Mapper som brukes i .NET-rammeverket for arbeid på relasjonell data basert på domenemodeller. Med andre ord gjør Entity Framework jobben med å behandle data i ulike representasjoner slik at ulike teknologier kan bruke, og jobbe med, disse uten datainnlesningskode fra utvikler. (Figur 3.7.6 A – «Entity Framework Mapping») 3.7.7 Microsoft Azure Blob Microsoft Blob gir brukere mulighet til å lagre store mengder av ustrukturert data, som kan bli aksessert fra hvor som helst i verden ved hjelp av HTTP eller HTTPS. Microsoft Blob består av 3 hovedkomponenter. (Figur 3.7.7 A – «Blob») 16 Container: en container er en gruppering av et sett med blob’er. Alle blob’er må være i en beholder. Blob: en fil av enhver type eller størrelse. En blob kan enten være en block eller page. Storage Account: all aksess til Azure lagring er gjort gjennom en storage konto. 3.8 Shared Preferences Android gir mange muligheter til å lagre data i en applikasjon. En av disse er Shared Preferences, som gjør det mulig å lagre og hente ut data i form av nøkkelverdi par. Passer ideelt hvis man for eksempel skal lage IDen til en bruker. 3.9 Valg av ulike teknologier 3.9.1 Java for Android Etter råd fra veilederne har vi valgt å programmere med Java for Android. Cross-platform teknologier som Xamarin og Tamarin ble diskutert, men vi har valgt å fokusere på god koding i et språk vi kjenner. For et proof of concept har dette vært en god løsning, men det er en avgjørelse som bør diskuteres hvis applikasjonen skal videreutvikles for et kommersielt marked. 3.9.2 Valg av Azure Ettersom vi bestemte oss for å ta i bruk Visual studio til å håndtere forespørsler for databasen, ble bruk av Microsoft Azure en naturlig løsning for lagring av databasen og webserveren. Det at Visual Studio integrerer bruk av Azure i tillegg til at Microsoft Azure fakturerer for faktisk bruk, gjorde dette valget av lagringsenhet enkelt. 3.9.3 Webserver Entity Framework Code First For oppbygningen av databasen har vi brukt Entity Framework Code First. Code First-tilnærmingen gir en bedre kontroll over koden enn om vi hadde brukt Model First eller Database First. Med Code First-tilnærmingen koder man selv modellene som blir bruk til å generere databasen og man trenger ikke å forholde seg til en rekke automatisk genererte filer. Med Database First vil ikke relasjonene eller attributtene nødvendigvis bli slik man ønsker. Selv om det ofte er løsninger for problemer med genereringer av automatisk kode så gir valget av Code First-tilnærmingen oss full kontroll over databasen, og lar oss trygt spesifisere forhold, størrelse og restriksjoner. (Figur 3.9.3 A – ‘‘Entity framework’’) 17 LINQ Databaseforespørslene skjer ved hjelp av LINQ, som er en Microsoft .NET Framework Component og er allerede integrert i Visual Studio. Vi har erfaringer med LINQ fra før av, så dette ble en enkel avgjørelse. 18 Prosessdokumentasjon 4. Innledning av samarbeid 4.1 Samarbeid i gruppa Da vi begynte samarbeidet, bestemte vi at vi skulle møtes tirsdag, onsdag og torsdag fra 09.00 til 16.00, men opplevde at dette fungerte dårlig. Folk kom ofte for sent, og det ble uttrykt fra medlemmer i gruppa om at det å sitte sammen så lenge per dag var en slitsom måte å jobbe på. Vi bestemte oss derfor for å definere en ‘’kjernetid” mellom klokka 10.00 - 14.00, i denne tiden skulle alle være tilstede, så var det opp til hver enkelt om de ville ta resten av tiden hjemme eller fortsette å sitte sammen. Bachelorprosjektet er 2/3 av studiepoengene dette semesteret, vi bestemte derfor at 3 av 5 arbeidsdager i uka skulle gå til arbeid med oppgaven. Med andre ord skulle hver av oss jobbe minst 3*8 timer i uka. I tillegg bestemte vi at vi skulle sitte og jobbe på Accenture på torsdager. Vi kom opp med en koselig idé for å holde oppe arbeidsmoral og en god stemning i gruppa: song of the week. Hver uke valgte én av oss en sang som vi hørte på sammen om morgenene. Dette har funket bra for humør og stemning; vi har fått delt vår kjærlighet for musikk med hverandre, noe som i stor grad er relatert til prosjektet, og ble tvunget til en liten pause med felles komplett avslapning eller sporadisk dansing. 4.2 Samarbeid med oppdragsgiver Accenture driver i utgangspunktet ikke med utvikling av produkter og tjenester mot konsumentmarkedet; å opptre som stakeholder for en oppstartsbedrift som utvikler en musikkapp faller derfor utenfor Accenture’s kjernevirksomhet. Likevel er Accenture interessert i studenter med teknisk innsikt og gode analytiske evner. Accenture sa seg derfor villig til å stille som en teoretisk produkteier for prosjektet, selv om de ikke egentlig vil få noe ut av sluttproduktet (prosjektgruppen innehar alle rettigheter for produktet). 4.3 Samarbeid med veiledere 4.3.1 Intern veileder ved Høgskolen Fra Høgskolen fikk vi tildelt G. Anthony Giannoumis som veileder. Han har blant annet bistått med utvikling av forretningsidé og presentasjonsteknikk. Vi møttes hver tirsdag på Høgskolen. 4.3.2 Veiledere ved Accenture Hos Accenture har vi fått hjelp fra Henrik Bjerke og Jonas Korssjøen. Har spesielt vært til hjelp med bruk av Scrum, og prioritering av oppgaver. Vi møttes hver torsdag på Accenture. 19 5. Utvikling av kravspesifikasjonen 5.1 Første utkast Problemstillingen vi har valgt oss har mange aspekter, og det er flere måter å angripe den på. En viktig del av prosjektet har derfor vært å lage en kravspesifikasjon som oppfyller våre ønsker og samtidig gir et gjennomførbart produkt. Kravspesifikasjonen har vært under kontinuerlig endring mens vi jobbet med prosjektet, med sterk påvirkning fra brukertesting. Vår første prosjektskisse og forslag til scope2 besto av 6 use case: 1. En bruker har lyst til å finne en konsert å gå på i en gitt uke, eller dato. Brukeren kan bla igjennom konserter innenfor sine sjangere og sitt område. Brukeren velger konsert og blir eventuelt sendt videre til billettbooking. 2. Et band trenger en trommeslager. Gjennom applikasjonen kan de finne trommeslagere innenfor samme sjanger og område som leter etter band. 3. En musiker trenger andre å spille med. Gjennom appen kan musikeren finne andre innenfor samme sjanger som spiller de instrumentene musikeren leter etter. 4. Bruker skal ha fest og ønsker å hyre et liveband. Ved å gå inn i appen og lete blant de etablerte bandene innen for en gitt sjanger, kan de finne et som passer til eventet og ta kontakt. 5. En konsertarena har en ledig kveld for et band/en musiker. Som i use caset over, kan de finne et band som passer til stedet og booke dem. 6. Bruker har funnet seg et band og de ønsker seg spillejobber. De kan lage en profil for bandet og slik gjøre seg tilgjengelig for alle som ønsker å booke. 5.2 “No fuss, just music” Etter oppfordring fra Anthony, skrev vi en rekke elevator pitches3 mens vi arbeidet med omfanget av prosjektet. Gjennom dette arbeidet kom Rannveig opp med slagordet “no fuss, just music”. Disse ordene har vært vår bibel; i resten av utviklingsprosessen ble all utvikling og alle endringer gjort med dette i tankene. Vi ville at musikken skulle stå i sentrum, og at så lite som mulig skulle være i veien. For at kun nødvendig informasjon skulle komme fram til brukeren, gjorde vi flere valg: ● ● ● Band kan kun opplyse om konserter; ingen andre oppdateringer Det er ingen «vegger» man kan skrive på; ingen kommentarer, og ingen meldingsfunksjoner Man må være venn med noen for å sende band- eller konsertforslag 2 Ligger vedlagt som “5. Prosjektskisse” 3 Våre elevator pitches ligger som vedlegg nummer 3 20 ● ● 5.3 Man må ha brukernavnet til en annen bruker for å legge dem til som venn, og slik unngår man tilfeldige/fremmede venneforespørsler Det skal være minimalt med informasjon om personer og band Spesifisering av målgruppe Brukergruppen var på dette tidspunktet dårlig definert. Det vi så på som én brukergruppe var i realiteten mange ulike grupper mennesker. Målet for applikasjonen var veldig ambisiøst, og en fullstendig løsning for bygging og tilgjengeliggjøring av lokale musikkmiljø vil inkludere flere målgrupper. Selv om disse målgruppene har en felles interesse, har de svært forskjellige behov. Vi bestemte oss for å fokusere på personer som er interesserte og engasjerte i sitt lokale musikkmiljø. 5.4 Funksjonalitetskutt Med bakgrunn i “no fuss, just music” og en ny, veldefinert målgruppe, bestemte vi oss for å kutte ut funksjonalitetene for konsertarenaer og hyring av band, som i use case nummer 4, 5 og siste del av 6. Under jobbing med elevator pitch og brukertesting innså vi at disse funksjonene virket overflødige, og litt “på siden” av hva vi ønsket at appen skulle være. Den skjebnesvangre dagen 20. januar kuttet vi bort vårt hjertebarn; musiker-finner-musikerdelen av appen (se use case 2 og 3). Den gjorde appen mer komplisert uten å føre til mer bruk, i tillegg til at det falt utenfor den brukergruppen vi hadde valgt å fokusere på. Vi fjernet også at en skulle bli sendt videre til billettbooking. Mange av konsertene i applikasjonen, vil være små og ikke ha en nettside for kjøp av billetter. Om vi skulle opprette vår egen betalingsfunksjon ville det kreve logistikk og sikkerhet som vi ikke hadde hatt tid til å gjennomføre. Brukertesting var også til hjelp med denne beslutningen. 5.4.1 Diskusjoner etter funksjonalitetskutt Selv om vi var enige om de større avgjørelsene, var det uenighet i gruppa rundt elementer som virket som småting. Et eksempel på en slik diskusjon var hvorvidt brukere skulle kunne se hvor mange følgere et band har, og hvem de er. Dette kom opp som et spørsmål fordi det ble sett på som unødvendig detalj av enkelte i gruppa. Med andre ord går det i mot “no fuss, just music”. På en annen side er man som bruker i en slik sammenheng vant til å kunne se hvem av sine venner som liker et band. Det er helt klart viktig å ta hensyn til hva brukere er vant til når en utvikler, med tanke på gjenkjennelse og at en tilbyr det som forventes. Samtidig ønsket vi å ikke bare lage en kopi av tidligere applikasjoner. Det handler om å finne en balanse mellom å være nyskapende og å skape trygghet for brukeren, samtidig som vi holder oss til “no fuss, just music”. Vi innså at det vi hadde sett på som unødvendige smådiskusjoner egentlig hadde vært symptomer på en større uenighet; hva skulle hovedfokuset i appen være etter funksjonalitetskuttene? På dette punktet hadde vi kuttet alle use case utenom halvparten av det første: 21 En bruker har lyst til å finne en konsert å gå på i en gitt uke, eller dato. Brukeren kan bla igjennom konserter innenfor sine sjangere og sitt område. I tillegg var vi fremdeles avhengig av band, så de måtte også ha en plass i appen. Til tross for at vi nå skulle fokusere på kun ett use case var det mange måter å løse det på og dermed ulike idéer i gruppa. Skulle vi rendyrke ”no fuss, just music”-konseptet, ha lite interaksjon mellom brukerne, og sikte oss inn mot undergrunnsmiljøer? Eller burde vi heller gjøre appen tilgjengelig for et bredere publikum; mer Facebook-lignende, slik at brukerne hadde en news feed og kunne kommunisere med venner om band og konserter? Med andre ord, burde vi forenkle appen i størst mulig grad eller legge til flere interessante funksjoner? 5.4.2 Use case etter funksjonalitetskuttene 1. 2. 3. 4. 5. 6. 7. 8. 9. Bruker kan logge inn med egen konto, eller via sin konto fra Google eller Facebook Bruker får forslag til band basert på hens preferanser og kan legge dem til i lista si Bruker får forslag til konserter på hens preferanser og kan legge dem til i lista si Bruker har en venneliste, og kan legge til venner om hen vet brukernavnet Bruker kan sende bandforslag til sine venner Bruker kan sende konsertforslag til sine venner Bruker kan opprette artistprofiler Bruker kan redigere artistprofiler Bruker kan opprette konserter for sine artistprofiler Den endelige kravspesifikasjonen finnes under 9.1 Kravspesifikasjon. 5.5 Brukertestingens innvirkning på oppgaven Diskusjoner om funksjonaliteter og hva brukere ønsket seg tok opp mye tid i den første delen av utviklingsprosessen. Vi valgte derfor å begynne med brukertesting, og bruke tilbakemeldingene aktivt i beslutningsprosessen. Dette hindret timevis med diskusjoner i gruppa, gjorde oss sikrere på at det finnes et marked for appen. På grunn av smidigheten i Scrum har vi hele tiden hatt mulighet til å endre spesifikasjoner basert på tilbakemeldinger. Brukertesting ble satt i sentrum etter dette, noe som førte til at vi hadde en kravspesifikasjon som endret seg hele tiden. Vi valgte å ta utgangspunkt i de nye use casene, og var klare for endringer basert på testing underveis4. 4 Utdypende om våre brukertester under punkt 10. Brukertesting 22 6. Første sprint (03. feb - 24. feb) 6.1 Oppstart med Scrum Scrum fungerer best med skreddersydde programmer for planlegging, organisering og gjennomføring. Vi fikk anbefalt noen verktøy på Scrumkurset vi deltok på hos Accenture, men siden vi ikke hadde tilgang til disse valgte vi å bruke Agilefant som var et gratis alternativ. Agilefant er et verktøy for smidig utvikling, men er ikke utviklet spesielt for Scrum. Det inneholder allikevel de grunnleggende funksjonalitetene vi trengte, som å legge inn oppgaver i lister, markere disse med status o.l. 6.2 Estimering Selv om vi hadde hatt et Scrumkurs var vi ikke helt sikre på hvordan vi skulle estimere hvor lang tid de ulike oppgavene ville ta. Vi prøvde på best mulig vis å følge det vi lærte og gi en liten oppgave et lavt tall som symbol på oppgavens omfang, og jobbe derifra ved å gi høyere og høyere tall til større oppgaver. Vi brukte relative story points, som vil si at tallet i seg selv ikke var en tidsramme eller tilsvarte arbeidstimer. Med relative tall kunne vi likevel lettere velge en oppgave basert på om man kunne ta en liten eller større arbeidsmengde, uten å henge seg for mye opp i nøyaktig hvor lang tid man hadde på seg. Arbeidstimer er også vanskeligere å estimere, spesielt i begynnelsen av programmeringen når man ikke enda er kjent med prosjektet med tanke på hvordan oppgavene bør løses, ny teknologi, arbeidsmiljø og annet som spiller inn på effektivitet. 6.3 Problemer med Scrum Underveis i sprinten ble vi mindre og mindre flinke til å bruke Agilefant fordi det var så uoversiktlig, og dermed mindre flinke til å bruke Scrum. Vi hadde stand-up, men utenom dette jobbet vi uten Scrum. Vi fulgte ikke planen nøye nok, tenkte ikke på hvor mye tid en oppgave tok, og jobbet generelt med det vi selv følte var viktig fremfor det vi hadde loggført i Agilefant at vi skulle gjøre under 1. sprint. Vi innså derfor ikke at vi hadde underestimert oppgavene og satt inn alt for mye arbeid i sprinten, og som en følge av dette hang vi langt bak vår egen framdriftsplan. 6.4 Erkjennelser etter 1. sprint “Scrum: now it makes sense” - Oss, etter 1. sprint Scrum ble tydeligere og enklere i etterkant av 1. sprint. Planleggingen ble lettere å gjennomføre for neste sprint, samt at vi følte at selve planleggingen virkelig ville hjelpe oss med arbeidet framover. Dette i motsetning til 1. sprint hvor vi følte at Scrum var i veien, og bare ekstraarbeid. Vi innså at vi hadde hatt veldig sterk fokus på business-delen av prosjektet, og vi måtte ta en avgjørelse om at vi i neste sprint skulle prioritere koding for å sikre framgang. I løpet av 1. sprint hadde vi hatt flere presentasjoner, hvorav én var helt business-rettet og ikke teknisk, vi jobbet med elevator pitches, og tenkte på hva vi skal gjøre med appen etter at bachelorprosjektet er ferdig; skal vi være med på Google Summer of Code, skal vi søke om støtte til å fortsette med 23 utvikling av appen, osv. Dette tok masse tid og vi kunne ikke la oss distrahere fra koding lenger, spesielt siden vi ikke fikk gjort alt vi la inn i 1. sprint. 6.5 Retrospektiv Vi utførte en retrospektiv av 1. sprint hvor vi skrev opp negative og positive opplevelser. (Figur 6.5 A - “Retrospektiv for 1. sprint”) 6.5.1 Hva fungerte dårlig, og hvorfor? Ettersom vi ikke var helt inne i bruk av Scrum, endte det opp med at vi ikke gjennomførte estimering av tid og oppgaver ordentlig. I tillegg brukte vi relative story points istedenfor noe fast, som timer, noe som resulterte i at vi bare jobbet så mye vi ville uten å tenke over det. Programmet vi brukte for å holde oversikt over sprintene, Agilefant, var rotete og ineffektivt. Vi bestemte at vi enten måtte finne oss et nytt program, eller finne ut av hvordan det kunne benyttes bedre. Vi brukte veldig mye tid på å diskutere og det gikk i stor grad utover arbeidet. For eksempel var diskusjoner om smådetaljer i design unødvendig på dette punktet i prosjektet. Det er bedre å la hverandre gjøre ferdig det man gjør på sin måte, og heller gi konstruktiv kritikk på det etterpå. En viktig lærdom etter første sprint er at en diskusjon på flere timer om fargevalg har ikke mye for seg såpass tidlig i utviklingen. 24 Grunnet kontinuerlig brukertesting gjorde vi en del endringer underveis i sprinten. Scrum, som smidig prosjektmetodikk, lar oss ta hensyn til forandringer som skjer i løpet av prosjektet. Allikevel bestemte vi oss for at slikt skulle skje mellom sprintene, i stedet for at vi skulle bruke tid på endringer, diskusjoner og å planlegge på nytt underveis. For å opprettholde effektivitet i arbeidet skulle altså sprintene foregå som planlagt, og idéer for endringer spares opp og diskuteres etter sprintslutt. 6.5.2 Hva fungerte? Noe som fungerte var «kjernetid». I løpet av sprinten lærte vi hvordan vi best jobbet sammen og hvordan vi best kunne bruke Scrum. Stand-up funket for oss selv om vi i all hovedsak hadde oversikt over hverandres arbeid. Det var alltid godt å vite helt konkret hvordan alle lå an i forhold til planen. 6.6 Presentasjoner Som utviklere med en idé, holder det ikke å være god på å kode. Det er bra å kunne overføre konseptet til en teknisk løsning, men like viktig er å kunne presentere arbeidet slik at andre mennesker blir interesserte og får tro på at en har noe å komme med. Av å skrive elevator pitches lærte vi mye om hvordan en skaper interesse for et konsept. I løpet av 1. sprint skulle vi ta dette et skritt videre; vi skulle begynne å holde presentasjoner. 6.6.1 Styringsgruppen i Accenture Den første presentasjonen vi holdt, var for styringsgruppen hos Accenture. På forhånd hadde vi forberedt en presentasjon som fokuserte på ideen som lå bak, og prosessen vi hadde hatt så langt. Målet var å få styringsgruppen med på tankegangen, og gi de tro på mulighetene konseptet førte med seg. Det var en skivebom. Vi fikk tilbakemeldinger på at styringsgruppen ville se planer for hvordan vi skulle få gjennomført den teknologiske delen av prosjektet. Presentasjonen burde inneholdt risikoanalyser, milepælsplaner og andre styringsdokumenter. Vi lærte en god lekse: Know your audience. 6.6.2 Veilederen på høyskolen og andre interessenter Til neste presentasjon var vi bedre forberedt. Vi visste at de som skulle være tilstede var interesserte i idéen og hvordan vi ville utvikle den. På presentasjonen hos Accenture var det ikke alle som skjønte hvem målgruppen var, så vi endret på presentasjonen for å sikre at dette kom ordentlig frem. Tilbakemeldingene denne gangen var svært annerledes. Vi fikk høre at prosjektet var interessant, og vi fikk mye input til hva vi burde gjøre fremover. Spesielt ble det tatt opp hvordan vi skulle behandle sjangerbegrepet som kriterie; en sjanger er ikke lenger beskrivende for én type musikk, og veldig få artister kan plasseres i kategorier på samme måte som tidligere. 25 7. Andre sprint (24. feb - 07. apr) 7.1 Planlegging Vi startet med å skrive opp oppgavene som var igjen fra forrige sprint, samt det vi ifølge fremdriftsplanen skulle være ferdig med i løpet av de neste tre ukene. Vi satte hovedtemaene i bobler for å finne ut i hvilken rekkefølge oppgavene måtte gjøres; hva som var avhengig av at andre ting var ferdig. (Figur 7.1 A ''2. sprint - avhengigheter'') Vi kom fram til at det følgende måtte bli ferdig i gitt rekkefølge: 1. 2. 3. 4. Brukergrensesnitt og funksjonalitet på band-, konsert- og vennesider Knytte opp disse mot databasen Hente ut informasjon fra databasen til lister Caching av data for å hindre unødvendig oppslag i databasen, og dermed gjøre appen mer effektiv og raskere 5. Brukergrensesnitt for notifikasjoner 6. Funksjonalitet og UI for at brukere skal kunne sende invitasjoner til konserter eller forslag til band, og kunne legge til venner 7. Innlogging med Google og Facebook. Dette var uavhengig av at det andre var ferdig, men vi satte det til slutten av sprinten. Det var litt uvisst hvor lang tid det ville ta, og det var uansett viktigere å få ferdig det andre først. Da vi følte at vi hadde fått opp punktene fra fremdriftsplanen, strukturert dem og estimert tidsbruk, førte vi det opp i Agilefant. I og med at vårt første forsøk ble så rotete, bestemte vi oss for å starte fra scratch. Denne gangen virket det ryddigere og ganske oversiktlig. Vi skjønte med en gang at vi kom til å bli mye flinkere til å bruke programmet mer aktivt. Vi fant ut at vi enkelt 26 kan se hvem som skal gjøre hva, hvilken rekkefølge det skal gjøres i og hvor mye tid som bør brukes. Beklager, Agilefant, vårt hat mot deg var uberettiget, det var vår feil hele tiden. (Figur 7.1.B - “Screenshot fra Agilefant 19.02.15”) 7.2 Diskusjoner underveis Vi diskuterte noen mulige endringer i appen underveis. Grunnet et ønske om å forenkle appen ble det foreslått å lage en nettside og la band registrere seg der. Det ville ført til mindre funksjonalitet i appen, og en enklere måte for band å lage profil. Fordi det allerede hadde gått med en del tid til programmeringen av dette i applikasjonen la vi ideen på vent som en mulig forbedring under videreutvikling. Det ble bestemt at vi skulle kutte siden med brukers egen profil. Dette betyr at brukeren ikke ser sin egen profil; lister over band og konserter finnes i sidemenyen allikevel, og brukernavn og bilde kan endres i settings. Da kunne førsteside i appen heller være ”explore”, der man får anbefalinger på konserter og band. Ettersom dette ikke ville være mye arbeid å få til, tenkte vi at det kunne tas etter 3. sprint når vi hadde fått en bedre oversikt over appen i sin helhet, og over explore/søkedelene av appen. Vi lot alt ligge for øyeblikket, og ville programmere ferdig før vi eventuelt gjorde større endringer, i tråd med det vi bestemte oss for etter 1. sprint. Ettersom vi hadde endret oppgaven drastisk så mange ganger allerede, visste vi at det ikke ville vært gunstig for framgang å bruke tid på dette midt i en sprint. 27 7.3 Avslutting av 2. sprint Vi var ikke ferdig med de planlagte arbeidsoppgavene ved avtalt sluttdato tre uker etter start, den 17. mars. Dette skyltes en del fravær i gruppa grunnet sykdom og casedager hos Accenture, samt at vi nok en gang tok inn for mange oppgaver i sprinten. Vi begynte å avslutte sprinten den 18. mars mens sprintplanen på Agilefant så slik ut: (Figur 7.3 A - “Agilefant den 18.03.15”) Alle svarte symboler er «deferred»; det vi ikke rakk som skulle dyttes over i neste sprint. Det var tydelig alt for mye igjen, og vi hadde ikke på dette punktet et fungerende produkt slik man skal på slutten av en sprint. Dette ga ikke resultatet bruk av Scrum egentlig skal gi, og det var demotiverende. 28 7.3.1 Første utsettelse av sluttdato på 2. sprint Med tanke på at vi allerede hadde lagt inn en dag til i sprinten fordi Rannveig var på casedag hos Accenture dagen før, valgte vi å gjøre resten av uka til en del av denne sprinten. Vi mente at på denne måten kunne vi fullføre det vi planla og ha 3. sprint som en «ren» søke-sprint. Planen var alltid at vi skulle arbeide med søkealgoritmer, -oppsett, utseende og alt som omhandler søk, i den 3. sprinten og ikke før. Gjennom samtale innså vi at vi allikevel ikke ville rekke å bli ferdig med alt. Det var mange småting, som å knytte elementer og funksjonalitet sammen, som ikke sto i sprintplanen, men som var helt nødvendig for at vi skulle ha et fungerende produkt ved enden av sprinten. Vi valgte derfor å fremdeles dytte innlogging og caching til neste sprint, ettersom dette viste seg å være svært store oppgaver som vi ikke ville rekke å bli ferdig med uansett. Alle andre svarte «deferred» endret vi tilbake til pending/in progress og fortsatte derifra. 7.3.2 Andre utsettelse av sluttdato på 2. sprint På dette punktet innså vi at vi var nødt til å bruke en del tid på dokumentasjonen sammen. Mye kodetid gikk bort på dette, og vi kom ikke særlig lenger på sprinten. Tirsdagen etter, da vi egentlig skulle planlegge ny sprint, var Emilie på casedag hos Accenture så planleggingen måtte utsettes nok en dag. Vi tok igjen avgjørelsen å gjøre resten av uka til en del av 2. sprint. Det «eneste» store vi har igjen er søkedelen, og det burde være i en samlet sprint. Vi utsatte altså vår 3. og siste sprint med tilsammen tre uker; én fordi vi så at vi hadde for mye gjenstående kodearbeid, én til grunnet annet forefallende arbeid, mest dokumentasjon, og én for påskeferie. Dette medførte at vi i stor grad hang bak, og vi innså at siste sprint ville bli meget stressende og kanskje umulig å gjennomføre. Vi følte et stort behov for å kutte mer funksjonalitet. 7.4 Nødvendig med videre funksjonalitetskutt Vi sjekket litt nærmere definisjonen av og eksempler på et proof of concept. Vi kom fram til at vi har jobbet mer mot en prototype enn et proof of concept. Et POC trenger ikke å være like ferdig, like fungerende, eller ha like flott brukergrensesnitt som det en prototype må. Vi hadde jo et ønske om å lage noe mer ferdig, men innså nå at vår oppgave var et POC av en grunn. Ekstremt mye tid går med på å sette rammer, endre funksjonalitet og generelt bestemme hvordan oppgaven skal bli ettersom vi begynte med kun en idé; et uferdig konsept. Vi innså at det måtte noen drastiske kutt til for å komme i mål. Dette skulle vi gjøre på slutten av uka når vi hadde gjort unna det vi absolutt måtte gjøre ferdig. Vi bestemte at vi måtte begynne å sette funksjonalitet på en liste over “dette skal den ferdige versjonen inneholde”. 29 7.5 Retrospektiv (Figur 7.5 A - “Retrospektiv for 2. sprint”) 7.5.1 Hva fungerte dårlig, og hvorfor? 2. sprint endte opp med å bli mye lenger enn planlagt. Selv om vi var nærmere med tidsestimeringen denne gangen, endte det opp med å gå for sakte framover. Dette hadde med fravær i gruppa å gjøre, men også dårlig kommunikasjon: Et større problem i 2. sprint var at vi ikke var flinke nok til å fortelle hverandre om eventuelle endringer som ble gjort av hver enkelt. Enten dette var endring i et use case, eller nye oppgaver som ikke ble lagt inn i Agilefant. Dette medførte forvirring og dårlig samarbeid, fordi planen ble endret uten at gruppa hadde blitt enige. Mye av dette var funksjonalitet som trengtes og uansett måtte gjøres, vi hadde bare ikke tenkt på det under planlegging. Vi innså likevel at hvordan det skulle utføres måtte tas opp i plenum. 7.5.2 Hva fungerte? Agilefant virket til det vi trengte programmet til, og vi hadde en ordentlig oversikt over oppgavene, hvor lang tid det skulle ta, hvem som skulle gjøre hva, og hva som var påbegynt eller ferdig. Vi hadde færre diskusjoner som tok opp mye tid, dog som nevnt i avsnittet over hadde flere diskusjoner kanskje vært gunstig for samarbeidet denne sprinten. 30 8. Tredje sprint (08. apr - 01. mai) 8.1 Planlegging Ettersom dette var vår siste sprint, bestemte vi oss for å planlegge på denne måten: - Skrive opp alle oppgaver som gjensto - inkludert det som var uferdig eller utsatt fra forrige sprint Sette viktighet på hver oppgave - lav, middels, høy Dele opp hvem som skulle gjøre hva Vi satte det inn i Agilefant og resultatet ble som i figur 8.2 A på neste side. Her brukte vi ikke story points som forklarte hvor lang tid hver oppgave ville ta, men tallene fra 1-3 som respektivt symboliserte lav til høy viktighet. Et unntak var “Bruker får forslag på band og konserter etter område og sjanger” som fikk tallet 5 for å symbolisere at det tross alt er det viktigste. Semitone er jo en anbefalingsmotor i all hovedsak, så anbefalingene er avgjørende for appen. 8.2 Valget om ikke å estimere tid Det var mye arbeid igjen, og vi ikke hadde tid til å fullføre alt. Mange av funksjonalitetene måtte kuttes, og vi var nødt til å bestemme oss for hva og hvordan. Vi var også klar over at vi ville bli nødt til å jobbe mye mer per uke enn tidligere. Det handlet ikke nå om å finne ut hva vi rekker på et satt antall timer - det handlet om å få gjort så mye som mulig innen 1. mai. Av disse grunnene valgte vi å sette prioritet på oppgavene fremfor å estimere tiden de ville ta. Vi var nødt til å sette målet om å få ferdig et proof of concept som viser vår idé, foran hvor mange timer vi ønsket å jobbe. På denne måten kunne vi være sikre på at funksjonene vi implementerte ville være de viktigste for appen. I tillegg ville det uunngåelige, voldsomme funksjonalitetskuttet skje automatisk når vi ikke rakk å gjøre mer. Under i figur 8.2 A er oversikt over oppgavene i Agilefant før vi begynte på vår siste sprint. Flere av disse oppgavene var overført fra 2. sprint; disse er merket med “2. sprint” (se boksene etter navnet på oppgaven), og hvis de var påbegynt vil de i tillegg ha en gul “I” som står for “in progress”. Resten er “not started”. 31 (Figur 8.2 A - “Screenshot fra Agilefant den 08.04”) 32 8.3 Underveis Valget om ikke å estimere tid fungerte for oss; vi visste alltid hva vi burde gjøre, og ønsket om å bli ferdig med så mye som mulig drev oss videre. Allikevel var vi ikke ferdige til fredag 1. mai som planlagt. Vi ble nødt til å bruke mer tid på de siste nødvendige detaljene for å få et fungerende produkt. 8.3.1 Tekniske grunner til at vi ikke ble ferdige Dagene som ledet opp til 1. mai var fremgangsmessig ineffektive på grunn av problemer som tok mye tid. Spesielt skapte datautveksling fra mobilapplikasjonen til serveren trøbbel. Om det var spesialtegn i URLen som ble sendt, avviste serveren requesten, og spørringene mislyktes. I tillegg var det objekter som ble sendt inn via url som inneholdt mer enn 12 parametere. Ikke pent designmessig, og upraktisk i forhold til implementering. På grunn av dårlig tid hadde vi satt oss veldig overfladisk inn i Spring-rammeverket for Android, og når det kom til objekter hadde vi så langt kun klart å implementere henting fra server. Etter å ha satt oss bedre inn i rammeverket fant vi ut hvordan vi kunne mappe objektene til JSON og legge inn disse i kroppen til en HTTP POST. Dette gjorde at vi ble kvitt de lange parameterne, og problemene med spesialtegn i disse. Vi hadde fremdeles metoder der det ikke ga mening å bruke JSON-objekter, og var nødt til å finne ut hva som skjedde. Etter endring av innstillingene for URLer i web.config-fila fungerte det å sende inn de fleste spesialtegn, men ikke punktum. Uansett hva vi gjorde i web.config-fila fikk vi en «404 not found» tilbake fra server. Etter sinte utrop og tanngnissing gikk det opp for oss: Punktumet «i /api/email@email.com» gjorde at server leste det som en fildestinasjon, ikke en spørring. Løsningen var enkel; vi la til en «/» på slutten av spørringene og problemet var løst. 8.3.2 Andre grunner til at vi ikke ble ferdige Fremdeles var kommunikasjon i gruppa et problem. Selv om vi fortsatte med stand-up i Scrumstil hver gang vi møttes, ble det for lang tid mellom torsdags- og tirsdagsmøtene våre. Nå som vi alle jobbet mye hver dag, klarte vi ikke holde hverandre oppdatert på hva vi holdt på med over helgene. På den lyse siden fikk vi allikevel gjort veldig mye, men bedre kommunikasjon kunne gjort arbeidet mer effektivt. Større bruk av online kommunikasjon på slutten gjorde ting enklere og mer oversiktlig. 8.4 Etter sprint Noe som ble tydelig for oss i etterkant var at vi burde ha tatt hensyn til alt som måtte gjøres for å lage et fungerende produkt. Med andre ord burde vi tidligere ha sluttet å ta inn nye oppgaver slik at vi hadde rukket å sy alt sammen og finpusse produktet. Likevel fikk vi gjort det aller meste på lista vår for sprinten. I figur 8.4 A under er en liste over oppgavene vi ikke fikk gjort. 33 (Figur 8.4 A – «Screenshot fra Agilefant 13.05, filtrert til å vise deferred oppgaver») Vi har planer om å fortsette arbeidet med appen, så vi valgte å sette disse oppgavene til «utsatt» (deferred, svart «D») istedenfor «blocked» eller noen av de andre valgene Agilefant hadde. Noe av det første vi ble enige om å ikke fullføre for denne gang var streaming av musikk, og innlogging med Googlekonto (for mer om hvorfor se 9.4 Oppfyllelse av krav til funksjonalitet). Dette var de to viktigste og største use casene som står i vår endelige kravspesifikasjon som vi ikke rakk å få ferdig. Andre ting vi prioriterte bort var redigering av konserten etter at de har blitt opprettet, og at man kunne velge bakgrunnsbilde. Vi lagde en løsning for at konserter ikke skulle være uten bilde; hvis bandet som skal holde konserten har et opplastet bilde vil dette settes som bakgrunn, ellers benyttes et default bilde som ble stemt fram som favoritt under brukertesting. Vi hadde også planer om å legge inn brukerinstruksjoner i appen som viser hvordan den funker første gang den åpnes. Vi innså at dette ikke er viktig for et proof of concept, og droppet det. Generelt er vi fornøyde med det vi oppnådde. Vi fikk implementert all funksjonalitet som var nødvendig for å vise fram idéen vår. 34 8.5 Retrospektiv (Figur 8.5. A – «Retrospektiv for 3. sprint») 8.5.1 Hva fungerte dårlig, og hvorfor? Som nevnt brukte vi ikke vanlig Scrum-planlegging denne sprinten, og dette var mye fordi vi var stresset. Planleggingen førte til at vi fikk kommet rett i gang med programmering og jobbet effektivt, men siden det ikke var satt noen rammer sleit vi med organisering og å slutte tidsnok. Vi jobbet individuelt veldig bra, men det krever mye samarbeid når man skal knytte deler sammen. Vi kunne ha gjort dette bedre på begynnelsen av sprinten, men de siste ukene ble vi flinkere til å kommunisere over nett mellom møtene. Dette gjorde at vi alltid var oppdatert på hva alle drev med, og det ble lettere å jobbe mot slutten. Mye av tiden gikk med til dokumentasjonen. Vi undervurderte hvor mye tid vi kom til å bruke. Planen var å jobbe oss ferdige med rapporten etter vi var ferdig med kodingen, men når vi gikk over den planlagte kodesluttdatoen måtte vi jobbe med begge deler parallelt. Vi fikk muligheten til å få rapporten vår sett over av en ekstern person flere ganger før endelig innlevering. Vi satte datoer for hvilke dager vi skulle sende den inn, og disse datoene måtte holdes for at vi skulle rekke å få tilbakemelding og gjøre endringer før innlevering av prosjektet. Derfor ble kodingen nedprioritert dagene før disse fristene og det gikk masse tid uten at vi fikk ferdigstilt vårt proof of concept. 35 8.5.2 Hva fungerte? Som nevnt var vi veldig effektive denne sprinten. Presset fra den oppkommende innleveringen og vår frykt for ikke å bli ferdig fikk oss gjennom svært lange dager med mye jobbing. Vi ville ikke at vår dårlige planlegging i begynnelsen av prosjektet skulle ødelegge for produktet vårt. Vi hadde fremdeles stor tro på appen, og vi ville gi andre mulighet til å se dette selv, istedenfor å måtte ta vårt ord for det. Siden vi hadde jobbet relativt individuelt gjennom prosjektet hadde vi ikke alltid oversikt over alle teknologiene som var i bruk. I tillegg tok det tid for alle å få tilgang til Visual Studio og server. Dette var den første sprinten der alle hadde tilgang til alt fra starten av. Nå som vi i tillegg generelt skjønte mer av teknologiene, ble det lettere å arbeide effektivt. Vi ble også bedre på å prioritere tid. Det virker kanskje ikke sånn, ettersom vi også denne gangen sprengte tidsskjemaet vårt, men vi klarte å sjonglere dokumentasjon og programmering, og hadde relativt klare planer for hva vi skulle gjøre hver dag. 36 Produktdokumentasjon 9. Resultater 9.1 Kravspesifikasjon Følgende er kravspesifikasjonen for produktet for dette prosjektet. Videre idéer og ønsker for videreutvikling av appen er ikke inkludert i denne kravspesifikasjonen. Vi valgte heller å samkjøre den med vår product backlog5 og hvordan vi lå an underveis, og derfor ikke inkludere flere funksjoner enn vi kunne få implementert i løpet av prosjektet. Vi jobbet altså med kravspesifikasjonen vår fram til begynnelsen av 3. sprint. Gruppa eier kildekoden og konseptet, og ingen andre skal jobbe videre på prosjektet. En kravspesifikasjon som inneholder informasjon om videreutvikling er altså ikke nødvendig. På denne måten var vi også sikre på at alt i spesifikasjonen var gjennomførbart og gjennomtenkt. 9.1.1 Overordnet systembeskrivelse Appen skal gi bruker anbefalinger til konserter og band basert på deres geografiske område og sjangerpreferanser. Det skal være mulig å opprette bandprofiler og konserter, og legge til band og konserter man liker i sine lister. 9.1.2 Funksjonelle egenskaper og brukergrensesnitt Bruker: ● ● ● ● ● ● 5 Innlogging i systemet ○ med brukerkonto laget i appen ○ med Facebook-konto ○ med Google-konto Sette og redigere informasjon om seg selv: ○ brukernavn ○ profilbilde ○ foretrukne sjangre ○ geografisk lokasjon ○ radius rundt gitte lokasjon Få anbefalinger av band og konserter basert på område og foretrukne sjangre Legge til andre brukere som venn ○ kun hvis man vet brukernavnet, ingen åpne søk med auto-fullfør i søkefeltet Se profilene til sine venner Se liste over sine venner Denne product backlogen ligger som vedlegg «2.3.2 Product backlog ved slutten av prosjektet» 37 Band: ● ● ● ● ● ● ● ● Se sin bandliste Legge til et band i sin bandliste Fjerne band fra sin bandliste Sende venner bandforslag Opprette band Se liste over sine opprettede band Sette og redigere informasjon om bandene sine: ○ bandnavn ○ bilde ○ linker ■ til Facebook ■ til SoundCloud ■ til annen nettside ○ sjangre ○ område ○ sang Offentlig profil for band som inneholder informasjonen over Konserter: ● ● ● ● ● ● ● Se sin konsertliste Legge til en konsert i sin konsertliste Fjerne konserter fra sin konsertliste Sende venner konsertinvitasjon Opprette konsert om man har et band Sette og redigere informasjon om konsertene sine: ○ Tittel på konserten ○ Bandnavn (automatisk, ikke-redigerbart) ○ Dato og tid ○ Sted ○ Bilde Offentlig plakat for konsert som inneholder informasjonen over, samt ○ hvor mange venner som skal på konserten/har lagt den til i sin liste ○ hvem av sine venner som skal på konserten 38 Notifikasjoner inne i appen: ● ● Får varsel når man mottar ○ venneforespørsel ■ Man får valget om å godta eller avvise ○ konsertinvitasjon ■ Man får mulighet til å legge til konserten i sin liste direkte ○ bandforslag ■ Man får mulighet til å legge til bandet i sin liste direkte Får varsel når et band man har i sin liste legger ut en ny konsert ○ Man får mulighet til å legge til konserten i sin liste direkte Brukergrensesnitt: Vi valgte å ikke sette noen konkrete krav for ferdig design ettersom dette er et proof of concept, og det viktigste er at vi får vist idéen vår. Allikevel hadde vi noen ønsker for det ferdige produktet som vi gjerne kunne jobbe mot under utvikling: ● ● ● ● Det skal være veldig visuelt i bruk, og simplistisk Bruk heller bilder enn tekst ○ Eks. band- og konsertbilder for anbefalinger, ikke tekst Lite farger, ta heller i bruk brukernes bilder for farger Grunnleggende brukervennlighet ○ Ryddig oppsett og selvforklarende linker, knapper og informasjon 39 9.2 Teknisk beskrivelse av produktet Nå som vi har vist kravspesifikasjonen vi kom fram til, er det på tide å vise det tekniske produktet vi faktisk utviklet. Det gås ut i fra at leser av denne delen har grunnleggende kunnskap om teknologiene vi har benyttet. I de følgende kapitlene har vi beskrevet systemets løsninger. For en utfyllende beskrivelse av funksjonalitet sett fra brukers perspektiv med skjermbilder fra appen, se vedlegg «6. Brukerveiledning». For en beskrivelse av web API-referansene vi har brukt, se vedlegg «7. HTTP API References». For å se oversikt og beskrivelse av alle klassene se vedlegg «8. Klasseoversikt – applikasjon» og «9. Klasseoversikt – server». 9.2.1 Systemets hovedkomponenter ● En Androidapplikasjon i frontend ■ kodet i Java med Android SDK ■ bruker Spring-rammeverkets REST-klient for å kommunisere med server ● REST API ■ tilbyr ressurser til frontend i form av JSON-objekter via URIer ■ kodet i ASP.NETs web-API, med attribute routing ● Database ■ SQL database, cloud service fra Windows, basert på SQL Server (Figur 9.2.1 A – ‘‘Systemets hovedkomponenter’’) 9.2.2 Frontend: Androidapplikasjon Applikasjonen som helhet har tre hovedfunksjoner 1. Gi bruker forslag til artister 2. Gi bruker forslag til konserter 3. Opprette artistprofiler Her følger en teknisk beskrivelse av applikasjonen. 40 Følgende rutiner og sider i appen forklares: Explore o Explore bands o Explore concerts Innstillinger o Settings o Location chooser o Genre chooser Band/artister o Band list o Band profiles Konserter o Concert list o Concert poster Bandadministrasjon o Your bands o Edit band o Add concert Venner o Your friends Notifikasjoner o Notifications Registrering/innlogging o Register o Login Mer om frontend-teknologier o Robospice o Trådprogrammering o Caching o Bildehåndtering o Cachinghåndtering og oppdateringer o SharedPreferences o Bruk av BroadcastReceiver o Skriving til cache 41 Explore Navn: Explore bands Formål: Gir brukere en mulighet til å finne nye band i sitt nærområde. Hvis en bruker vil ha mer informasjon om et band så er det bare å trykke seg inn på bandet. Brukere kan selv oppdatere listen ved å swipe nedover og få ut nye forslag. Hva rutinen gjør: Explore er siden bruker først kommer til etter å ha logget inn. En ny tråd startes som sjekker om det er noe i cachen, og eventuelt oppdaterer den. På explore-siden har bruker mulighet til å se hvilke band som er i sitt nærområde. Når man først oppretter en bruker vil man ikke ha noe området spesifisert, og derfor er det satt et standardområde. Dette er Oslo Sentralstasjon ettersom appen vår i førsteomgang er beregnet på Oslo (ettersom det er et proof of concept). På Explore-siden vil det for band være bandets bilde, samt navnet på bandet og hvor langt unna brukeren de er, enten i meter eller kilometer avhengig av avstanden. Det vil være 3 band per rad, og hvis bruker har nok band i området sitt vil det vises 15 band, randomisert. For å oppdatere listen og vise nye band kan bruker swipe nedover. Da vil loadingsymbolet vises og en ny spørring blir kjørt til serveren. Hvis requesten lykkes vil 15 nye band vises. Når bruker forlater Explore-listen blir den cachet, eller cachen oppdateres om den eksisterende listen er ulik den i cache. Derfor er bruker nødt til å manuelt oppdatere explore-siden hvis det er gjort endringer i settings for at disse endringene skal ta effekt. Hvis listen din ikke har noe innhold (ikke noe å cache) vil listen prøve å oppdatere seg selv hver gang du går inn på explore. Navn: Explore concerts Formål: Gir brukere en mulighet til å finne nye konserter i sitt nærområde. Hvis en bruker vil ha mer informasjon om en konsert så er det bare å trykke seg inn på konserten. Brukere kan selv oppdatere listen ved å swipe nedover og få ut nye forslag. Hva rutinen gjør: Tilsvarende som på banddelen. 42 Innstillinger Navn: Settings Formål: Gir brukeren en mulighet til å endre innstillingene sine. Her kan en bruker endre profilbildet sitt, velge sjangre de liker, sette sin geografiske posisjon og bestemme hvor mange km rundt denne lokasjonen de vil ha forslag fra. Hva rutinen gjør: Når en bruker først kommer inn på Settings-siden vil det kjøres en ny spørring mot serveren. Spørringen vil prøve å hente brukeren sitt område, sjangere, radius og profilbilde. Hvis forespørselen gjennomføres som den skal, vil dataene bli satt inn på sine respektive steder på siden. Hvis brukeren ikke har nett eller forespørselen ikke går, så vil brukeren få en toastmelding om dette. Bruker kan også endre sine innstillinger. Når en bruker har endret innstillingene sine vil det først sjekkes om brukeren har nett og deretter bli sendt en ny forespørsel mot serveren. Et loadingsymbol vil kjøre ved siden av elementet bruker prøver å oppdatere. Når forespørselen er håndtert vil loadingsymbolet forsvinne og bruker vil få en melding om at elementet er oppdatert. Hvis elementet ikke klarte å oppdateres vil bruker få en toast-melding om dette isteden, og hvis bruker ikke har nett vil en toast forklare dette. Oppdatering av radiusen skjer ved at du drar eller trykker på seekbaren. Når seekbaren stoppes vil appen merke det og sende en ny forespørsel til serveren for å oppdatere radiusen. Oppdatering av bilde skjer ved at du trykker på bildet. Du får herfra mulighet til å velge et bilde fra galleriet ditt. Når du har valgt et bilde vil det sendes en ny forespørsel til serveren for å prøve å oppdatere bildet. Navn: Location chooser Formål: Gi bruker mulighet til å velge område ved hjelp av en autocomplete-funksjon Hva rutinen gjør: Nå bruker trykker på områdeikonet enten i Settings, Add Concert eller i Edit Band opprettes et fragment med et AutoCompleteTextView. Via forespørsler til Google Places API, mottar appen JSON-objekter som brukes for å gi bruker forslag basert på input. Når bruker trykker på tekstområdet vises det en knapp. Når denne trykkes på startes en spicerequest til server om å oppdatere brukers, konsertens eller bandets område. 43 Navn: Genre chooser Formål: Gir bruker mulighet til å velge sjangre for seg selv og for sitt band. Sjangrene er predefinerte for nå. Hvordan rutinen kjører: To lister sendes med inn som argumenter til fragmentet; en liste med valgte sjangre, og en med tilgjengelige sjangre hentet fra server. Disse listene vises på skjermen med plussikon for mulige sjangre som kan legges til, og minussymbol for de som kan fjernes. Når bruker trykker på et av elementene med plussikon, legges denne til i lista over valgte sjangre, og fjernes fra lista over tilgjengelige sjangre. Når bruker trykker på et av elementene med minussymbol, fjernes denne fra lista over valgte sjangre og legges til i lista over tilgjengelige sjangre. Når bruker trykker på ok-knappen nederst i fragmentet, startes en spicerequest for oppdatering av brukers sjangre på server. Band/artister Navn: Band list Formål: Gir brukeren mulighet til å se listen over band de liker og har lagt til i listen sin. I tillegg kan en bruker søke etter band basert på bandnavn. En bruker kan også gå inn på et band for å få mer informasjon, og eventuelt legge eller fjerne band fra bandlisten sin. Hvordan rutinen kjører: Når du først går inn på «Your bands» så vil en ny tråd kjøres for å sjekke om det finnes noen band i cachen og deretter oppdatere listen. Søking etter band skjer helt øverst til høyre ved å trykke på forstørrelsesglasset. Når en bruker begynner å skrive inn noe her vil det bli sendt en ny spørring til server, så listen oppdateres fortløpende mens brukeren skriver. Hvis spørringen gir resultat og noen bandnavn inneholder det bruker søker på, vil disse vises i listen. Ellers vil listen bli tom med en melding om at det ikke finnes noen band med det navnet. Hvis bruker har lyst til å gå tilbake fra søk til sin opprinnelige liste så kan brukeren enten hviske ut teksten, eller trykke på kryss-tegnet til høyre for søkefeltet for å viske ut. Hvis bruker trykker to ganger på søkefeltet så vil søkeviewet lukke seg. Når brukeren trykker seg ut av bandlisten vil en ny tråd kjøre som sjekker om listen er ulik den som allerede finnes i cachen. Hvis listen er forskjellig så vil listen bli cachet på nytt. 44 Navn: Band profile Formål: Gir brukeren informasjon om et spesifikt band, og mulighet til å legge til bandet i sin bandliste om hen ønsker det. Informasjon som vises er bandnavn, område, og link til Facebook- og SoundCloudside, samt en generell internettlink om disse finnes. Hva rutinen gjør: Når aktiviteten starter setter applikasjonen i gang en spicerequest som henter bandobjektet fra server basert på ID. En annen request settes i gang, og blir lagt i spicemanagerkøen, som henter informasjon om hvorvidt bruker har lagt til bandet i sin liste. Når bandet er hentet settes denne requesten i gang, og en knapp i høyre hjørne blir synlig når denne er utført. Om bruker ikke har lagt til bandet i sin liste, er knappen grå. Om bruker trykker på knappen sendes en request til server om å legge til dette bandet i brukers liste. Om bandet allerede ligger i brukers liste, er knappen i en annen farge. Hvis brukeren nå trykker på knappen sendes en request til server om å fjerne bandet fra brukers liste. I tillegg til informasjon om bandets sjangre og tilholdssted, er det tre link-knapper. En til bandets Facebookside, en til bandets SoundCloudside, og en til en valgfri nettside. Når bruker trykker på en av disse fører linkene deg videre; om bruker har SoundCloud eller Facebookapplikasjonen på sin mobil åpnes lenkene i de tilhørende applikasjonene. Konserter Navn: Concert list Formål: Gir brukeren mulighet til å se de konsertene de har tenkt til å gå på. I tillegg til at man kan søke i sine egne konserter eller etter nye konserter. Man kan i tillegg gå inn på konserter hvis man vil ha mer informasjon om en spesifikk konsert. Hva rutinen gjør: Når en først går inn på «Concert list» så vil en ny tråd startes som sjekker cachen og oppdaterer listen. Søking etter konserter skjer helt øverst til høyre når en trykker på forstørrelsesglasset. Når en bruker begynner å skrive inn noe her vil det bli sendt et request til serveren på spørringen. Listen oppdateres hele tiden mens brukeren skriver. Hvis spørringen gir resultat vil disse vises i listen. Ellers vil listen bli tom med en melding om at det ikke finnes noen konserter med den tittelen. I motsetning til søk på personer vil konsertsøk vise alle konserter der tittelen inneholder spørringen. Hvis en har lyst til å komme tilbake til sin opprinnelige liste så kan en enten hviske ut informasjonen som er i søkefeltet eller trykke på kryss-tegnet til høyre for søkefeltet. Ved å trykke to ganger på krysstegnet til høyre for søkefeltet vil søkeviewet lukkes. 45 Når en trykker seg videre ut av «Concert list», enten i form av å trykke på en konsert eller gå inn på en annen fane, vil en ny tråd kjøre som sjekker om listen er forskjellig fra den som allerede finnes i cachen. Hvis listen er forskjellig så vil listen bli cachet på nytt. Navn: Concert poster Formål: Gir brukeren mulighet til å se all informasjon om en konsert. Profilen til en konsert, om man vil. Bruker kan legge til konserten i sin liste og invitere vennene sine. Hva rutinen gjør: Når bruker trykker på en konsert vil ConcertActivity kjøres og all informasjon om konserten hentes fra server. Bandets navn hentes fra bandid’en som ligger lagret på konserten og en tråd vil også hente alle brukerens venner. Hvis bandet har et bilde, vil dette være lagret på konserten. Hvis bildeURL for konserten er tom, betyr det at bandet ikke hadde bilde da de opprettet konserten, og et standard bilde benyttes. Det vil også kjøres en spørring til server som sjekker om denne konserten ligger i brukerens liste allerede. Et loadingsymbol vil kjøre, og ved positivt svar fra nevnte spørring vil det i høyre hjørne stå «Remove from list» og ved negativt svar «Add to concert list». Loadingsymbolet endres til passende ikoner; henholdsvis et grønt «check»-symbol og et plusstegn. Når man legger den til, lagres konsertid og brukerid sammen på server, og brukers «concert list» vil bli oppdatert når man besøker den neste gang. Bruker kan invitere venner ved å trykke på konvolutten i nedre høyre hjørne. Dette åpner en liste over vennene til brukeren, og når noen inviteres vil bruker få tilbakemelding om requesten gikk bra eller ikke. Mottaker vil få opp invitasjonen under sine notifikasjoner. En egen tråd sjekker hvor mange av brukerens venner som skal på konserten, og legger ut dette tallet på plakaten foran teksten «friends are going». Bandadministrasjon Navn: Your Bands Formål: Gir brukeren oversikt over sine bandprofiler, og mulighet til å redigere bandenes profiler og legge til konserter. Hva rutinen gjør: Når en bruker først går inn på bandadminsiden sendes det en ny forespørsel til server for å hente alle bandene brukeren er administrator for. Hvis spørringen ble vellykket vil listen bli satt inn, og det vil for hvert av bandene startes en egen tråd for å dekode URL’en om til bilde. Hvis spørringen ikke gikk vil personen få en feilmelding om dette. 46 Når brukeren trykker på et av listeelementene, sjekker applikasjonen om bandet ligger i listen av bandobjekt som er hentet fra server. Hvis dette er tilfellet opprettes ett fragment som viser en oppsummering av informasjonen til bandet og to knapper: «Edit Profile» og «Add concert». Hvis bandet ikke finnes i listen, setter applikasjonen i gang en spicerequest til server. Når bandet er hentet fra server, legges det i listen, og oppsummeringsfragmentet vises. Om bruker trykker på «Edit Profile»-knappen i oppsummeringsfragmentet, startes en ny «Edit Band»-aktivitet. Bandobjektet blir sendt med som et serialisert objekt til aktiviteten. Om bruker trykker på «Add Concert»- knappen i oppsummeringsfragmentet startes en ny «Create Concert»-aktivitet. Navn: Edit band Formål: Gir bruker mulighet til å redigere sine bandprofiler. Hva rutinen gjør: 1. Navn Et tekstfelt i hovedvinduet 2. Bilde Når en bruker trykker på «bilde»-knappen kan brukeren velge bilder fra galleriet sitt. Hvis et bilde blir valgt vil det bli laget en fil basert på bildepathen, og det blir sendt en HttpPost request opp mot serveren med denne filen. Hvis filen klarer å bli opplastet vil brukeren få en toast-melding om at opplastingen var vellykket. Hvis filen ikke klarte å bli opplastet vil brukeren få melding om dette. 3. Posisjon Se «Location Chooser» 4. Linker Når bruker trykker på link-knappen åpnes et dialogfragment med tre tekstfelt. Ett for Facebook, ett for SoundCloud og ett for en link til en hvilken som helst nettside. 5. Genre Se «Genre Chooser» For alle tekstfelt gjelder samme prosedyre. Når bruker trykker på et tekstfelt, blir en knapp i høyre hjørne synlig. Når bruker trykker på denne sendes en spicerequest til server for oppdatering av verdien i tekstfeltet. Navn: Add Concert Formål: Bruker får mulighet til å opprette en konsert hvis hen allerede har opprettet et band. 47 Hva rutinen gjør: Aktiviteten «Crater Concert» startes. Layoutene er lagt opp til å ligne på «Concert poster» slik at bruker skal få best inntrykk av hvordan den kommer til å se ut. Ved start av aktiviteten hentes det valgte bandets ID med inn fra «Your Bands» slik at bandnavnet står ferdigskrevet. Det kjøres også en request som sjekker om bandet har et bandbilde. I så fall hentes bilderuten som dekodes og settes som bakgrunn. Hvis bandet ikke har et bilde settes et defilet bilde som bakgrunn. Hvorvidt bandet har et bilde sendes med som en Boleyn til serversiden når konserten lagres. Hvis true hentes bandets bildeURL og lagres med konserten. Hvis false settes URL’en til å være tom. Ved en sjekk på dette under «Concert Poster» vet applikasjonen om den må hente ut et bilde, eller sette default. Lokalet eller adresse for konserten velges via location chooser som er beskrevet tidligere. Når brukeren trykker på «Post concert»-knappen kjøres en request for å lagre dataene. Om resultatet er positivt, vil brukeren tas tilbake til «Your concerts» og få en melding om at konserten ble publisert. Venner Navn: Your friends Formål: Den gir brukeren mulighet til å se hvilken venner de har lagt til. En kan også gå inn på profilene til vennene sine og se de hva slags konserter de skal gå på. En bruker kan også bruke søkesymbolet øverst til høyre for å finne nye venner, eller fjerne sine gamle venner. Hva rutinen gjør: Når bruker først går inn på «Your Friends» vil en ny tråd startes som sjekker cachen og oppdaterer listen (mer om dette kan ses under «cachinghåndtering og oppdateringer»). Hvis en bruker begynner å skrive inn i søkesymbolet vil en ny aktivitet startes. Hver gang en ny bokstav blir skrevet inn i tekstfeltet vil en ny countdown kjøres. Hvis brukeren ikke skriver inn noe på 1 sekund vil det sendes en request til serveren basert på spørringen. Et loadingsymbol vil kjøre mens brukeren skriver inn teksten. Hvis spørringer som sendes til serveren gir et positivt svar vil loadingsymbolet ved siden av navnet bli byttet ut med et hvitt hjerte hvis bruker ikke er venn med personen, og et rødt hjerte hvis bruker er venn med personen. Hvis hjertet er hvitt kan du trykke på det for å sende en vennerequest til personen, og da vil loadingsymbolet starte. Hvis requesten din ble vellykket vil hjertet bli rødt. Hvis du ikke klarte å legge til personen vil du få en toast-melding om dette og loadingsymbolet vil forsvinne. Hvis hjertet er rødt kan du trykke på det for å fjerne vennen. Da vil også loadingsymbolet starte og requesten utføres. Hjertet blir hvitt igjen hvis det var vellykket. For å gå tilbake til sine venner fra «Your friends» kan man trykke på tilbakepilen øverst til venstre. Når man går vekk fra vennelisten vil en ny tråd kjøres for å sjekke om listen er annerledes. Hvis listen er annerledes vil cachen oppdateres. 48 Notifikasjoner Navn: Notifications Formål: Gir brukeren en mulighet til å kunne se notifikasjonene sine. Her vil en bruker få informasjon om nye venneforespørsler, få informasjon om en bruker har akseptert en venneforespørsel, se invitasjoner til konserter som venner har sendt og se om en venn har akseptert en konsertinvitasjon. Hva rutinen gjør: Man kommer seg til notifikasjonene sine ved å trykke på bjellen som ligger i actionbar. Bjellen vil være tilgjengelig på alle hovedaktivitetene. Når man først går inn på notifikasjonsaktiviteten vil et loadingsymbol starte, og det sendes en forespørsel til serveren for å hente alle notifikasjonene til brukeren. Når appen får svar vil loadingsymbolet fjernes. Hvis spørringen ble vellykket vil listen bli oppdatert til den nye listen. Brukeren vil også få en melding på at listen har blitt oppdatert. Siden bildene kommer tilbake som url’er vil bildene bli dekodet fortløpende. Når man får inn den oppdaterte listen vil notifikasjoner man ikke har sett før ha en lysegrå bakgrunn. Det vil også til høyre være spesifisert hvor lenge det er siden notifikasjonen ble sendt til brukeren; «just now», «x m», «x h» eller «x d». Hvis en bruker har lyst til å oppdatere notifikasjonene sine så kan de selv swipe nedover for å kjøre spørringen på nytt. Hvis listen ikke klarer å bli oppdatert så vil man få en melding som dette i form av en toast. Det er flere forskjellige notifikasjoner man kan få: Venneforespørsel: hvis noen har søkt etter ditt eksakte navn så kan de legge deg til som en venn. Bruker vil da få opp en venneforespørsel i notifikasjonsaktiviteten. Denne kan bruker enten si ja eller nei til. Hvis brukeren sier nei vil loadingsymbolet komme opp igjen og et nytt request mot server vil kjøre. Hvis requesten lykkes vil venneforespørselen vil bli fjernet. Hvis brukeren sier ja vil loadingsymbolet komme opp igjen og et nytt request vil bli kjørt mot serveren. Hvis det lykkes er bruker nå venn med personen. Venneaksept: hvis en bruker aksepterer en venneforespørsel vil avsender få en notifikasjon på at vennen har akseptert. Brukeren selv vil få en ny notifikasjon som bekrefter at de nå er venner. Hvis bruker ikke aksepterer venneforespørselen vil ikke avsender få noen informasjon om dette. Konsertinvitasjon: bruker kan få invitasjoner til konserter fra sine venner. Bruker kan som med venneforespørsler enten si ja eller nei til invitasjonen. Ved aksept vil konserten legges til i brukers concert list. 49 Konsertaksept: hvis en bruker aksepterer en konsertinvitasjon, så vil avsender få en notifikasjon på at brukeren har akseptert. Bruker får selv en bekreftelse på at hen har godtatt. Hvis bruker avslår får ikke avsender noen notifikasjon. Bruker kan forlate notifikasjonslisten enten ved å trykke på tilbakepilen øverst til venstre eller ved å trykke på en av notifikasjonene. Hvis bruker trykker på en konsertinvitasjon eller konsertakseptnotifikasjon vil hen komme til konserten det gjelder. Bruker kan også trykke på en venneakseptnotifikasjon og få opp vennens profil, men ikke en venneforespørsel som ikke er godtatt. Man skal ikke kunne se profilen til noen man ikke er venn med. Registering/innlogging Navn: Register Formål: La en bruker registrere seg med mail, brukernavn og passord så de kan ta i bruk appen. Hva rutinen gjør: En bruker kan registrere seg med mail ved å trykke på «Or register»-teksten på innloggingssiden. Når en bruker kommer til registeringssiden må de skrive inn mail, brukernavn og passord. De kan deretter trykke på «registrer» knappen. En ny spørring blir så sendt til server for å prøve å registrere personen. Hvis mailen eller profilnavnet allerede er tatt vil ikke registreringen gjennomføres, og brukeren vil få melding om dette i appen. Hvis i midlertidig registreringen var vellykket vil brukeren bli logget inn i appen og sendt rett til explore-siden. Navn: Login Formål: la en bruker logge seg inn med enten Facebook eller vanlig email innlogging Hva rutinen gjør: En bruker kan logge seg inn i appen enten ved å trykke på Facebook-knappen «Log in with Facebook» eller ved å skrive inn mail og passord og trykke på «log in» knappen. En bruker kan registrere seg med vanlig mail ved å trykke på register-knappen. Hvis en bruker ikke har nett når de trykker på «log in» vil de få en melding(toast) om at de ikke har nett. Hvis en bruker derimot har nett så vil det komme opp et loadingsymbol ved siden av «log in»-knappen og en ny forespørsel vil bli sendt til serveren. Hvis innloggingen var vellykket vil brukerens id bli lagret i en sharedpreferences og brukeren vil deretter bli logget inn. Hvis brukernavnet eller passordet var feil får brukeren en toast-melding om feilen. Hvis det skjedde en annen uventet feil på serveren får brukeren også melding om dette. Hvis brukeren derimot har lyst til å logge seg inn med Facebook kan de trykke på «Log in with Facebook»-knappen. Man vil da bli logget rett inn, med mindre det er første gang brukeren 50 logger inn med Facebook; brukeren blir nødt til å godta at Facebook kan brukes som innlogging. Hvis innloggingen ikke går vil man få feilmelding om dette. For å bruke Facebooks API, krever Facebook at applikasjonen er registrert hos dem. For å verifisere dette brukes nøkkelhasher. Siden Semitone fortsatt er under utvikling har vi kun debugnøkler, og disse er knyttet til hver enkelts utviklermiljø. Facebookinnlogging vil derfor midlertidig kun fungere med versjoner av applikasjonen som er installert fra en av gruppemedlemmenes datamaskiner. Mer om frontend-teknologier Robospice Ved håndtering av webserverforespørsler har vi tatt i bruk Robospice på appsiden av produktet. Trådprogrammering Data som hentes fra serveren blir alltid kjørt på en ny tråd for at det ikke skal forstyrre hovedprogrammet. I tillegg blir data som hentes fra cachen kjørt på en ny tråd. Dette fører til at appen ikke stopper i utførelsen når cachen hentes inn eller lagres. Eksempel på trådstarting ved start og slutt av en aktivitet/fragment kan ses i figur 9.2.2 A. (Figur 9.2.2 A – onStop- og onStart-metodene i BandActivityList.class tar og starter en ny tråd for å hente ut og for å lagre listen (caching). Ved å bruke trådprogrammering her så unngår man at hovedtråden må vente på at cachen skal lastes og lagres. Dette fører til en bedre flyt i programmet og gjør opplevelsen bedre for brukeren) 51 Caching Ettersom nedlasting av bilder tar relativt lang tid, er appen bygd opp slik at listene til en bruker caches når de forlater siden. Lagring av bilder tar også litt tid (ca. 1-2 sek), så dette gjøres på en egen tråd. Denne tråden startes når onStop-metoden blir kalt og lagrer hele listen til en bruker. Når en bruker da går inn igjen på listen sin, blir det i onStart-metoden kalt en ny tråd som laster inn dataene fra cachen. Etter at dataene er lastet inn, vil tråden kjøre en forespørsel mot server der den ber om listen til brukeren. Når appen får svar, vil den sjekke om listen som kom fra serveren stemmer med den listen som ble hentet fra cachen. Hvis listen ikke stemmer vil elementene som er ulike bli oppdatert. Slik vil bruker kunne se sine opprinnelige lister selv om hen ikke har internettilgang. Metoden for lagring av hele vennelisten kan ses i figur 9.2.2 B. (Figur 9.2.2 B - metode i som tar inn vennelisten til en bruker. Metoden lagrer hele vennelisten på pathen som er medsendt. Ettersom bildene ikke kan lagres sammen med listen (fordi de lagres som bitmap) så blir disse først lagret for seg selv, så blir det satt inn i objektene før hele listen lagres) Bildehåndtering Ettersom appen henter ut alle bildene i form av URLer, kjøres det egne tråder for å dekode disse om til bilder(bitmap). Alle listene som bruker bilder vil starte en egen tråd for hvert bilde som må dekodes. Bildene vil derfor bli dekodet fortløpende og man trenger ikke vente på at alle bildene blir omgjort før de kan bli vist. Cachinghåndtering og oppdateringer “Explore concerts”, “Explore bands”, “Concert list”, “Band list” og “Your friends” bruker alle caching av lister. Når brukeren først går inn på en av disse listene vil en ny tråd startes som sjekker om det er noen objekter i cachen. Mens dette pågår starter et loadingsymbol som viser at appen jobber. Hvis tråden finner noen objekter i cachen vises disse for brukeren og 52 loadingsymbolet vil avsluttes. Hvis det ikke finnes noen objekter i cachen så vil loadingsymbolet fortsette. På Explore-sidene vil listen bare prøve å oppdatere seg hvis brukeren ikke har noen objekter i listen. På de andre listene vil derimot tråden alltid starte en nettverksrequest til serveren for å få tak i den oppdaterte listen. Hvis dette ikke går vil en feilmelding vises. Hvis requesten lykkes vil det skje en forward og reverse lookup av listen, som sjekker at den nåværende listen hentet fra cachen er oppdatert. Hvis den nye listen fra serveren har noen objekter som listen i cachen ikke har så blir disse satt inn. Objekter som kun er i cache blir fjernet, og objekter der dataene er endret blir oppdatert. Når du trykker deg videre ut av disse listene vil en ny tråd kjøre som vil sjekke om listen er forskjellig fra den cachen som allerede finnes. Hvis listen er forskjellig så vil listen bli cachet på nytt. Hvis listene ikke er forskjellige trenger ikke listen bli cachet på nytt. SharedPreferences På applikasjonssiden brukes sharedpreferences til å holde på IDen til brukeren. Når en bruker logger inn, lagres brukerIDen. Hver gang en bruker bytter mellom aktiviteter(sider) vil metoden getUser sjekke om det finnes en brukerID. Hvis det ikke gjør det blir brukeren sendt ut til logg inn-siden. Bruk av sharedpreferences fører til at en bruker ikke trenger å logge inn hver gang de skal inn på appen; når en bruker åpner appen sjekkes det om IDen ligger i sharedpreferences, og hvis dette er tilfelle sendes brukeren rett til explore-siden. Bruk av BroadcastReceiver Når man først logger seg inn i appen så vil appen starte en ny broadcast kalt NotificationsBroadReceiver. BroadcastReceiveren vil starte en ny service kalt SendNotifications. Denne servicen gjør slik at en ny service kalt MyService vil bli kjørt hvert 20 sekund. Hver gang denne servicen blir kjørt, vil det gjøres en spørring mot serveren som sjekker om personen har nye notifikasjoner. Hvis personen har nye notifikasjoner så stoppes servicen og det lagres en sharedpreferences på at brukeren har nye notifikasjoner. Når en bruker da enten bytter aktivitet eller kommer tilbake til appen så vil da bjellen helt øverst farges rød for å vise at brukeren har nye notifikasjoner. Hvis du går inn i notifikasjonsaktiviteten så vil bjellen bli sin normale farge igjen og myService vil igjen bli kjørt hvert 20 sekund igjen for å sjekke etter nye notifikasjoner. Skriving til cache ObjectOutputStream-klassen kan bli brukt til å skrive primitive datatyper og Java-objekter til en OutputStream. Den klarer i midlertid ikke å skrive bilder til strømmen sammen med objektene. For å unngå at bildene må lastes inn på nytt hver gang blir bildene skrevet til fil hver for seg. Deretter blir pathen til bildet satt inn i objektene. For eksempel på konserter vil hele 53 konsertlisten skrives til fil der hver konsert har en filpath til bildet sitt. Eksempel på skriving av hele listen til fil kan ses i figur 9.2.2 C. (Figur 9.2.2 C - viser metoden storeConcerts. Metoden tar imot konsertlisten som skal caches og pathen til hvor dataene skal bli lagret. ObjectOutputStream blir brukt til å lagre filen på pathen som er sendt med, og det returneres true hvis listen klarte å lagre og false hvis listen ikke klarte å lagre. SharedPreferences brukes til å lagre pathen til konsertlisten, og denne pathen vil bli hentet ut når en bruker går inn på sin konsertliste for å så bruke ObjectOutputStream til å lese inn konsertlisten.) 54 9.2.3 Backend Serversiden er bygget opp i flere lag, dette er for å dele de forskjellige logiske delene av serveren og gjøre det enklere å endre på én del av programmet uten at det har noen effekt på resten. Det er brukt trådprogrammering og caching for å gjøre serveren så pålitelig og rask som mulig, samtidig som det er brukt hashing på kritiske deler av databasen for å øke sikkerheten. Følgende skal beskrives for backend: Oppbygning Trådprogrammering Caching Entity Framework Code First Den ferdige databasen LINQ Komprimering på server Opplasting til serveren Blob Routing Oppbygning Serversiden vår er altså bygd opp i flere lag. Vi har basert oppbygningen på designmønsteret model-view-controller, men serveren vår har ikke noe view så vi har ikke en komplett MVCstruktur. Vi har prøvd å bygge modellen på MVC for å kunne dele opp og kategorisere delene så bra som mulig. Webserveren er bygd opp slik at en controller tar imot forespørslene og sender disse videre inn (se figur 9.2.3 A). Dataen vil bli hentet ut fra databasen, og hvis mer enn én parameter skal tilbake, vil dataen bli mappet over til et objekt (model) og deretter sendes tilbake til controlleren som gir svar til applikasjonen. (Figur 9.2.3 A – Viser hvordan serveren vår er oppbygd for forespørsler som angår band. Først mottar en bandcontroller forespørsler fra applikasjonen og sender disse videre til bandmanager. Bandmanager håndterer caching og fjerning av cache når data endres. Hvis bandmanager ikke har noe i cachen på det som blir forespurt så sendes forespørselen videre til dbBand som kommuniserer med databasen) 55 Vi har 5 hovedcontrollere på serversiden. Disse er UserController, BandController, ConcertController, FriendsController, og GenreController. Hver controller tar imot kall som omhandler sine «temaer». Dette gjør strukturering på serversiden mye mer oversiktlig. Ved å basere serveren på model-view-controller øker vi i tillegg sikkerheten og unngår risikoer som vi ville hatt hvis appen fikk tilgang til å manipulere databasen direkte istedenfor å gå igjennom flere lag med kommunikasjon. Trådprogrammering I tillegg til å basere serveroppbyggingen på model-view-controller så er trådprogrammering implementert på serversiden. Ved hjelp av trådprogrammering vil serveren bruke mindre RAM, og generelt utføre forespørslene raskere. Et eksempel på oppsett av tråder på serversiden kan ses i figur 9.2.3 B. Vi har på serveren brukt trådtypen Task. Task er en asynkron operasjon som kan bli sett på som en smart tråd, bare at den har ett høyere nivå av abstraksjon. Å bruke Task istedenfor Thread gir mer effektiv og skalerbar bruk av systemressursene. I tillegg får man mer kontroll enn man får med en tråd. Det er bygd et rikt sett med API’er rundt Task, som gjør det friere og enklere å håndtere for eksempel at en tråd skal vente på at noe skal skje. (Figur 9.2.3 B – metode i bandcontroller som tar imot en parameter og venter på svar fra Bandmanager. Await gjør at metoden venter på at den får svar fra bandmanager, og Async task gjør at metoden kjører som en tråd asynkront. Når den mottar et svar, returnerer den en liste med bandobjekter.) På grunn av dette så er det Task som er det foretrukket API’et i .NET-rammeverket for å skrive flertrådet, asynkron og parallell kode. Og vi har bestemt oss for å følge disse anbefalingene. Caching I tillegg til trådprogrammering, hjelper caching til å øke responstid på serveren. Et eksempel på hvordan caching brukes kan ses i figur 9.2.3 C. Hvordan oppdateringer på data som er i cachen håndteres kan ses i figur 9.2.3 D. 56 (Figur 9.2.3 C – Viser hvordan caching gjøres når det hentes ut et band. Metoden i bandmanager lager en cache-nøkkel basert på id’en til bandet og sjekker deretter om dette objektet finnes i cachen. Hvis objektet finnes, returneres objektet; ellers sendes forespørselen videre til en metode i dbBand som utfører forespørselen mot databasen. Hvis forespørselen gir et objekt tilbake, caches dette før svaret sendes tilbake til controlleren som igjen sender informasjonen videre til applikasjonen.) (Figur 9.2.3 D – når noe i cachen skal oppdateres, hentes cachenøkkelen til dette objektet for å fjerne det fra cachen før man oppdaterer dataen i databasen.) Ved å cache objekter ved hjelp av IDen til bandet, gjør vi systemet mer skalerbart. Det vil føre til at mange brukere kan få tak i et objekt uten at alle må spørre serveren hver gang, selv om de skal ha samme objekt. Vi har midlertidig også cachet mer brukerspesifikke ting som bandlisten og konsertlisten til en bruker. Entity Framework Code First For oppbygningen av selve databasen brukes Entity Framework Code First. Et eksempel på hvordan en modell er oppbygd kan ses i figur 9.2.3 E. 57 (Figur 9.2.3 E – Viser bruker domeneklassen der [key] definerer primærnøkkelen og public virtual List<x> definerer mange-relasjon til de andre domeneklassene. Vanlig public virtual x definerer en relasjon til domeneklassene.) Bruk av Entity Framework Code First gir oss enklere kontroll over databasen. Det gjør det enklere å holde styr på domeneklassene våre, og vi trenger ikke å bekymre oss over automatisk generert kode. Code first gjør det også enklere å oppdatere databasen, noe som vi har hatt behov for etterhvert som prosjektet har utviklet seg. Den ferdige databasen Figur 9.2.3 F viser det ferdige databaseoppsettet. Alle tabellene som vises er konstruert ved hjelp av Code First-tilnærmingen og har derfor egne domenemodeller. 58 (Figur 9.2.3 F – Viser den ferdige databasen og relasjonene mellom de forskjellige objektene. “*” representerer en primærnøkkel mens “(FREM)” representerer en fremmednøkkel. Hovedtabellene i databasen er Band, Concert, User, Genre og Notifications, og resten er koblinger mellom disse.) LINQ For å håndtere dataforespørsler mot serveren så bruker vi LINQ. Et eksempel på en LINQ forespørsel kan ses i figur 9.2.3.G. (Figur 9.2.3 G – viser en typisk LINQ-forespørsel, der alle notifikasjonene til en bruker hentes ut. Listen blir sortert etter datoen så den nyeste notifikasjonen ligger først. Listen hentes asynkront, og en await er brukt slik at task’en venter på at forespørselen gjør seg ferdig.) 59 Komprimering på server For å unngå at bildene tar alt for lang tid å laste inn så komprimeres bildene på serversiden. Ettersom vi har fokusert på det visuelle i Semitone så har vi en del bilder. For å unngå at dette tar alt for langt tid, har vi i databasen én url for de store bildene og én for de små bildene. De små bildene til en bruker (brukerprofil) blir minket til 50*50 og komprimert ned til 20l. De små bildene som brukes av band og konserter i listene blir minket ned til 100*100 og til 25l. (100l er størst kvalitet og 0l er lavest kvalitet) Opplasting til serveren Opplasting av bilder skjer ved at applikasjonen sender filer til serveren. Serversiden vil deretter motta filen og konvertere filen til et bilde før dette bildet sendes videre innover. Bildet vil deretter bli komprimert og gitt ny størrelse, og deretter opplastet ved hjelp av Microsoft Azure Blob Storage. URLen blir returnert og blir så lagret i databasen på den medsendte brukerIDen. Mottakelsen av en fil kan ses i figur 9.2.3 H. Blob (Figur 9.2.3 H - metoden ChangePic i UserController tar imot en parameter og sjekker om en fil har blitt opplastet. Filen blir deretter hentet ut og konvertert til et bilde før bildet sendes videre inn til Usermanager for opplasting. Usermanager kontakter deretter UploadImage(Image) i BaseManager.) Bildeopplastning på server skjer ved hjelp av Blob lagring fra Microsoft Azure. Azure Blob er en tjeneste for lagring av store mengder ustrukturerte data. .NET Azure Blob Storage gir oss en måte å ha et filsystem lett tilgjengelig fra skyen. Bruk av Azure Blob lagring gjør at bildene til appen enkelt kan aksesseres fra over alt i verden ved hjelp av RESTful API. Opplasting av bilder til serveren kan ses i figur 9.2.3 I. 60 (Figur 9.2.3 I. Metoden UploadImage i BaseManager tar imot et bilde for opplasting til server. Storage-informasjonen hentes fra Azure, en referanse til containerne gfx hentes, bildet opplastes på denne containeren ved hjelp av en blob og URLen til blob’en returneres.) Routing For routing av spørringene opp mot server har vi brukt ASP.NETs Web API 2. (Figur 9.2.3 J - RegisterRoutes setter opp routingen i applikasjonen. Når en URL kommer inn til server sjekkes {controller}-parameteren og deretter {action}-parameteren i den spesifiserte Controlleren) (Figur 9.2.3 K - {action}-parametritt sjekkes i Controllerklassen, i [Route]-attributtet) 61 9.3 Proof of concept Fordi oppgaven er et proof of concept, har vi stått friere til å definere de oppgavene som må implementeres. Vi har valgt å ikke ta med alle våre idéer og ønsker inn i kravspesifikasjonen, til fordel for en bedre implementasjon av de viktige oppgavene for å demonstrere konseptet på en god måte. Med andre ord har vi for eksempel latt være å legge inn ikke-funksjonelle krav for prosjektet i kravspesifikasjonen. Med ikke-funksjonelle krav mener vi for eksempel skalering, pålitelighet, robusthet, sikkerhet og ytelse. Dette vil gi et bedre, mer velfungerende produkt, men det har ikke noe med selve funksjonene til produktet å gjøre. Vi har i liten grad tatt hensyn til dette under utviklingen. Uansett ville vi ikke sette noen krav for dette, men heller implementere det vi underveis mente var nødvendig for de funksjonelle kravene. Et godt eksempel er at vi, som nevnt, har brukt caching og trådprogrammering for å øke ytelse og hastighet i systemet. Det eneste punktet hvor vi har tenkt på sikkerhet i denne omgang, var ved lagring av passord. På alle passordene legges det til et salt, før det så hashes, og deretter lagres. Det var altså flere aspekter vi ikke tok med i kravspesifikasjonen, men hvordan klarte vi å utføre det vi faktisk tok med? 9.4 Oppfyllelse av krav til funksjonalitet Vår kravspesifikasjon var skreddersydd til prosjektet, så den besto kun av det vi håpet å få ferdig. I tillegg var den under kontinuerlig forandring for å tilpasses prosjektet. Alle funksjonelle krav vi fikk implementert gjør nøyaktig det vi planla. Vi ble likevel ikke helt ferdig med det planlagte arbeidet. Enkelte teknologier var ikke så lette å implementere, og grunnet tiden det tok måtte vi prioritere funksjonalitet som var viktig og helt nødvendig for appen. Dette er en liste over punkter fra kravspesifikasjonen som ikke ble gjennomført: Bruker: Innlogging med Google-konto Redigering av brukernavn Band: ● Sende venner bandforslag ● La band laste opp sang Konserter: ● ● ● Redigere informasjon om konsertene sine Laste opp bakgrunnbilde Se hvem av sine venner som skal på konserten Notifikasjoner: ● Får varsel når et band man har i sin liste legger ut en ny konsert ○ Man får mulighet til å legge til konserten i sin liste direkte 62 Vi rakk altså ikke å fullføre innlogging med Google-konto, men vanlig registrering i appen fungerer, og innlogging med Facebook vil fungere for alle6. Vi ble heller ikke ferdige med streaming av musikk, så per i dag kan ikke band legge ut en låt på profilen sin. Det ligger lenker til artistens SoundCloud-side på profilen, så muligheten for å sjekke ut musikken til en artist finnes allikevel. Noe som har forblitt en placeholder er for eksempel hvem av vennene til en bruker som skal på en konsert. Det er også andre småting vi blir nødt til å fikse på etter hvert, som at ved invitasjon til en konsert vises alle brukerens venner, selv de som allerede har konserten i sin liste. Dette kan føre til at man mottar invitasjon til en konsert man allerede har i lista si. Det var et punkt i kravspesifikasjonen som vi fullførte, men som ikke ble som forventet: “Få anbefalinger av band og konserter basert på sine preferanser”. Her hadde vi planer om å ha to måter å vise forslagene på; enten som en liste, eller én og én profil med mulighet for å swipe til neste. Vi innså at en vanlig liste ville være kjedelig, men at å kun vise én om gangen ikke ville gi brukeren noen oversikt. Derfor kom vi fram til rutenettet av bilder vi nå har på explore-siden. Vi ville fremdeles la brukeren klikke seg inn på en konsert fra rutenettet og deretter kunne swipe mellom alle forslagene, men dette fikk vi ikke tid til å gjennomføre. 9.5 Søkekriterier Bruker får forslag på band basert på to kriterier ● ● Område Sjanger 9.5.1 Om geografisk område som søkekriterie Bruker definerer selv område. I tillegg får brukeren mulighet til å velge hvor langt hen er villig til å reise for en konsert, basert på radius. Å kunne definere hvor langt en er villig til å reise er viktig for at applikasjonen skal fungere godt for alle lokasjoner. Om en bor i en by, vil en gjerne ikke reise mer enn en halvtime for å gå på konsert. Bor en i områder med færre mennesker kan det godt hende at en er villig til å reise lenger. 9.5.2 Om sjanger som søkekriterie Hvordan sjanger skal defineres har vært et tema vi har fått mange forslag på. Både under brukertesting, fra veiledere og på presentasjoner. Noe problematikk er hvordan man skal definere sjanger, mengden sjangre som finnes, og at begrepet i seg er i oppløsning. Vi har valgt å bruke brede sjangerbegreper. Sjanger er ikke bare en beskrivelse av musikk, men også en identitetsmarkør, og vi mener derfor at det er en god begynnelse. Andre aktører i markedet, som SoundCloud, har også valgt denne tilnærmingen. 6 Forklaring under teknisk beskrivelse av login i del «9.2.2 Fronteend: Androidapplikasjon» 63 9.5.3 Videreutvikling av søkekriterier På lengre sikt ønsker vi å gi artister mer makt over beskrivelse av musikken sin. En artist vil fortsatt måtte velge en eller flere overordnede sjangre, men vi vil i tillegg gi mulighet for å legge til egendefinerte sjangre. Om en artist mener at musikken hens er indie-danse-pønk, så er den indie-danse-pønk. På denne måten kan vi gi musikere større definisjonsmakt over egen musikk. For at bruker skal få bedre forslag ønsker vi også å lage et referansesystem der band legger til band de mener de ligner på. Bruker vil deretter få flere og bedre anbefalinger basert på band hen har i lista si. 9.6 Sammenlignet med konkurrerende løsninger Bandsintown: Bandsintown er en app som gir bruker mulighet til å følge forskjellige band. Basert på de bandene bruker følger vil hen få forslag til andre band hen kanskje liker. Hen vil også kunne få informasjon om konserter i sin by. Bandsintown har ingen oversikt over de små scenene og de ukjente bandene. Timbre: Timbre er en iOS-app som finner konserter i brukers geografiske område. Timbre har fokus på store konserter, og har ikke oversikt over de minste scenene. Timbre handler kun om konserter, så band har ingen egen rolle i appen. Appen er heller ikke tilgjengelig i alle byer, kun de det er lagt opp til. Timber gir ikke bruker mulighet til å lage egendefinerte lister over de konsertene hen skal gå på, og dette kan føre til mye unødvendig informasjon og at det blir uoversiktlig. Jukely: Jukely foreslår konserter i nærheten av bruker, i et visst antall byer som er lagt inn. Jukely er veldig fokusert rundt betalingsmåte; bruker må blant annet kjøpe billetter for å invitere venner på konserter. Jukely har heller ikke fokus på små band og konserter, og bruker kan ikke opprette sitt eget band eller legge ut konserter. Et trekk som går igjen i disse appene er at informasjon om konserter og band hentes fra eksterne steder. Dette medfører at appene ikke vil fungere overalt, og at ukjente band ikke får delt informasjonen sin. Vi distanserer oss godt fra disse appene ved å gi band en egen rolle i appen, og dermed sette lokal musikk i fokus fremfor de store og kjente artistene. Vi gir også brukeren kontroll ved at de kan definere sin radius, og dermed selv velge betydningen av lokal musikk. Semitone er mer enn kun en informasjonsapp; den vil kunne skape et forhold mellom de lokale bandene og publikum. 64 10. Brukertesting 10.1 Om undersøkelsene: Kvalitativ forskningsmetode Brukertestingen bestod av dybdeundersøkelser på et mindre antall personer. Vi prøvde å åpne for lengre svar, og alltid la testpersonene si alt de tenkte om appen uavhengig av hva vi testet. Alle temaene vi testet og spørsmålene vi stilte kan leses i vedlegg 4. Brukertester. 10.2 Forhold rundt testingen Vi snakket i størst grad med folk vi kjenner, men spurte også nye bekjente når vi fikk sjansen. Vi prøvde å variere både i alder, grad av musikkinteresse, sosiale miljøer og IT-kyndighet. Siden vi testet såpass mange ganger, passet vi på å alltid inkludere nye personer i hver test, men også teste noen som allerede var kjent med idéen. Alle undersøkelsene ble lagt opp slik at vi hadde spesielle temaer, og eventuelt et par åpne spørsmål. Vi prøvde i størst mulig grad å tilpasse undersøkelsen til personen slik at vi skulle få mest mulig nyttig informasjon ut av dem, for eksempel ved å stille videre spørsmål basert på det som ble sagt. Selv om vi noen ganger hadde planlagte spørsmål, var dette ofte bare forslag; det viktigste var alltid å få meninger om temaet vi undersøkte. 10.3 Hva undersøkte vi? ● ● ● ● ● ● ● ● ● Generelt om appidéen - Hvilke deler er uviktige for bruker og hva bør fokuseres på? ○ Utført flere ganger i løpet av prosessen etter hvert som oppgaven ble mer konkret og ting ble kuttet bort ■ Basert på forklaring av idé ■ Basert på elevator pitch ○ Førsteinntrykk og om de ville ha brukt appen Kommunikasjon mellom brukere - Er disse funksjonene ønsket eller i veien? ○ Å legge til venner ○ Meldingsfunksjonen ○ Sende konsertinvitasjoner og bandforslag Betalingsfunksjon – Ønsker brukerne å kjøpe billetter gjennom appen? Liste eller swipe-funksjon for anbefalingene - Hvordan skal vi presentere data? Innlogging - Hvordan foretrekker flest å logge inn og hvorfor? ○ Vanlig bruker ○ Facebook-konto ○ Google-konto Mengden personlig informasjon - Vil brukere dele mer om seg selv? Mengden informasjon om band - Holder det med informasjonen vi har bestemt? ○ Fa musikeres synspunkt ○ Fra publikums synspunkt Notifikasjoner i appen - Hva vil brukere ha varsel på? Design og brukergrensesnitt - Hvordan burde appen se ut? 65 10.4 Resultater 10.4.1 For mye funksjonalitet Vi fikk mye kommentarer på at appen hadde for mange funksjoner, og at det gjorde det vanskelig å skjønne hva appen egentlig gjorde; hva som var hovedfokus. Likevel var folk generelt svært positive til idéen, men de hadde kommentarer som fikk oss til å innse at vi måtte gjøre noen endringer. “Det høres ut som en kul app. Min første frykt er om jeg må være veldig aktiv for at den skal fungere for meg” -del av et undergrunnsmiljø i Oslo, 20-30 år, sånn passe interessert i musikk 10.4.2 Kommunikasjon mellom brukere Testgruppen var ikke interessert i meldingsfunksjonen. Den ble beskrevet som “malplassert” og “unødvendig”. Vi fikk få positive tilbakemeldinger. “Det er som om man skulle avtale med venner hvilket tog en skal ta inne i NSB-appen” -del av et undergrunnsmiljø i Oslo, 20-30 år, opptatt av det sosiale aspektet ved konserter Vennefunksjonene fikk blandede tilbakemeldinger. Noen var interessert i dette, andre var likegyldige. Det var også positivitet rundt at man kun kunne legge til venner om man kjente til brukernavnet. Dette gjør at man slipper forespørsler fra fremmede. 10.4.3 Billettkjøp Funksjonen for kjøp av billetter var testpersonene generelt negative til, og syns det var unødvendig å implementere. “Jeg trodde denne appen var for små artister som sannsynligvis ikke har billetter på billettservice” -hyppig konsertgåer, 20-30 år 10.4.4 Liste vs. swipefunksjon Under testen for liste eller swipe-funksjon for anbefalinger, fikk vi ikke et godt svar. Mange var usikre, og de fleste sa ja til at de ville ha begge deler. Vi fikk inntrykk av at de ikke var helt fornøyde med løsningen, som noen også sa fra om. 10.4.5 Innlogging Rundt innloggingsspørsmålet viste det seg å være veldig delte meninger. Det var omtrent like mange som foretrakk hver av løsningene, men ingen hadde noe i mot at alle mulighetene var til stede. 10.4.6 Mengden informasjon Mange likte den minimale mengden personlig informasjon. Enkelte skulle gjerne kunne dele mer om seg selv, men flertallet var for å ha lite informasjon. De så ikke nødvendigheten i å ha mer i en app som denne, hvor man uansett kjenner personene man legger til fra før av. 66 Basert på undersøkelsen om mengden bandinformasjon som skulle deles, viste det seg at folk også her foretrakk lite informasjon, heller enn mye. Selv artistene skjønte hvorfor det var såpass lite, og var ok med det ettersom de kunne linke til andre nettsider. Notifikasjoner var en funksjon svært mange stilte seg likegyldig til. “Det ville selvfølgelig vært praktisk, men det er ikke så viktig for meg” -glad i å gå på konserter, 30-40 år, bor i storby Samtidig er notifikasjoner et nyttig grep for å fremme aktiv bruk av appen. 10.4.7 Brukergrensesnitt Vi viste fram en del design av brukergrensesnitt underveis. Vi gjorde dette spesielt på mindre detaljer, men også for hele appen for å se om den var forståelig og lett å bruke. De siste versjonene av appen virket greie å forstå for de fleste. Noe vi testet ganske nøye var bakgrunnsbilde på innloggingssiden. Vi hadde valgt ut en rekke alternativer individuelt, som vi presenterte for brukerne og ba dem velge sin favoritt. Det viste seg at det var svært viktig for brukerne at bildet tydelig representerte både musikk og konserter. 10.5 Innvirkninger av testresultat på produktet Mange av testene fikk resultater som stemte med avgjørelser vi allerede hadde tatt. Det var allikevel viktig å gjennomføre alle disse testene, ettersom de styrket vår tro på valgene vi tok. Noen av testene førte også til endringer, eller hjalp oss med å bestemme oss når vi var usikre. De store funksjonalitetskuttene i begynnelsen av prosjektet var delvis inspirert av resultatet fra de første brukertestene. Da vi spisset målgruppen vår ble det ganske tydelig hva som kunne fjernes, men flere av disse kuttene føltes tryggere å gjennomføre når vi visste at det var usikkerhet blant brukere om disse funksjonene. Det var uenighet innad i gruppa om hvor mye vennefunksjonalitet som skulle være en del av appen. Ved hjelp av undersøkelsen om dette fant vi helt konkret ut hva som var ønskelig blant brukerne. Derfor kuttet vi åpenbart meldingsfunksjonen. NSB-sammenligningen ble spikeren i kista for den. Liste/swipe-debatten for Explore-sidene endte for oss i å lage et nytt design. Dette var i stor grad på grunn av brukertesten og utilfredsheten vi oppfattet fra testpersonene. Vi viste det nye rutenettdesignet til flere av de samme menneskene, og de var mer positive til dette. Innloggingen løste seg selv. Ingen hadde noe i mot at alle mulighetene fantes, og alle mulighetene ville bli benyttet. Vi beholdt alle tre i kravspesifikasjonen. 67 Avslutning 11. Konklusjon Bak applikasjonen Semitone ligger det en mye større idé. Utgangspunktet for applikasjonen var et ønske om å endre hvem som får definere hva musikk er, hvem som får mulighet til å utøve musikk, hvem som får mulighet til å delta i mindre miljø, og hvem som får mulighet til å bli hørt. Dette er ikke noe som gjøres over natta, og vi lærte vel også etter hvert at det ikke er gjort i en app laget i løpet av 5 måneder. Men et sted må en begynne, og det har vi tro på at Semitone kan være en del av. En mobilapplikasjon kan kanskje ha nok funksjoner som løser mange av problemene på en gang, men hvor bra ville den applikasjonen egentlig blitt? Vi har valgt å gå bort fra en slik løsning, og heller fokusere på å lage en app som løser ett av problemene på en god måte. Når en problemstilling er for stor for én løsning, er det bedre å begynne i et hjørne. Når en liten del er løst bra, blir det lettere å fikse på resten. Semitone er enkel og gjør akkurat det den skal gjøre. Ikke mer, ikke mindre. 11.1 Egenevaluering 11.1.1 Gjennomføring Vi undervurderte mengden tid og arbeid utvikling fra idé til konsept ville ta. Vi burde brukt mer tid på dette i begynnelsen av prosjektet. Endringene som skyldtes mangel på planlegging underveis, medførte en del ekstraarbeid. Samtidig førte det til at vi fikk prøvd ut ulike måter å implementere idéene teknisk og ulike måter å utføre planlegging og endringer, og vi har tatt med oss verdifulle erfaringer fra dette. Som beskrevet i prosessdokumentasjonen har vi flere ganger sprukket tidsplanene våre. Vi var nok litt for optimistiske med tanke på mengden arbeid som det var mulig å utføre i hver sprint, og kunne vært bedre på å se tegnene på dette og justert sprint backlogs deretter. 11.1.2 Samarbeid/gruppeprosessen Samarbeidet i gruppa har vært preget av miljø hvor det var helt åpent for å si sine meninger, eller spørre hverandre om hjelp. Alle uenigheter som oppsto ble løst uten å skape ondt blod, selv om diskusjonene til tider var intense. Vi har i løpet av halvåret hatt perioder med dårlig kommunikasjon, men har tatt tak i det og jobbet mot tettere samarbeid igjen. Alle medlemmene føler eierskap til idéen og produktet – noe som var svært viktig for oss – og slik har alle opprettholdt engasjementet gjennom hele prosessen. 68 Det har vært viktig for oss å ta hensyn til hverandre. Et godt eksempel er kjernetiden. Vi er en gruppe med forskjellige måter å jobbe på, og forskjellige døgnrytmer, noe som krever justering for at alle skal ha det bra. Vi synes vi har hatt et godt samarbeid med veilederne våre. Vi har møttes med alle våre veiledere én gang i uka, og de har alltid vært tilgjengelige for oss. De har kommet med spørsmål og tatt opp temaer som vi ikke hadde tenkt på, og Semitone hadde nok ikke blitt så bra som det er uten dem. 11.1.3 Læringsutbytte Nye teknologier Vi måtte sette oss inn i en del nye teknologier for å gjennomføre prosjektet. Både overfladisk kunnskap for å sette ulike teknologier opp mot hverandre for å ta riktige valg, og dypere forståelse for å ta det i bruk på best mulig måte. Både .NET og Java for Android var kjent for oss, men samtidig har vi lært å ta i bruk mer av det rammeverkene har å tilby, og også utvide disse med tilleggsrammeverk. Scrum Vi var ikke veldig kjent med Scrum, så læringskurven har vært stupbratt. Scrum som utviklingsmetodikk er mye brukt, og det vil definitivt komme godt med å ha erfaring med dette. Planlegging Når du tror du er ferdig med planlegginga; planlegg et par timer til. Gruppearbeid i større prosjekter Vi lærte en god del om gruppearbeid i større prosjekter, og spesielt i prosjekter der man selv skal lage oppgaven og bestemme rammene. Dette var noe vi ikke hadde erfaring med fra tidligere, og læringsprosessen var bratt. Nødvendigheten av kommunikasjon og kontinuerlig samarbeid ble tydelig for oss, dog dessverre litt senere enn vi hadde foretrukket. Vi føler at vi samarbeidet veldig godt helt på tampen av prosjektet, og merket at det var mer flyt når vi fikk til dette. Elevator pitches og presentasjoner Gjennom arbeid med elevator pitches lærte vi hvordan vi skulle identifisere og presentere det viktigste med en idé eller et produkt. Dette var en viktig lærdom med tanke på presentasjoner og videre arbeid med appen, hvor vi sannsynligvis vil bli nødt til å presentere Semitone mange ganger. Dette har også gjort at vi har blitt flinke til å forklare kort og spennende om bachelorprosjektet vårt til venner og bekjente. Vi lærte også en del om presentasjoner og presentasjonsteknikk. Dette er lærdom vi vil ta med oss resten av livet. Vi fant ut hvordan man legger opp en presentasjon for å få best flyt og for å 69 fange interessen til publikum. Gjennom tilbakemeldinger fikk vi også vite hva hver og en av oss burde tenke på mens vi holder presentasjoner. 11.2 Videre arbeid Nå som vi er ferdige med bachelorprosjektet, har vi fremdeles mulighet til å videreutvikle appen og dette har vi planer om. Vi eier selv både konsept og kildekode. Vi har underveis kommet opp med nye idéer som vi kunne tenke oss å ha implementert i en ferdig utgave av appen. Enkelte idéer hadde vi helt fra starten, men grunnet tidsrammene valgte vi å ikke ta dette med i kravspesifikasjonen. Den “ferdige” applikasjonen vil kunne inneholde følgende funksjonalitet i tillegg til det som står i kravspesifikasjonen: ● ● ● ● ● ● ● ● Man kan opprette koblinger mellom band som har lignende musikk, noe vi har kalt “referanser” Med utgangspunkt i band og konserter i brukerens lister, og basert på referansene, vil vi kunne forbedre anbefalingene og gjøre det mer tilpasset hver enkelt person. Altså vil vi lage en algoritme som lærer En bruker skal kunne swipe mellom band- og konsertprofiler ○ For anbefalte band og konserter ○ I konsertliste ○ I bandliste La bruker hindre uønskede anbefalinger fra å dukke opp flere ganger En cross-platform-løsning Lage en nettside der band kan registrere seg, konsertlokaler kan legge til konserter osv. Dette for å forenkle bandadministrasjonen og åpne for mer detaljert redigering av utseende på bandprofiler og konsertplakatene deres Band skal kunne legge til brukere som bandmedlemmer, som da også vil få adminrettigheter på bandet Et mer gjennomtenkt, sammenhengende og finpusset brukergrensesnitt, som både ser penere ut og er så intuitivt som mulig å benytte 70 Om vi hadde hatt en tidsmaskin og dratt tilbake for å vise våre august-oss applikasjonen vi endte opp med å lage, hadde vi nok ikke kjent den igjen. Det hadde nok også blitt noen sinte innvendinger når august-oss oppdaget at musiker-finner-musiker-funksjonen var borte, og muligens en og annen beskyldning om ødeleggelse av en fantastisk fin idé. Men som våre august-selv etterhvert har fått lære: å kutte en funksjon gjør deg ikke til en sellout. Det kan derimot sørge for at produktet du utvikler blir bedre. Mai-oss er stolte av det vi har laget, men vi har også lært at å bli for knyttet til en enkelt funksjon eller en spesifikk del av konseptet er ufruktbart. Vi regner med at det kommer til å komme nye korsveier der kjepphester må kastes; om ikke smertefritt, så i hvert fall med viten om at det lønner seg i lengden. Én kjepphest kommer vi likevel til å beholde. Idéen som ligger i bunnen; musikk skal ikke være avhengig av store plateselskaper og A-spillelister. Det skal ikke være utilgjengelig fordi du ikke kjenner de rette personene eller de riktige stedene, eller fordi du ikke orker å lese igjennom 35 poster fra et band på Facebook for å finne ut når konserten deres er. Det skal rett og slett være no fuss, just music. Oslo, 26. mai 2015 ______________________ __________________ ______________________ Madeleine V. K. Rønning Emilie Strand Rannveig A. Skjerve 71 12. Referanser Artikkel Nettside Forfatter Tilgjengelig på Sist besøkt Om Høgskolen i Oslo og Akershus HiOA - http://www.hioa.no/Om-HiOA 05.05.15 Fakultet for teknologi, kunst og design (TKD) HiOA - http://www.hioa.no/OmHiOA/Fakultet-for-teknologikunst-og-design-TKD 05.05.15 App Spotlight: Bandsintown Spotify Katz, Candice https://news.spotify.com/us/20 13/02/05/bandsintown/ 02.05.15 What happened to the Spotify app? Songkick - http://help.songkick.com/custo mer/portal/articles/1671555what-happened-to-the-spotifyapp- 02.05.15 Proof of Concept (POC) Technopedia Janssen, Cory http://www.techopedia.com/defi nition/4066/proof-of-conceptpoc 02.05.15 Accenture - http://www.accenture.com/noen/company/Pages/index.aspx 04.05.15 6 steg til hvordan du legger opp en effektiv “elevator pitch” Left Brain Marketing Stegane, Are http://leftbrainmarketing.NET/bl ogg/2012/04/6-steg-tilhvordan-du-legger-opp-eneffektiv-elevator-pitch/ 05.05.15 Scrum (software development) Wikipedia - http://en.wikipedia.org/wiki/Scr um_%28software_developmen t%29 14.05.15 Android software development Wikipedia - http://en.wikipedia.org/wiki/And roid_software_development 05.05.15 About Accenture 72 Tidligere prosjekter HiOA - http://www.cs.hioa.no/data/bac helorprosjekt/TidligereProsjekt er.php 14.05.15 Introducing RoboSpice: Introducing RoboSpice: A Robust Asynchronous Networking Library for Android YouTube YouTube user Chariot Solutions https://www.youtube.com/watc h?v=ONaD1mB8r-A 04.05.15 JSON Tutorial w3schools.com - http://www.w3schools.com/JS ON/ 05.05.15 XML Tutorial w3c.org - http://www.w3schools.com/xml/ 02.05.15 Getting Started Git Basics git - http://gitscm.com/book/en/v2/GettingStarted-Git-Basics 29.04.15 Spring for Android spring - http://projects.spring.io/springandroid/ 03.05.15 Native Android Development with Spring YouTube YouTube user Spring Developer https://www.youtube.com/watc h?v=kvPpu-pTTMY 03.05.15 Learn REST: A Tutorial rest.elkstein.org Dr. Elkstein, M. http://rest.elkstein.org/2008/02/ what-is-rest.html 01.05.15 ASP.NET Wikipedia - http://en.wikipedia.org/wiki/AS P.NET 05.05.15 - Agilefant - http://agilefant.com/ 14.05.15 (Video) (Video) 73 API - application program interface Webopeida Beal, Vangie http://www.webopedia.com/TE RM/A/API.html 14.05.15 Visual Studio Visual Studio - https://www.visualstudio.com/ 14.05.15 Entity Framework Data Developer Center - https://msdn.microsoft.com/enus/data/ef.aspx 14.05.15 Intro to Entity Framework 5.0 YouTube YouTube User Fabio Scopel https://www.youtube.com/watc h?v=EPXFc6pAnMs 14.05.15 How to use Blob storage from .NET Microsoft Azure Tamram http://azure.microsoft.com/nbno/documentation/articles/stora ge-dotnet-how-to-use-blobs/ 14.05.15 Android Shared Preferences Tutorial Tutorialspoint - http://www.tutorialspoint.com/a ndroid/android_shared_prefere nces.htm 14.05.15 Understanding Routing in ASP.NET MVC Dotnetcurry Sumit Maitra http://www.dotnetcurry.com/sh owarticle.aspx?ID=814 19.05.15 Apache Harmony Wikipedia - http://en.wikipedia.org/wiki/Apa che_Harmony 19.05.15 Pinstripe Limo dafont.com Designer: Lauren Thompson (Nymphont) http://www.dafont.com/pinstrip e-limo.font 22.05.15 Terms of Use/End User License Nymphont Lauren Thompson (Nymphont) http://www.nymfont.com/2009/ 07/terms-of-useend-userlicense-agreement.html 22.05.15 Bildet fra forsiden, brukt med tillatelse Miriam Namork Photography Foto: Miriam Namork http://miriamnamork.tumblr.co m/ Kontakt: miriam.semb@gmail.com 22.05.15 (Video) (Font benyttet på forsiden) 74 Vedlegg 1. Ordliste 2. Styringsdokumenter 2.1. Fremdriftsplan 2.2. Risikoanalyse 2.3. Product backlogs 2.3.1. Ved begynnelsen av prosjektet 2.3.2. Ved slutten av prosjektet 3. Elevator Pitch 4. Brukertester 5. Prosjektskisse 6. Brukerveiledning 7. HTTP API References 8. Klasseoversikt – applikasjon 9. Klasseoversikt – server 75 1. Ordliste Apache Harmony: Apache Harmony var en åpenkildekode-implementasjon av Java, utviklet av Apache Software Foundation. Prosjektet ble avsluttet 16. november 2011. API (Application Program Interface): API er et sett rutiner, funksjoner, protokoller og verktøy for å bygge programvare. APIet spesifiserer hvordan programvarekomponentene burde kommunisere, og APIer brukes under programmering av grafiske brukergrensesnittkomponenter. Backend: Den «usynlige» delen. Består typisk av servere og applikasjoner som prosesserer forespørsler fra frontend, og databaser. BroadcastReceiver: En BroadcastReceiver i Android er en komponent som gjør det mulig for en applikasjon å lytte etter bestemte hendelser i systemet. Caching: Caching er en komponent som lagrer data slikt at identiske forespørsler i fremtiden kan leveres fortere. I databaseøyemed betyr dette at identiske fremtidige forespørsler kan gjøres uten å måtte spørre databasen. Ettersom databaseforespørsler er trege vil dette føre til at responstiden fra for eksempel en server blir raskere. Vi har brukt caching på serveren for å øke ytelsen og responstiden. Cross-platform: At en applikasjon kan kjøre på flere forskjellig plattformer; i vårt tilfelle gjelder dette først og fremst om appen skal kunne kjøres på både iOS og Android. Frontend: Den delen av et system som er synlig for bruker Hashing (av passord): For å beskytte et passord vil det ofte bli enveis-hashet. Selv om en person klarer å få tilgang til databasen vil de ikke ha tilgang til passordene i vanlig tekst. De blir nødt til å prøve alle mulige passordkombinasjoner for å finne ut det originale passordet. Et passord vil ofte bli hashet sammen med et salt for å gjøre det enda vanskeligere å bryte passordene. Integrated Development Environment (IDE): Integrated Development Environment, eller integrert utviklingsmiljø på norsk, er et program som brukes til utvikling og koding av andre programmer. Minimal Viable Product (MVP): Et MVP inneholder kun den nøkkelfunksjonaliteten som gjør at produktet kan brukes, og ikke mer. Det brukes typisk for testing mot kunder eller potensielle kunder. For oss betyr dette at vi ville lage et teknisk proof of concept som viser idéen vår, men som inneholder så lite funksjonalitet som mulig grunnet mangel på tid. Model, View, Controller (MVC): Et designmønster for programutvikling. Programmet deles opp i dataenheter, visuell del og logikk som utføres på disse. Object Relational Mapper: En programmeringsteknikk som brukes for å konvertere inkompatible typer, f.eks. JSON-data eller relasjonell data fra database, til objekter som kan brukes av programmeringsspråk. 76 Open source: Kildekode som er gjort tilgjengelig. Routing: I denne konteksten er routing-prosessen å mappe en URL til en handler på serversiden. Salt (passord): Et salt lagres ofte i forbindelse med et passord. Salting gjør slik at selv om to passord er like så vil hashing av disse passordene være forskjellige ettersom saltet er random generert. Services i Android: En service i Android er en applikasjonskomponent som kan utføre langvarige bakgrunnsoperasjoner uten tilknytning til brukergrensesnitt. En annen komponent kan starte en service, men servicen kjører videre selv om komponenten som startet den avsluttes. Toast: En midlertidig melding i appen som dukker opp nederst på skjermen, ofte for å informere om det som skjer i applikasjonen som bruker ikke kan se (f.eks. «Konserten ble lagret»). Tråder/Trådprogrammering: En tråd er utførelsen av den minste sekvensen av programmerte instruksjoner som kan håndteres uavhengig av andre instruksjoner i et program. En tråd kan ses på som en lettvektprosess; oppgavene i programmet fordeles, men en tråd krever mindre ressurser enn det en prosess gjør. Trådprogrammering refererer til bruken av tråder i programmering og brukes for å øke ytelsen til applikasjoner. Tråder kan bli brukt på en server til å behandle hver forespørsel med en ny tråd, i stedet for med en ny prosess. For hver forespørsel som kommer inn er det en egen tråd som utfører denne spesifikke forespørselen. Hvis forespørselen er en databaseforespørsel som databasen må utføre, men som den ikke må vente på, så kan tråden bare kjøre videre mens databaseforespørselen foregår samtidig. Use case: En use case er en beskrivelse av et system i form av «historier» om hva systemet skal kunne gjøre. Eksempel: En bruker henter kakao fra maskinen. 77 2. Styringsdokumenter Styringsdokumentene i forprosjektrapporten ble utarbeidet i midten av januar, og baserte seg på kunnskap vi hadde om lignende dokumenter fra tidligere. Etter ønske fra Accenture valgte vi å bruke rammemodellen Scrum for utviklingen, og gikk derfor raskt over til å bruke product backlog til planlegging av arbeid. Vi brukte allikevel fremdriftsplanen fra forprosjektrapporten som veiledning til oppsett av 1. sprint og som en generell oversikt over hvilken rekkefølge funksjoner burde implementeres. 2.1 Fremdriftsplan Figur 2.1 A - Fremdriftsplan fra forprosjektet (januar 2015) Å planlegge ut i fra product backlog fungerte mye bedre for oss enn om vi skulle forholdt oss til en statisk milepælsplan. I milepælsplanen er det mange fastsatte funksjoner som vi kuttet på grunn av tilbakemelding fra potensielle brukere, så denne planen ble fort unøyaktig. Det viste seg også etterhvert at planen var i overkant ambisiøs i forhold til hva som faktisk var mulig å få gjennomført. 78 2.2 Risikoanalyse Risikoanalyse fra 01.februar 2015 Risiko Sannsynlighet Risikograd Forebygging Utfall Sykdom Høy Middels Enighet; ved sykdom slappe av, ta igjen resten når en er blitt frisk Influensa Mangelfull scoping Høy Høy Se over use cases, legge en klar plan For mye diskusjoner, uenigheter og forvirring underveis ettersom alle oppgaver ikke var satt ordentlig nok For stor arbeidsmengde Høy Høy Dynamisk utvikling; kutte unødvendige funksjoner så fort de blir identifiserte En mindre app, men arbeidsmengden førte likevel til at vi måtte utsette kodestopp Intern uenighet Middels Middels/høy Åpen kommunikasjon, ta tak i konflikter når de oppdages Godt håndterte konfliktsituasjoner, Dropbox, google docs, lokale kopier og git Ingen data evig tapt (midlertidig borte pga git-problemer) Tap av data Middels Høy Tekniske problemer Middels Lav men det har krev tid Git failures I etterpåklokskapens lys må det innrømmes at vi undervurderte hvor mye av oppgaven vår som skulle komme til å omhandle selve utviklingen av konseptet. Vi har stort sett jobbet på prosjekter med klart definerte oppgaver og tekniske spesifikasjoner, altså prosjekter der det er mulig å 79 bruke mer tid på å programmere hver for seg og mindre tid på å diskutere. Det er en klar svakhet i planleggingen vår, og har gitt utslag i en del beslutninger tatt av enkelte i stedet for gruppa som helhet. Etterpåklokskapens risikoanalyse Mangelfull kommunikasjon om status på programmering fra hver enkelt Høy Høy Stand-ups på alle møtedager Fungerte godt i begynnelsen, men ble dårligere på slutten. Dette førte til at vi ikke klarte å samkjøre den siste innsatsen og var en av hovedgrunnene til at vi ble nødt til å utsette kodestopp en uke ’’Diskusjonstrøtthet’’ Høy Høy Brukertesting Brukertesting ble innført etter første ‘‘diskusjonsrunde’’ og var til god hjelp for å minimere mengden diskusjoner. Men det var fremdeles en faktor som var med oss resten av semesteret, og var nok en av hovedgrunnene til den manglende kommunikasjonen som har oppstått til tider. 80 2.3 Product backlogs Vi hadde allerede gjort de fleste funksjonalitetskuttene da vi begynte å bruke Scrum, så vår første product backlog er ikke så veldig annerledes fra vår siste. Vi gjorde allikevel noen endringer på underveis så vi har lagt ved både vår første og siste versjon. 2.3.1 Ved begynnelsen av prosjektet Brukerkonto o Som bruker kan jeg logge meg inn med en brukerkonto laget i appen o Som bruker kan jeg logge meg inn med min Facebook-konto o Som bruker kan jeg logge meg inn med min Google-konto o Som bruker kan jeg sette og redigere følgende informasjon om meg selv: Brukernavn Profilbilde Passord Hvilke notifikasjoner jeg skal få fra appen Hvilke sjangre jeg liker Hva som er mitt lokale område o Som bruker kan jeg søke på en sjanger og få opp konserter eller band under valgte sjanger o Som bruker kan jeg swipe mellom anbefalingene jeg får til konserter og band Vennefunksjonalitet o Som bruker kan jeg sende venneforespørsler Gitt at jeg kjenner til brukernavnet til mottaker o Som bruker kan jeg motta, og godta eller avslå, venneforespørsler o Som bruker kan jeg se mine venner i en venneliste o Som bruker kan jeg fjerne mine venner fra min venneliste o Som bruker kan jeg sende mine venner meldinger Bandfunksjonalitet o Som bruker får jeg anbefalinger av band basert på mitt satte område og foretrukne sjangre o Som bruker kan jeg legge til et band i min bandliste o Som bruker kan jeg fjerne et band fra min bandliste o Som bruker kan jeg se min bandliste o Som bruker kan jeg søke i min bandliste o Som bruker kan jeg sende forslag om band til mine venner o Som musiker kan jeg opprette en bandprofil o Som musiker med bandprofil kan jeg sette og redigere følgende informasjon om bandet mitt: Bandnavn Hvilke sjangre bandet identifiserer seg som En sang som streames i appen Medlemmer av bandet Linker til SoundCloud, Facebook og hjemmeside Referanser til andre band i appen 81 Kjøp av CD/utgivelser Hva som er bandets lokale område o Som musiker med bandprofil kan jeg informere mine følgere om: Nye konserter Nye musikalske utgivelser o Som bruker kan jeg se et band sin profil o Som bruker skal jeg få notifikasjon når et band i min bandliste legger ut en ny konsert o Som bruker kan jeg kjøpe CD’er fra bandet om muligheten er tilstede Konsertfunksjonalitet o Som bruker får jeg anbefalinger av konserter basert på mitt satte område og foretrukne sjangre o Som bruker kan jeg legge til en konsert til min konsertliste o Som bruker kan jeg fjerne en konsert fra min konsertliste o Som bruker kan jeg se min konsertliste o Som bruker kan jeg søke i min konsertliste o Som bruker kan jeg sende mine venner invitasjon til en konsert o Som musiker med bandprofil kan jeg opprette nye konserter o Som musiker som kan opprette en konsert kan jeg sette og redigere følgende informasjon om konserten: Tittel på konserten Bandnavn Dato og klokkeslett Navn på konsertlokalet Adresse til konsertlokalet Billettkjøp o Som bruker kan jeg se en «konsertplakat» o Som bruker kan jeg se hvor mange av mine venner som skal på en gitt konsert o Som bruker kan jeg se hvem av mine venner som skal på en gitt konsert o Som bruker kan jeg kjøpe billetter til en konsert hvis muligheten er tilstede o Som bruker kan jeg søke på en dato og få opp konserter på denne datoen 82 2.3.2 Ved slutten av prosjektet Brukerkonto o Som bruker kan jeg logge meg inn med en brukerkonto laget i appen o Som bruker kan jeg logge meg inn med min Facebook-konto o Som bruker kan jeg logge meg inn med min Google-konto o Som bruker kan jeg sette og redigere følgende informasjon om meg selv: Brukernavn Profilbilde Foretrukne sjangre Geografisk lokasjon Radius rundt gitte lokasjon o Som bruker kan jeg velge å swipe mellom eller se liste over anbefalingene jeg får til konserter og band Vennefunksjonalitet o Som bruker kan jeg sende venneforespørsler Gitt at jeg kjenner til brukernavnet til mottaker o Som bruker kan jeg motta, og godta eller avslå, venneforespørsler o Som bruker kan jeg se mine venner i en venneliste o Som bruker kan jeg fjerne mine venner fra min venneliste Bandfunksjonalitet o Som bruker får jeg anbefalinger av band basert på mitt satte område og foretrukne sjangre o Som bruker kan jeg legge til et band i min bandliste o Som bruker kan jeg fjerne et band fra min bandliste o Som bruker kan jeg se min bandliste o Som bruker kan jeg sende forslag om band til mine venner o Som bruker kan jeg godta eller avslå bandforslag fra mine venner o Som musiker kan jeg opprette en bandprofil o Som musiker kan jeg se en liste over alle mine opprettede band o Som musiker med bandprofil kan jeg sette og redigere følgende informasjon om bandet mitt: Bandnavn Bilde Hvilke sjangre bandet identifiserer seg som En sang som streames i appen Medlemmer av bandet Linker til SoundCloud, Facebook og hjemmeside Hva som er bandets lokale område o Som musiker med bandprofil kan jeg informere mine følgere om: Nye konserter o Som bruker kan jeg se et band sin profil o Som bruker skal jeg få notifikasjon når et band i min bandliste legger ut en ny konsert Konsertfunksjonalitet 83 o o o o o o o o o o o o Som bruker får jeg anbefalinger av konserter basert på mitt satte område og foretrukne sjangre Som bruker kan jeg legge til en konsert til min konsertliste Som bruker kan jeg fjerne en konsert fra min konsertliste Som bruker kan jeg se min konsertliste Som bruker kan jeg sende mine venner invitasjon til en konsert Som bruker kan jeg godta eller avslå konsertinvitasjoner fra venner Som musiker med bandprofil kan jeg opprette nye konserter Som musiker som kan opprette en konsert kan jeg sette og redigere følgende informasjon om konserten: Tittel på konserten Bandnavn Dato og klokkeslett Navn på konsertlokalet Adresse til konsertlokalet Bilde Som bruker kan jeg se en «konsertplakat» Som bruker kan jeg se hvor mange av mine venner som skal på en gitt konsert Som bruker kan jeg se hvem av mine venner som skal på en gitt konsert Som bruker kan jeg søke på en dato og få opp konserter på denne datoen 84 3. 3.1 Elevator pitch To musicians If you feel like your music won’t get heard because of the bigger bands and artists, this is for you. We want to make a no fuss music app where you can let people know of your concerts and new music without it drowning in spam from other bands' shameless self-promotion. This app doesn’t care how many followers you have, or what people follow you; this is all about music. Let people in your area know you exist, what you sound like and when your next concert is. That’s it; you’ll have a real chance of being heard. 3.2 To the music enthusiasts I have a hard time keeping track of local musicians. Especially in Oslo, this seems like an impossible task. Wouldn’t it be great to have an easy way of doing this, connect with your friends and find concerts to attend together? We are making an app which will give you suggestions for underground bands and concerts in your area. Find a concert for Friday night, or check out where your friends are going and join them! No spammy invites to events totally uninteresting to you, or unnecessary promotion from bands. In short: no fuss, just music. 3.3 To investors There are many music apps out there, music streaming apps, music discovery apps, concert tracking apps, and they all have the same flaw; they don’t focus on the local music scene. Our app’s head cornerstone is the love for local music and underground scenes, and our aim is to make those scenes available for more people. Users will get suggestions for bands and concerts happenings in their area based on their taste in music. Bands can add their profiles and make themselves known, without having to fight of the jammer and fuss from the big names in the industry. 85 4. Brukertester Tabell over temaene vi undersøkte underveis, og spørsmålene vi stilte 86 5. Prosjektskisse Oslo, 4. desember 2014 Prosjektskisse for hovedprosjekt, dataingeniørfag og informasjonsteknologi ved HiOA våren 2015 Gruppemedlemmer: Rannveig A. Skjerve, Emilie Strand, Madeleine Rønning Oppdragsgiver: Accenture Norge Rolfsbuktveien 2, 1364 Fornebu P.O. Box 363 N-1326 Lysaker Foreløpig tittel: Sosial media app for musikere, musikkengasjerte og arrangører Beskrivelse Accenture er et av verdens ledende konsulentselskaper. De leverer tjenester innenfor rådgivning, teknologi og outsourcing. Vår oppgave vil bli gjennomført som et proof of conceptoppdrag i regi av Accenture Norge. Appen skal kunne samle musikere, musikkengasjerte og arrangører. Brukere skal kunne fylle ut profiler, og basert på profilen skal appen finne, og foreslå, andre musikere, konserter, band eller konsertarenaer som matcher med brukerens preferanser. Use cases 1. En bruker har lyst til å finne en konsert å gå på i en gitt uke, eller dato. Brukeren kan bla igjennom konserter innenfor sine sjangere og sitt område. Brukeren velger konsert og blir eventuelt sendt videre til billettbooking. 2. Et band trenger en trommeslager. Gjennom applikasjonen kan de finne trommeslagere innenfor samme sjanger og område som leter etter band. 87 3. En musiker trenger andre å spille med. Gjennom appen kan musikeren finne andre innenfor samme sjanger som spiller de instrumentene musikeren leter etter. 4. Bruker skal ha fest og ønsker å hyre et liveband. Ved å gå inn i appen og lete blant de etablerte bandene innen for en gitt sjanger, kan de finne et som passer til eventet og ta kontakt. 5. En konsertarena har en ledig kveld for et band/en musiker. Som i use caset over, kan de finne et band som passer til stedet og booke dem. 6. Bruker har funnet seg et band og de ønsker seg spillejobber. De kan lage en profil for bandet og slik gjøre seg tilgjengelig for alle som ønsker å booke. 88 6. Brukerveiledning 6.1 Login/register Når brukeren åpner appen kommer de til innloggingssiden (figur 6.1 A). (Figur 6.1 A – «login») (Figur 6.1 B – «Register») Hvis de allerede har en brukerprofil, kan de logge inn med den. Om det er første gang brukeren åpner appen, må det opprettes en brukerprofil. Dette gjør de ved å trykke på «or register»7. Her må brukeren fylle inn valgfritt brukernavn, sin emailadresse og et passord (figur 5.1 B). Når brukeren trykker på «register»-knappen blir de logget inn i appen. 7 Som nevnt under teknisk beskrivelse funker ikke Facebook-innlogging for andre enn utviklerne før appen har blitt publisert. 89 6.2 Meny Hovedmenyen i appen er en navigation drawer. Denne ligger til venstre i appen og dukker opp når brukeren drar fingeren, eller swiper, helt fra venstre på skjermen og mot høyre. Denne menyen er tilgjengelig overalt bortsett fra på konsertplakat, bandprofiler og ved redigering av band. (Figur 6.2 A – «Menu») Denne menylista vil nå gjennomgås og forklares. 90 6.3 Explore bands Dette er den første siden bruker ser etter innlogging. Her dukker det opp anbefalinger av band basert på brukerens valgte område og foretrukne sjangre (figur 6.3 A). Ved å swipe nedover på listen, vil den oppdateres. Om det er første gang bruker logger inn, må preferansene settes under «settings» før anbefalingene blir skreddersydd til brukeren. (Figur 6.3 A – «Explore bands») (Figur 6.3 B – “Band profile”) Bruker kan trykke på et band for å se deres bandprofil (figur 6.3 B). Her ser man bandets navn, sjangre og posisjon, og det er linker til deres Facebookside, SoundCloudprofil og et annet nettsted bandet har valgt. Disse linkene vil åpnes ekstern når de trykkes på, og hvis brukeren har SoundCloud- eller Facebook-appen på sin mobil vil linkene åpnes i disse. Hvis brukeren er interessert i bandet, vil knappen «add to your list» øverst til høyre legge til bandet i brukerens bandliste (figur 6.5 B). Når knappen blir trykket på, endres den til å si «remove from list» og hjertet endrer farge (figur 6.3 C). Ved å trykke på denne fjernes bandet fra brukerens liste. Det kommer en melding som bekrefter at bandet er lagt til eller fjernet. (Figur 6.3 C – “Remove from list”) 91 6.4 Explore concerts Denne siden er tilsvarende «explore bands» for konserter. Her dukker det opp anbefalinger av konserter basert på brukerens valgte område og foretrukne sjangre (figur 6.4 A). Ved å swipe nedover vil listen oppdateres. Om brukeren ikke har satt preferansene sine, må dette gjøres under «settings» før anbefalingene blir skreddersydd til brukeren. (Figur 6.4 A – «Explore concerts») (Figur 6.4 B – “Concert poster”) Bruker kan trykke på en konsert for å se konsertplakaten med all informasjon (figur 6.4 B). På konsertplakaten vises tittelen på konserten, bandet som holder konserten, dato, klokkeslett og sted. Brukeren vil også se hvor mange venner som skal på konserten. Brukeren kan trykke på knappen «add to concert list» for å legge konserten inn i konsertlisten sin. Da vil knappen endres (figur 6.4 C). Konserten fjernes fra listen ved at å trykke på knappen igjen. Brukeren får en melding når konserten har blitt lagt inn eller fjernet fra listen. (Figur 6.4 C – “Remove from list”) 92 Bruker har også mulighet til å invitere sine venner til en konsert. Ved å trykke på konvolutten nederst til høyre vil brukeren få opp en liste over sine venner. (Figur 6.4 D – «Invite friends») Deretter kan brukeren velge ønsket venn og bekrefte sendelsen, og vennen vil motta invitasjonen i sin notifikasjonsliste. Applikasjonen sier fra når invitasjonen er sendt. 6.5 Concert list & Band list Disse listene inneholder konserter og band som brukeren selv har lagt dit. Her kan brukeren trykke på et band eller en konsert og få opp profilene på samme måte som i Explore-sidene. (Figur 6.5 A – «Concert list») (Figur 6.5 B – «Band list») 93 Øverst til høyre i listene er det forstørrelsesglass som er søkeikon. Når brukeren trykker på dette vil det dukke opp et søkefelt hvor brukeren kan søke etter konserter hvis de er inne i konsertlista, og band inne i bandlista. Etter hvert som brukeren skriver vil søkeresultatene oppdatere seg og alle konserttitler eller bandnavn som inneholder søkefrasen vil vises (figur 6.5 C). Slik kan dette feltet brukes til å finne en spesiell konsert eller et band, men også til å finne tilfeldige nye band eller konserter. Brukeren kan trykke på et resultat for å få opp profilen. (Figur 6.5 C – «Søk inne i bandliste der en bruker har søkt på frasen band») 94 6.6 Your friends Dette menyvalget viser listen over brukerens venner (figur 6.6 A). Når brukeren trykker på en venn vil de få opp profilen (figur 6.6 B). På brukerprofilen får brukeren se de siste konsertene vennen har lagt til i sin konsertliste. På denne måten kan brukere lett finne ut hvor vennene skal, og møte dem på konsert. (Figur 6.6 A – «Vennelisten») (Figur 6.6 B – «Venneprofil») Øverst til høyre i vennelisten har brukeren mulighet til å søke etter nye venner. For å legge til noen, må brukeren kjenne til vennens brukernavn. Hvis brukeren skriver inn noe som ikke er et brukernavn, vil det ikke gå an å legge dem til (figur 6.6 C). Hvis det derimot er et brukernavn, vil det dukke opp et hjertesymbol ved siden av navnet (figur 6.6 D). (Figur 6.6 C – «Ingen ved dette navnet») (Figur 6.6 D – «Funnet venn») 95 Brukeren kan legge til denne personen som venn ved å trykke på hjertet. Hjertet vil bli rødt (figur 6.7 E), og en melding vil fortelle at venneforespørselen ble sendt (figur 6.7 F). Hvis personen og brukeren er venner før brukeren søker, vil hjertet være rødt når det dukker opp i søkeresultatet. Bruker kan fjerne personen som venn ved å trykke på hjertet igjen. (Figur 6.7 E – «Venn lagt til») 6.7 (Figur 6.7 F – «Bekreftelse på at forespørsel ble sendt») Your bands Her kan man opprette band, redigere sine band og opprette konserter (Figur 6.7 A). (Figur 6.7 A – «Your bands») (Figur 6.7 B – «Opprett band») For å opprette band kan brukeren trykke på plussknappen øverst til høyre. Dette vil enkelt la brukeren opprette et band ved å kun skrive inn bandnavnet og trykke på knappen (Figur 6.7 B). Det nye bandet vil da dukke opp i listen over brukerens band. Ved å trykke på et band får man opp informasjonen om bandet på den nedre halvdelen av siden (Figur 6.7 C). 96 (Figur 6.7 C – «Ingen info ligger inne enda!») (Figur 6.7 D – «Edit band») Edit band profile For å redigere informasjonen om bandet eller legge til informasjon på nye band må brukeren trykke på «Edit profile». Brukeren blir da tatt til en ny side for redigering (Figur 6.7 D). Endre bandnavn: Brukeren kan gjøre endringene i tekstboksen øverst, og slik endre bandnavn. Endre bakgrunnsbilde: Når brukeren trykker på det øverste symbolet åpnes galleriet på mobilen til brukeren. Når et bilde er valgt vil det settes som bakgrunn. Det kommer en melding som bekrefter endringen når den er gjennomført (Figur 6.7 E). Endre posisjon: Ikon nummer to endrer bandets område. Dette er hvor bandet holder til, og det vil la brukere i nærheten finne dem i sine anbefalinger. Ved et trykk på knappen dukker det opp en tekstboks. Når brukeren begynner å skrive inn vil det dukke opp forslag basert på søkefrasen (Figur 6.7 F). Når det ønskede stedet dukker opp i listen, kan brukeren klikke på dette for å velge det. Det kommer en melding som bekrefter endringen når den er gjennomført. 97 (Figur 6.7 E – «Bakgrunnsbilde valgt») (Figur 6.7 F – «Posisjonsvelger») Endre linker: Den tredje knappen lar brukeren redigere bandets linker (figur 6.7 G). Bruker får mulighet til å sette inn link til bandets Facebookside, deres SoundCloud-profil, og en hvilken som helst annen nettside. Det kommer en melding som bekrefter endringen når den er gjennomført. Endre sjangre: Den siste knappen lar brukeren sette og endre bandets sjangre (figur 6.7 H). Ved å trykke på sjangrene sine til venstre, vil de fjernes og dukke opp i listen over tilgjengelige sjangre til høyre. For å legge til flere sjangre må brukeren trykke på en av disse til høyre som har et pluss. Når brukeren er ferdig med endringene, vil den bekreftende knappen som dukker opp lagre det. Det kommer en melding som bekrefter endringen når den er gjennomført. Deretter kan bruker gå tilbake til «Your bands» og se endringene som ble gjort på bandet (figur 6.7 I). 98 (Figur 6.7 G – «Endre bandlinker») (Figur 6.7 H – «Endre sjangre») (Figur 6.7 I – «Endringer er lagret») Add concert Når brukeren velger et band under «Your bands» og så trykker på «Add concert» vil en side for oppretting av konserter dukke opp. Her vil allerede bandnavnet være fylt ut, samt bakgrunnsbildet satt lik bandets bilde. Hvis bandet ikke har noe bandbilde, vil bakgrunnsbildet bli et standard bilde. Brukeren kan legge inn en tittel på konserten, sette dato og tid, samt velge stedet med samme posisjonsvelger som på «edit profile». Så er det bare å trykke på «post concert»-knappen, og konserten vil bli publisert. Brukeren får informasjon når lagringen av konserten er gjennomført. (Figur 6.7 J – «Add concert») 99 6.8 Settings Dette er siden der brukeren kan endre informasjon om seg selv. (Figur 6.8 A – «Settings») Endre profilbilde: Ved å trykke på «change profile picture» får brukeren opp sitt galleri på mobilen, og kan velge et bilde. Det kommer en melding som bekrefter endringen når den er gjennomført. (Figur 6.8 B – «Det vises at applikasjonen jobber med å lagre bildet gjennom en «loading circle») Endre posisjon: Posisjonen til bruker har standardverdien «Oslo Sentralstasjon». For å gjøre endring må bruker trykke på den. Da dukker det opp en posisjonsvelger. (Figur 6.8 D – «valgt posisjon») (Figur 6.8 C – «Posisjonsvelger») (Figur 6.8 E – «Bekreftende melding») Ved å skrive inn stedet brukeren bor eller vil finne band og konserter, vil det for hvert nye tegn dukke opp nye forslag (Figur 6.8 C). Når det ønskelige alternativet dukker opp, vil brukeren kunne trykke på det. For å lagre endringene må brukeren trykke på den bekreftende knappen (Figur 6.8 D). Det kommer en melding som bekrefter endringen når den er gjennomført (Figur 6.8 E). 100 Endre radius: Her setter brukeren størrelsen på sitt lokale område. Det er kun innenfor dette området at brukeren får anbefalinger av band og konserter. Radiusen er rundt posisjonen brukeren har satt. Brukeren velger radius ved å dra på sirkelen på stripa. Det kommer en melding som bekrefter endringen når den er gjennomført. Endre sjangre: Brukeren kan her velge sine foretrukne sjangre. Brukerens valgte sjangre står i listen til venstre, og resten av de mulige valgene til høyre. For å legge til flere sjangre trykker man på sjangrene man vil ha, og på samme måte fjerner man sjangre man ikke vil ha. Når brukeren er ferdig må endringene lagres ved å trykke på knappen nederst (figur 6.8 F)t. Det kommer en melding som bekrefter endringen når den er gjennomført. (Figur 6.8 F – «Sjangervelger») 6.9 About Her står det kort om appen. 6.10 Log off Dette valget logger deg ut av appen. 101 6.11 Notifications Man kommer til denne siden ved å trykke på bjelleikonet øverst til høyre i appen. Denne inneholder en liste over venneforespørsler og konsertinvitasjoner brukeren har sendt og mottatt. Nye, usette notifikasjoner vil ha en mørkere bakgrunn enn resten. (Figur 6.11 A – «Notifications») Når det kommer inn en ny notifikasjon blir brukeren varslet ved at bjelleikonet blir rødt. (Figur 6.11 B – «Bjellen er rød = nye notifikasjoner») Venneforespørsler Når en bruker sender en venneforespørsel, har mottakeren to valg; godta eller avslå. Hvis mottakeren avslår vil ikke avsender få noen informasjon om det. Hvis mottakeren derimot godtar vil avsenderen få en notifikasjon om at brukerne nå har blitt venner (figur 6.11 C). 102 (Figur 6.11 C – «Venneforespørsel godtatt») Når en bruker mottar en venneforespørsel ser den slik ut: (Figur 6.11 D – «Venneforespørsel mottatt») Hvis brukeren trykker «decline» vil notifikasjonen bli borte, og ikke noe mer skje. Hvis brukeren trykker på «accept» vil notifikasjonen endre seg og fortelle at de to brukerne har blitt venner. Brukerne vil nå havne i hverandres venneliste. (Figur 6.11 E – «Brukeren har godtatt en venneforespørsel») Konsertinvitasjoner Når en konsertinvitasjon blir sendt, vil mottakeren ha de samme valgene som for venneforespørsler; godta eller avslå. Hvis brukeren godtar vil begge parter få en notifikasjon som forteller at invitasjonen ble godtatt, og konserten havner i mottakerens konsertliste. (Figur 6.11 F – «Konsertinvitasjon mottatt») (Figur 6.11 G – «Konsertinvitasjon godtatt») 103 7. HTTP API References Band GET api/Band/Random/{userid} GET api/Band/IsAdded/{userid} Returnerer en tilfeldig generert liste av band som passer til brukers preferanser Returnerer hvorvidt et band er i en brukers liste eller ikke GET api/Band/Query/{query} Returnerer en liste av band som matcher tekststrengen {query} GET api/Band/GetUsersList/{id} Returnerer brukers bandliste GET api/Band/Get/{id} Returnerer band med id {id} GET api/Band/GetProfiles/{userId} Returnerer bandene bruker har opprettet GET api/Band/GetAllGenres/{id} Returnerer en liste med alle sjangre og informasjon om hvilke bandet har i sin liste Returnerer hvorvidt et band er lagt til i en brukers liste eller ikke GET api/Band/IsAdded/{userId},{bandId} POST api/Band/Add/{name},{userId} Legg til band POST api/Band/updateName/{name},{bandId} Oppdater bandnavn POST api/Band/UpdateLocation/ Oppdater bandets posisjon POST api/Band/UpdateWwwLink/ Oppdater link til bandets webside POST api/Band/UpdateFbLink/ Oppdater bandets Facebook link POST api/Band/UpdateScLink/ Oppdater bandets Soundcloud link POST api/Band/ChangePic/{bandid} Oppdater bandets bilde POST "api/Band/UpdateGenres" Oppdater bandets sjangre POST api/Band/AddToUserList/{userid},{bandid},{ok} Legg til, eller ta bort band fra bruksers liste 104 Concert GET api/Concert/GetRandom/{userid} GET api/Concert/Get/{id} GET api/Concert/Query/{query} Returnerer en tilfeldig generert liste av konserter som passer til brukers preferanser Returnerer et konsertobjekt med concertid={id} Returnerer en liste av band som matcher tekststrengen {query} GET api/Concert/GetUsersList/{userid} Returnerer brukerens konsertliste GET api/Concert/ GetFriendsAttendanceNumber /{concertId},{userId} GET "api/Concert/GetAttendingFriends/{concertId},{ userId}" Returnerer antall venner av bruker som har konserten i sin liste POST api/Concert/AddToUserList/{concertId},{userId} ,{ok} POST api/Concert/SendInvitation/{from},{to},{concerti d} Legg til/fjern konserter fra en brukers liste POST api/Concert/AcceptInvitation/{id},{ok} Aksepter invitasjon til konsert fra en av brukers venner Returnerer en liste med venner av bruker som har konserten i sin liste Send invitasjon til konsert til en av brukers venner Genre GET api/User/GetAll/{id} Returnerer alle sjangre fra server Friends GET api/Friends/GetList/{userid} GET api/Friends/Query/{name},{userid} Returnerer en liste over brukerens venenr Returnerer et venneobjekt om det finnes en bruker hvis {name} matcher eksakt med brukerens brukernavn POST api/Friends/SendRequest/{userId},{friendId} POST api/Friends/Respond/{requestId},{ok} POST api/Friends/Remove/{userid},{friendId} Send venneforespørsel Svar på venneforespørsel Fjern venn fra brukers venneliste 105 User GET api/User/Get/{userid} GET api/User/CheckName/{name} GET api/User/CheckEmail/{email} GET api/User/GetAllGenres/{id} GET api/User/GetNotifications/{id} POST api/User/ChangePic/{userid} POST api/User/ChangeRadius/{radius},{userId} POST api/User/RegisterFacebook/{uid},{profilename}, {path} POST api/User/Login/{pass},{email} POST api/User/Register POST api/User/UpdateGenres POST api/User/UpdateLocation Returnerer en en bruker Returnerer hvorvidt {name} finnes som et brukernavn i databasen Returnerer hvorvidt {email} finnes som en brukers email i databasen Returnerer en liste med alle sjangre og informasjon om hvilke bruker har i sin liste Returnerer en liste med alle notifikasjonene til en bruker Oppdaterer brukers bilde Oppdaterer brukers radius Registrerer bruker med Facebookkonto Logg inn bruker Registrer ny bruker Oppdaterer brukers sjangre Oppdaterer brukers posisjon 106 8. Klasseoversikt – applikasjon (Figur 8 A – «Skjermbilde fra Android Studio, mappeoversikt») Adapter Klassene i denne mappen håndterer listene. Hvordan listene vises, hva slags layout som vises, hva som skjer når man klikker på listene og hvilken informasjon som blir satt inn hvor. Klasse MyAdminAdapter.java MyConcertAdapter.java MyExploreBandAdapter.java MyExploreConcertAdapter.java MyFriendsAdapter.java MyNotificationsAdapter.java Forklaring Adapter som tar for seg håndtering av bandene som en bruker administrerer Adapter som tar for seg håndtering av konsertene som en bruker følger Adapter som tar for seg håndtering av listen der tilfeldige band vises Adapter som tar for seg håndtering av listen der tilfeldige konserter vises Adapter som tar for seg håndtering av listen av venner som en bruker har Adapter som tar for seg håndtering av listen der notifikasjoner til en bruker vises 107 Band Alle View klasser for Band BandActivityList.java Fragment som viser listene med band som en bruker følger eller søker etter. BandActivity.java BandAdminFragment.java Aktivitet som viser en bandprofil Fragment med liste over brukers bandprofiler, og informasjon om disse Fragment som viser bandinfo. Brukes i BandActivity. Fragment som viser en oppsummering av informasjon om bandet. Brukes i BandAdminFragment. Aktivitet for redigering av bandprofiler DialogFragment for redigering av bandlinker. Brukes i EditBandActivity BandContainerFragment.java BandSummaryFragment.java EditBandActivity.java EditBandLinksFragment.java Concert Alle View klasser for Concert ConcertActivity.java ConcertActivityList.java CreateConcertActivity.java Aktivitet som viser en konsertprofil; plakaten til en konsert Fragment som viser listene med konserter som en bruker følger eller søker etter Aktivitet der bruker kan opprette en konsert Explore Viewklassene for explore ExploreBands.java ExploreConcerts.java Fragment som viser en liste av tilfeldige band som er innenfor en bruker sin rekkevidde og lokasjon. Fragment som viser en liste tilfeldige konserter som er innenfor en bruker sin rekkevidde og lokasjon. Friends Viewklassene for venner FriendActivity.java FriendsFragment.java SearchActivity.java Aktivitet som viser en venn sine 5 nyeste konserter og band som de følger. Fragmentet som viser listen av personer som brukeren er venn med. Håndterer henting av en bruker sine venner og caching av dette. Aktiviteten håndterer at brukeren kan søke etter personer/venner og legge til eller fjerne disse. 108 Login Viewklassene for login LoginActivity.java RegisterActivity.java Aktivitet som lar en bruker logge seg inn med Facebook eller vanlig innlogging. Aktivitet som lar en bruker registrerer seg med vanlig mail. Main MainActivity.java NavigationDrawerFragment.java Dette er hovedaktiviteten som tar for seg navigeringen mellom de forskjellige fragmentene i navigasjonsskuffen. Fragment som viser navigasjonsskuffen/menyen Models Alle modellklasser Undermappe: Args Mappe med modeller som brukes for mapping av JSON objekt som ikke er en del av domenemodellen AddConcert.java GenreArgs.java Modell for mapping av verdier som brukes i oppretting av konserter Modell for mapping av en sjangerliste med markering av valgte sjangre Undermappe: Calculations Mappe med modeller for kalkulasjoner Distance.java Kalkulering av avstand mellom to geografiske punkter Undermappe: Comparison Mappe som tar for seg sammenligning av om objektene er like. Brukes mest i henhold til om data skal caches eller ikke. BandsComparison.java ConcertsComparison.java FriendsComparison.java ImagesComparison.java NotificationsComparison.java En klasse som sammenligner bandobjekter. En klasse som sammenligner konsertobjekter En klasse som sammenligner venneobjekter En klasse som sammenligner bildeobjekter. En klasse som sammenligner notifikasjonsobjekter. 109 Undermappe: Save Mappe som tar for seg håndtering av lagring av data. SaveData.java En klasse som tar for seg lagring av lister og lagring av bilder. Undermappe: List Mappe med modeller for lister fra server AdminList.java BandList.java ConcertList.java FriendsList.java GenreArgsList.java NotificationsList.java ImageList.java Liste med brukers Liste med Band Liste med konserter Liste med venner Liste med sjangre, med markering av valgte Liste med notifikasjoner Liste med thumbnails til Explore-sidene Undermappe: Model Modeller som speiler modellene på serverside, brukes for JSONmapping og som objekter i applikasjonen Band.java Concert.java ConcertInfo.java Friends.java Genre.java Images.java BandProfile.java Notifications.java User.java Modell for band Modell for konserter Modell med informasjon om hvem som deltar på konsert Modell for en venn Modell for sjanger Modell med informasjon som brukes på explore sidene. Modell for objekter i listen over brukers bandprofiler Modell for notifikasjoner Model for bruker Undermappe:Shape Denne mappen håndterer egenlagde figurer i bilde. RoundedImageView.java Klasse som gjør et bilde rundt. Notifications Mappe som håndterer notifikasjoner. Håndterer om brukeren har fått nye notifikasjoner og vising av disse til brukeren. MyService.java NotificationsActivity.java Service som sjekker om en bruker har nye notifikasjoner. Aktivitet som håndterer visning av alle notifikasjonene til en bruker. 110 NotificationsBroadReceiver.java SendNotifications.java BroadcastReceiver som starter SendNotificationServicen En service som starter myService vært 20 sekund. Request Mappe for alle requests mot server AddBandToListRequest.java AddConcertNotificationRequest.java AddConcertToListRequest.java AddFriendRequest.java AddNewBandRequest.java AddNewConcertRequest.java BandListRequest.java BandProfilesRequest.java BandQueryRequest.java CheckNotificationsRequest.java ConcertListRequest.java ConcertQueryRequest.java ExploreRequest.java FaceLoginRequest.java FindConcertRequest.java FindFriendRequest.java FriendListRequest.java GetAllFriendsGoingConcert.java GetBandWithIdRequest.java GetFriendsToConcert.java GetGenresRequest.java GetUserRequest.java IsBandAddedRequest.java LoginRequest.java NotificationResponseRequest.java NotificationListRequest.java ProfilePicRequest.java RadiusRequest.java Request for å legge et band inn i brukers bandliste Request for å sende en konsertinvitasjon Request for å legge en konsert inn i brukers konsertliste Request for å legge til en bruker som venn Request for å opprette et nytt band Request for å legge til en ny konsert Request for å hente ut brukerens bandliste Request for å hente ut alle brukerens opprettede band Request for å hente ut bandene som matcher med en brukers søkefrase Request for å sjekke om brukeren har nye notifikasjoner Request for å hente ut brukerens konsertliste Request for å hente ut konsertene som matcher med en brukers søkefrase Request for å hente ut bilder til Explore-sidene Request for å få logget inn med Facebook Request for å hente ut informasjon om en konsert basert på konsertID Request for å finne en bruker basert på søk under venneliste Request for å hente ut brukerens venneliste Request for å hente hvor mange av brukerens venner som skal på en gitt konsert Request for å hente ut informasjon om et band basert på bandID Request for å hente alle brukerens venner som skal på en gitt konsert Request for å hente ut alle sjangre på et band eller en bruker Request for å hente ut all informasjon om en bruker basert på brukerID Request for å sjekke om et band er lagt til i en brukers bandliste Request for å få logget inn Request for å svare på en notifikasjon Request for å hente ut en brukers notifikasjoner Request for å sette profilbilde for en bruker Request for å sette radius for en bruker 111 RegisterRequest.java UpdateBandImageRequest.java UpdateBandLinksRequest.java UpdateBandNameRequest.java UpdateGenreRequest.java UpdateLocationRequest.java Request for å registrere en bruker i appen Request for å oppdatere bilde på et band Request for å oppdatere linkene på et bands profil Request for å oppdatere navnet til et band Request for å oppdatere sjangrene til et band eller en bruker Request for å oppdatere posisjonen til et band eller en bruker Settings Viewklasse for brukerinnstillinger SettingsFragment.java Klassen som håndterer brukerinnstillingene til en bruker. Utils View og interface for valg av sjangre og posisjon ChooseGenreFragment.java GenreChooser.java LocationFragment.java LocationChoooser.java Fragment med mulighet til å velge sjangre Interface for valg av sjanger Fragment med mulighet for å velge sjanger Interface for valg av posisjon Res Mappe for alle ressurser anim drawable, drawable-hdpi, drawable-mdpi, drawable-xhdpi, drawable-xxhdpi layout menu values values-w820dp AndroidManifest.xml I denne mappen ligger slide-animasjonene I disse mappene ligger alle bilder, ikoner og knapper i ulike oppløsninger I denne mappen ligger alle layout-filene for aktiviteter, fragmenter, lister, dialoger og actionbar I denne mappen finnes layouts for menyvalg i actionbar I denne mappen ligger alle String-verdier, dimensjoner, farger og styles I denne mappen ligger dimensjoner for horisontal layout Manifestet til prosjektet 112 9. Klasseoversikt – server Controller Kontrolleren mappen håndterer alle kontrollerne. Det er metodene i disse klassene som kontaktes av applikasjonen. BandController ConcertController FriendsController GenreController UserController Controller som håndterer bandforespørsler Controller som håndterer konsertforespørsler Controller som håndterer det som omhandler venner. Controller som håndterer det som omhandler sjangere. Controller som håndterer det som omhandler user. Managers Managermappen håndterer sending av forespørsler mellom kontrollere og db klassene i tillegg til håndtering av caching og bildeopplastning i manager. BaseManager BandManager ConcertManager FriendManager GenreManager ManagerFactory UserManager En basemanager som håndterer opplastning av bilder og caching En manager som håndterer bandforespørsler. En manager som håndterer konsertforespørsler. En manager som håndterer venneforespørsler. En manager som håndterer sjanger forespørsler. Returnerer managere som kontrolleren bruker til å sende forespørselen videre. En manager som håndterer bruker forespørsler. Models Args Models Klasse som brukes til mapping av objekter som kun brukes i datautveksling mellom applikasjon og server Class Mappen som har alle klassene som skal sendes tilbake til applikasjonen. Når et objekt hentes fra databasen så BandClass ConcertClass ConcertInfoClass FriendsClass Klasse som brukes til mapping av bandobjekter Klasse som brukes til mapping av konsertobjekter Klasse som brukes til mapping av hvor mange venner som skal gå og om en spesifikk bruker skal gå. Klasse som brukes til mapping av venneobjekter 113 GenreClass ImageClass MemberClass NotificationsClass Klasse som brukes til mapping av sjangerobjekter Klasse som bruker til mapping av objektene i explore listen. Klasse som brukes til mapping av hvilke band en person er medlem i Klasse som brukes til mapping av notifikasjoner. Db Mappen som håndterer alle Db forespørslene i tillegg til domenemodellene for databasen. DbBand DbConcert DbFriends DbGenre DbUser IdentityModels Utfører db forespørsler for band Utfører db forespørsler for konserter Utfører db forespørsler for venner Utfører db forespørsler for sjanger Utfører db forespørsler for bruker Klassen som inneholder modellene som gjør opp databasen. 114