Zadanie
Ulohy
Prezentacia po 1. kole odovzdavania: prezentacia .pdf
- Aplikacia musi mat minimalne obrazovky:
- Registracia,
- Prihlasenie,
- Oznacenie sa do podniku,
- Zobrazenie podnikov s pouzivatelmi (len tie, v ktorych je aspon jeden clovek aktualne),
- Zobrazenie detailu podniku.
- Pridanie priatela pomocou pouzivtelskeho mena
- Zobrazenie priatelov a ich informacii
- V kode aplikacie musia byt pouzite:
- Fragmenty,
- Navigation kniznica pre navigaciu medzi Fragmentami
- RecyclerView, ViewModel, LiveData, DataBinding, Room, Coroutines, Retrofit, Gson/Moshi
- Ziskanie aktualnej GPS polohy - FusedLocationProviderClient.getCurrentLocation() pre zapisanie sa do najblizsieho podniku
- Pouzitie Geofence na okruh 300 metrov okolo zistenej polohy. Vyuzitie eventu EXIT - pri jeho odchyteni sa vymazat z podniku
- Pouzitie OverPass API na ziskanie podnikov v okoli svojej polohy
- Pouzitie LottieAnimacie na ukazku priebehu nacitania podnikov v okoli, ziskania GPS polohy, najdenie najblizsieho podniku a zapisania sa do podniku.
- Obrazovka Registracia musi:
- obsahovat vstupne policka pre pouzivatelske meno, heslo, heslo zopakovane, tlacidlo na registraciu, tlacidlo na prihlasenie
- po kliknuti na prihlasenie prejst na fragment prihlasenie
- po kliknuti na registraciu: 1. overit ci su policka vyplnene, 2. ci sa hesla zhoduju, 3. odoslat request na registraciu, 4. ak pride Status kod 200 - automaticky prihlasit pouzivatela, ak iny kod - vypisat chybu
- Obrazovka Prihlasenie musi:
- obsahovat vstupne policka pre pouzivatelske meno, heslo, tlacidlo na registraciu, tlacidlo na prihlasenie
- po kliknuti na registraciu prejst na fragment registracia
- po kliknuti na prihlasenie: 1. overit ci su policka vyplnene, 2. odoslat request na prihlasenie (zapamatat si access token a refresh token), 3. ak pride Status kod 200 - automaticky prihlasit pouzivatela, ak iny kod - vypisat chybu
- Obrazovka Oznacenie sa do podniku musi:
- obsahovat klikatelnu animaciu Lottie - tlacidlo "oznacit"
- animacia moze zobrazovat priebeh jednotlivych ukonov v tejto obrazovke
- musi zistit aktualnu GPS polohu
- nacitat podniky z Overpass API podla zistenej polohy do 500 metrov
- zobrazit nacitane podniky s vypocitanou vzdialenostou (ktore maju vyplneny nazov podniku), podla vzdialenosti vzostupne. po kliknuti na podnik zo zoznamu ho zvolit
- najst najblizsi podnik podla polohy, a predvolene ho zvolit
- zretelne oznacit zvoleny podnik pouzivatelovi
- stlacenim tlacidla oznacit
- odoslat request, ktory priradi pouzivatela do zvoleneho podniku.
- vytvori sa Geofence okolo jeho zistenej polohy s okruhom 300 metrov a zaregistrovanim na udalost EXIT
- pri odchyteni udalosti EXIT, sa odosle request, ktory ho z podniku automaticky vymaze.
- Obrazovka Zobrazenie podnikov musi:
- obsahovat zoznam podnikov, v ktorych je aspon jeden pouzivatel aktualne zapisany ( nacitanie cez request )
- pouzit RecyclerView na zobrazenie zoznamu
- kazdy riadok obsahovat aspon nazov podniku a pocet ludi
- moznost zoradit podla nazvu podniku, poctu ludi, vzdialenosti od podniku
- umoznit manualne znovu nacitat zoznam z internetu
- po kliknuti na riadok otvorit detail daneho podniku
- tlacidlo na pridanie sa do podniku - otvori Oznacenie sa do podniku
- Obrazovka Zobrazenie detailu podniku musi:
- obsahovat nazov podniku, pocet aktualne zapisanych pouzivatelov v nom
- tlacidlo, na ktore ked klikne tak sa otvori mapa s oznacenim GPS miesta podniku
- ine dodatocne informacie ak su k dispozicii
- Obrazovka Pridanie priatela pomocou pouzivtelskeho mena musi:
- obsahovat vstupne policko na zadanie pouzivatelskeho mena pridavaneho priatela a tlacidla na pridanie.
- Priatelstvo nie je symetricke, preto sa nepotvrdzuje. Ak si A prida priatela B, neznamena ze B ma priatela A.
- Priatelov, ktorich si pouzivatel pridal, uvidia nazov podniku, v ktorom sa nachadzaju
- Obrazovka Zoznam priatelov a ich informacii musi:
- obsahovat zoznam svojich priatelov, a tiez informaciu v akom podniku sa aktualne nachadzaju (ak nie su v ziadnom podniku, tak budu v zozname ale nazov podniku bude prazdny retazec). Na zoznam vyuzite RecyclerView.
- po kliknuti na riadok s priatelom, sa otvori obrazovka Zobrazenie detailu podniku.
- Aplikacie musi
- pamatat ci bol pouzivatel prihlaseni pred zatvorenim aplikacie.
- ak bol prihlaseny uvodna obrazovka je zoznam podnikov
- ak nebol prihlaseny uvodna obrazovka je prihlasenie
- po vyprsani access tokenu, automaticky pouzit refresh token na ziskanie noveho access tokenu
- Ako bonus mozete pridat do detailu podniku ci zoznamu podnikov pridat aj mapu (MapBox, Google Maps)
- Odosielanie hesla sa odporuca zahashovane, kedze na webservise sa uklada a porovnava 1:1.
Hashovanie hesla
String passwordToHash = "password"; String salt = getSalt(); String generatedPassword = null; try { MessageDigest md = MessageDigest.getInstance("SHA-512"); md.update(salt.getBytes()); byte[] bytes = md.digest(passwordToHash.getBytes()); StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16) .substring(1)); } generatedPassword = sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } System.out.println(generatedPassword);
Webservis endpointy
Za x-apikey nasleduje API kluc dostali ste ho v sprave v AIS. Za Bearer ide access token, ziskany v odpovedi user/login.php alebo user/create.php
API KEY je odlisny ako pre zadanie cast 4 !! Prisiel vam spravou do AIS. Atributy v hlavickach su case-sensitive.
### Ziskanie podnikov v okoli 500 metrov od zadanej suradnice : 48.143483, 17.108513 GET https://overpass-api.de/api/interpreter?data=[out:json];node(around:250,48.143483, 17.108513);(node(around:250)["amenity"~"^pub$|^bar$|^restaurant$|^cafe$|^fast_food$|^stripclub$|^nightclub$"];);out body;>;out skel; ### Ziskanie podniku podla ID 10073969719 GET https://overpass-api.de/api/interpreter?data=[out:json];node(10073969719);out body;>;out skel; ### Registracia, ak uz zadany username existuje odpoved je {"uid":-1,"access":"","refresh":""}. Vtedy treba upozornit pouzivatela, ze si ma vybrat ine pouzivatelske meno. POST https://zadanie.mpage.sk/user/create.php Accept: application/json Cache-Control: no-cache Content-Type: application/json x-apikey: ... { "name": "username", "password": "heslo" } ### Prihlasenie, ak zadane meno neexistuje alebo heslo nie je spravne vrati {"uid":-1,"access":"","refresh":""} . Treba upozornit pouzivatela, ze meno alebo heslo je nespravne. POST https://zadanie.mpage.sk/user/login.php Accept: application/json Cache-Control: no-cache Content-Type: application/json x-apikey: ... { "name": "username", "password": "heslo" } ### Obnovenie access tokenu, pomocou refresh tokenu POST https://zadanie.mpage.sk/user/refresh.php Accept: application/json Cache-Control: no-cache Content-Type: application/json x-apikey: ... x-user: moje_id_pouzivatela { "refresh": "" } ### Ziskanie podnikov, v ktorich sa nachadza aspon jeden clovek GET https://zadanie.mpage.sk/bar/list.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer .... x-apikey: ... x-user: moje_id_pouzivatela ### Zapisanie svojej aktualnej pritomnosti v podniku POST https://zadanie.mpage.sk/bar/message.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer .... x-apikey: ... x-user: moje_id_pouzivatela { "id": " id podniku z OverPass", "name": "nazov podniku z Overpass", "type": "typ z Overpass", "lat": 3.3, "lon": 33.3 } ### Odstranenie seba z podniku ( id musi byt prazdne, ostatne name, lat, lon mozu byt lubovolne) POST https://zadanie.mpage.sk/bar/message.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer .... x-apikey: ... x-user: moje_id_pouzivatela { "id": "", "name": "", "type": "", "lat": 3.3, "lon": 33.3 } ### Pridanie priatela. Pridanie priatela (priatel = contact), ktory moze vidiet v ktorom bare som ja (ja = x-user) POST https://zadanie.mpage.sk/contact/message.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer ... x-apikey: ... x-user: moje_id_pouzivatela { "contact": "pouzivatelske meno priatela" } ### Zobrazenie mojich priatelov a nazvy barov kde sa nachadzaju. ( Ludi, ktori manualne zadali moje username. ) GET https://zadanie.mpage.sk/contact/list.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer ... x-apikey: ... x-user: moje_id_pouzivatela ### Zobrazenie pouzivatelov, ktorych som pridal aby videli, kde sa nachadzam ja. Odstranovat viem len z tohto zoznamu. GET https://zadanie.mpage.sk/contact/friends.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer .... x-apikey: .... x-user: moje_id_pouzivatela ### Vymazanie priatela. Odobratie povolenia pouzivatelovi contact vidiet v ktorom bare sa nachadzam. POST https://zadanie.mpage.sk/contact/delete.php Accept: application/json Cache-Control: no-cache Content-Type: application/json authorization: Bearer ... x-apikey: ... x-user: moje_id_pouzivatela { "contact": "pouzivatelske meno priatela" }
Mozne status kody z webservisu: 500 - databazova chyba (napr. pri pridani/odstraneni priatela ak pouzivatelske meno neexistuje) 400 - nespravny request, chyba niektory atributy v hlavicke alebo v json tele. x-apikey nie je to iste ako X-ApiKey, atributy su case-sensitive. 401 - neautorizovany request, mate zly alebo uz neplatny access token. 404 - endpoint neexistuje 200 - uspesna odpoved, v niektorych requestoch je prazdne telo (nic request nevracia)