исходники приложений на kotlin
Пишем MVP приложение на Kotlin под Android
Разработка приложений на Kotlin под Android набирает популярность среди разработчиков, однако статей в русскоязычном сегменте Интернета довольно мало. Я решил немного подправить ситуацию, и написать туториал по разработке приложения на Kotlin. Мы напишем полноценное приложение с использованием всех трендовых библиотек (кроме RxJava) в мире Android-разработки. В конце у нас должно получиться расширяемое и легко тестируемое приложение (сами тесты мы писать не будем).
Внимание! В статье описывается создание приложения версии 1.0. Текущий код в репозитории может отличаться от описываемого в статье.
Наверное, некоторые из вас знают, что помимо языка программирования Kotlin JetBrains также разрабатывает библиотеку Anko, для создания UI приложения, в качестве замены обычным XML-файлам. Мы не будем использовать его в нашем проекте, дабы не ставить в затруднительное положение людей не знакомых с Anko.
Настройка Android Studio
Для написания приложений на языке Kotlin, Android Studio нужен специальный плагин. Инструкцию по установке плагина можно найти здесь. Также не забудьте отключить функцию «Instant Run» в настройках Android Studio, т. к. на данный момент она не поддерживается плагином Kotlin.
Для корректной работы генерации кода нужно использовать версию плагина не ниже 1.0.1. Я использовал версию Kotlin 1.0.2 EAP. Вот так выглядит файл build.gradle приложения в моем проекте:
Что будем писать?
Итак, для начала нам нужно определиться что же мы будем писать? Недолго думая я остановился на приложении-заметках. Название тоже придумалось легко — Notelin. Приложение очень простое и состоит из двух экранов:
— Главный экран — содержит в себе список с заметками
— Экран заметки — здесь можно смотреть/редактировать содержание выбранной заметки
Требования к приложению небольшие:
— Добавление/просмотр/удаление заметки
— Просмотр информации о заметке
— Сортировка заметок по заголовку и по дате
— Поиск по заголовкам заметок
Используемые библиотеки
Для работы с базой данных я буду использовать библиотеку Android Active. Урок по работе с ней можно найти по этой ссылке. Для реализации Depency Injection была использована библиотека Dagger 2. На Хабре есть много статей по работе с ней. Основой всего приложения будет библиотека Moxy. С ее помощью мы реализуем паттерн MVP в нашем проекте. Она полностью решает проблемы жизненного цикла, благодаря чему вы можете не переживать о пересоздании компонентов вашего приложения. Также мы воспользуемся набором расширений для языка Kotlin в Android — KAndroid. Про остальные библиотеки я буду рассказывать по ходу дела.
Ниже приведен список зависимостей проекта:
А вот так выглядит список зависимостей приложения:
Обратите внимание, что вместо apt я использую kapt. Это плагин для Gradle, позволяющий аннотировать Kotlin-элементы.
Структура приложения
Вот так выглядит структура нашего проекта в конечном варианте:
Создаем Model
У заметок будет четыре поля:
Реализуем все это в коде:
По этой модели библиотекой ActiveAndroid будет создана БД, в которой будут храниться наши заметки. Если вы заметили, у нас есть два конструктора: пустой и с параметрами. Первый конструктор будем использовать мы, а второй — ActiveAndroid. Наша модель наследуется от класса Model, благодаря чему мы можем сохранять и удалять наши заметки просто вызывая методы save() и delete(), например:
Но прежде чем использовать нашу модель, нам нужно прописать кое-какие мета-данные в Manifest-файле:
Думаю, все понятно без комментариев. Осталось унаследовать класс Application от com.activeandroid.app.Application:
Чтобы приложение было менее зависимо от БД я создал обертку NoteDao над нашей моделью, в которой будут происходить все операции по созданию, сохранению, обновлению и удалению заметок:
Наверное, вы заметили, что для создания объектов мы не использовали ключевое слово new — это отличие Kotlin от Java.
Экран с заметками
Также является главным экраном приложения. На нем пользователь может добавить/удалить заметку, просмотреть информацию о заметке, отсортировать их по дате или названию, а также произвести поиск по заголовкам.
Создаем MainView и MainPresenter
Теперь нам нужно перевести все это в код. Для начала создадим интерфейс нашей View:
Далее мы реализуем созданный интерфейс в нашей активити:
Одной из особенностей Kotlin, является то, что наследование и реализация интерфейсов указывается через двоеточие после имени класса. Также не имеет разницы идет название родительского класса перед интерфейсами, после или даже между ними, главное, чтобы класс в списке был один. Т. е. запись выше могла бы выглядеть так:
Если же вы попытаетесь добавить через запятую название еще одного класса, то IDE выдаст ошибку и подчеркнет красной линией название класса, который идет вторым.
Пока оставим методы пустыми. Как видите, активити наследуется от MvpAppCompatActivity. Это нужно для того, чтобы активити могла восстанавливать состояние при повороте экрана.
Создадим класс презентер:
Презентер также наследуется от MvpPresenter, которому мы указываем с какой View мы будем работать.Осталось инжектировать нашу модель в презентер. Для этого мы создаем модуль — поставщика NoteDao:
Создадим Component для инжектирования презентера:
Теперь нам нужно создать статический экземпляр класса AppComponent в классе Application:
Теперь мы можем инжектировать нашу модель в презентере:
Для взаимодействия MainView и MainPresenter нам нужно создать переменную в MainActivity:
Плагин Moxy сам привяжет View к фрагменту и произведет другие необходимые действия.
Создадим разметку экрана со списком и плавающей кнопкой. Файл activity_main.xml:
Для реализации летающей кнопки я использовал библиотеку FloatingActionButton. Google уже добавили FAB в support-библиотеку, поэтому вы можете воспользоваться их решением.
Укажем нашей Activity, какой макет она должна показывать:
Далее нам нужно связать FAB и список, чтобы при прокручивании списка вверх кнопка исчезала:
Нам не нужно писать порядком надоевший findViewById, нужно лишь прописать одну строчку в блоке с import’ами:
Как видите, последний пакет совпадает с названием нашего xml-файла. IDE автоматически инициализирует свойства (property) наших View и их имена совпадают с ID, которые мы указали в разметке.
Давайте реализуем загрузку заметок из БД. Заметки нужно загружать только один раз и использовать их в последующем. В этом нам поможет метод onFirstViewAttach класса MvpPresenter, который вызывается единожды при первой привязке View к презентеру. Далее, сколько бы мы не крутили и вертели нашу Activity, данные будут закешированы в презентере.
Создадим адаптер для нашего списка:
В адаптере мы используем метод formatDate. Он служит для форматирования даты в строку:
Данный метод находится в файле DateUtils.kt и мы можем использовать как обычный статический метод. Отличие от статического метода здесь в том, что метод принадлежит не классу, а пакету и нам не нужно писать имя класса перед названием метода. В аннотации мы указываем название класса, через который мы будем обращаться к методу из Java. Например в Java дынный метод будет вызываться так:
В методе onNotesLoaded нашей Activity мы показываем наши заметки:
Если заметок нет, то мы показываем сообщение «Нет заметок» в TextView.
Насколько я знаю, для обработки клика по элементам RecycleView не существует «официального» OnItemClickListener. Поэтому мы воспользуемся своим решением:
В методе onCreate нашей Activity пишем:
Функция with позволяет не писать каждый раз имя переменной, а только лишь вызывать методы у объекта, который мы передали в нее. Обратите внимание, что для получения Activity я использовал не просто this, а this@MainActivity. Это связано с тем, что при использовании this в блоке with, возвращается объект, который мы передали в функцию with. При обычном клике по пункту мы переходим на Activity, где мы можем просмотреть текст нашей заметки. При долгом нажатии появляется контекстное меню. Если вы заметили, перед закрывающей скобкой я не написал слово return. Это не ошибка, а особенность языка Kotlin.
Вот что происходит при нажатии на пункт меню в презентере:
Мы еще не создали класс NoteActivity, поэтому компилятор будет выдавать ошибку. Для решения этой проблемы можно создать класс NoteActivity или вовсе закомментировать код внутри метода openNote. Запись NoteActivity::class.java аналогична NoteActivity.class в Java. Также заметьте, что мы обращаемся к списку не через метод get(position), а через квадратные скобки, как к обычному массиву.
При использовании MVP-библиотеки Moxy в своем приложении, нам нужно привыкать, что все действия с View, такие как показ/закрытие диалога и другие, должны проходить через презентер. Изначально это не очень привычно и неудобно, но пользы от этого гораздо больше, т. к. мы можем быть уверены, что при пересоздании Activity наше диалоговое окно никуда не пропадет.
Я не буду показывать код контекстного меню, удаления и показа информации о заметке т. к. статья получается очень большой. Но, думаю, общий смысл вы уловили. Также следует отметить, что метод hideNoteContextDialog у презентера должен вызываться даже при закрытии диалога через кнопку назад или при нажатии на область за границами диалога.
При нажатии на FAB должна создаваться новая заметка:
Для создания новой заметки мы вызываем у презентера функция openNewNote:
Метод openNewNote использует созданный нами ранее openNote, в который мы передаем Context и позицию заметки в списке.
Реализуем поиск по заметкам
Давайте добавим поиск по заметкам. Создайте в папке res/menu файл main.xml:
В MainActivity пишем:
При изменении текста в поле поиска мы передаем строку из поля в презентер, после чего показываем результаты в списке. На самом деле, у SearchView нет метода onQueryChange, его добавила библиотека KAndroid.
Реализуем поиск в презентере:
Обратите внимание, как красиво, в одну строчку мы реализовали поиск по списку с помощью метода filter и лямбд. В Java тот же функционал занял бы 6-7строк. Осталось отобразить результаты поиска:
Реализуем сортировку заметок
И последний этап в создании главного экрана, это сортировка заметок. Добавим в res/menu/main.xml следующие строки:
Теперь нам нужно обработать нажатие на пункты меню:
Оператор when является более функциональным аналогом switch-case в Java. Код сортировки в MainPresenter:
Экран с содержанием заметки
Теперь нам нужно создать экран с содержанием заметки. Здесь пользователь может просмотреть/отредактировать заголовок и текст заметки, сохранить или удалить ее, а также просмотреть информацию о заметке.
Создаем NoteView и NotePresenter
Экран содержит всего лишь три View:
-Заголовок
-Дата последнего изменения
-Текст заметки
А вот и сама разметка:
В начале статьи я мельком упомянул об Anko. Библиотека позволяет существенно сократить код, не теряя при этом в удобочитаемости. Вот так, например, выглядела бы наша разметка при использовании Anko:
Но не будем отвлекаться и приступим к написанию кода. Первым делом нам нужно создать View:
Имплементируем NoteView в NoteActivity:
В onCreate мы извлекаем id заметки, чтобы презентер достал заметку из БД и передал данные во View. Создадим презентер:
Не забудьте добавить в класс AppComponent строку:
Покажем нашу заметку:
Реализуем сохранение заметки
Для сохранения заметки нам нужно выбрать соответствующий пункт в меню. Создайте файл res/menu/note.xml:
Опять же, я не стал приводить код удаления и вывода информации о заметке. При просмотре исходного кода, вы можете заметить, что помимо идентификатора заметки я передал в NoteActivity позицию заметки в списке. Это нужно для того, чтобы при удалении заметки на экране просмотра заметки, она также удалялась из списка. Для реализации этого функционала я использовал EventBus. И опять, я не стал приводить код.
На этом все: заметки добавляются, редактируются и удаляются. Также мы можем осуществить поиск и сортировку заметок. Обязательно посмотрите полный исходный код, ссылку на который я привел в конце статьи, чтобы лучше понять как все устроено.
Благодарности
Конечно же, нельзя забывать о людях, которые помогли мне при написании статьи. Хотел бы выразить благодарность хабраюзерам Юрию Шмакову (@senneco) за помощь с его библиотекой Moxy и за помощь по другим вопросам. Также, хочу сказать спаcибо сотруднику JetBrains Роману Белову (@belovrv) за ревью статьи и за предоставленный код на Anko.
UPD: Еще хотел сказать спасибо Sirikid за EPIC COMMIT, благодаря которому я переделал внушительную часть кода с использованием фич Kotlin’а.
Заключение
Надеюсь, эта статья смогла убедить вас в том, что писать приложения на Kotlin не трудно, а может даже и легче, чем на Java. Конечно же, могут встречаться и баги, которые сотрудники JetBrains достаточно быстро фиксят. Если у вас появились какие-либо вопросы, вы можете задать их напрямую разработчикам на Slack-канале. Также вы можете почитать статьи о разработке на Kotlin здесь.
Щупаем Kotlin (и чуть-чуть Gradle) на примере Отправлялки-длинных-твитов (открытые исходники)
Я никогда не был любителем HelloWorld и туториалов. В них как правило решаются проблемы, которые данным инструментом решаются хорошо, а вот острые углы и недостатки деликатно обходятся. По-настоящему пощупать язык или библиотеку можно только на реальном приложении, написании «бизнес-кода», а не «сервиса фабрики сервисов фабрик моделей сервисов». Пример такого простого приложения — на видео. Ну что, поехали?
Предпосылки к задаче
Я люблю читать книги с телефона и люблю твитить из этих книг цитаты. Но поскольку эти книги как правило содержат цитаты длиной более чем 140 символов, ситуация несколько раздражала. Решить проблему можно было бы двумя путями:
Что можно узнать из получившегося проекта
Бенефиты Kotlin
Нужно объявить просто POJO-класс с readonly полям? Легко.
Самостоятельно объявлять тип переменных? Но зачем, если компилятор может вывести их за вас!
Причем var — это переменная, а val — это final объект, так что случайно вам её иным значением не заменить.
Так же код позволяют сократить операторы вроде with:
Или возможность втыкать переменные внутри строки без функции format или аналогичной по смыслу:
Callback’и для кликов тоже назначаются достаточно более коротким кодом:
И как вы наверное уже заметили их примеров выше, оператор «new» тоже упразднён.
Ещё мне понравилась возможность объявлять функции без классов как альтернатива статическим методам, которых в Kotlin, как я понял, нет.
А ещё под Kotlin+Android у Kotlin есть такая классная штука — Kotlin Android Extensions. Она позволяет забыть findViewById() как страшный сон и делать следующий финт ушами:
На порядок удобнее, чем аннотации RoboGuice.
Пожалуй единственное, что мне показалось странным — формат досрочного выхода из CallBack’а:
Используем Gradle
Сегодня сборка Android-приложений с помощью Gradle считается стандартом. Правда немного напрягает то, что разработка Groovy лежащего в основе Gradle остановлена (?) в начале года. Ну да ладно, побудем оптимистами. Минимальный скрипт сборки приложения (в debug- и release-сборке) выглядит вот так.
К слову, крайне рекомендую использовать proguard для сборки релизной версии — без неё у меня Kotlin-приложение весило раз в 5 больше, чем аналогичное Java-приложение. После обработки proguard’ом же разница в размере была в 100 килобайт или около того. В proguard-правила для сборки пришлось добавить всего одно правило:
Впрочем при сборке того же скрипта не из консоли, а из например IntelliJ IDEA вы наткнётесь на проблему — консоли для ввода пароля для сертификата у вас в этом случае нет. Для данной проблемы вроде как есть решение — но мне оно не подошло, при попытке его использовать я получил ошибку:
Возможно, вам повезёт больше и вы поможете найти мне ошибку? Версии библиотек, Java и самой IDE самые свежие.
Локальные решения и выводы
Перечислять особенности же функций вычисления размера шрифта для вписывания текста в прямоугольник или расшаривания приложения я не буду — всё есть в исходниках описанного приложения на GitHub’е.
В общем, как по мне, на Kotlin код получается более лаконичным и простым, так что для своих небольших проектов я его использовать (как и делиться исходниками) продолжу и дальше. Если вам показалось, что я не использовал в этом приложении ещё какие-либо классные (и уместные) возможности Kotlin или Gradle — жду pull-request’ов и комментариев!
* слава очень ограниченная, статья с перечислением килотонн подводных камней уже в пути
Исходники приложений на kotlin
Введение в Android
Скачивание и установка Android Studio
Android Studio — специальная среда разработки под Android. Основана на IntelliJ IDEA, поэтому пользовательский интерфейс очень похож.
Скачать Android Studio можно с официального сайта для разработчиков под Android: developer.android.com: https://developer.android.com/studio.
Устанавливается стандартным образом для каждой из поддерживаемых операционных систем (Windows, Linux, macOS).
Инструкцию можно найти здесь: https://developer.android.com/studio/install.
Создание первого приложения
Для создания нового проекта необходимо выполнить следующие шаги:
Проект нового приложения создан. Для его запуска необходимо либо подключить реальное Android-устройство, либо установить и запустить эмулятор.
Для установки эмулятора необходимо выполнить следующие шаги в рамках Android Studio:
Эмулятор создан. Можно его запустить, нажав на кнопку «Run» в окне «AVD Manager».
Подключение реального устройства
Для подключения реального устройства необходимо:
Запуск приложения на эмуляторе и устройстве
Для запуска приложения необходимо сперва выбрать устройство (слева от кнопки «Run»), на котором будет выполнен запуск, а затем нажать кнопку «Run».
Изучим структуру проекта приложения.
Вкладка «Project» на панели слева отображает структуру проекта. Режим «Android» не отображает реальную структуру проекта, но он удобен для разработки. Режим «Project» отображает реальную структуру проекта в файловой системе.
Рассмотрим структуру проекта в режиме «Android».
На верхнем уровне проект отображает свои модули и список Gradle-скриптов. Проект может содержать более, чем один модуль, но по-умолчанию у него есть хотя бы один модуль app с исходным кодом приложения. Gradle-скрипты — это сборочные скрипты проекта, описывающие этапы сборки, зависимости и другую необходимую для сборки проекта информацию. О них позже.
Модуль app содержит разделы:
Манифест AndroidManifest.xml располагается в корневом каталоге проекта. Он содержит важную информацию о приложении, которая требуется системе Android для выполнения какого-либо кода приложения. Среди прочего файл манифеста выполняет следующее:
Приложение Dice Roller
В качестве простейшего примера создадим приложение «Dice Roller», которое будет иметь один единственный экран с изображением игрального кубика и кнопкой для имитации броска.
Заготовка для приложения уже создана. Далее необходимо:
Готовый пример располагается в каталоге рядом с данным конспектом.
Игральный кубик содержат точки в диапазоне от 1 до 6. Таким образом кнопка для имитации броска должна генерировать случайное число от 1 до 6.
Сперва рассмотрим добавление кнопки без добавления изображения, а для проверки работы кнопки необходимо подготовить текстовое поле для отображения числа от 1 до 6.
1. Изменение текста и его размера на экране (activity_main.xml):
2. Добавление кнопки (тега Button ):
3. Расположение элементов в центре экрана:
Обработка нажатия на кнопку
1. Установка идентификатора кнопки:
2. Получение экземпляра кнопки по ее идентификатору:
3. Установка обработчика события onClick :
Обработчик нажатия на кнопку описывает генерацию случайного числа от 1 до 6, получение экземпляра текстового поля по идентификатору result_text (предварительно идентификатор должен быть добавлен к компоненту TextView ), и установку сгенерированного числа в качестве текста.
Если запустить приложение, можно убедиться, что нажатие на кнопку «Roll» меняет значение числа на экране.
Добавление изображения костей
1. Добавление изображений в каталог drawable :
2. Замена TextView на ImageView :
3. Замена получения экземпляра TextView на ImageView :
4. Обновление обработчика нажатия на кнопку «Roll»:
Сборка и управление зависимостями
Сборкой Android-приложений занимается утилита Gradle. Кроме сборки Gradle отвечает за следующее:
Gradle-файл проекта определяет репозитории и зависимости общие для всех модулей в проекте.
Репозитории — хранилища, в которых будут искаться добавляемые зависимости.
Зависимости — библиотеки или инструменты, которые необходимы для работы проекта.
Пример build.gradle для модуля app представлен ниже.
Блок plugins описывает плагины, которые должны быть включены в проект:
Блок android описывает параметры сборки проекта под Android:
Блок dependencies описывает зависимости от библиотек, необходимых приложению. Зависимости задаются идентификаторами библиотек в репозиториях, включенных в Gradle-файле проекта.
Исходники приложений на kotlin
Awesome Android Kotlin Apps
👓 A curated list of awesome android kotlin apps by open-source contributors.
Awesome Android Kotlin Apps aims to be the starting point for developers to find an Android app with a particular Tech Stack / Libraries.
🔃 Last updated : Fri Dec 03 06:02:38 UTC 2021
Jetpack Compose Apps
Name | Author ✍️ | Description 🗒️ | Reputation 💪 |
---|---|---|---|
awesome-jetpack-compose-android-apps | androiddevnotes | 👓 A curated list of awesome Jetpack Compose android apps by open-source contributors. |
Last commit: 4 weeks ago
🍴 49
👁️ 11
Name | Author ✍️ | Description 🗒️ | Reputation 💪 |
---|---|---|---|
fenix | mozilla-mobile | Firefox for Android |
Tech Stack : Coroutines, Testing, Retrofit, Room, Firebase Perf, WorkManager, Paging, Navigation, LiveData, ViewModel
Last commit: 4 hours ago
🍴 117
👁️ 22
Tech Stack : LiveData, ViewModel, WebKit, APK Parser, libsu
Last commit: 5 hours ago
🍴 10
👁️ 5
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, Firebase Messaging, WorkManager, Navigation, Dynamicanimation, LiveData, ViewModel
Last commit: 5 hours ago
🍴 19
👁️ 14
Tech Stack : Dagger Hilt, Testing, Coroutines + Flow, Retrofit, Room, LiveData, ViewModel, Paging, Navigation
Last commit: 11 hours ago
🍴 5
👁️ 1
Tech Stack : Koin, Espresso, UiAutomator, Mockk, Coroutines, Navigation, Room, MotionLayout, KTX, Modularization, Dynamic Delivery, Dark Theme, klint, Detekt, codebeat, CodeFactor, Codacy, MPAndroidChart, Groupie, LiveData, ViewModel
Last commit: 12 hours ago
🍴 55
👁️ 14
Tech Stack : LiveData, Navigation Jetpack, ViewModel, Room, Gradle Kotlin DSL, Databinding, Retrofit, Koin and Ktlint
Last commit: 1 day ago
🍴 183
👁️ 23
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Data Binding, Navigation, LiveData, ViewModel
Last commit: 1 day ago
🍴 8
👁️ 2
Tech Stack : Room, LiveData, ViewModel
Last commit: 2 days ago
🍴 16
👁️ 6
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, WorkManager, Navigation, LiveData, ViewModel
Last commit: 2 days ago
🍴 23
👁️ 3
Tech Stack : Dagger, Coroutines, RxJava, Testing, Retrofit, Room, Firestore, Firebase-ML, Firebase-Analytics, Paging, Navigation, LiveData, ViewModel
Last commit: 2 days ago
🍴 8
👁️ 7
Tech Stack : Koin, RxJava, Room, Paging, Navigation, Epoxy, LiveData, ViewModel
Last commit: 3 days ago
🍴 43
👁️ 12
Tech Stack : Dagger Hilt, Coroutines, Testing, Retrofit, Room, Data Binding, LiveData, ViewModel
Last commit: 3 days ago
🍴 575
👁️ 201
Tech Stack : Dagger, Coroutines, RxJava, Retrofit, Realm, Firebase Messaging, Paging, Navigation, Facebook, FlowLayout, LiveData, ViewModel
Last commit: 4 days ago
🍴 413
👁️ 60
Tech Stack : Kodein, Coroutines, Testing, Retrofit, Room, WorkManager, Exoplayer, Navigation, Tikxml, LiveData, ViewModel
Last commit: 4 days ago
🍴 51
👁️ 27
Tech Stack : Koin, Coroutines, Retrofit, Room, Lottie, Zoomy, Navigation, LiveData, ViewModel
Last commit: 5 days ago
🍴 14
👁️ 3
Tech Stack : Dagger, Retrofit, Coroutines, RXJava2, ViewModel, Data Binding
Last commit: 6 days ago
🍴 20
👁️ 7
Tech Stack : Coroutines, Testing, Retrofit, Room, Firebase Perf, WorkManager, Paging, Navigation, LiveData, ViewModel
Last commit: 1 week ago
🍴 949
👁️ 185
Tech Stack : Coroutines, Testing, Retrofit, WorkManager, GSYVideoPlayer, Data Binding, PermissionX, EventBus, LiveData, ViewModel
Last commit: 2 weeks ago
🍴 316
👁️ 27
Tech Stack : LiveData, ViewModel
Last commit: 2 weeks ago
🍴 15
👁️ 7
Tech Stack : Dagger, Coroutines, RxJava, Testing, Retrofit, Room, WorkManager, Data Binding, ShortcutBadger, LiveData, ViewModel
Tech Stack : Dagger, Coroutines, RxJava, Testing, Room, Firebase Messaging, WorkManager, Dropbox, Calendar view, Paging, Biometric, LiveData, ViewModel
Last commit: 2 weeks ago
🍴 51
👁️ 9
Tech Stack : Retrofit, RxJava, Epoxy, ViewModel, LiveData, Navigation, Realm, ExoPlayer v2.0, Glide
Last commit: 3 weeks ago
🍴 152
👁️ 110
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, WorkManager, Paging, Data Binding, Navigation, Algolia Search, LiveData, ViewModel
Last commit: 3 weeks ago
🍴 110
👁️ 17
Tech Stack : Hilt, Coroutines + Flow, UI Testing, Room, ViewModel, WorkManager, Apollo
Last commit: 3 weeks ago
🍴 15
👁️ 5
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, WorkManager, Data Binding, Navigation, LiveData, ViewModel
Last commit: 3 weeks ago
🍴 14
👁️ 5
Tech Stack : Coroutines + Flow, SQLDelight, Kotlin Serialization, Klock, Brackeys-IDE EditorKit
Last commit: 3 weeks ago
🍴 18
👁️ 5
Tech Stack : Dagger Hilt, Coroutines, Testing, Retrofit, Room, ExoPlayer, WorkManager, Data Binding, Navigation, LiveData, ViewModel, Compose
Last commit: 4 weeks ago
🍴 7
👁️ 4
Tech Stack : Koin, RxJava, Testing, Retrofit, Room, Stripe, PayPal, Mapbox, Paging, Data Binding, Navigation, LiveData, ViewModel
Last commit: 1 month ago
🍴 567
👁️ 36
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, Firestore, Firebase In-App Messaging, Paging, Navigation, Google Play Billing, Muzei, LiveData, ViewModel
Last commit: 1 month ago
🍴 93
👁️ 15
Tech Stack : Koin, Coroutines, Testing, Retrofit, Jsoup, WorkManager, Data Binding, Navigation, LiveData, ViewModel
Last commit: 1 month ago
🍴 7
👁️ 1
Tech Stack : Dagger, Coroutines, RxJava, Testing, Retrofit, Realm, ExoPlayer, Conductor, Data Binding, ShortcutBadger, LiveData, ViewModel
Last commit: 1 month ago
🍴 985
👁️ 132
Tech Stack : Koin dependency injection, Coroutines, Realm db, Material Components, Markdown, Navigation, LiveData, ViewModel
Last commit: 1 month ago
🍴 9
👁️ 1
Tech Stack : Dagger Hilt, Coroutines, Retrofit, Room, Paging, Navigation, LiveData, ViewModel
Last commit: 1 month ago
🍴 34
👁️ 4
Tech Stack : Koin, Coroutines, RxJava, Testing, Retrofit, Room, Paging, Data Binding, Easy Permissions, Navigation, LiveData, ViewModel
Tech Stack : Dagger Hilt, Coroutines, Testing, Retrofit, Room, LiveData, ViewModel
Last commit: 2 months ago
🍴 338
👁️ 52
Tech Stack : Dagger, Room, Coroutines, Firebase Messaging, Navigation, LiveData, ViewModel
Last commit: 3 months ago
🍴 21
👁️ 3
Tech Stack : ViewModel, LiveData, Coroutines, Firebase Cloud Messaging, Retrofit, Room, Glide, Dagger Hilt, and Google Material.
Last commit: 3 months ago
🍴 1
👁️ 1
Tech Stack : Koin, JSoup, Navigation, LiveData, ViewModel
Last commit: 3 months ago
🍴 140
👁️ 87
Tech Stack : Dagger Hilt, Coroutines, Testing, Room, Firestore, Firebase Auth, Firebase Messaging, Firebase Functions, Navigation, ARCore, LiveData, ViewModel
Last commit: 3 months ago
🍴 6195
👁️ 1469
Tech Stack : Koin, Coroutines, Testing, Retrofit, Navigation, FlowLayout, LiveData, ViewModel
Last commit: 3 months ago
🍴 207
👁️ 19
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, Navigation, Paging, Data Binding, LiveData, ViewModel
Last commit: 3 months ago
🍴 341
👁️ 89
Tech Stack : Dagger Hilt, Coroutines + Flow, ViewModel, Retrofit, Room, Navigation
Last commit: 4 months ago
🍴 3
👁️ 1
Tech Stack : Dagger Hilt, Coroutines, Retrofit, Room, ARCore, Sceneform, ViewModel, Data Binding, LiveData.
Last commit: 4 months ago
🍴 36
👁️ 13
Tech Stack : Coroutines, Room, JSoup, Navigation, LiveData, ViewModel
Last commit: 4 months ago
🍴 49
👁️ 13
Tech Stack : Dagger Hilt, Coroutines, Testing, Retrofit, Room, WorkManager, Navigation, insetter, LiveData, ViewModel
Last commit: 4 months ago
🍴 40
👁️ 9
Tech Stack : Dagger, Coroutines, RxJava, Testing, Retrofit, Room, Firestore, Firebase Auth, Firebase Messaging, WorkManager, Navigation, LiveData, ViewModel
Last commit: 4 months ago
🍴 68
👁️ 15
Tech Stack : Dagger Hilt, Coroutines, Room, Dhaval2404/ImagePicker, Subsampling Scale Image View, Navigation, LiveData, ViewModel
Last commit: 4 months ago
🍴 3
👁️ 1
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, Navigation, LiveData, ViewModel
Last commit: 5 months ago
🍴 13
👁️ 5
Tech Stack : Dagger Hilt, Coroutines, RxJava, Testing, Retrofit, Room, Paging, Navigation, LiveData, ViewModel
Last commit: 5 months ago
🍴 264
👁️ 43
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, LiveData, ViewModel
Last commit: 6 months ago
🍴 31
👁️ 10
Tech Stack : Dagger Hilt, Coroutines, Flow, Jetpack (Room, ViewModel,Navigation LiveData), Retrofit, Paging, Testing
Last commit: 6 months ago
🍴 5
👁️ 2
Tech Stack : Retrofit, Firebase Auth, Coroutines, LiveData, ViewModel
Last commit: 7 months ago
🍴 16
👁️ 2
Tech Stack : Coroutines, Retrofit, Room, LiveData, ViewModel
Last commit: 8 months ago
🍴 41
👁️ 6
Tech Stack : Dagger, Coroutines, Testing, Navigation, ColorPicker, ViewModel
Last commit: 8 months ago
🍴 10
👁️ 3
Tech Stack : Dagger Hilt, Coroutines, Retrofit, Room, LiveData, ViewModel, Paging, Navigation, DataStore
Last commit: 8 months ago
🍴 11
👁️ 3
Tech Stack : Koin, Testing, Room, Firebase Storage, Firebase Auth, Firebase Messaging, Firebase Perf, Firebase Functions, Navigation, LiveData, ViewModel
Last commit: 8 months ago
🍴 67
👁️ 8
Tech Stack : Coroutines, Testing, Fuel, Room, WorkManager, Data Binding, Navigation, LiveData, ViewModel
Last commit: 9 months ago
🍴 16
👁️ 3
Tech Stack : Dagger Hilt, Coroutines + Flow, MPAndroidChart, Retrofit, LiveData, ViewModel
Last commit: 9 months ago
🍴 4
👁️ 1
Tech Stack : Dagger Hilt, Coroutines, Flows, Retrofit, Room, Material Design Components, Navigation, LiveData, ViewModel
Last commit: 9 months ago
🍴 22
👁️ 8
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, Google Auth, Data Binding, Navigation, LiveData, ViewModel
Last commit: 9 months ago
🍴 39
👁️ 15
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, WorkManager, MPAndroidChart, Navigation, LiveData, ViewModel
Last commit: 9 months ago
🍴 7
👁️ 2
Tech Stack : Koin, Coroutines, RxJava, Retrofit, Room, Navigation, Markwon, LiveData, ViewModel
Last commit: 10 months ago
🍴 8
👁️ 3
Tech Stack : Dagger, Coroutines, RxJava, Testing, Retrofit, Room, Firestore, Firebase Auth, Facebook Login, WorkManager, MPAndroidChart, Data Binding, Navigation, LiveData, ViewModel
Last commit: 10 months ago
🍴 7
👁️ 2
Tech Stack : Koin, Coroutines, Testing, Room, Data Binding, AR, LiveData, ViewModel
Last commit: 10 months ago
🍴 6
👁️ 62
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, LiveData, ViewModel
Last commit: 11 months ago
🍴 8
👁️ 3
Tech Stack : Koin, RxJava, Testing, Scarlet, Room, Data Binding, LiveData, ViewModel
Last commit: 11 months ago
🍴 7
👁️ 2
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, Navigation, Data Binding, LiveData, ViewModel
Last commit: 11 months ago
🍴 17
👁️ 4
Tech Stack : Koin, Coroutines, Retrofit, Room, Firebase Messaging, Firebase Auth, WorkManager, Google Maps, Paging, JSoup, vanniktech/Emoji, afollestad/inline-activity-result, LiveData, ViewModel
Last commit: 11 months ago
🍴 37
👁️ 5
Tech Stack : Dagger Hilt, Coroutines, Testing, Retrofit, Room, Paging, Navigation, LiveData, ViewModel
Last commit: 12 months ago
🍴 46
👁️ 13
Tech Stack : Dagger Hilt, Coroutines, Retrofit, Room, Firestore, WorkManager, Navigation, MPAndroidChart, LiveData, ViewModel
Last commit: 12 months ago
🍴 31
👁️ 3
Tech Stack : Dagger, Coroutines, Testing, socketIO, Retrofit, Room, MPAndroidChart, Navigation, LiveData, ViewModel
Last commit: 12 months ago
🍴 1
👁️ 2
Tech Stack : Coroutines, Testing, Room, Google Drive, Dropbox, WorkManager, Navigation, LiveData, ViewModel
Last commit: 1 year ago
🍴 15
👁️ 1
Tech Stack : Retrofit, Room, Paging, LiveData, ViewModel
Last commit: 1 year ago
🍴 2
👁️ 0
Tech Stack : Dagger, Coroutines, RxJava, Retrofit, Room, Firestore, WorkManager, Paging, Data Binding, Navigation, JSoup, js-evaluator-for-android, LiveData, ViewModel
Last commit: 1 year ago
🍴 80
👁️ 18
Tech Stack : Kodein, Coroutines, Retrofit, Room, WorkManager, Navigation, Markwon, LiveData, ViewModel
Last commit: 1 year ago
🍴 6
👁️ 3
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, WorkManager, Navigation, LiveData, ViewModel
Last commit: 1 year ago
🍴 17
👁️ 8
Tech Stack : LiveData, ViewModel, Navigation Components, CameraKit, Firebase ML Kit Text Recognition API, Glide, Volley, Lottie
Last commit: 1 year ago
🍴 1
👁️ 1
Tech Stack : LiveData, ViewModel, Retrofit, Room, Koin, RxJava, etc
Last commit: 1 year ago
🍴 3
👁️ 1
Tech Stack : ViewModel, LiveData, Koin, Room db, Coroutines etc
Last commit: 1 year ago
🍴 1
👁️ 2
Tech Stack : LiveData, Koin, RxJava, RxBinding, Offline first with simple caching, Spek2Framwework for Unit Testing, etc
Last commit: 1 year ago
🍴 115
👁️ 12
Tech Stack : Coroutines, RxJava, Retrofit, Room, WorkManager, Paging, Navigation, Data Binding, ARouter, LiveData, ViewModel
Last commit: 1 year ago
🍴 31
👁️ 5
Tech Stack : Dagger, Coroutines, Testing, Room, LiveData, ViewModel
Last commit: 1 year ago
🍴 3
👁️ 3
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, MPAndroidChart, LiveData, ViewModel
Last commit: 1 year ago
🍴 7
👁️ 2
Tech Stack : Coroutines, Retrofit, Firestore, Firebase Auth, Firebase Messaging, Firebase Storage, Cloud Functions, Data Binding, Navigation, LiveData, ViewModel
Tech Stack : Dagger, RxJava, Testing using Fakes, MockWebserver, RxRetrofit, Room, Navigation Components, Lottie, LiveData, ViewModel
Last commit: 1 year ago
🍴 1
👁️ 2
Tech Stack : Dagger Hilt, Room, Navigation, LiveData, ViewModel
Last commit: 1 year ago
🍴 7
👁️ 2
Tech Stack : Dagger Hilt, Koin, Coroutines, RxJava, Testing, Retrofit, Room, WorkManager, Paging, LiveData, ViewModel
Last commit: 1 year ago
🍴 0
👁️ 1
Tech Stack : Dagger, Coroutines, RxJava, Room, Venom, LiveData, ViewModel
Last commit: 1 year ago
🍴 4
👁️ 2
Tech Stack : Koin, Coroutines, Testing, Retrofit, Data Binding, Sandwich, LiveData, ViewModel
Last commit: 1 year ago
🍴 3
👁️ 3
Tech Stack : Dagger, Coroutines, Retrofit, Room, WorkManager, Paging, Data Binding, Navigation, LiveData, ViewModel
Last commit: 1 year ago
🍴 2
👁️ 1
Tech Stack : RxJava, Testing, Room, Firebase Storage, Firebase Auth, Firebase Messaging, Firebase Perf, Firebase Functions, Navigation, LiveData, ViewModel
Last commit: 1 year ago
🍴 68
👁️ 28
Tech Stack : RxJava, Testing, Retrofit, Room, ExoPlayer, LiveData, ViewModel
Last commit: 1 year ago
🍴 90
👁️ 17
Tech Stack : Coroutines, Retrofit, Room, Pretty Time, LiveData, ViewModel
Last commit: 2 years ago
🍴 2
👁️ 1
Tech Stack : Dagger, Coroutines, RXJava2, ViewModel, Data Binding, LiveData.
Tech Stack : Coroutines, Retrofit, Room, LiveData, ViewModel
Last commit: 2 years ago
🍴 0
👁️ 0
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, Data Binding, Navigation, LiveData, ViewModel
Last commit: 2 years ago
🍴 98
👁️ 16
Tech Stack : Dagger, Retrofit, Room, WorkManager, Navigation, android-upload-service, LiveData, ViewModel
Tech Stack : Coroutines, Retrofit, Room, Algolia, LocGetter, EasyValidation, Dexter, Splashy, secure-preferences, Paging, Data Binding, Navigation, LiveData, ViewModel
Last commit: 2 years ago
🍴 4
👁️ 3
Tech Stack : Coroutines, Retrofit, Room, Firestore, Firebase Auth, Firebase Messaging, Facebook Login, WorkManager, Dexter, Data Binding, Navigation, LiveData, ViewModel
Last commit: 2 years ago
🍴 5
👁️ 1
Tech Stack : Dagger, RxJava, Room, WorkManager, Data Binding, RxPermissions, LiveData, ViewModel
Last commit: 2 years ago
🍴 83
👁️ 21
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, WorkManager, Exoplayer, Navigation, Android-Permissions, LiveData, ViewModel
Tech Stack : Koin, RxJava, Room, Firestore, Firebase Auth, Firebase Storage, Firebase Messaging, WorkManager, Data Binding, Paging, LiveData, ViewModel
Last commit: 2 years ago
🍴 8
👁️ 3
Tech Stack : Dagger, Coroutines, Retrofit, Room, WorkManager, Data Binding, MPAndroidChart, Navigation, LiveData, ViewModel
Tech Stack : Dagger, RxJava, Testing, Retrofit, Room, Data Binding, LiveData, ViewModel
Last commit: 3 years ago
🍴 123
👁️ 20
Tech Stack : Testing, Fuel, Room, WorkManager, Navigation, PermissionsDispatcher, LiveData, ViewModel
Last commit: 3 years ago
🍴 12
👁️ 3
Name | Author ✍️ | Description 🗒️ | Reputation 💪 |
---|---|---|---|
android-showcase | igorwojda | 💎 Android application following best practices: Kotlin, Coroutines, JetPack, Clean Architecture, Feature Modules, Tests, MVVM, DI, Static Analysis. |
Tech Stack : Kodein, Coroutines, Testing, Retrofit, KAndroid, Lottie, Detekt, Navigation, Dynamic Feature Modules, LiveData, ViewModel
Last commit: 4 days ago
🍴 708
👁️ 138
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Data Binding, Navigation, LiveData, ViewModel
Tech Stack : Kotlin, Coroutines, Flow, Dagger-Hilt, Kotlin-DSL, LiveData, Lifecycle, ViewModel, Room, Navigation, Data Binding, Material-Components, Retrofit, OkHttp, Moshi, Timber, Glide
Last commit: 2 weeks ago
🍴 5
👁️ 2
Tech Stack : Dagger, RxJava, Testing, Retrofit, Room, Navigation, Data Binding, LiveData, ViewModel
Tech Stack : Dagger, Unit Testing for modules, Mockito, RxJava, Retrofit, Room, CI-CD, SOLID, Code Coverage, Jacoco, Detekt, ktlint, Stetho, LiveData, ViewModel
Last commit: 2 months ago
🍴 40
👁️ 6
Tech Stack : Koin, Retrofit, Room, Data Binding, LiveData, View Model, Work Manager, Material Components
Last commit: 3 months ago
🍴 39
👁️ 6
Tech Stack : RxJava3, Coroutines Flow, Retrofit, Room, Dagger Hilt, Dynamic Feature Modules, ConcatAdapter, LiveData, ViewModel, SavedStateHandle, WorkManager, Glide, Lottie, MpCharts, MockWebServer, MockK, FlowTestObserver, ktLint, detekt, Git Hooks, Git Flow
Last commit: 4 months ago
🍴 26
👁️ 13
Tech Stack : Navigation Component, Dagger, Coroutines Flow, Room, Retrofit, LiveData, ViewModel, View Binding, Dynamic Feature Modules.
Tech Stack : Koin, Coroutines, Testing, Retrofit, Room, Data Binding, Motion Layout, LiveData, ViewModel
Last commit: 6 months ago
🍴 82
👁️ 23
Tech Stack : Dagger Hilt, Testing, RxJava, Retrofit, AssistedInject, Epoxy, RxPaper, MvRx, ViewModel
Last commit: 1 year ago
🍴 1
👁️ 1
Tech Stack : Dagger Hilt, Coroutines, Testing, Retrofit, Room, Navigation, LiveData, ViewModel
Last commit: 1 year ago
🍴 12
👁️ 10
Tech Stack : Koin, Coroutines, RxJava, Retrofit, Room, Firestore, Firebase Auth, Firebase Storage, WorkManager, Navigation, Paging, LiveData, ViewModel
Last commit: 18 hours ago
🍴 24
👁️ 5
Tech Stack : Dagger, Coroutines, Retrofit, Room, Navigation, LiveData, ViewModel
Last commit: 4 weeks ago
🍴 200
👁️ 27
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, WorkManager, acra, fastAdapter, Paging, JSoup, dropbox/Store, LiveData, ViewModel
Last commit: 4 months ago
🍴 2
👁️ 5
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, WorkManager, Data Binding, Navigation, LiveData, ViewModel
Last commit: 2 years ago
🍴 6
👁️ 1
Name | Author ✍️ | Description 🗒️ | Reputation 💪 |
---|---|---|---|
StarWarsSearch-MVI | Ezike | Star wars sample android project showcasing the use of View components for rendering UI in Fragments and Activities. Uses Android Jetpack, clean architecture with MVI (Uni-directional data flow), dagger hilt, and kotlin coroutines with StateFlow |
Tech Stack : Jetpack, Dagger hilt, Coroutines & StateFlow, Room, Retrofit, FlowBinding
Last commit: 2 weeks ago
🍴 22
👁️ 6
Tech Stack : Dagger hilt, Coroutines & StateFlow, Unit Testing, Retrofit, DFM Navigation, FlowBinding, Exoplayer
Last commit: 3 months ago
🍴 73
👁️ 11
Tech Stack : Dagger, RxJava, Retrofit, Room, Clean Architecture, LiveData, ViewModel
Last commit: 4 months ago
🍴 45
👁️ 15
Tech Stack : Dagger, Coroutines, Testing, Retrofit, Room, Firestore, Firebase Auth, Navigation, Markdown Processor, LiveData, ViewModel
Last commit: 8 months ago
🍴 101
👁️ 12
Name | Author ✍️ | Description 🗒️ | Reputation 💪 |
---|---|---|---|
tachiyomi | tachiyomiorg | Free and open source manga reader for Android. |
Tech Stack : Inorichi injekt, Coroutines, RxJava, Testing, Retrofit, DiskLruCache, Jsoup, WorkManager, Duktape Android, Conductor
Last commit: 7 hours ago
🍴 1710
👁️ 516
Tech Stack : Clean Architecture, Coroutines, RxJava 2, Coroutines, Toothpick, Moxy, Unit-tests (Spek, Mockk), UI-tests (Kaspresso)
Last commit: 10 months ago
🍴 5
👁️ 3
Name | Author ✍️ | Description 🗒️ | Reputation 💪 |
---|---|---|---|
shadowsocks-android | shadowsocks | A shadowsocks client for Android |
Tech Stack : Testing, Room, Firebase Ads, WorkManager
Last commit: 2 months ago
🍴 11524
👁️ 1629
Tech Stack : Dagger, Coroutines, Room, Firebase Auth, Firebase Database, Paging, Navigation, Evernote android-job, Facebook Litho, Facebook SoLoader, Biometric
Last commit: 11 months ago
🍴 93
👁️ 19
Tech Stack : Room, Play Install Referrer Library
Last commit: 1 year ago
🍴 1
👁️ 1
Contributors are cool people.
If you contributed and are missing in this list, please send a PR including your entry in the list below! 🐣
About
👓 A curated list of awesome android kotlin apps by open-source contributors.