CityQuiz

Voleu fer un quiz sobre ciutats importants. L'usuari veurà una foto d'una ciutat i haurà d'endevinar quina és.

city QUiz

Dades

En aquest projecte només implementareu la inrefície gràfica. Tota la part d'accés a dades i logica de negoci us la dono feta.

Preparació del projecte

Per tal d'usar les classes que contenen la lògica de negoci, en comptes de crear un projecte Android, en descarregarem un de ja creatque es troba al GIT. Per poder-lo decarregar i editar primer hauràs de fer un fork (copia del projecte al teu espai de gitlab) per poder-hi treballar.

git remote add upstream git@gitlab.com:mateuyabar/cityquizresources.git

Organitza les tasques

Fes una copia del següent trello amb les tasques que hauràs d'anar fent:

https://trello.com/b/NhDdlIos/cityquiz

Ves-lo actualitzant durant el projecte.

Creació de les pantalles

Crea una Activity, amb 3 fragments (amb ViewModel) i modifica els layouts per a que s'assemblin el màxim possible als següents:

Fes la navegació per a que al fer clic als botons es passi d'un fragment a l'altre.

Recordatoris

Mira les classes de dades

Model del domini

El paquet domain conté el model del domini

Constants

Hem definit algunes constants a dins de la classe Game per usar dins de l'aplicació

Repository

Conté les classes per accedir a les funcionalitats.

RepositoriesFactory

El mètode getGameLogic ens retorna una instancia de GameLogic

GameLogic

Permet fer les diferents operacions d'un joc

AnswerCountDownTimer

No l'usarem per ara

Posa-hi la logica

Modifica l'app per a que fagi crides a les capes de repositori i el joc funcioni correctament.

Un Sol ViewModel

Per tal que tots els fragments puguin accedir al mateix Game, farem que comparteixin el mateix viewModel.
Per fer això, al fer la crida al ViewModelProvider li hem de passar l'Activity i no el Fragment.

quizViewModel = ViewModelProviders.of(getActivity()).get(QuizViewModel.class);

Diagrama d'ajuda

participant StartFragment participant QuizFragment participant ResultFragment StartFragment->QuizViewModel: startQuiz() StartFragment->StartFragment: navigateToQuiz() QuizFragment->QuizViewModel: getGame() QuizViewModel-->QuizFragment: Game QuizFragment->QuizFragment: display(game) QuizFragment->QuizViewModel: answerQuestion() QuizViewModel-->QuizFragment: Game QuizFragment->QuizFragment: display(game) QuizFragment->QuizViewModel: answerQuestion(); QuizViewModel-->QuizFragment: Game Note right of QuizFragment: Quan s'acaba el joc QuizFragment->QuizFragment: navigateToGameResult() ResultFragment->QuizViewModel: getGame() QuizViewModel-->ResultFragment: Game ResultFragment->ResultFragment: display(game)

Ajuda per foto d'una ciutat

String fileName = ImagesDownloader.scapeName(cityname);
int resId = appContext.getResources().getIdentifier(fileName, "drawable", appContext.getPackageName());
view.setImageResource(resId);

LiveData

Usa LiveData per a actualitzar les vistes desde el ViewModel.

Desde el ViewModel, crea un MutableLiveData i modifica'l segons l'estat del joc. Els fragments haurien d'observar el Live data i actualitzar-se.

Diagrama d'ajuda

participant StartFragment participant QuizFragment participant ResultFragment StartFragment->QuizViewModel: getGame() QuizViewModel-->StartFragment: LiveData StartFragment->LiveData: Observe() StartFragment->QuizViewModel: startQuiz() QuizViewModel->LiveData: postValue(game) LiveData-->>StartFragment: onChanged(); StartFragment->StartFragment: navigateToQuiz() QuizFragment->QuizViewModel: getGame() QuizViewModel-->QuizFragment: LiveData QuizFragment-->LiveData: observe() LiveData-->>QuizFragment: onChanged(); QuizFragment->QuizFragment: display(game) QuizFragment->QuizViewModel: answerQuestion() QuizViewModel->LiveData: postValue(game) LiveData-->QuizFragment: onChanged(); QuizFragment->QuizFragment: display(game); QuizFragment->QuizViewModel: answerQuestion(); QuizViewModel->LiveData: postValue(game) LiveData-->QuizFragment: onChanged(); Note right of QuizFragment: Quan s'acaba el joc QuizFragment->QuizFragment: navigateToGameResult() ResultFragment->QuizViewModel: getGame() QuizViewModel-->ResultFragment: LiveData ResultFragment->LiveData: Observe() LiveData-->ResultFragment: onChanged(); ResultFragment->ResultFragment: display(game)

Test

Fes un test automàtic de la navegació del projecte.
Coprova que fent clic als diferents botons es navega correctament entre pantalles.

Extra: limit de temps

Modifica l'aplicació per a que l'usuari tingui un temps límit per respondre les preguntes.

La classe AnswerCountDownTimer t'ajudarà a controlar el temps que ha passat a cada resposta.

Extra2: millors puntuacions

Modifica l'aplicació per a que es guardi les puntuacions que aneu fent en una Base de dades (usant room) i que es mostrin en la pantalla de resultats.