Zadanie
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
- 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úť.
- 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)