Skip to content

Igorpi25/Chat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Chat

Это движок мессенжера, построенный с использованием open-source библиотек. Движок польностью модульный. Каждый модуль представляет отдельный open-source проект на Github, с описанинием и запускаемым демонстрационным приложением.

Демонстрационное приложение можете загрузить из GooglePlay

Архитектура

Мгновенная отзывчивость - это способность UI элементов на клиентском устройстве, мгновенно реагировать на изменения источников контента, расположенных на других клиентских устройствах, без необходимости запросов к серверу, и действий со стороны пользователя

Например, изменение фотографии профиля пользователя, отображается на устройствах всех пользователей мгновенно. Без необходимости перезагрузки фрагмента или активити. Изменение происходит во всех фрагментах, даже косвенно отображающих фотографию этого пользователя.

Другой пример. При получении нового сообщения, транспорт() записывает его в Sqlite БД. При записывании данных вызываетя ContentResolver, который через переданный ему URI вызывает onContentChanged в курсоре, который используется на UI фрагменте. В итоге, вызывается onLoadFinished(Loader<Cursor> loader, Cursor data) на нужном фрагменте. Таким образом UI-фрагменты мгновенно реагируют на изменения сервера.

Способ описанный выше отличается простой реализацией, надежностью. Не требует Intent и BraocastMessage чтобы ловить изменение состояния системы. Методика применения MultipleTypesAdapter дополняет этото способ, и существенно упрощает разработку.

UI

Здесь и далее, применяется единая архитектура описанная выше. Прежде чем перейти к изучению кода, автор рекомендует ознакомиться с MultipleTypesAdapter и Communicator

ConversationPrivate.java

Чат с одним человеком. При изменении состояния Sqlite БД, вызывается onLoadFinished(Loader<Cursor> loader, Cursor data). Он формирует новый MatrixCursor для адаптера. Адаптер "кушает" особым образом построееный курсор, который автор для простоты называет MatixCursor

Обратите внимание на LOADER_USERS, благодоря которым получается "мгновенная отзывчивость", на изменение профиля другого пользователя, без необходимости перезагрузить весь фрагмент. Перезагружается только нужный Loader.

ConversationGroup.java

Групповой чат, принцип работы одинаковый с чатом с одним человеком

Conversation.java

Это базовый класс для фрагментов ConversationPrivate.java и ConversationGroup.java отображающих непосредственно чат. Основную работу по отображению записей полученных из БД, делает именно этот класс

RecentList.java

Архитектура точно такая-же. Отличие данного UI фрагмента, в более сложном SQL-запросе, который расположен в ContentProvider. Т.е. на данном архитектурном уровне нет отличия от фрагментов описанных выше. Все тот же "мулти-адаптер" и "отзывчивость"

UI элементы из Profile

Contacts.java

DetailsGroup.java

DetailsUser.java

Архитектура точно такая как предыдущие. Отличие данного UI фрагмента, в более сложном SQL-запросе, который расположен в ContentProvider. Т.е. на данном архитектурном уровне нет отличия от фрагментов описанных выше. Все тот же "мулти-адаптер" и "отзывчивость"

Серверная часть

ВНИМАНИЕ! Данная библиотека - это реализация только клиентской части. Серверную часть вы можете видеть в репозитории автора на GitHub. Есть инструкция по самостоятельному запуску и настройке сервера

Клонирование из GitHub

Проект содержит много git-подмодулей, которые при неумелом использовании могут принести неприятности. Поэтому делайте как я, тогда с git-подмодулями проблем не будет

  1. Для клонирования репозитория, автор рекомендует использовать командную строку, вместо EGit Eclipse или AndroidStudio. Т.к. проект содержит настройки workspace в папке репозитория, и репозитории подмодулей находятся НЕ в ветке master, и подмодули тоже имеют свои подмодули. В командной строке выполните:

$ git clone git://github.com/Igorpi25/Chat.git Chat $ cd Chat $ git submodule update --remote --recursive --init ``` Параметры третьей строки (git submodule update --remote --recursive --init) означают: * `--remote` - подмодуль нужно скачать из ветки удаленного репозитория. Название ветки записано из файле ".submodule" в параметре `branch`. Это ветка `library`, в ветке `master` находится запускаемый демо-проект * `--recursive` - повторяй команду `git submodule update --remote --recursive --init` для всех модулей, и их вложенных подмодулей * `--init` - если подмодуль не инициализирован, то инициализируй. (во вложенных подмодулях это очень кстати, без этого нам бы пришлось вызывать `git submodule init` для каждого вложенного подмодуля)

Используемые библиотеки

Библиотеки автора

  • Connection- Диалоги ошибки соединения к интернету. Включен в составе Session
  • Session - Авторизация пользователя на сервере
  • Uploader - Отправка фотографий на сервер
  • Communicator - это архитектурно важная библиотека. Все дела с Websocket, парсинг json и т.п.
  • MultipleTypesAdapter - вся архитектура UI-элементов построена на этой библиотеке
  • Profile - профили пользователся и группы. Модуль обеспечивает элементы "социальной сети"

License

See the LICENSE file for license rights and limitations (Apache).

About

Android chat-client working on Websockets

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages