diff --git a/.gitignore b/.gitignore index 3a42aea..5ed2c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,6 @@ *.war *.nar *.ear -*.zip *.tar.gz *.rar @@ -159,7 +158,6 @@ dist *.war *.nar *.ear -*.zip *.tar.gz *.rar diff --git a/LICENSE.md b/LICENSE.md index a69ce8b..b25210d 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,5 +1,5 @@ # Licensz -Az itt található oktatási segédanyagok a BMEVIAUAC00 tárgy hallgatóinak készültek. Az anyagok oly módú felhasználása, amely a tárgy oktatásához nem szorosan kapcsolódik, csak a szerző(k) és a forrás megjelölésével történhet. +Az itt található oktatási segédanyagok a BMEVIAUAD02 tárgy hallgatóinak készültek. Az anyagok oly módú felhasználása, amely a tárgy oktatásához nem szorosan kapcsolódik, csak a szerző(k) és a forrás megjelölésével történhet. Az anyagok a tárgy keretében oktatott kontextusban értelmezhetőek. Az anyagokért egyéb felhasználás esetén a szerző(k) felelősséget nem vállalnak. diff --git a/README.md b/README.md index 5d8f46e..638407a 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ # Mobil- és Webes szoftverek - Laborok -![Build docs](https://github.com/bmeviauac01/laborok/workflows/Build%20docs/badge.svg?branch=master) +![Build docs](https://github.com/VIAUAD02/laborok/workflows/Build%20docs/badge.svg?branch=master) -[BMEVIAUAC00 - Mobil- és Webes Szoftverek](https://www.aut.bme.hu/Course/mobilesweb) tárgy laborfeladatai. +[BMEVIAUAD02 - Mobil- és Webes Szoftverek](https://www.aut.bme.hu/Course/mobilesweb) tárgy laborfeladatai. -A jegyzetek MkDocs segítségével készülnek és GitHub Pages-en kerülnek publikálásra: +A jegyzetek MkDocs segítségével készülnek és GitHub Pages-en kerülnek publikálásra: Az MKDocs használatához [a hovatalos dokumentáció](https://squidfunk.github.io/mkdocs-material/creating-your-site/) segítségedre lehet. diff --git a/docs/hf/index.md b/docs/hf/index.md deleted file mode 100644 index 14d2774..0000000 --- a/docs/hf/index.md +++ /dev/null @@ -1,79 +0,0 @@ -# Házi feladat információk - -A házi feladat célja, hogy az előadáson és laborokon bemutatott technológiák segítségével egy komplex alkalmazást készítsen a hallgató, önálló funkcionalitással. - -## Követelmények - -- Legalább 4 technológia használata (pl. UI, egyedi nézetek, fragmentek, perzisztens adattárolás, animációk, stílusok/témák, RecyclerView, hálózati kommunikáció, Service, BroadcastReceiver, Content Provider, Intent, stb.) -- Kotlin nyelven kell készülnie -- View keretrendszerben kell készülnie (Jetpack Compose csak laborvezetővel egyeztetve) -- Önálló alkalmazás legalább 3-4 képernyővel/nézettel -- Bármilyen külső könyvtár használható a fejlesztéshez, hogy még látványosabb alkalmazások készüljenek: - - [https://github.com/wasabeef/awesome-android-ui](https://github.com/wasabeef/awesome-android-ui) - - [https://github.com/wasabeef/awesome-android-libraries](https://github.com/wasabeef/awesome-android-libraries) - - [https://github.com/nisrulz/android-tips-tricks](https://github.com/nisrulz/android-tips-tricks) - -!!!tip "Néhány példa alkalmazás" - - Kiadás/bevétel nyomkövető figyelmeztető funkcióval és grafikonokkal - - Turisztikai látványosságokat gyűjtő alkalmazás - - Raktár kezelő alkalmazás - - Számla kezelő megoldás - - Recept kezelő alkalmazás - - Napló készítő alkalmazás fényképekkel - - Sport tracker alkalmazás - - Készülék esemény naplózó alkalmazás - - Apróhirdetés alkalmazás - - Találkozó szervező alkalmazás - - Sportfogadó megoldás - - Szaki kereső alkalmazás - - Játék alkalmazás, pl. aknakereső, shooter, stb. - - Valamilyen REST API-t használó alkalmazás, például valuta váltás, tőzsdei infók, stb: - - [https://github.com/toddmotto/public-apis](https://github.com/toddmotto/public-apis) - - [https://github.com/Kikobeats/awesome-api](https://github.com/Kikobeats/awesome-api) - - [https://github.com/abhishekbanthia/Public-APIs](https://github.com/abhishekbanthia/Public-APIs) - - A házi feladat használhat felhő megoldást is, pl. Firebase, Amazon, stb. - -## Beadás módja - -!!!danger "neptun.txt" - Az első és legfontosabb, hogy az eddigiekhez hasonlóan töltsd ki a neptun.txt fájlt, hogy a rendszer azonosítani tudjon. - -### Specifikáció - -A specifikáció beadás határideje a **7. hét vége (2023. október 22. 23:59)**. -A specifikáció elkészítése közben a "spec" branchen dolgozz. Erre az ágra akárhány kommitot tehetsz. -Sablont a README.md fájl tartalmaz, azt kell kiegészíteni, és feltölteni a repóba a megadott határidőig. -A beadás akkor teljes, ha a "spec" branch-en megtalálható a README.md fájlban a specifikáció. A beadást egy pull request jelzi, amely pull request-et a laborvezetődhöz kell rendelned. -A specifikáció elkészítése előfeltétele a házi feladat elfogadásának. - -### Házi feladat - -A házi feladat beadás határideje a **11. hét vége (2023. november 19. 23:59)**. -A házi feladat elkészítése közben a "hf" branchen dolgozz. Erre az ágra akárhány kommitot tehetsz. -A projektet mindenképpen ebbe a repository-ba hozd létre, a fejlesztést végig itt végezd. -A beadás akkor teljes, ha a "hf" branch-en megtalálható a projekted teljes forráskódja. A beadást egy pull request jelzi, amely pull request-et a laborvezetődhöz kell rendelned. -A házi feladathoz mindenképpen tartozik **házi feladat védés** is. Ennek ideje a beadást követően (a 12-13. héten) van. Módjáról és idejéről egyeztess a laborvezetőddel. - -### Házi feladat pótlás - fizetésköteles! - -A pótbeadás határideje a **13. hét vége (2023. december 3. 23:59)**. -A házi feladat pótlása közben a "pothf" branchen dolgozz. Erre az ágra akárhány kommitot tehetsz. -A beadás akkor teljes, ha a "pothf" branch-en megtalálható a projekted teljes forráskódja. A beadást egy pull request jelzi, amely pull request-et a laborvezetődhöz kell rendelned. -A házi feladat pótlásához mindenképpen tartozik **pót házi feladat védés** is. Ennek ideje a beadást követően (a 14. héten) van. Módjáról és idejéről egyeztess a laborvezetőddel. - -!!!danger "FONTOS: Elővizsga" - Az elővizsgára jelentkezés feltétele a házi feladat normál határidőre való leadása. Aki mégis jelentkezik elővizsgára úgy, hogy pót házit adott le, annak a vizsgáját nem javítjuk, automatikusan elégtelen kerül beírásra. - -## Dokumentáció - -A házi feladatot a specifikáción túl dokumentálni nem szükséges. - -## iMSc pontok - -A házi feladat minimumkövetelményeinek túlteljesítéséért, extra funkciókért, igényes felületért, kiemelkedő kódminőségért a laborvezetővel egyeztetve maximum 10 iMSc pont szerezhető. -iMSc pont szerzéséhez az elkészült alkalmazásról rövid dokumentációt kell készíteni a README.md fájlba. (A specifikáció után.) Ebben röviden ismertetni kell az elkészült alkalmazás funkcionalitását és az érdekesebb megoldásokat. - -!!!tip "Androidalapú szoftverfejlesztés + Mobil- és webes szoftverek közös házi feladat" - Ha valaki mind a két tárgyat hallgatja a félévben, van lehetőség közös házi feladat írására, DE: - - Ezt mindenképpen egyeztetni kell mindkét laborvezetővel. - - Ugyanaz a házi csak úgy adható le mindkét tárgyon, ha a nehezebb követelményeket (vagyis az Androidalapú szoftverfejlesztését) felülteljesíti. Tehát az Androidalapú szoftverfejlesztés követelményei szerint nem 5, hanem 6-7 technológiát kell használni. Ennek mennyiségéről és a feladat komplexitásáról a laborvezetők döntenek. \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 8ab128e..898dfcd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,6 +1,6 @@ # Tárgy ismertető -A tárgykövetelményeket lásd a [hivatalos tantárgyi adatlapon](https://portal.vik.bme.hu/kepzes/targyak/VIAUAC00/). +A tárgykövetelményeket lásd a [hivatalos tantárgyi adatlapon](https://portal.vik.bme.hu/kepzes/targyak/VIAUAD02/). A laborok sorrendjét és a beadások határidejét Moodle-ben találod. @@ -10,7 +10,7 @@ A laborok sorrendjét és a beadások határidejét Moodle-ben találod. A javítás menetéről és formájáról bővebben a ["Hozzájárulás az anyaghoz"](tudnivalok/github/contributing.md) dokumentumban olvashatsz bővebben. !!! quote "Felhasználási feltételek" - Az itt található oktatási segédanyagok a BMEVIAUAC00 tárgy hallgatóinak készültek. Az anyagok oly módú felhasználása, amely a tárgy oktatásához nem szorosan kapcsolódik, csak a szerző(k) és a forrás megjelölésével történhet. + Az itt található oktatási segédanyagok a BMEVIAUAD02 tárgy hallgatóinak készültek. Az anyagok oly módú felhasználása, amely a tárgy oktatásához nem szorosan kapcsolódik, csak a szerző(k) és a forrás megjelölésével történhet. Az anyagok a tárgy keretében oktatott kontextusban értelmezhetőek. Az anyagokért egyéb felhasználás esetén a szerző(k) felelősséget nem vállalnak. diff --git a/docs/laborok/01-android-hello-world/assets/avd_create.png b/docs/laborok/01-android-hello-world/assets/avd_create.png index b4b7bf2..9b9425c 100644 Binary files a/docs/laborok/01-android-hello-world/assets/avd_create.png and b/docs/laborok/01-android-hello-world/assets/avd_create.png differ diff --git a/docs/laborok/01-android-hello-world/assets/avd_extras.png b/docs/laborok/01-android-hello-world/assets/avd_extras.png index 058cb21..35c9db0 100644 Binary files a/docs/laborok/01-android-hello-world/assets/avd_extras.png and b/docs/laborok/01-android-hello-world/assets/avd_extras.png differ diff --git a/docs/laborok/01-android-hello-world/assets/avd_manager.png b/docs/laborok/01-android-hello-world/assets/avd_manager.png index ef6f49b..8448bf5 100644 Binary files a/docs/laborok/01-android-hello-world/assets/avd_manager.png and b/docs/laborok/01-android-hello-world/assets/avd_manager.png differ diff --git a/docs/laborok/01-android-hello-world/assets/ide_android.png b/docs/laborok/01-android-hello-world/assets/ide_android.png index e2fa4cc..c760270 100644 Binary files a/docs/laborok/01-android-hello-world/assets/ide_android.png and b/docs/laborok/01-android-hello-world/assets/ide_android.png differ diff --git a/docs/laborok/01-android-hello-world/assets/nice_studio.png b/docs/laborok/01-android-hello-world/assets/nice_studio.png index 05baa41..5193c6d 100644 Binary files a/docs/laborok/01-android-hello-world/assets/nice_studio.png and b/docs/laborok/01-android-hello-world/assets/nice_studio.png differ diff --git a/docs/laborok/01-android-hello-world/assets/sdk_manager.png b/docs/laborok/01-android-hello-world/assets/sdk_manager.png index 00e60a5..393d2d0 100644 Binary files a/docs/laborok/01-android-hello-world/assets/sdk_manager.png and b/docs/laborok/01-android-hello-world/assets/sdk_manager.png differ diff --git a/docs/laborok/01-android-hello-world/assets/studio_new.png b/docs/laborok/01-android-hello-world/assets/studio_new.png index a0460df..a5ce3a2 100644 Binary files a/docs/laborok/01-android-hello-world/assets/studio_new.png and b/docs/laborok/01-android-hello-world/assets/studio_new.png differ diff --git a/docs/laborok/01-android-hello-world/assets/studio_old.png b/docs/laborok/01-android-hello-world/assets/studio_old.png index a06577d..76b6ea9 100644 Binary files a/docs/laborok/01-android-hello-world/assets/studio_old.png and b/docs/laborok/01-android-hello-world/assets/studio_old.png differ diff --git a/docs/laborok/01-android-hello-world/index.md b/docs/laborok/01-android-hello-world/index.md index 41026e9..eb5d20c 100644 --- a/docs/laborok/01-android-hello-world/index.md +++ b/docs/laborok/01-android-hello-world/index.md @@ -58,18 +58,15 @@ A feladatok megoldása során a dokumentációt markdown formátumban készítsd ### Fordítás menete Android platformon -A projekt létrehozása után a forráskód az `src` könyvtárban, míg a felhasználói felület leírására szolgáló XML állományok a `res` könyvtárban találhatók. Az erőforrás állományokat egy `R.java` állomány köti össze a forráskóddal, így könnyedén elérhetjük Java/Kotlin oldalról az XML-ben definiált felületi elemeket. Az Android projekt fordításának eredménye egy APK állomány, melyet közvetlenül telepíthetünk mobil eszközre. +A projekt létrehozása után a forráskód az `src` könyvtárban található. A felhasználói felületet Jetpack Compose használatával, közvetlenül Kotlin kódban definiáljuk, így nincs szükség XML állományokra. Az Android projekt fordításának eredménye egy APK állomány, melyet közvetlenül telepíthetünk mobil eszközre. Jetpack Compose segítségével könnyedén elérhetjük és kezelhetjük a felületi elemeket Kotlin kódból, megkönnyítve ezzel a modern, deklaratív felületkialakítást. ![](assets/lab-1-compile.png) *Fordítás menete Android platformon* -1. A fejlesztő elkészíti a Kotlin forráskódot, valamint az XML alapú felhasználói felület leírást a szükséges erőforrás állományokkal. +1. A fejlesztő elkészíti a Kotlin forráskódot, amelyben a felhasználói felületet Jetpack Compose segítségével definiálja. Nincs szükség külön XML alapú felhasználói felület leírásra. -2. A fejlesztőkörnyezet az erőforrás állományokból folyamatosan naprakészen tartja az `R.java` erőforrás fájlt a fejlesztéshez és a fordításhoz. - - !!! danger "FONTOS" - **Az `R.java` állomány generált, kézzel SOHA ne módosítsuk!** (Az Android Studio egyébként nem is hagyja.) +2. A fejlesztőkörnyezet folyamatosan naprakészen tartja a Compose elemekhez kapcsolódó erőforrásokat és a szükséges build állományokat a fejlesztéshez és a fordításhoz. 3. A fejlesztő a Manifest állományban beállítja az alkalmazás hozzáférési jogosultságait (pl. Internet elérés, szenzorok használata, stb.), illetve ha futás idejű jogosultságok szükségesek, ezt kezeli. @@ -113,13 +110,12 @@ SDK szerkezet: Az SDK kezelésére az SDK managert használjuk, ezzel lehet letölteni és frissen tartani az eszközeinket. Indítása az Android Studion keresztül lehetséges. -Az SDK Manager ikonja a fenti toolbaron (vagy Tools -> SDK Manager): - -![](assets/sdk_manager_icon.png) +Az SDK Manager ikonja a fenti toolbaron a beállításoknál található (vagy Tools -> SDK Manager): -vagy +|Régi UI||Új UI| +|-------||-----| +|![](assets/sdk_manager_icon.png)||![](assets/sdk_manager_icon_2.png)| -![](assets/sdk_manager_icon_2.png) SDK manager felülete: @@ -132,22 +128,21 @@ Indítsuk el az AVD managert, és vizsgáljuk meg a laborvezetővel, hogy rendel ### AVD -Az AVD az Android Virtual Device rövidítése. Ahogy arról már előadáson is szó esett, nem csak valódi eszközön futtathatjuk a kódunkat, hanem emulátoron is. (Mi is a különbség szimulátor és emulátor között?) Az AVD indítása a fejlesztői környezeten keresztül lehetséges (illetve parancssorból is, de ennek a használatára csak speciális esetekben van szükség). +Az AVD az Android Virtual Device rövidítése. Ahogy arról már előadáson is szó esett, nem csak valódi eszközön futtathatjuk a kódunkat, hanem emulátoron is. (Mi is a különbség szimulátor és emulátor között?) Az AVD indítása a fejlesztői környezeten keresztül lehetséges (*Tools->Device Manager*), illetve parancssorból is, de ennek a használatára csak speciális esetekben van szükség. Az AVD Manager ikonja: -![](assets/avd_icon.png) +|Régi UI||Új UI| +|-------||-----| +|![](assets/avd_icon.png)||![](assets/avd_icon_2.png)| -vagy - -![](assets/avd_icon_2.png) ![](assets/avd_manager.png) -A fenti képen jobb oldalon, a kinyíló panelben, a létező virtuális eszközök listáját találjuk, bal oldalon pedig az ún. eszköz definíciókét. Itt néhány előre elkészített sablon áll rendelkezésre. Magunk is készíthetünk ilyet, ha tipikusan egy adott eszközre szeretnénk fejleszteni (pl. Galaxy S4). Készítsünk új emulátort! Értelemszerűen csak olyan API szintű eszközt készíthetünk, amilyenek rendelkezésre állnak az SDK manageren keresztül. +A fenti képen jobb oldalon, a kinyíló panelben, a létező virtuális eszközök listáját találjuk, bal oldalon pedig az ún. eszköz definíciókét. (Ezt az *Add a new device* fül, majd a *Create Virtual Device* opcióval tudjuk megnyitni a jobb oldalon lévő `+` ikonnal) Itt néhány előre elkészített sablon áll rendelkezésre. Magunk is készíthetünk ilyet, ha tipikusan egy adott eszközre szeretnénk fejleszteni (pl. Galaxy S24). Készítsünk új emulátort! Értelemszerűen csak olyan API szintű eszközt készíthetünk, amilyenek rendelkezésre állnak az SDK manageren keresztül. 1. A jobb oldali panelon kattintsunk a fent található *Create Virtual Device...* gombra! -2. Válasszunk az előre definiált készülék sablonokból (pl. *Pixel 7 Pro*), majd nyomjuk meg a *Next* gombot. +2. Válasszunk az előre definiált készülék sablonokból (pl. *Pixel 8 Pro*), majd nyomjuk meg a *Next* gombot. 3. Döntsük el, hogy milyen Android verziójú emulátort kívánunk használni. CPU/ABI alapvetően x86_64 legyen, mivel ezekhez kapunk [hardveres gyorsítást](https://developer.android.com/studio/run/emulator-acceleration) is. Itt válasszunk a rendelkezésre állók közül egyet, majd *Next*. 4. Az eszköz részletes konfigurációja. @@ -161,7 +156,7 @@ A fenti képen jobb oldalon, a kinyíló panelben, a létező virtuális eszköz - *Emulated*, egy egyszerű szoftveres megoldás, **most legalább az egyik kamera legyen ilyen**. - *VirtualScene*, egy kifinomultabb szoftveres megoldás, amelyben egy 3D világban mozgathatjuk a kamerát. - Hálózat: Állíthatjuk a sebességét és a késleltetését is kommunikációs technológiák szerint. - - *Boot Option*: Nemrég jelent meg az Android emulátor állapotáról való pillanatkép elmentésének lehetősége. Ez azt takarja, hogy a virtuális operációs rendszer csak felfüggesztésre kerül az emulátor bezáráskor (például a megnyitott alkalmazás is megmarad, a teljes állapotával), és *Quick boot* esetben a teljes OS indítása helyett másodperceken belül elindul az emulált rendszer. *Cold Boot* esetben minden alkalommal leállítja és újra indítja a virtális eszköz teljes operációs rendszerét. + - *Boot Option*: (Nemrég jelent meg az) Az Android emulátor állapotáról való pillanatkép elmentésének lehetősége. Ez azt takarja, hogy a virtuális operációs rendszer csak felfüggesztésre kerül az emulátor bezáráskor (például a megnyitott alkalmazás is megmarad, a teljes állapotával), és *Quick boot* esetben a teljes OS indítása helyett másodperceken belül elindul az emulált rendszer. *Cold Boot* esetben minden alkalommal leállítja és újra indítja a virtális eszköz teljes operációs rendszerét. - Memória és tárhely: - RAM: Ha kevés a rendszermemóriánk, nem érdemes 768 MB-nál többet adni, mert könnyen futhatunk problémákba. Ha az emulátor lefagy, vagy az egész OS megáll működés közben, akkor állítsuk alacsonyabbra ezt az értéket. 8 GB vagy több rendszermemória mellett nyugodtan állíthatjuk az emulátor memóriáját 1024, 1536, vagy 2048 MB-ra. - VM heap: az alkalmazások virtuális gépének szól, maradhat az alapérték. Tudni kell, hogy készülékek esetében gyártónként változik. @@ -180,35 +175,39 @@ Az elindított emulátoron próbáljuk ki az *API Demos* és *Dev Tools* alkalma !!! note "Megjegyzés" A gyári emulátoron kívül több alternatíva is létezik, mint pl. a [Genymotion](https://www.genymotion.com/fun-zone/) vagy a [BigNox](https://www.bignox.com/), viszont a Google féle emulátor a legelterjedtebb, így amennyiben ezzel nem jelentkeznek problémáink, maradjunk ennél. -Tesztelés céljából nagyon jól használható az emulátor, amely az alábbi képen látható plusz funkciókat is adja. Lehetőség van többek között egyedi hely beállítására, bejövő hívás szimulálására, stb. A panelt a futó emulátor jobb oldalán található vezérlő gombok közül a *...* gombbal lehet megnyitni: +Tesztelés céljából nagyon jól használható az emulátor, amely az alábbi képen látható plusz funkciókat is adja. Lehetőség van többek között egyedi hely beállítására, bejövő hívás szimulálására, virtuálisan szenzorok manipulálására, stb. A panelt a futó emulátor jobb oldalán található vezérlő gombok közül a *...* gombbal lehet megnyitni: ![](assets/avd_extras.png) ## Fejlesztői környezet - Android fejlesztésre a labor során a JetBrains IntelliJ alapjain nyugvó Android Studio-t fogjuk használni. A Studio-val ismerkedők számára hasznos funkció a *Tip of the day*, érdemes egyből kipróbálni, megnézni az adott funkciót. Induláskor alapértelmezetten a legutóbbi projekt nyílik meg, ha nincs ilyen, vagy ha minden projektünket bezártuk, akkor a nyitó képernyő. (A legutóbbi projekt újranyitását a *Settings -> Appeareance & Behavior -> System Settings -> Reopen last project on startup* opcióval ki is kapcsolhatjuk.) + Android fejlesztésre a labor során a JetBrains IntelliJ alapjain nyugvó Android Studio-t fogjuk használni. A Studio-val ismerkedők számára hasznos funkció a *Tip of the day*, érdemes egyből kipróbálni, megnézni az adott funkciót. Induláskor alapértelmezetten a legutóbbi projekt nyílik meg, ha nincs ilyen, vagy ha minden projektünket bezártuk, akkor a nyitó képernyő. (A legutóbbi projekt újranyitását a *Settings -> Appeareance & Behavior -> System Settings -> Reopen projects on startup* opcióval ki is kapcsolhatjuk.) ![](assets/studio_old.png) -Az Android Studio Giraffe-ban megújult a környezet felhasználói felülete. Amint látható, jóval letisztultabb dizájnt választottak, sokkal kevesebb a figyelmet elvonó extra a képernyőn, sokkal inkább a kódon van a hangsúly. Ezek között a nézetek között egyszerűen válthatunk a Beállításokban, a New UI menüpontban. +Pár frissítéssel ezelőtt, az Android Studio Giraffe-ban megújult a környezet felhasználói felülete. Amint látható, jóval letisztultabb dizájnt választottak, sokkal kevesebb a figyelmet elvonó extra a képernyőn, sokkal inkább a kódon van a hangsúly. Ezek között a nézetek között egyszerűen válthatunk a Beállításokban, a New UI menüpontban. (*Settings -> Appeareance & Behavior -> New UI*) ![](assets/studio_new.png) ## Hello World -A laborvezető segítségével készítsünk egy egyszerű Hello World alkalmazást, a varázsló nézeten az *Include Kotlin support* legyen bepipálva! -1. Hozzunk létre egy új projektet, válasszuk az *Empty Views Activity* lehetőséget. -1. A projekt neve legyen `HelloWorld`, a kezdő package `hu.bme.aut.mobweb.helloworld`, a mentési hely pedig a kicheckoutolt repository-n belül a `HelloWorld` mappa. -1. Nyelvnek válasszuk a *Kotlin*-t. -1. A minimum API szint legyen API24: Android 7.0. -1. A `Build configuration language` Kotlin DSL legyen. +A laborvezető segítségével készítsünk egy egyszerű Hello World alkalmazást. + +1. Hozzunk létre egy új projektet, válasszuk az *Empty Activity* lehetőséget. +2. A projekt neve legyen `HelloWorld`, a kezdő package `hu.bme.aut.mobweb.helloworld`, a mentési hely pedig a kicheckoutolt repository-n belül a `HelloWorld` mappa. +3. Nyelvnek válasszuk a *Kotlin*-t. +4. A minimum API szint legyen API24: Android 7.0. +5. A `Build configuration language` Kotlin DSL legyen. !!!warning "FILE PATH" A projekt a repository-ban lévő HelloWorld könyvtárba kerüljön! +!!!danger "FILE PATH" + A projektnek az elérési Path-je csak az angol ábécé kis betűit tartalmazza, ugyanis az Android Studio az ékezetekre és a speciális karakterekre érzékeny! + ### Android Studio Ez a rész azoknak szól, akik korábban már használták az Eclipse nevű IDE-t, és szeretnék megismerni a különbségeket az Android Studio-hoz képest. @@ -232,11 +231,10 @@ Ez a rész azoknak szól, akik korábban már használták az Eclipse nevű IDE- * Szigorú lint. A Studio megengedi a warningot. Ezért szigorúbb a lint, több mindenre figyelmeztet (olyan apróságra is, hogy egy View egyik oldalán van padding, a másikon nincs) * Layout szerkesztés. A grafikus layout építés lehetséges. * CTRL-t lenyomva navigálhatunk a kódban, pl. osztályra, metódushívásra kattintva. Ezt a navigációt (és az egyszerű másik osztályba kattintást is) rögzíti, és a historyban előre-hátra gombokkal lehet lépkedni. Ha van az egerünkön/billentyűzetünkön ilyen gomb, és netes böngészés közben aktívan használjuk, ezt a funkciót nagyon hasznosnak fogjuk találni. + * Ha több fájl is meg van nyitva egyszerre, könnyen navigálhatunk az ALT + BAL/JOBB nyilak segítségével az fájlok között. ![](assets/nice_studio.png) -*Szín ikonja a sor elején; kiemelve jobb oldalon, hogy melyik nézeten vagyunk; szabadszavas kiegészítés; a "Hello world" igazából `@string/very_very_very_long_hello_world`.* - ### Billentyűkombinációk @@ -255,6 +253,10 @@ Ez a rész azoknak szól, akik korábban már használták az Eclipse nevű IDE- * CTRL + SHIFT + N: Keresés fájlokban * CTRL + ALT + SHIFT + N: Keresés szimbólumokban (például függvények, property-k) * CTRL + SHIFT + A: Keresés a beállításokban, kiadható parancsokban. +* ALT + ENTER hiányzó elemek importálása/létrehozása. + +!!!tip "Keresés" + Hogy ha bármikor szükségünk van valamire, de esetleg nem találnánk a menüpontok között, akkor a dupla Shift lenyomásával (Shift+Shift) kereshetünk az Android Studioban (illetve más JetBrains IDE-kben). Próbáljuk is ki és keressünk rá a "Device Manager" opcióra. ### Eszközök, szerkesztők @@ -268,15 +270,15 @@ A *View* menü *Tool Windows* menüpontjában lehetőség van különböző abla * Event Log * Gradle -Lehetőség van felosztani a szerkesztőablakot, ehhez kattinsunk egy megnyitott fájl tabfülére jobb gombbal, *Split Vertically/Horizontally*! +Lehetőség van felosztani a szerkesztőablakot, ehhez kattinsunk egy megnyitott fájl tabfülére jobb gombbal, *Split Right/Down* vagy csak kattintsunk rá hosszan és kezdjük el húzni a kódfelületre! ### Hasznos beállítások A laborvezető segítségével állítsák be a következő hasznos funkciókat: -* kis- nagybetű érzékenység kikapcsolása a kódkiegészítőben (settingsben keresés: *sensitive*) +* kis- nagybetű érzékenység kikapcsolása a kódkiegészítőben (settingsben keresés: *Match case*) * "laptop mód" ki- és bekapcsolása (*File -> Power Save Mode*) -* sorszámozás bekapcsolása (kód melletti részen bal oldalt: jobb egérgomb, *Show Line Numbers*) +* sorszámozás bekapcsolása (kód melletti részen bal oldalt: jobb egérgomb, *Appearance -> Show Line Numbers*) ### Generálható elemek @@ -299,13 +301,13 @@ Például részletes információt kaphatunk a hálózati forgalomról: ## Database Inspector -A készüléken debuggolt alkalmazásunknak az [adatbázisát](https://developer.android.com/studio/inspect/database) is meg tudjuk tekinteni. +A készüléken debuggolt alkalmazásunknak az [adatbázisát](https://developer.android.com/studio/inspect/database) is meg tudjuk tekinteni. (*View -> Tool Windows -> App Inspection*) ![](assets/di.png) ## Device File Explorer -A készüléken lévő fájlrendszert is [böngészhetjük](https://developer.android.com/studio/debug/device-file-explorer). +A készüléken lévő fájlrendszert is [böngészhetjük](https://developer.android.com/studio/debug/device-file-explorer). (*View -> Tool Windows -> Device Explorer*) ![](assets/dfe.png) diff --git a/docs/laborok/02-android-ui/assets/asset_studio.png b/docs/laborok/02-android-ui/assets/asset_studio.png index a10215c..976fac7 100644 Binary files a/docs/laborok/02-android-ui/assets/asset_studio.png and b/docs/laborok/02-android-ui/assets/asset_studio.png differ diff --git a/docs/laborok/02-android-ui/assets/details.png b/docs/laborok/02-android-ui/assets/details.png index e486f72..a97cc53 100644 Binary files a/docs/laborok/02-android-ui/assets/details.png and b/docs/laborok/02-android-ui/assets/details.png differ diff --git a/docs/laborok/02-android-ui/assets/list.png b/docs/laborok/02-android-ui/assets/list.png index ac6e35c..93a0c92 100644 Binary files a/docs/laborok/02-android-ui/assets/list.png and b/docs/laborok/02-android-ui/assets/list.png differ diff --git a/docs/laborok/02-android-ui/assets/login.png b/docs/laborok/02-android-ui/assets/login.png index c758d58..693d3c3 100644 Binary files a/docs/laborok/02-android-ui/assets/login.png and b/docs/laborok/02-android-ui/assets/login.png differ diff --git a/docs/laborok/02-android-ui/assets/login_insets.png b/docs/laborok/02-android-ui/assets/login_insets.png new file mode 100644 index 0000000..d605652 Binary files /dev/null and b/docs/laborok/02-android-ui/assets/login_insets.png differ diff --git a/docs/laborok/02-android-ui/assets/pass.png b/docs/laborok/02-android-ui/assets/pass.png index 63d99ab..22d5bac 100644 Binary files a/docs/laborok/02-android-ui/assets/pass.png and b/docs/laborok/02-android-ui/assets/pass.png differ diff --git a/docs/laborok/02-android-ui/assets/splash.png b/docs/laborok/02-android-ui/assets/splash.png index e90b314..915a796 100644 Binary files a/docs/laborok/02-android-ui/assets/splash.png and b/docs/laborok/02-android-ui/assets/splash.png differ diff --git a/docs/laborok/02-android-ui/downloads/res.zip b/docs/laborok/02-android-ui/downloads/res.zip index fe4498e..486c9f5 100644 Binary files a/docs/laborok/02-android-ui/downloads/res.zip and b/docs/laborok/02-android-ui/downloads/res.zip differ diff --git a/docs/laborok/02-android-ui/index.md b/docs/laborok/02-android-ui/index.md index 006dd5f..8c87c92 100644 --- a/docs/laborok/02-android-ui/index.md +++ b/docs/laborok/02-android-ui/index.md @@ -42,11 +42,11 @@ A feladatok megoldása során ne felejtsd el követni a [feladat beadás folyama Első lépésként indítsuk el az Android Studio-t, majd: -1. Hozzunk létre egy új projektet, válasszuk az *Empty Views Activity* lehetőséget. -1. A projekt neve legyen `PublicTransport`, a kezdő package `hu.bme.aut.android.publictransport`, a mentési hely pedig a kicheckoutolt repository-n belül a PublicTransport mappa. -1. Nyelvnek válasszuk a *Kotlin*-t. -1. A minimum API szint legyen API24: Android 7.0. -1. A *Build configuration language* Kotlin DSL legyen. +1. Hozzunk létre egy új projektet, válasszuk az *Empty Activity* lehetőséget. +2. A projekt neve legyen `PublicTransport`, a kezdő package `hu.bme.aut.android.publictransport`, a mentési hely pedig a kicheckoutolt repository-n belül a PublicTransport mappa. +3. Nyelvnek válasszuk a *Kotlin*-t. +4. A minimum API szint legyen API24: Android 7.0. +5. A *Build configuration language* Kotlin DSL legyen. !!!danger "FILE PATH" A projekt a repository-ban lévő PublicTransport könyvtárba kerüljön, és beadásnál legyen is felpusholva! A kód nélkül nem tudunk maximális pontot adni a laborra! @@ -54,21 +54,59 @@ Első lépésként indítsuk el az Android Studio-t, majd: !!!info "" A projekt létrehozásakor, a fordító keretrendszernek rengeteg függőséget kell letöltenie. Amíg ez nem történt meg, addig a projektben nehézkes navigálni, hiányzik a kódkiegészítés, stb... Éppen ezért ezt tanácsos kivárni, azonban ez akár 5 percet is igénybe vehet az első alkalommal! Az ablak alján látható információs sávot kell figyelni. -Láthatjuk, hogy létrejött egy projekt, amiben van egy Activity, `MainActivity` néven, valamint egy hozzá tartozó layout fájl `activity_main.xml` néven. Nevezzük ezeket át `LoginActivity`-re, illetve `activity_login.xml`-re. Ezt a jobb gomb > Refactor > Rename menüpontban lehet megtenni (vagy Shift+F6). Az átnevezésnél található egy Scope nevű beállítás. Ezt állítsuk úgy be, hogy csak a jelenlegi projekten belül nevezze át a dolgokat (Project Files). +Láthatjuk, hogy létrejött egy projekt, abban egy Activity, `MainActivity` néven. Ez be is lett írva automatikusan a *Manifest* fájlba mint Activity komponens. + +Következő lépésként vagyük fel a szükséges függőségeket a projektbe! Ehhez nyissuk meg a + +- Modul szintű `build.gradle.kts` fájlt (*app -> build.gradle.kts*) +- Illetve a `libs.version.toml` fájlt (*gradle -> libs.versions.toml*) + +Először másoljuk be a következő függőségeket a `libs.version.toml` verzió katalógus fájlba: + +```toml +[versions] +... +coreSplashscreen = "1.0.1" +navigationCompose = "2.7.7" + +[libraries] +... +androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "coreSplashscreen" } +androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" } +``` + +Itt a `[versions]` tag-en belül adhatunk egy változó nevet, majd egy verzió értéket, amit majd a következő lépésben átadunk a `version.ref`-nek. Ez mondja meg, hogy melyik verziót használja az adott modulból. A `[libraries]` tag-en belül definiálunk szintén egy változót `androidx-navigation-compose` néven, amit majd később használunk fel a `build.gradle.kts` fájlban. Ennek megadjuk, hogy melyik modul-t szeretnénk beletenni a projektbe, valamint egy verzió számot, amit korábban már definiáltunk. + +Hogy ha ezzel megvagyunk, nyissuk meg a `build.gradle.kts` fájlt, és adjuk hozzá az imént felvett modulokat a `dependencies` tag-en belülre: + +```kts +dependencies { + ... + implementation(libs.androidx.core.splashscreen) + implementation(libs.androidx.navigation.compose) +} +``` + +Itt az `implementation` függvény segítségével tudunk új függőséget felvenni a projektbe, és ezen belül meg kell adnunk a modul nevét, amit már korábban definiáltunk a `libs.version.toml`-ban. Ezt a következő képpen tehetjük meg: + +- megadjuk a fájl nevét, jelen esetben `libs` +- majd ezután megadjuk annak a változónak a nevét amihez hozzárendeltük korábban a modulunkat. + +Hogy ha ezzel is megvagyunk kattintsunk a `Sync Now` gombra a jobb fölső sarokban, és várjuk meg míg letölti a szükséges függőségeket. + +!!!danger "Sync Now" + Figyelem ha ezt a lépést kihagyjuk, akkor az Android Studio nem fogja megtalálni a szükséges elemeket, és ez később gondot okozhat! -!!!note "" - Érdemes megfigyelni, hogy az átnevezés "okos". A layout fájl átnevezése esetén a LoginActivity-ben nem kell kézzel átírnunk a layout fájl azonosítóját, mert ezt a rendszer megteszi. Ugyanez igaz a manifest fájlra is. ## Splash képernyő (0.5 pont) -Az első Activity-nk a nevéhez híven a felhasználó bejelentkezéséért lesz felelős, azonban még mielőtt ez megjelenik a felhasználó számára, egy splash képernyővel fogjuk üdvözölni. Ez egy elegáns megoldás arra, hogy az alkalmazás betöltéséig ne egy egyszínű képernyő legyen a felhasználó előtt, hanem egy tetszőleges saját design. +Miután a felhasználó elindította az alkalmazást, egy "üdvözlő/splash" képernyővel szeretnénk köszönteni. Ez egy elegáns megoldás arra, hogy az alkalmazás betöltéséig ne egy egyszínű képernyő legyen a felhasználó előtt, hanem jelen esetben egy alkalmazás logo, egy tetszőleges háttér színnel. -

