Aplikacje mobilne

  • Wykład:
    • Czwartek, godz. 9:15 (A1-329) od 1.06.2023 sala D1-215
  • Laboratorium:
    • Poniedziałek, godz. 7:30 (D1-317.3)
    • Wtorek, godz. 7:30 (D1-317.3)
    • Środa, godz. 13:15 (D1-317.2) - dr Marcin Kik
    • Środa, godz. 15:15 (D1-317.2) - dr Marcin Kik
    • Czwartek, godz. 11:15 (D1-317.3) - dr Marcin Kik
    • Czwartek, godz. 13:15 (D1-317.3) - dr Marcin Kik
    • Piątek, godz. 7:30 (D1-317.2)
    • Piątek, godz. 11:15 (D1-317.2)

Wyniki (aktualne)

Ostatnia aktualizacja: 2023-06-28 15:27:30

Zasady zaliczenia kursu

  • Ocena z laboratorium bierze pod uwagę umiejętności nabyte w trakcie kursu oraz terminowość oddawania zadań
  • Rozwiązania zadań należy wysyłać w terminie na przydzielone konto SVN
  • Rozwiązania zadań wysłane po danym terminie, ale do 1 tygodnia liczone są maks. za połowę punktów, po terminie 1 tygodnia liczone są za ZERO punktów
  • Zadania z gwiazdką można oddawać do tygodnia po terminie SVN bez straty punktów
  • Wysłane rozwiązania, należy oddać na laboratorium, bez straty punktów na pierwszych lub drugich zajęciach po terminie SVN, na trzecich zajęciach (bez usprawiedliwień) zadania liczone są maks. za połowę punktów na czwartych zajęciach zadania liczone są za ZERO punktów (nawet zadania wysłane w terminie na SVN)

Projekt

  • Ocena z projektu wystawiona na podstawie
    • jakości rozwiązania problemu oraz przejrzystości kodu
    • znajomości (wszystkich) tematów przedstawionych na wykładzie

Ocena z list zadań

  • ocena 5.5 >=70pt
  • ocena 5.0 >=50pt <70pt
  • ocena 4.5 >=43pt <50pt
  • ocena 4.0 >=37pt <43pt
  • ocena 3.5 >=31pt <37pt
  • ocena 3.0 >=25pt <31pt

Ocena końcowa

  • Ocena końcowa = 0.5 * ocena z list zadań + 0.5 * min(5.0,ocena z projektu), przy czym obie oceny cząstkowe (listy zadań oraz projekt) muszą być co najmniej dst!

Wykłady

  1. Wykład 2.03.2023
  2. Wykład 9.03.2023
  3. Wykład 16.03.2023
  4. Wykład 23.03.2023
  5. Wykład 30.03.2023
  6. Wykład 13.04.2023
  7. Wykład 20.04.2023
  8. Wykład 27.04.2023
  9. Wykład 11.05.2023
  10. Wykład 18.05.2023
  11. Wykład 1.06.2023
  12. Wykład 15.06.2023
  13. Wykład 22.06.2023

Instrukcja wysyłania zadań z lab. w Android Studio na SVN

  • Na początek wykonaj Build -> Clean Project z Android Studio
  • Spakuj cały katalog projektu do pliku .zip, .rar, .tar.gz ... np. dla pierwszej listy będą dwa pliki l1z1.zip oraz l1z2.zip, czyli l1 - pierwsza lista oraz z1 - zadanie pierwsze itd.
  • Wyślij pliki na przydzielone konto SVN

Projekt - Aplikacja w systemie mobilnym Android

  • Od 3.04.2023, każdy wybiera projekt który będzie realizował
  • Projekt jest realizowany w grupach >=2, <=6 osobowych (czyli 2 osoby, 3 osoby, 4 osoby, 5 osób lub 6 osób)
  • Zakres projektu musi wykorzystywać w pełni materiał przedstawiony na co najmniej 5 wykładach (z wyjątkiem wykładu 1)
  • Projekt musi zostać zatwierdzony przez osobę prowadzącą laboratorium
  • Na każdym laboratorium po wybraniu projektu co najmniej jedna osoba z grupy przedstawia postępy projektu
  • Projekt należy wybrać najpóźniej do 14.04.2023 (przy zgłoszonym braku wyboru grupy nastąpi losowy przydział)
  • Do zarządzania projektem najlepiej skorzystać z github, gitlab, bitbucket, ... i proszę wysłać prowadzącemu link do projektu grupy.
  • Na realizację projektu i wysłanie na SVN (każda osoba wysyła tylko końcową wersję projektu na przydzielone konto SVN, tak każda osoba z grupy wysyła ten sam projekt na swoje konto SVN) jest czas do 28.05.2023
  • Wysłany projekt, należy oddać na laboratorium, bez straty na pierwszych lub drugich zajęciach po terminie SVN, na trzecich zajęciach i następnych maks. ocena jest obniżana o jeden stopień (czyli 3 zajęcia maks 4.0, 4 zajęcia maks 3.0, ...)
  • Przy oddawaniu projektu na laboratorium wszyscy z grupy znają cały projekt i potrafią odpowiedzieć na dowolne pytania z zakresu wykładów

Laboratorium

Lista 0 (Lab)

  1. Zainstaluj język Kotlin oraz uruchom i przeanalizuj kilka przykładów ze strony link.
    
    $ sudo pacman -S kotlin
    $ cat << EOF >hello.kt
    fun main(args: Array<String>) {
        pAplikacja do rysowania kształtów: Stwórz aplikację, która umożliwia użytkownikom rysowanie różnych kształtów, takich jak okręgi, prostokąty, trójkąty itp. Wykorzystaj komponenty Path i Canvas do rysowania kształtów na ekranie. Przy użyciu GestureDetector, umożliw użytkownikom wybieranie rodzaju kształtu, dostosowanie koloru i rozmiaru oraz przeciąganie palcem po ekranie, aby rysować wybrane kształty.rintln("Hello, World!")
    }
    EOF
    $ kotlinc hello.kt -include-runtime -d hello.jar
    $ java -jar hello.jar
    
    # uruchomienie REPL
    $ kotlinc-jvm
    Welcome to Kotlin version 1.8.10 (JRE 11.0.18+10)
    Type :help for help, :quit for quit
    >>> 2+2
    res0: kotlin.Int = 4
    >>>
    
    
  2. Zainstaluj Android Studio. Uruchom przykładowe "Hello World" w emulatorze i/lub na urządzeniu z Androidem (telefon, tablet).
  3. Zainstaluj scrcpy albo inny program do udostępniania ekranu urządzenia z Androidem. W przypadku korzystania TYLKO z emulatora pokaż okno emulatora dla wybranego urządzenia.

Lista 1 (Lab) Termin wysłania na SVN do 12.03.2023

  1. (2pt) Przepisz i uruchom prostą grę napisaną w Kotlinie na wykładzie pierwszym. Zrób dodatkowo taką samą grę w Javie.
  2. (3pt) W tym zadaniu jest duża możliwość wyboru. Proszę napisać dowolną aplikację w systemie Android w Javie i Kotlinie z następującymi ograniczeniami:
    • aplikacja zawiera co najmniej cztery widgety na ekranie co najmniej dwóch rodzajów np. TextView, EditView
    • aplikacja powinna odpowiadać na co najmniej dwa zdarzenia np. dwa przyciski
    • aplikacja powinna zmieniać dowolny aspekt wyglądu np. textview ma większe i grubsze czcionki
    • aplikacja powinna dostosowywać się do wielkość ekranu (różne telefony i rozdzielczości)
    • nie może to być aplikacja z zadania 1
    Sugestie:
    • Zgadywanie liczby. Komputer losuje liczbę np. 1 do 100, a użytkownik próbuje zgadywać liczbę z podpowiedziami komputera, czy liczba jest większa czy mniejsza od aktualnie podanej.
    • Zgadywanie słowa. Komputer podaje słowo (na początku zasłonięte), a użytkownik próbuje zgadnąć jakie to słowo w najmniejszej liczbę odsłanianych liter.
    • Papier-kamień-nożyczki. Gra z komputerem (który wybiera losowo). Śledź rozgrywkę człowieka i komputera podając kto wygrał ile partii.
    • ...

Lista 2 (Lab) Termin wysłania na SVN do 26.03.2023

Celem tej listy jest opanowanie bardziej zaawansowanych układów graficznych (niż te z poprzedniej listy) oraz wykorzystanie większej liczby widgetów oraz widoków w interfejsie graficznym użytkownika. Od tej listy wszystkie aplikacje piszemy w języku Kotlin.

  1. (4pt) Napisz klasyczną grę Saper (Minesweeper), gdzie wypełniamy siatkę 9x9 polami które na początku są zakryte następnie odkrywamy je w taki sposób aby nie natrafić na minę. Na każdym odkrytym polu dodatkowo wypisywana jest liczba odkrytych min, które stykają się z danym polem. Możemy też zabezpieczyć dane pole flagą. Jeśli gracz odkryje wszystkie pola i zaznaczy flagami wszystkie miny, to wygrywa. Wykorzystaj odpowiedni Layout do rozłożenia przycisków i zrób tak aby przyciski wypełniały odpowiednio ekran oraz czcionka była odpowiednio duża (możesz to przetestować na emulatorze dla różnych rozdzielczości ekranów).
  2. (3pt) Napisz aplikację "Wisielec", która wyświetla po kolei obrazek wisielca oraz słowo które gracz próbuje zgadnąć. Słowo wybierane jest losowo z dostępnego słownika. Oczywiście cały czas wyświetlane jest słowo z prawidłowo zgadniętymi literami np. dla słowa komputer jeśli gracz zgadł prawidłowo litery o, m i e, słowo będzie wyglądało mniej więcej tak ?om???e?. Do utworzenia obrazków wykorzystaj np. program GIMP nazwij je odpowiednio wisielec0.png, wisielec1.png i tak dalej. Do wyświetlania obrazków wykorzystaj ImageView. Do przechowywania słownika wykorzystaj plik strings.xml.
    <string-array name="words">
        <item>komputer</item>
        <item>zgadywanka</item>
        ...
    </string-array>
    
    Jak pobierać zasoby zobacz link. Słownik możesz wypełnić dowolnymi słowami np. ściągniętymi z internetu przez prosty skrypt.

Lista 3 (Lab) Termin wysłania na SVN do 16.04.2023

Uwagi: (doprecyzowujące)

  • Zadanie pierwsze liczone jest za 5pt jeśli zostanie wykonane w wersji podstawowej. Dodatkowe punkty są za pomysły rozszerzające aplikację np. wykorzystanie biblioteki ciekawie rozbudowującej aplikacje (patrz wykład 5). Proponuje zastosować kilka takich pomysłów.

  1. (5-10pt) Napisz aplikacje typu "Calendar", czyli kalendarz i listę wydarzeń. Proszę wzorować się na innych aplikacjach tego typu i zobaczyć jakie mają funkcjonalności. Tutaj naprawdę niebanalnych pomysłów jest dużo!. Minimalne wymagania to możliwość przeglądania kalendarza i dodawania wydarzeń w danym dniu (oraz usuwania). W aplikacji należy wykorzystać RecyclerView i co najmniej dwie aktywności z komunikacją przez intencje. Zrób też tak, aby aplikacja pamiętała kalendarz i listę wydarzeń po rotacji ekranu, czyli po zmianie z portrait na landscape i odwrotnie. Tutaj należy wykorzystać tylko onSaveInstanceState i onRestoreInstanceState. Uwaga: W tym zadaniu aplikacja powinna być w pełni funkcjonalna. Uwzględniana będzie też wygoda i użyteczność aplikacji.
  2. *(5pt) Wykorzystaj lokalną bazę danych do przechowywania danych aplikacji przez użycie Room'a czyli warstwę abstrakcji na SQLite.
  3. *(5pt) Zrób w aplikacji powiadomienie użytkownika, że zbliża się termin wydarzenia.

Lista 4 (Lab) Termin wysłania na SVN do 7.05.2023

Celem tej listy jest napisanie aplikacji, która ma wiele aktywności, prawidłowo obsługuje stany aplikacji onPause, onStop, itp. przechowuje dane, poprawnie wykorzystuje intencje (intent) oraz wykorzytuje fragmenty.

  1. (5pt) Napisz prostą grę w kółko i krzyżyk wykorzystującą Jetpack Compose. Aplikacja powinna mieć możliwość wyboru rozmiaru rozgrywki w zakresie co najmniej od 3x3 do 20x20. Wystarczy sama podstawowa rozgrywka między dwoma użytkownikami reguły też mogą być różne. W tym zadaniu głównym celem jest wykorzystanie Jetpacka do generowania i obsługi UI z kodu. Wykorzystaj też ViewModel do przechowywania i zarządzania danymi związanymi z interfejsem użytkownika w sposób "lifecycle-aware".
  2. (5pt) Napisz aplikacje (galeria) przechowującą zdjęcia np. ludzi, krajobrazów, zwierząt, ... i każde zdjęcie dodatkowo zawiera krótki opis. Po uruchomieniu aplikacji, na początku pokazuje ona dostępne zdjęcia. Użytkownik może wybrać dowolną pozycję, aby zobaczyć większe zdjęcie i opis. Na ekranie dodatkowo, mamy możliwość ocenienia zdjęcia przez np. "gwiazdki" (zobacz RatingBar ). Proszę pamiętać, że na tym etapie poznania Androida nie ma to być w pełni funkcjonalna aplikacja np. nie potrzeba tworzyć kont dla użytkowników lub nie potrzeba przechowywać nowych zdjęć. Aplikacja powinna natomiast obsługiwać:
    • co najmniej dwie aktywności
    • przekazywać informacje z jednej aktywności do drugiej wykorzystując intencje (tutaj proszę przemyśleć jak to zrobić, dane wysyłane w intencji mają ograniczony rozmiar)
    • druga aktywność powinna wracać informacje do pierwszej o liczbie gwiazdek, po czym w pierwszej aktywności obrazki zostają odpowiednio posortowane po liczbie gwiazdek
    • poprawnie obsługiwać cykl życia aktywności tzn. onCreate, onStart, onResume, onPause, onStop, onDestroy, ... (te które są potrzebne)
    • wykorzystywać fragmenty przy zmianie orientacji ekranu
    • zapamiętywać swój stan po zmianie orientacji ekranu
  3. *(5pt) Zmień powyższą aplikacje na "tab layout" (ViewPager2) zamiast dwóch aktywności.
  4. *(5pt) Uzupełnij poprzednie zadanie o możliwość robienia zdjęć np. z dostępnych podstawowych bibliotek i dodawania do kolekcji.

