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)