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 сделать переходы между списком и просмотром контакта