Lista 5 (Lab) Termin wysłania na SVN do 21.05.2023

Celem tej listy jest napisanie aplikacji, która umożliwia prostą animacje i na stałe przechowuje dane.

  1. (5pt) Zaprogramuj widok niestandardowy (custom view) z pełną funkcjonalnością oraz przykładami wykorzystania. Do wyboru jest okrągły pasek postępu lub animowany wykres:
    • Okrągły pasek postępu (Circular progress bar), który wyświetla okrągły pasek postępu i animuje go, gdy użytkownik zbliża się do celu.
    • Animowany wykres (Animated chart), który wyświetla wykres i animuje dane podczas ich aktualizacji
  2. (5pt) Napisz prostą wersje gry 'Space Invaders'. Celem gry jest kontrola statku kosmicznego i zestrzelenie obcych przed osiągnięciem dołu ekranu. Wykorzystaj SurfaceView lub GLSurfaceView który będzie odpowiedzialny za rysowanie gry. Gra powinna być skalowalna do rozmiarów ekranu. Wszystkie informacje o stanie rozgrywki np. logowanie gracza, tabela wyników itp. mają być przechowywane w bazie SQLite z wykorzystaniem Room.
  3. *(5pt) Dodaj do gry z zadania poprzedniego, komunikację przez sieć aby umożliwić grę dwóch użytkowników - dwa statki na dole ekranu sterowane niezależnie przez dwóch użytkowników na różnych urządzeniach (gracze widzą ten sam ekran). Do komunikacji wykorzystaj bazę czasu rzeczywistego Firebase.

Lista 6 (Lab) Termin wysłania na SVN do 4.06.2023

  1. (5pt) Celem tego zadania jest wykorzystanie bazy danych czasu rzeczywistego oraz autentykacji Firebase. Można wykorzystać je w następujących aplikacjach (jedna do wyboru):
    • Dopisz funkcjonalność "gry przez sieć" do aplikacji kółko i krzyżyk. Wystarczy tutaj klasyczna rozgrywka na planszy 3x3, czyli na początku mamy możliwość rejestracji lub jeśli mamy już konto to logowania. Po czym możemy wybrać osobę do gry (która jest też zalogowana do systemu). Następnie prowadzimy grę na zmianę przez sieć.
    • Program do rozmowy (chat) przez sieć z wykorzystaniem Firebase. Logowanie i rozmowa w czasie rzeczywistym z zalogowanymi użytkownikami.
    • Dopisz możliwość gry przez sieć do gry Pong. Logowanie, tabela wyników i oczywiście sama gra prowadzona przez dwie osoby na różnych urządzeniach.
    Logowanie należy przeprowadzić z wykorzystaniem Firebase Authentication SDK.
  2. (5pt) Napisz aplikacje wykorzystującą REST API do prostych obliczeń matematycznych Newton API. W implementacji wykorzystaj bibliotekę Retrofit. Napisz prosty interfejs do wprowadzania podstawowych funkcji np. w EditText wprowadzamy wyrażenie i na dole mamy Buttony które odpowiadają wszystkim dostępnym operacją simplify, factor, derive, ... po czym dostajemy wynik obliczeń.
    
    # Lokalna instalacja Newton API (jeśli chcemy pracować i/lub testować lokalnie)
    
    #
    # Starsza wersja
    #
    $ sudo pacman -S nodejs npm
    $ git clone https://github.com/aunyks/newton-api.git
    $ cd newton-api
    $ git checkout 7799
    $ npm install --no-audit
    $ npm run start
    
    #
    # Nowsza wersja api/v2
    #
    $ sudo pacman -S nodejs npm
    $ git clone https://github.com/aunyks/newton-api.git
    $ cd newton-api
    $ npm install
    $ export NODE_OPTIONS=--openssl-legacy-provider
    $ npm run dev
    
    # Mamy serwer na http://localhost:3000
    
    

