Hodnotenie

Celkové hodnotenie je 26 bodov, mimo 24 bodov z cvičení.

Funkčná časť:
  • Registrácia, prihlásenie, obnovenie zabudnutého hesla, zmena hesla (Fragment, DataBinding, SharedPreferences, ViewModel, LiveData) - 4x 1 bod
  • Skrolovateľný zoznam s prepojením na profil používateľa po kliknutí (využitie RecyclerView, Retrofit, ViewModel, Room, LiveData, Coroutines, Repository vzor, AuthInterceptor, TokenAuthenticator) - 5 bodov
  • Mapa s ikonami používateľov v kruhu, ktorý predstavuje môj geofence s prepojením na profil používateľa po kliknutí (využitie mapy, Retrofit, ViewModel, Room, LiveData, Coroutines, Repository vzor) /v tejto mape sa nezobrazuje kruh podľa mojej aktuálnej polohy alebo podľa odpovede zo serveru, používateľov umiestnite vo vnútri kružnice na náhodné miesta/ - 5 bodov
  • Vlastný profil, manuálne a automatické zapnutie zdieľania polohy, vytváranie Geofence okruhov pri opustení okruhu, zobrazenie môjho posledného kruhu (využitie BroadcastReceiver, Intent, Geofence, FusedLocationProvider, SharedPreferences) - 5 bodov
  • Pravidelné kontrolovanie používateľov vo svojom okolí na pozadí aspoň v hodinových intervaloch a pri opustení kruhu. Zobrazenie notifikácií o zmene používateľov /koľko je okolo, pribudlo, ubudlo/ (Worker, Notification, Retrofit, Room, Coroutines, Repository vzor, Intent) - 3 body
  • Nahratie profilovej fotky, odstránenie profilovej fotky - 1 bod
  • Využitie DataBinding a Navigation knižnice pre presun medzi fragmentmi. Celkovo 1 aktivita a viac fragmentov. - 2 body
  • Zobrazenie profilu iného používateľa - meno, fotka a posledný okruh, v ktorom bol so mnou - 1 bod

UI a UX časť:
  • Dizajn, ktorý je prívetivý a hodí sa do aplikácie bez rušivých elementov. Kvalitné UX, aplikácia nemrzne, funguje plynule, klikacie polohy sú dostatočne veľké, a používateľ vie od začiatku intuitívne používať aplikáciu. - 0.7 - 1.0
  • Dizajn, ktorý je prívetivý a hodí sa do aplikácie bez rušivých elementov. Nevenovaná pozornosť UX, aplikácia mrzne/seká, nefunguje plynule, klikacie polohy sú malé, a používateľ je už od začiatku stratený v aplikácii (nefunguje, nevie, ako má niečo urobiť,...). - 0.5 - 0.7
  • Dizajn je neprívetivý a nevhodný s rušivými elementmi (prevažne ponechané predvolené veľkosti a farby elementov a chaotické umiestnenie prvkov). Kvalitné UX, aplikácia nezmrza, funguje plynule, klikacie polohy sú dostatočne veľké, a používateľ vie od začiatku intuitívne používať aplikáciu. - 0.5 - 0.7
  • Dizajn je neprívetivý a nevhodný s rušivými elementmi (prevažne ponechané predvolené veľkosti a farby elementov a chaotické umiestnenie prvkov). Nevenovaná pozornosť UX, aplikácia mrzne/seká, nefunguje plynule, klikacie polohy sú malé, a používateľ je už od začiatku stratený v aplikácii (nefunguje, nevie, ako má niečo urobiť,...). - 0.3 - 0.5


Výsledný počet bodov z vyššie uvedených bodov sa získa nasledovne:
Celkový počet bodov = (UI a UX časť) * (Funkčná časť)

Úlohy

Aplikácia musí pred prihlásením obsahovať:
  • Obrazovku s registráciou a možnosťou prihlásenia
  • Obrazovku s prihlásením, možnosťou registrácie/zabudnutého hesla (
  • Obrazovku s obnovením zabudnutého hesla
Aplikácia musí po prihlásení obsahovať:
  • Obrazovku s vlastným profilom - Meno, fotka, zapnutie/vypnutie zaznamenávania okruhu manuálne, zapnutie/vypnutie zaznamenávania okruhu podľa časového intervalu, aktuálny okruh zobrazený na mape
  • Obrazovku iného profilu - Meno, fotka, okruh zobrazený na mape v ktorom bol videni naposledy spolu s datumom kedy ho tam bolo vidno naposledy
  • Obrazovku s nahratím/odstránením profilovej fotky
  • Obrazovku so zmenou hesla, ak používateľ vie aktuálne heslo
  • Obrazovku s mapou, na ktorej sa zobrazí marker (ako profilová fotka ak je nastavená) a okolo nej môj okruh. Následne zobrazí aj všetkých ostatných používateľov pomocou markerov (s fotkami) v mojom okruhu. Kde marker je na nahodnej pozícii v mojom okruhu. Po kliknutí na marker sa zobrazí profil používateľa. Ak mám vypnuté zaznamenávanie, tak sa nezobrazí mapa ale upozornenie, že mám vypnuté zaznamenávanie a možnosť ho zapnúť.
  • Obrazovku so skrolovateľným zoznamom všetkých ostatných používateľov v mojom okruhu, v ktorom bude meno a profilová fotka. Po kliknutí na riadok sa zobrazí profil používateľa. Ak mám vypnuté zaznamenávanie, tak sa nezobrazí zoznam ale upozornenie, že mám vypnuté zaznamenávanie a možnosť ho zapnúť.
Aplikácia musí:
  • používať Geofencing - vytvoriť okolo aktuálnej polohy okruh s definovaným polomerom, pri jeho opustení vytvoriť nový okruh s aktuálnou polohou.
  • automaticky pravidelne načítavať zo serveru ľudí v okolí, a zobrazovať notifikáciu o aktuálnych a nových ľuďoch v okolí
  • umožniť zapínať/vypínať zaznamenávanie podľa stanoveného časového intervalu (napr. od 10:00 do 17:00)
  • Používať lokálnu databázu SQL Lite
  • Používať Fragmenty, Navigation knižnicu, Intenty, PendingIntenty, ViewModel, LiveData, Picasso/Glide na zobrazenie obrázkov, Google Maps / MapBox, Repository vzor podľa prednášok, Retrofit na komunikáciu s Rest API

Hašovanie hesla

Heslo pri registrácii výrazne odporúčam odosielať už zahašované, aby ste predišli odosielaniu raw hesla, ktoré by mohlo byť odchytené. Pri prihlasovaní sa porovnáva odoslané heslo 1:1 s heslom v databáze, ktoré bolo prijaté z registrácie. Pri resetovanie zabudnuteho hesla (kedze server a appka nepouzivaju rovnake kodovanie hesla), je potrebne si poznacit ze pouzivat si vyziadal zmenu hesla, a pri dalsom prihlaseni odoslat naprv plain text heslo a nasledne umoznit pouzivatelovi ho hned zmenit. Kedy sa uz odosiela zahashovane. Pri dalsom prihlasovani sa pouziva uz zahashovane heslo.


Webservisové endpointy

Vo všetkých requestoch je nutné použiť v hlavičke atribút "x-apikey" s hodnotou API kľúču, ktorý vám príde do správy.

V geofence/* je potrebné používať O-Auth autorizáciu v hlavičke. Teda atribút "Authorization" s hodnotou "Bearer token", kde token je access token.

Access token má časovú platnosť, po ktorej expiruje. Potom musíte získať nový pomocou refresh tokenu.

Exspiracia access tokenu bola zmenena na dobu 5 minut, aby ste si vedeli jednoduchsie otestovat aj ci sa vam uspesne obnovuje access token. Nasledne neskor bude nastavena na dlhsiu dobu, cize nespoliehajte sa v kode na presnu dobu exspiracie.

Ziadat o resetovanie zabudnutého hesla je mozne 1x za 5 minut. Kod pre resetovanie hesla v emaile exspiruje po 10 minutach.


### Registracia, ak uz zadany username existuje odpoved je {"uid":-1,"access":"","refresh":""}, 
### ak email existuje {"uid":-2,"access":"","refresh":""}. Vtedy treba upozornit pouzivatela, ze si ma vybrat ine pouzivatelske meno/email.
### Po registracii, treba kliknut na link v emaile, ktory pride na danu adresu. -- Bude dorobene, zatial bez overenia.

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",
  "email": "email"
}

### Ocakavana odpoved

{"uid":"id pouzivatela","access":"access token","refresh":"refresh token"}


### Prihlasenie, ak zadane meno neexistuje alebo heslo nie je spravne vrati {"uid":-1,"access":"","refresh":""} . 
### Treba upozornit pouzivatela, ze meno alebo heslo je nespravne. Ako hodnotu "name" je mozne pouzit name aj email z registracie.

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"
}

### Ocakavana odpoved

{"uid":"id pouzivatela","access":"access token","refresh":"refresh token"}

### Ziskanie profilu pouzivatela

GET https://zadanie.mpage.sk/user/get.php?id=[id pouzivatela]
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer ....
x-apikey: ...


### Ocakavana odpoved

{"id":"id pouzivatela","name":"name","photo": "photo path without prefix, i.e. photo/1.jpeg  prefix is https://upload.mcomputing.eu/"}


### Obnovenie zabudnuteho hesla -  po uspesnom odoslani, by mal prist email na dany email s odkazom, ktory pouzivatel otvori a zmeni si heslo v prehliadaci.
POST https://zadanie.mpage.sk/user/reset.php
x-apikey: ...

{
"email": "email pouzivatela pri registracii"
}

### Ocakavana odpoved
HTTP CODE 200:  {"status":"success"}   - uspesna, email bol odoslany

HTTP CODE 500:  {"status":"failure", "message":"text hlasky"}  - neuspesne, popis chyby moze byt v hlaske 


### Zmena hesla  - ak je pouzivatel prihlaseny a vie svoje heslo


POST https://zadanie.mpage.sk/user/password.php
x-apikey: ...
Authorization: Bearer ..

{
"old_password": "aktualne heslo",
"new_password": "nove heslo"
}

### Ocakavana odpoved

{"status":"success"}

### Nahratie profilovej fotky -  !!!!!!! POZOR - upload.mcomputing.eu  a nie zadanie.mpage.sk ako pri inych requestoch !! 
### odosielate fotku JPG alebo JPEG ako form data, kde je jedna hodnota "image" s profilovou fotkou.

POST https://upload.mcomputing.eu/user/photo.php
Authorization: Bearer ...
x-apikey: ...
Content-Type: multipart/form-data; boundary=WebAppBoundary

--WebAppBoundary
Content-Disposition: form-data; name="image"; filename="photo.jpg"
Content-Type: image/jpg

< ./mojafotka.jpg
--WebAppBoundary--

### Ocakavana odpoved

{"id":5,"name":"a","photo":"photos/u-5.jpeg"}

### Odstranenie profilovej fotky 

DELETE https://upload.mcomputing.eu/user/photo.php
Authorization: Bearer ...
x-apikey: ...

### Ocakavana odpoved

{"id":5,"name":"a","photo":""}



### 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": ""
}

### Ocakavana odpoved

{"uid":"id pouzivatela","access":"access token","refresh":"refresh token"}

### Ziskanie okruhov pouzivatelov

GET https://zadanie.mpage.sk/geofence/list.php
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer ....
x-apikey: ...


### Ocakavana odpoved ak mam zapnute zdielanie, tzn. aktivny geofence

{
	"me": {"uid":"5","lat":"48.1555486000","lon":"17.0513821000","radius":"100"},
	"list":[
		{"uid":"5","radius":"100", "updated":"2023-10-28 16:24:34","name":"username","photo":"photo path without prefix, i.e. photo/1.jpeg  prefix is https://upload.mcomputing.eu/"}
	]
}

### Ocakavana odpoved ak nemam zapnute zdielanie, tzn. vypnuty geofence

{	
	"list":[]
}


### Ziskanie okruhov pouzivatelov - predchadzajuca alternativa

GET https://zadanie.mpage.sk/geofence/olist.php
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer ....
x-apikey: ...


### Ocakavana odpoved ak mam zapnute zdielanie, tzn. aktivny geofence

[
	{"uid":"5","radius":"100", "updated":"2023-10-28 16:24:34","name":"username","photo":"photo path without prefix, i.e. photo/1.jpeg  prefix is https://upload.mcomputing.eu/"}
]


### Ocakavana odpoved ak nemam zapnute zdielanie, tzn. vypnuty geofence

[]


### Zapisanie svojho okruhu,  lat,lon su suradnice stredu okruhu v desatinnom formate, a radius je polomer v metroch.

POST https://zadanie.mpage.sk/geofence/update.php
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer ....
x-apikey: ...

{
  "lat": 3.3,
  "lon": 33.3
  "radius": 100
}


### Ocakavana odpoved

{"success":true}

### Odstranenie svojej polohy, po vypnuti geofencu

DELETE https://zadanie.mpage.sk/geofence/update.php
Accept: application/json
Cache-Control: no-cache
Content-Type: application/json
Authorization: Bearer ....
x-apikey: ...


### Ocakavana odpoved

{"success":true}

Mozne status kody z webservisu:

500 - databazova chyba
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. Povolene len Authorization/authorization a x-apikey 
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)