diff --git a/docusaurus.config.js b/docusaurus.config.js index 5a3150e1b..fa8a312c7 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -2,12 +2,12 @@ module.exports = { title: 'Kotlin Multiplatform Mobile', tagline: 'by IceRock Development', - url: 'https://kmm.icerock.dev', - baseUrl: '/', + url: 'https://alex009.github.io', + baseUrl: '/kmm.icerock.dev/', onBrokenLinks: 'throw', onBrokenMarkdownLinks: 'warn', favicon: 'img/favicon.ico', - organizationName: 'icerockdev', // Usually your GitHub org/user name. + organizationName: 'alex009', // Usually your GitHub org/user name. projectName: 'kmm.icerock.dev', // Usually your repo name. // i18n: { // defaultLocale: 'ru', @@ -38,6 +38,13 @@ module.exports = { label: 'Onboarding', docsPluginId: 'onboarding', }, + { + type: 'doc', + docId: 'intro', + position: 'left', + label: 'University', + docsPluginId: 'university', + }, // { // type: 'localeDropdown', // position: 'right', @@ -185,6 +192,17 @@ module.exports = { editUrl: 'https://github.com/icerockdev/kmm.icerock.dev/tree/docusaurus/', remarkPlugins: [require('mdx-mermaid')], }, + ], + [ + '@docusaurus/plugin-content-docs', + { + id: 'university', + path: 'university', + routeBasePath: 'university', + sidebarPath: require.resolve('./sidebars.js'), + editUrl: 'https://github.com/icerockdev/kmm.icerock.dev/tree/docusaurus/', + remarkPlugins: [require('mdx-mermaid')], + }, ] ], }; diff --git a/university/0-intro.md b/university/0-intro.md new file mode 100644 index 000000000..93875e23d --- /dev/null +++ b/university/0-intro.md @@ -0,0 +1,60 @@ +--- +sidebar_position: 0 +--- + +# IceRock KMM University + +## О курсе + +Внутренний университет IceRock проводит обучение начинающих специалистов, желающих освоить разработку под мобильные платформы - Android и iOS, с применением технологии Kotlin Multiplatform Mobile. + +Материалы курса доступны публично и его можно проходить самостоятельно, однако для студентов университета компании есть следующие преимущества: + +1. Постоянная обратная связь - выполненные практические задачи проверяются и дается развернутая обратная связь +1. Консультации с сотрудниками IceRock - студенты курса являются полноценными сотрудниками компании и имеют доступ ко всем каналам коммуникации, что позволяет получать ценный опыт от сотрудников (в офисе, в Slack или на тематических собраниях) +1. Трудоустройство с первого дня обучения - вы сможете посвятить все свое время учебе, не волнуясь о финансовом вопросе + +Важная особенность курса - **нет разделения на Android и iOS разработчиков**. Студенты курса выполняют задачи как на Android так и на iOS (без глубокого погружения в специфику конкретной платформы, особенно в UI) - это позволяет лучше понять в чем платформы похожи, а в чем различаются. Изучение обеих платформ позволяет делать общий код наиболее оптимальным образом, учитывающим особенности и Android и iOS. + +После завершения обучения и успешного выполнения выпускного задания студент может выбрать какая платформа будет для него в приоритете и переходит в одну из производственных команд в роли iOS + KMM / Android + KMM разработчика. Уже в производственной команде бывший студент изучит более глубоко выбранную платформу, но уже будет иметь базу по обеим. + +## Структура + +1. Основы разработки Android приложений +1. Основы разработки iOS приложений +1. Основы разработки Kotlin Multiplatform Mobile +1. Основы мобильной разработки в IceRock +1. Реализация форм ввода данных +1. Передача данных по сети +1. Хранение данных +1. Runtime permissions +1. Push notifications + +## Выпускная работа + +В завершении прохождения курса выполняется выпускная работа - студент самостоятельно реализует мобильное приложение, с использованием KMM и изученных подходов, в реальных производственных процессах компании. +Проект, который потребуется выполнить, может быть как синтетический, так и реальный (если в нужный момент времени окажется доступен к выполнению реальный проект, а студент будет способен его выполнить). + +## Длительность + +Все тематические блоки курса потребуют ориентировочно 2 месяца, без учета выпускной работы. Объем выпускной работы оценивается в 2 недели. + +## График + +Обучение происходит в рабочие часы. Рабочий график - пн-пт с 10 до 19. + +## Формат коммуникации + +Студенты из Новосибирска первые 2 недели проводят обучение строго в офисе, для быстрой и эффективной коммуникации с наставником. + +После первых двух недель можно перейти на удаленную работу, с общением через Slack и Google Meet. + +Обратная связь по практическим задачам дается в формате: + +1. Комментарии по Code Review в GitLab +1. Документ с списком найденных багов по тестированию приложения +1. Созвон/личная встреча для совместного обсуждения + +## Хочу учиться + +Заинтересованные в такого рода обучении могут присылать свое резюме на почту training@icerockdev.com, с темой "Обучение в IceRock University". diff --git a/university/1-android-basics/_category_.json b/university/1-android-basics/_category_.json new file mode 100644 index 000000000..33f3301a7 --- /dev/null +++ b/university/1-android-basics/_category_.json @@ -0,0 +1,4 @@ +{ + "position": 1, + "label": "Основы разработки Android приложений" +} diff --git a/university/1-android-basics/android-intro.md b/university/1-android-basics/android-intro.md new file mode 100644 index 000000000..d7627429d --- /dev/null +++ b/university/1-android-basics/android-intro.md @@ -0,0 +1,32 @@ +--- +sidebar_position: 0 +--- + +# Основы Android + +Для изучения мобильной разработки с использованием Kotlin Multiplatform Mobile важно изучить основы Android разработки - эти знания и опыт помогут писать общий код для Android и iOS с учетом особенностей обеих платформ. + +В основы разработки Android приложений мы включаем: + +- Систему сборки - Gradle +- Язык программирования - Kotlin +- Базовые компоненты Android приложения + - `Activity` + - `Service` + - `BroadcastReceiver` + - `ContentProvider` +- `Fragment` +- Верстка UI используя xml layout +- Библиотеки AndroidX и Jetpack от Google +- `RecyclerView` +- `LiveData` +- `ViewModel` +- Жизненный цикл `Application`, `Activity`, `Fragment`, `ViewModel` +- `ViewBinding` +- Библиотека Android Navigation Component от Google +- Библиотека Retrofit от Square +- Библиотека Hilt от Google + +:::info +Для тех кому всё перечисленное уже знакомо, использовано на практике и есть уверенное понимание о чем речь - можно пропустить ознакомление с теоретическим блоком и сразу перейти к [практической задаче](practice). +::: \ No newline at end of file diff --git a/university/1-android-basics/app-logic.md b/university/1-android-basics/app-logic.md new file mode 100644 index 000000000..63895e7e1 --- /dev/null +++ b/university/1-android-basics/app-logic.md @@ -0,0 +1,46 @@ +--- +sidebar_position: 5 +--- + +# Логика приложения + +Помимо пользовательского интерфейса любое мобильное приложение содержит логику работы (еще называют бизнес логикой), например: + +- Обращения к серверу для получения данных +- Локальное хранение данных +- Валидация форм ввода +- Обращение к системным API для интеграции - получение фото, видео и подобное +- Алгоритмы расчитывающие некие данные на основе ввода пользователя +- ... + +Логику приложения принято отделять от пользовательского интерфейса, чтобы была понятная зона ответственности каждого блока кода. Для разделения логики и UI требуется решение для их взаимодействия, ведь совсем независимо они не могут быть. + +Ознакомимся с современными подходами построения логики приложений по [материалам Google](https://developer.android.com/courses/pathways/android-architecture). Обязательно в конце проверь себя пройдя небольшой тест. + +## ViewModel + +Ознакомиться детальнее с ViewModel и LiveData помогут следующие кодлабы: + +- [Android Kotlin Fundamentals: 5.1 ViewModel](https://developer.android.com/codelabs/kotlin-android-training-view-model) - не пропуская Summary и тест в Homework +- [Android Kotlin Fundamentals: LiveData and LiveData observers](https://developer.android.com/codelabs/kotlin-android-training-live-data) - не пропуская Summary и тест в Homework +- [Incorporate Lifecycle-Aware Components](https://developer.android.com/codelabs/android-lifecycles) - для закрепления связей жизненного цикла android компонентов и ViewModel, LiveData + +## Retrofit + +Практически все приложения выполняют работу с сетью. Основной способ выполнения сетевых запросов в Android это библиотека [Retrofit](https://square.github.io/retrofit/). + +CodeLab [Get data from the internet](https://developer.android.com/codelabs/basic-android-kotlin-training-getting-data-internet) даст более детальное представление о библиотеке и как её использовать. + +## Coroutines + +В CodeLab [Get data from the internet](https://developer.android.com/codelabs/basic-android-kotlin-training-getting-data-internet) для выполнения асинхронной задачи (обращения к серверу) использовались [kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines). Это популярная библиотека для выполнения асинхронных и многопоточных задач. + +Ознакомимся с библиотекой детальнее используя Hands On [Introduction to Coroutines and Channels](https://play.kotlinlang.org/hands-on/Introduction%20to%20Coroutines%20and%20Channels/). + +В дальнейшем (вне текущего курса) для изучения coroutines используй подборку материалов из [раздела Learning](../../learning/libraries/kotlinx/coroutines). + +## Dependency Injection + +Разные классы приложения должны между собой связываться. Чтобы связанность классов не стала слишком жесткой, что усложнит поддержку кода, используют паттерн Dependency Injection. + +Подробнее позволит разобраться статья [Dependency Injection](https://developer.android.com/training/dependency-injection) и CodeLab [Using Hilt in your Android app](https://developer.android.com/codelabs/android-hilt). diff --git a/university/1-android-basics/getting-started.md b/university/1-android-basics/getting-started.md new file mode 100644 index 000000000..92ac471c0 --- /dev/null +++ b/university/1-android-basics/getting-started.md @@ -0,0 +1,81 @@ +--- +sidebar_position: 1 +--- + +# Первые шаги + +## Build your first app + +Первые шаги в разработке Android приложений рекомендуем начать с выполнения инструкций на [developer.android.com](https://developer.android.com) в блоке [Build your first app](https://developer.android.com/training/basics/firstapp). + +Блок "Создание вашего первого приложения" научит: +- Как развернуть среду разработки Android приложений `Android Studio` +- Как создать простейший проект +- Как собрать Android приложение и запустить на эмуляторе/устройстве +- Как построить UI используя `ConstraintLayout` +- Как использовать строки локализации из ресурсов +- Как делать переходы между `Activity` + +## App fundamentals + +После первого созданного приложения (молодец!) нужно глубже погрузиться в теорию об устройстве Android приложений. В этом нам поможет все та же официальная документация [developer.android.com](https://developer.android.com) - идем читать [App fundamentals](https://developer.android.com/guide/components/fundamentals). + +Документация расскажет: +- Что является компонентами Android приложения +- За что отвечает `Activity` +- Что такое `Service` +- Какие типы `Service` нам доступны и для чего +- Какие задачи решает `BroadcastReceiver` +- Чем полезен `ContentProvider` +- Как запустить каждый из компонентов Android приложения +- Для чего нужен `ContentResolver` +- Состав и предназначение `AndroidManifest.xml` +- Как управлять требованиями приложения к версии Android +- Что такое ресурсы Android приложения + +## App resources + +Следующий важный блок Android разработки - работа с ресурсами приложения. Документация также есть, но начнем в этот раз с видео от сообщества - так будет проще понять. + + +
+
+ +После просмотра видео можно перейти к документации, но только в раздел [Handle configuration changes](https://developer.android.com/guide/topics/resources/runtime-changes), в котором описана одна из важнейших особенностей Android, которая влияет на разрабокту общего кода - изменение конфигурации и автоматическое пересоздание UI компонентов системой. + +Раздел документации [App resources](https://developer.android.com/guide/topics/resources/providing-resources) содержит очень детальное и развернутое описание как работать с ресурсами, каких типов они бывают и для чего нужен каждый из них. Об этом стоит прочитать *в будущем*, на данный момент лучше пропустить. + +В результате мы должны узнать: +- Что такое изменение конфигурации, в каких случаях происходит и к чему приводит +- Какие типы ресурсов есть в android приложении +- Как реализуется локализация строк и изображений под разные языки +- Как добавлять векторные и растровые изображения в приложение +- Как сделать разную UI верстку для разных экранов +- Что такое dp и ***dpi +- Что такое `qualifier` +- Что такое `R` класс и как его использовать + +## Android Manifest + +Файл `AndroidManifest.xml` важный и главный источник информации о приложении для Android OS. Пора ознакомиться с его кратким описанием - [App Manifest Overview](https://developer.android.com/guide/topics/manifest/manifest-intro), а к детальному описанию каждого аттрибута можно будет обратиться тогда, когда он попадется на практике. + +Про манифест нужно понять: +- Зачем нужен `AndroidManifest.xml` +- Структура файла +- Обязательные атрибуты +- Как добавлять `Activity`/`Service`/`ContentProvider`/`BroadcastReceiver` +- Как объявлять требуемые приложению разрешения + +## Немного практики + +В приложении созданном на шаге [Build your first app](#build-your-first-app) нужно: +1. Создать новую `Activity` - `RotatingActivity` +1. На UI `RotatingActivity` расположить 2 надписи с текстом "первая" и "вторая" +1. Сделать переход на эту активити с отдельной иконки на рабочем столе (чтобы стало 2 иконки на рабочем столе) +1. Сделать разную верстку для портретного и ландшафтного режима - в портретном надписи должны быть "первая" сверху и "вторая" снизу, а в ландшафтном - слева и справа соответственно +1. Сделать локализацию строк с переводом на английский +1. Добавить векторное изображение и вывести его на любом экране + +## Вспомнить главное + +- Официальная документация Android - [developer.android.com](https://developer.android.com) diff --git a/university/1-android-basics/gradle.md b/university/1-android-basics/gradle.md new file mode 100644 index 000000000..71002e09a --- /dev/null +++ b/university/1-android-basics/gradle.md @@ -0,0 +1,47 @@ +--- +sidebar_position: 3 +--- + +# Gradle + +## Обзорно про Gradle + +Следующее видео расскажет о том что такое система сборки, зачем она нужна и что предоставляет Gradle (местами есть уход в излишнее на данный момент детали, поэтому не страшно если что-то из видео будет не совсем понятно сразу). + + +
+
+ +## Gradle и Kotlin DSL + +В следующем видео можно увидеть как происходит перевод groovy скриптов на kotlin для большей помощи IDE в написании билд скриптов. + + +
+
+ +При возникновении сложностей на практике - пользуйтесь [документацией Gradle о поддержке Kotlin DSL](https://docs.gradle.org/current/userguide/kotlin_dsl.html). + +## Gradle детальнее + + +
+
+ +## Время практики + +1. Создать Android проект по шаблону "No activity" в Android Studio. +1. Установить минимально требуемую версию Android - KitKat (4.4) +1. Установить стабильную (не бета/альфа) версию Android Gradle Plugin +1. Установить идентификатор приложения `dev.icerock.education.gradle` +1. Подключить Hilt - https://developer.android.com/training/dependency-injection/hilt-android#setup +1. Перевести gradle-groovy скрипты на gradle-kotlin-dsl + +В результате команда `./gradlew build` должна успешно выполняться. + +## Важные ссылки + +- Официальная документация Gradle - [docs.gradle.org](https://docs.gradle.org/current/userguide/userguide.html) +- Текущие версии Gradle - [gradle.org](https://gradle.org/releases/) +- Текущие версии Android Gradle Plugin - [developer.android.com](https://developer.android.com/reference/tools/gradle-api) +- Официальная документация Android Gradle Plugin - [developer.android.com](https://developer.android.com/studio/build) diff --git a/university/1-android-basics/kotlin.md b/university/1-android-basics/kotlin.md new file mode 100644 index 000000000..378699b0d --- /dev/null +++ b/university/1-android-basics/kotlin.md @@ -0,0 +1,33 @@ +--- +sidebar_position: 2 +--- + +# Kotlin + +## Examples + +Для знакомства с языком разработки Kotlin воспользуемся разделом [Examples](https://play.kotlinlang.org/byExample) на официальном сайте (группу Kotlin/JS смотреть не нужно). +Данный раздел показывает наглядно, на интерактивных примерах, весь синтаксис языка и наиболее популярные возможности стандартной библиотеки Kotlin. + +## Koans + +После изучения теории нужно попрактиковаться - раздел [Koans](https://play.kotlinlang.org/koans/overview) поможет закрепить изученные материалы на практике. +В данном разделе в интерактивном формате, прямо в браузере, вам нужно выполнить разные несложные задачи. + +## Документация + +Официальная документация Kotlin расположена по адресу [kotlinlang.org/docs](https://kotlinlang.org/docs/). К ней стоит обращаться во всех случаях, когда что-то не понятно про язык разработки и его инструментарий. + +Сразу знакомиться со всей документацией не стоит (все равно забудется без практики), но нужно прочитать несколько базовых разделов: +- [Basic Syntax](https://kotlinlang.org/docs/basic-syntax.html) +- [Idioms](https://kotlinlang.org/docs/idioms.html) - примеры того, как принято писать код в "Kotlin стиле", как задумано авторами языка +- [Coding Conventions](https://kotlinlang.org/docs/coding-conventions.html) - как оформлять код, на примерах + +## Где можно попрактиковаться + +Для практики написания кода на Kotlin можно использовать Android Studio или сайт [play.kotlinlang.org](http://play.kotlinlang.org/). Сайт удобен тем, что писать и выполнять Kotlin код можно в браузере, а результатом поделиться в виде ссылки. + +## Вспомнить главное + +- Официальная документация Kotlin - [kotlinlang.org/docs](https://kotlinlang.org/docs) +- Песочница для выполнения Kotlin кода - [play.kotlinlang.org](http://play.kotlinlang.org/) diff --git a/university/1-android-basics/practice.md b/university/1-android-basics/practice.md new file mode 100644 index 000000000..8322f2f7e --- /dev/null +++ b/university/1-android-basics/practice.md @@ -0,0 +1,40 @@ +--- +sidebar_position: 6 +--- + +# Практическое задание + +Нужно разработать android приложение для просмотра GitHub репозиториев. + +Функциональные возможности: +1. Авторизация пользователя (username + personal access token) +1. Просмотр списка репозиториев пользователя (первые 10) +1. Просмотр детальной информации выбранного репозитория + 1. описание + 1. статистика (forks, stars, watchers) + 1. ссылка на web страницу репозитория + 1. лицензия + +Технические требования: +1. Реализация на Kotlin +1. Использовать XML Layouts для UI +1. Использовать Kotlin Gradle DSL +1. Использовать Retrofit для работы с REST API +1. Использовать RecyclerView для отображения списка +1. Использовать ConstraintLayout для экрана детальной информации +1. Использовать Android Navigation Component для переходов между экранами +1. Экраны делать с помощью Fragment (подход Single Activity) +1. Использовать Coroutines для асинхронности и многопоточности +1. Использовать [Kotlinx.Serialization](https://github.com/Kotlin/kotlinx.serialization) для парсинга json +1. Использовать ViewModel для реализации логики экранов +1. Использовать LiveData / StateFlow для обновления данных на UI +1. Корректно обрабатывать ситуации "загрузка данных", "ошибка загрузки", "пустой список" +1. Корректно обрабатывать смену конфигурации + +Материалы: +1. [GitHub REST API](https://docs.github.com/en/rest) +1. [GitHub Basic Authorization](https://docs.github.com/en/rest/overview/other-authentication-methods#basic-authentication) +1. [GitHub user repositories](https://docs.github.com/en/rest/reference/repos#list-repositories-for-a-user) +1. [Kotlinx.Serialization guide](https://github.com/Kotlin/kotlinx.serialization/blob/master/docs/basic-serialization.md#json-decoding) +1. [Интеграция Kotlinx.Serialization и Retrofit](https://github.com/JakeWharton/retrofit2-kotlinx-serialization-converter) +1. [Дизайн](http://jira.icerockdev.com/browse/MOKO-1054) diff --git a/university/1-android-basics/user-interface.md b/university/1-android-basics/user-interface.md new file mode 100644 index 000000000..319b96743 --- /dev/null +++ b/university/1-android-basics/user-interface.md @@ -0,0 +1,117 @@ +--- +sidebar_position: 4 +--- + +# User Interface + +Со всеми приложениями пользователь взаимодействует через интерфейс - User Interface (UI). Ранее мы уже задели создание интерфейса, а в данном блоке рассмотрим эту тему детальнее. + +## Основы + +Для начала нужно ознакомиться с главными UI классами: + +- [Activity](https://developer.android.com/reference/android/app/Activity) - окно приложения, единственное что показывает UI в Android пользователю +- [Fragment](https://developer.android.com/guide/fragments) - часть UI (может быть отдельным экраном приложения, может частью экрана) +- [View](https://developer.android.com/reference/android/view/View) - небольшой блок пользовательского интерфейса, например текст, кнопка, поле ввода и т.д. + +Для ознакомления на практике пройти уроки из официального Android курса - [Android Basics - Layouts](https://developer.android.com/courses/android-basics-kotlin/unit-2). + +Про `Fragment` полезно пройти CodeLab - [Advanced Android 01.1: Fragments](https://developer.android.com/codelabs/advanced-android-training-fragments) (в CodeLab используется Java, но при выполнении можно использовать Kotlin). + +Также, для изучения жизненного цикла `Activity` и `Fragment`, хорошо подойдет CodeLab [Android Kotlin Fundamentals: Lifecycles and logging](https://developer.android.com/codelabs/kotlin-android-training-lifecycles-logging) и её продолжение - [Android Kotlin Fundamentals: Complex Lifecycle Situations](https://developer.android.com/codelabs/kotlin-android-training-complex-lifecycle) + +Вопросы для самопроверки: + +- Чем отличаются `Activity` и `Fragment`? +- Какой жизненый цикл `Activity`? +- Какой жизненый цикл `Fragment`? +- Что произойдет с введенным в `EditText` текстом, если произойдет изменение конфигурации (например поворот экрана)? +- Как сохранить положение скролла в `RecyclerView` или `ScrollView` при повороте экрана? + +## Экраны и навигация + +Современные android приложения строятся по подходу Single Activity, о котором рассказано в следующем видео. + + +
+
+ +В дополнение можно прочитать [статью](https://habr.com/ru/company/redmadrobot/blog/426617/) на русском языке. + +Для построения навигации между экранами Google рекомендует использовать [Android Navigation Component](https://developer.android.com/guide/navigation), который наиболее полнофункционален именно с подходом Single Activity, когда мы в пределах одного Activity переходим между разными Fragment'ами. + +Более подробно изучить работу с навигацией и попрактиковаться можно по следующим урокам: + +- [Navigate between screens](https://developer.android.com/courses/pathways/android-basics-kotlin-unit-3-pathway-1) +- [Introduction to the Navigation component](https://developer.android.com/courses/pathways/android-basics-kotlin-unit-3-pathway-2) + +## Верстка экрана + +Верстка UI в Android на данный момент возможна несколькими способами: +1. Jetpack Compose - новый, современный подход, declarative UI +1. XML layouts - все еще наиболее популярный, но начинающий устаревать + +Мы будем рассматривать верстку через xml, так как она все ещё наиболее распространена и эти навыки точно потребуются на проектах ближайшие годы. + +:::info +Тем кто заинтересован посмотреть что такое Jetpack Compose подойдет набор уроков от Google - [Jetpack Compose](https://developer.android.com/courses/pathways/compose) +::: + +С версткой через xml можно познакомиться через CodeLab - [Android Kotlin Fundamentals: LinearLayout using the Layout Editor](https://developer.android.com/codelabs/kotlin-android-training-linear-layout) + +Многое в практиках от Google показывается через Layout Editor, но важно также смотреть и понимать что получается в результирующем xml. Чтобы понимать, к чему приводят действия в Layout Editor, читайте xml после действий в редакторе. + +### ConstraintLayout + +`ConstraintLayout` - это универсальный и многофункциональный лейаут. Его основное преимущество - без множественной вложенности описать сложное расположение элементов на экране. Он используется очень часто, потому что его возможности сильно упрощают реализацию сложных задач. + +Подробно про `ConstraintLayout` - [Build a Responsive UI with ConstraintLayout](https://developer.android.com/training/constraint-layout/index.html). И практика для закрепления [Use ConstraintLayout to design your Android views](https://developer.android.com/codelabs/constraint-layout). + +### RecyclerView + +Важный элемент практически всех мобильных приложений - список элементов. На Android он реализуется с помощью [RecyclerView](https://developer.android.com/guide/topics/ui/layout/recyclerview). Подробно ознакомиться с концептом этого элемента и попрактиковаться можно в CodeLab - [Android Kotlin Fundamentals: RecyclerView fundamentals](https://developer.android.com/codelabs/kotlin-android-training-recyclerview-fundamentals). + +Вопросы для самопроверки: + +- Что такое `RecyclerView`? +- В каких случаях нужен `RecyclerView`, а в каких достаточно `LinearLayout`? + +### Связь верстки и кода + +Для обращения к UI элементам из кода мы используем инструмент [View Binding](https://developer.android.com/topic/libraries/view-binding). Он из xml layout'ов автоматически генерирует классы, которые мы можем использовать в коде и обращаться к разным view как к полям этого сгенерированного класса. + +Также можно посмотреть следующее видео: + + +
+
+ +## AndroidX & Jetpack + +В текущем блоке мы использовали разные библиотеки от AndroidX и Jetpack. Разберемся с тем что это за библиотеки. + +[AndroidX](https://developer.android.com/jetpack/androidx) - набор библиотек, обеспечивающих поддержку более новых API на старых версиях устройств. Они позволяют разработчику не задумываться о том, на какой версии android будет запускаться приложение, когда требуемый функционал менялся между разными релизами android. В прошлом этот набор библиотек назывался `Android Support Libraries`. Рекомендуется использовать AndroidX API, так как оно обновляется чаще релизов Android OS и может включать множество разных багфиксов (как и новых багов, куда без них). + +[Jetpack](https://developer.android.com/jetpack) - набор библиотек (включающий и AndroidX), предоставляющий множество готовых решения для разных типовых задач разработки приложений - базы данных, архитектурные компоненты, работа с постраничной загрузкой, удобная работа с камерой и прочее (список библиотек большой, можно посмотреть на сайте). + +## Забота о User Experience (UX) + +Разработчики приложений должны стремиться к удобному и понятному пользовательскому опыту. Важно помнить, что мы пишем код не для себя, а чтобы пользователи могли получить приложение которое решает их задачи. Приложение может приносить боль при использовании, а может быть приятным, быстрым и удобным. Ставьте себя на место пользователя, когда делаете какой либо функционал, и спрашивайте "а пользовался бы я сам таким решением?". + +В CodeLab Google подготовили набор советов, как сделать приложение удобнее и понятнее - [Create a more polished user experience](https://developer.android.com/codelabs/basic-android-kotlin-training-polished-user-experience). + +А также многое про удобство можно прочитать на сайте [material.io](https://material.io/design) - разделы Interaction и Communication очень детально и наглядно объясняют как можно создавать комфортное использование приложения. Многие принципы применимы не только на android, но и на любой системе с UI. + +## Practice time + +Сделать приложение по [дизайну](https://www.figma.com/file/07E2agIcfVsAZBMoq91ccL/android-ui-education). + + + +1. Создать приложение с шаблона `Empty Activity` +1. Создать `data class Contact(val firstName: String, val lastName: String, val avatarResourceId: Int)` +1. Объявить глобальное свойство `contacts: List` в котором написать 5 или больше разных контактов - это будут данные нашего приложения +1. Добавить 2 фрагмента - `ContactsFragment` и `ContactFragment` +1. На фрагменте `ContactsFragment` расположить `RecyclerView` отрисовывающий множество элементов - разные контакты +1. На фрагменте `ContactFragment` с помощью `ConstraintLayout` сверстать UI экрана просмотра контакта +1. С помощью Android Navigation Component сделать переходы между списком и просмотром контакта