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)