CityQuiz
Voleu fer un quiz sobre ciutats importants. L'usuari veurà una foto d'una ciutat i haurà d'endevinar quina és.
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.
- Entra a GitLab al projecte https://gitlab.com/mateuyabar/cityquizresources
- Fes un fork del projecte al teu gitlab (això et crearà una còpia del projecte).
- Clona el projecte al teu ordinador
- Afegeix el projecte inicial (del que has fet fork) com a remot anomenat upstream
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:
Navegació
Fes la navegació per a que al fer clic als botons es passi d'un fragment a l'altre.
Recordatoris
- Ho tens tot al Git?
- Has actualitzat el trello?
Mira les classes de dades
Model del domini
El paquet domain conté el model del domini
- Game
- Question
- Answer
- City
Constants
Hem definit algunes constants a dins de la classe Game per usar dins de l'aplicació
- maxQuestions = 5
- possibleAnswers = 6
- MAX_MILIS_PER_ANSWER = 5000
- MAX_SCORE = 100
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
- Game createGame(int numQuestions, int numAnswers)
- Usa les constants definides a Game pels parametres
- Game answerQuestions(Game game, int response)
- Game skipQuestion(Game game) - No la necessitem per ara
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
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
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.