Lista 7 (Lab) Termin wysłania na SVN i oddania do 27.06.2023

  1. (5pt) Napisz prostą aplikacje "Task-Manager", czyli listę zadań do zrobienia. Aplikacja zawiera RecyclerView z potencjalną listą zadań. Na początku lista jest pusta, ale na dole aktywności znajduje się Button (Dodaj), gdzie użytkownik może uruchomić drugą aktywność aby wprowadzić opis nowego zadania. Do przechowywania danych należy wykorzystać bibliotkę SQLDelight.
  2. (5pt) Utwórz aplikację pogodową "Weather App", która pobiera dane pogodowe z dowolnego API i zapewnia użytkownikom aktualizacje pogody w czasie rzeczywistym. Zaimplementuj usługę (service), która okresowo pobiera informacje o pogodzie i wyświetla je jako powiadomienie (notifications) dla użytkownika. Aplikacja powinna umożliwiać użytkownikom wybór preferowanej lokalizacji, a usługa powinna pobierać dane pogodowe dla tej lokalizacji w regularnych odstępach czasu. Powiadomienie powinno zawierać istotne szczegóły pogodowe, takie jak temperatura, wilgotność i krótki opis warunków pogodowych.
  3. (5pt) Napisz prostą aplikację do odtwarzania muzyki "Music Player App", która pozwala użytkownikom odtwarzać i kontrolować swoją bibliotekę muzyczną. Zaimplementuj usługę (service), która zarządza funkcjami odtwarzania w tle, nawet gdy aplikacja nie jest aktywnie uruchomiona. Aplikacja powinna mieć powiadomienie (notifications) z przyciskami odtwarzania/pauzy, które umożliwiają użytkownikom sterowanie odtwarzaniem muzyki bez otwierania aplikacji.
  4. (5pt) Wykorzystując framework Flutter napisz prostą wersję aplikacji, która umożliwia śledzenie i zarządzanie swoim planem zajęć. Aplikacja powinna umożliwiać dodawanie wydarzeń, takich jak zajęcia, egzaminy lub spotkania, do kalendarza. Wykorzystaj standardowe komponenty np. showDatePicker, showTimePicker do wyboru daty i czasu. Dane wystarczy przechowywać na liście np. List<Event> events = [], gdzie Event to np.
    
    class Event {
      final String title;
      final DateTime dateTime;
    
      Event({required this.title, required this.dateTime});
    }
    
    
    oraz można wykorzystać komponent ListView do wyświetlania listy.
  5. (5pt) Wykorzystując framework Flutter napisz aplikację, która umożliwia użytkownikom rysowanie różnych kształtów, takich jak okręgi, prostokąty, trójkąty itp. Wykorzystaj komponenty np. CustomPaint do rysowania kształtów na ekranie. Przy użyciu GestureDetector, umożliw użytkownikom wybieranie rodzaju kształtu, dostosowanie koloru i rozmiaru oraz przeciąganie po ekranie, aby rysować wybrane kształty.
  6. (5pt) Wykorzystując React Native napisz aplikację 'StudyTimer' umożliwiającą ustawienie licznika czasu w momencie nauki i śledzenie postępów. Aplikacja powinna zawierać:
    • Minutnik: Aplikacja wyświetla minutnik, który użytkownik może ustawić na określony czas (np. 25 minut) za pomocą pól wejściowych.
    • Przycisk Start/Pauza: Studenci mogą uruchomić lub wstrzymać stoper, aby rozpocząć lub wstrzymać sesję nauki.
    • Pasek postępu: Pasek postępu wizualnie wskazuje czas, który upłynął i pozostały czas.
    • Licznik ukończonych sesji: Aplikacja śledzi liczbę sesji nauki ukończonych przez studenta.
    • Powiadomienie: Po zakończeniu odliczania aplikacja wyświetla powiadomienie lub alert informujący o zakończeniu sesji nauki.
    Komponenty techniczne:
    • Komponenty React Native: Użyj komponentów React Native, takich jak Text, View, Button, TextInput, ProgressBar itp., aby zbudować interfejs użytkownika.
    • Zarządzanie stanem: Wykorzystaj zarządzanie stanem React Native do obsługi licznika czasu, postępu i liczby zakończonych sesji.
  7. CDN