+

- -???info "Android 12 (API 31) alatt" +???info "Splash scheen Android 12 (API 31) alatt" (A szükséges fájl [innen](./downloads/res.zip) elérhető) @@ -141,27 +179,19 @@ Az első Activity-nk a nevéhez híven a felhasználó bejelentkezéséért lesz } ``` -API 31 felett bevezetésre került egy [Splash Screen API](https://developer.android.com/develop/ui/views/launch/splash-screen), most ezt fogjuk használni. Ehhez adjuk hozzá a szükséges függőséget az `app` modulhoz tartozó `build.gradle.kts` fájlunkban a *dependencies* szekcióhoz: - -```gradle -dependencies { - ... - implementation("androidx.core:core-splashscreen:1.0.0") -} -``` -A függőség hozzáadása után nyomjuk meg a `Sync Now` gombot a felül megjelenő kék sávon. A Környezet ez után letölti amegfelelő könyvtárakat, és újraszinkronizálja a gradle fájlokat. Innentől kezdve már használható a frissen hozzáadott könyvtár. +API 31 felett bevezetésre került egy [Splash Screen API](https://developer.android.com/develop/ui/views/launch/splash-screen), most ezt fogjuk használni. Ehhez már korábban felvettük a szükséges függőséget a `build.gradle.kts` fájlba. -Azonban először készítsünk egy ikont, amit majd fel fogunk használni a splash képernyőnk közepén. Ehhez az Android Studio beépített `Asset Studio` eszközét fogjuk használni. Bal oldalon a *Project* fül alatt nyissuk meg a `Resource Manager`-t, majd nyomjunk a + gombra, ott pedig az `Image Asset` lehetőségre. +Készítsünk el egy tetszőleges ikont, amit majd fel fogunk használni a splash képernyőnk közepén. Ehhez az Android Studio beépített `Asset Studio` eszközét fogjuk használni. Bal oldalon a *Project* fül alatt nyissuk meg a `Resource Manager`-t, majd nyomjunk a + gombra, ott pedig az `Image Asset` lehetőségre. -1. Itt *Launcher Icon*-t szeretnénk majd generálni, tehát válasszuk azt. -1. A neve legyen *ic_transport* -1. Az egyszerűség kedvéért most *Clip Art*-ból fogjuk elkészíteni az ikonunkat, így válasszuk azt, majd az alatta lévő gombnál válasszunk egy szimpatikusat (pl. a bus keressel). -1. Ez után válasszunk egy szimpatikus színt. -1. Ha akarunk, állíthatunk a méretezésen is. -1. A `Background Layer` fülön beállíthatjuk a háttér színét is. -1. A beállításoknál állítsuk át, hogy az ikonok *PNG* formábumban készüljenek el. -1. Ez után nyomjunk a *Next* majd a *Finish* gombra. +1. Itt *Launcher Icon-t* szeretnénk majd generálni, tehát válasszuk azt. +2. A neve legyen *ic_transport* +3. Az egyszerűség kedvéért most *Clip Art*-ból fogjuk elkészíteni az ikonunkat, így válasszuk azt, majd az alatta lévő gombnál válasszunk egy szimpatikusat (pl. a *bus* keresési szóval). +4. Ez után válasszunk egy szimpatikus színt. +5. Ha akarunk, állíthatunk a méretezésen is. +6. A `Background Layer` fülön beállíthatjuk a háttér színét is. +7. A beállításoknál állítsuk át, hogy az ikon *PNG* formában készüljön el. +8. Ezután nyomjunk a *Next* majd a *Finish* gombra.

@@ -169,730 +199,1238 @@ Azonban először készítsünk egy ikont, amit majd fel fogunk használni a spl Láthatjuk, hogy több féle ikon készült, több féle méretben. Ezekből a rendszer a konfiguráció függvényében fog választani. -A splash képernyő elkészítéséhez egy új stílust kell definiálnunk a `themes.xml` fájlban. +A splash képernyő elkészítéséhez egy új stílust kell definiálnunk a `themes.xml` fájlban. Vegyük fel az alábbi kódrészletet a meglévő stílus alá. (A tárgy keretein belül nagyon kevés XML kóddal fogunk foglalkozni.) ```xml - - - - - - - + ``` Az új stílusunk a `Theme.PublicTransport.Starting` nevet viseli, és a `Theme.SplashScreen` témából származik. Ezen kívül beállítottuk benne, hogy -- `windowSplashScreenBackground`: a splash képernyő háttere a *primary color* legyen (természetesen más is választható), +- `windowSplashScreenBackground`: a splash képernyő háttere (természetesen más is választható), - `windowSplashScreenAnimatedIcon`: a középen megjelenő ikon a saját ikonunk legyen, annak is csak az előtere, -- `android:windowSplashScreenIconBackgroundColor`: az ikonunk mögött milyen háttér legyen, +- `android:windowSplashScreenIconBackgroundColor`: az ikonunk mögött milyen háttér legyen (ez is személyre szabható más színnel), - `postSplashScreenTheme`: a splash screen után milyen stílusra kell visszaváltania az alkalmazásnak. + !!!note A Splash Screen API ennél jóval többet tud, akár animálhatjuk is a megjelenített képet, azonban ez sajnos túlmutat a labor keretein. -Most már, hogy bekonfiguráltuk a *splash* képernyőnket, már csak be kell állítanunk a használatát. Ehhez először az imént létrehozott stílust kell alkalmaznunk `LoginActivity`-re a `manifest.xml`-ben. - +Most már, hogy bekonfiguráltuk a *splash* képernyőnket, már csak be kell állítanunk a használatát. Ehhez először az imént létrehozott stílust kell alkalmaznunk `MainActivity`-re a `manifest.xml`-ben. + + ```xml - ... - - ... - + ``` -Ha már itt járunk, állítsuk be az alkalmazásunk ikonját is: +Ezután állítsuk be az alkalmazásunk ikonját is: ```xml - ... + ... ``` - -Majd meg kell hívnunk az `installSplashScreen` függvényt az `onCreate`-ben, hogy valójában elkészüljön a *splash screen*: +Majd meg kell hívnunk az `installSplashScreen` függvényt az `onCreate`-ben, hogy az alkalmazás indításánál, valóban elkészüljön a *Splash Screen*. ```kotlin -class LoginActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { + +class MainActivity : ComponentActivity() { + override fun onCreate(savedInstanceState: Bundle?) { installSplashScreen() super.onCreate(savedInstanceState) - setContentView(R.layout.activity_login) - } + enableEdgeToEdge() + + setContent { + PublicTransportTheme { + Greeting(name = "Android") + } + } + } } ``` -Próbáljuk ki az alkalmazásunkat! +!!!note "Splash Screen-NavGraph" + A Splash Screent a NavGraph segítségével is meg lehet oldani, erről a labor végén egy ismertető [feladat](#ismerteto-feladat-navgrap-splash) fog segítséget mutatni. (Ez nem szükséges a labor megszerzéséhez, a feladat nélkül is el lehet érni a maximális pontot, azonban az érdekesség kedvéért érdemes végig csinálni.) +Próbáljuk ki az alkalmazásunkat! + !!!example "BEADANDÓ (0.5 pont)" - Készíts egy **képernyőképet**, amelyen látszik a **splash képernyő** (emulátoron, készüléket tükrözve vagy képernyőfelvétellel), egy **ahhoz tartozó kódrészlet**, valamint a **neptun kódod a kódban valahol kommentként**. A képet a megoldásban a repository-ba f1.png néven töltsd föl. + Készíts egy **képernyőképet**, amelyen látszik a **splash képernyő** (emulátoron, készüléket tükrözve vagy képernyőfelvétellel), egy **ahhoz tartozó kódrészlet**, valamint a **neptun kódod a kódban valahol kommentként**! A képet a megoldásban a repository-ba f1.png néven töltsd föl! + + A képernyőkép szükséges feltétele a pontszám megszerzésének! - A képernyőkép szükséges feltétele a pontszám megszerzésének. - ## Login képernyő (0.5 pont) -Most már elkészíthetjük a login képernyőt. A felhasználótól egy email címet, illetve egy számokból álló jelszót fogunk bekérni, és egyelőre csak azt fogjuk ellenőrizni, hogy beírt-e valamit a mezőkbe. +Most már elkészíthetjük a login képernyőt. A felhasználótól egy e-mail címet, illetve egy számokból álló jelszót fogunk bekérni, és egyelőre csak azt fogjuk ellenőrizni, hogy beírt-e valamit a mezőbe.

-Az `activity_login.xml` fájlba kerüljön az alábbi kód. Alapértelmezetten egy grafikus szerkesztő nyílik meg, ezt át kell állítani a szöveges szerkesztőre. Ezt az Android Studio verziójától függően a jobb felső, vagy a jobb alsó sarokban lehet megtenni: +Ehhez először hozzunk létre egy új *Packaget* a projekt mappába `navigation` néven, majd ebbe hozzunk létre két *Kotlin Filet* (a *Package*-ünkön jobb klikk -> New -> Kotlin Class/File) `NavGraph` illetve `Screen` néven. Ez utóbbira csak azért lesz szükség, hogy a későbbiekben szebben tudjuk megoldani a navigációt a képernyők között. Ezt az [Extra feladat - Screen File](#ismerteto-feladat-screen-file) résznél fogjuk részletezve leírni az érdeklődők kedvéért. -```xml - - - - - - - - - - - - - -