Дизайн

При разработке дизайна за основу были взяты наработки от предыдущих версий, а также Material design guidelines. Цветовая палитра белый-черный-розовый.

Для разработки всех экранов и элементов в приложении используется библиотека Android support library. Библиотека содержит все элементы, предусмотренные гайдлайном Material, а также инструменты для работы со списками, таблицами и анимациями.

Кроме того в приложении используются нестандартные элементы библиотеки, такие как CoordinatorLayout и FloatingActionButton. CoordinatorLayout позволяет реализовать поведение экрана, как на рисунках 23 и 24, когда заголовок экрана “заезжает” за основной список.

Экран события - 1

Рисунок 19. Экран события - 1

Экран события - 2

Рисунок 20. Экран события - 2

Мой профиль-1

Рисунок 21. Мой профиль-1

Мой профиль-2

Рисунок 22. Мой профиль-2

Первый вариант дизайна -1

Рисунок 23. Первый вариант дизайна -1

Первый вариант дизайна -2

Рисунок 24. Первый вариант дизайна -2

Работа с сетью

Для реализации описанных в предыдущей главе механизмов работы с сетью используется библиотека Retrofit, являющаяся распространенным решением для работы с сетью и применяемая многими, как крупными, так и маленькими компаниями.

Для работы с JSON файлами используется библиотека Gson от Google, также являющаяся одним из самых распространенных решений.

Для описания запросов в Retrofit используется следующий формат описания метода интерфейса:

@<Операция(GET, POST)>("<url запроса без учета базового адреса сервера(он указывается при создании объекта для работы с интерфейсом)>")

Call<[Тип возвращаемого значения]> [Имя метода](@Query("api_token") String token - параметры запроса);

После описания интерфейса сервера с помощью этого шаблона, необходимо создать объект для работы с сетью и подключить к нему интерфейс

Retrofit retrofit = new Retrofit.Builder()

.client(initClient(context))

.baseUrl(ServerConfig.INSTANCE.getApiURL())

.addConverterFactory(GsonConverterFactory.create())

.build();

apiService = retrofit.create(ApiEndpoints.class);

Далее в коде можно обращаться к этому синглтону для вызова методов интерфейса.

Для реализации long polling запросов необходимо поставить timeout запроса на 60 секунд.

Тем самым мы получим необходимое поведение запроса, при котором приложение будет ждать ответа сервера в течение минуты, а не мгновенно.

В приложении запросы long polling работают следующим образом: при входе на экран события (запросы long polling используются в приложении для работы комментариев на экране события) приложение отправляет инициирующий запрос на сервер. После этого каждые 60 секунд запрос завершается и сервер присылает либо пустой ответ либо список новых комментариев. После этого запрос реинициируется и снова ждет 60 секунд. При выходе из экрана приложение отправляет запрос на прекращение связи с сервером и подключение закрывается.

Для работы с сокетами в приложении используется библиотека Android Async. Библиотека позволяет отправлять как стандартные http запросы, так и работать со всеми видами сокетов - udp, tcp и web socket.

В приложении используются udp сокеты, так как они позволяют не поддерживать постоянное подключение к сети. Приложение подключается к сокету при входе на экран диалогов. Здесь через сокет приходит информация о всех диалогах для live обновления списка диалогов в случае получения нового сообщения. При входе на экран сообщений в конкретном диалоге приложение подключается к сокету для общения с конкретным пользователем и через сокет приходят сообщения только этого пользователя.

Для обработки push уведомлений используется Firebase Cloud Messaging - основной и один из лучших, а главное бесплатный инструмент для работы с push уведомлениями.

Интерфейс диалогов

Рисунок 14. Интерфейс диалогов

Уведомления

Рисунок 15. Уведомления

В коде необходимо реализовать специальный Broadcast Receiver для обработки уведомлений. В качестве обертки над Firebase используется сервис Airship. Сервис является платным, однако решает основные проблемы Firebase и добавляет больше возможностей. Во первых сервис обеспечивает гарантированную доставку push уведомлений, так как стандартный интерфейс Firebase не гарантирует их доставку пользователю. Во вторых Airship позволяет разделить уведомления на категории, а также отправлять их по местоположению. Кроме того Airship позволяет просмотреть статистику уведомлений.

@Override

protected void onPushReceived(@NonNull Context context, @NonNull PushMessage message, boolean notificationPosted) {

try {

Bundle bundle = message.getPushBundle();

String action = bundle.getString("action", "null");

int count = Integer.parseInt(bundle.getString("count", "0"));

switch (action) {

case "FRIEND_REQUEST": {

UnreadIndicators.friends = count;

break;

}

case "INVITE": {

UnreadIndicators.offers = count;

break;

}

case "NEW_SUBMISSION": {

UnreadIndicators.offers = count;

break;

}

}

EventBus.getDefault().post(new BaseActivity.MessageEvent());

} catch (Exception e) {

}

}

В нашем случае уведомления разделены на 3 категории: запросы в друзья, заявки на события и приглашения. На основе этих категорий приложение понимает какой именно индикатор непрочитанных уведомлений в основном меню необходимо обновить. Обновление происходит с помощью библиотеки EventBus.

EventBus - это шаблон, который реализует следующее поведение: класс подписывается на определённое событие и после этого нужные события просто добавляется в EventBus из любого участка кода и класс, подписанный на события получает мгновенное обновление информации.

В приложении таким классом является базовый класс BaseActivity, что позволяет обновлять индикаторы на любом экране в приложении.

@Subscribe(threadMode = ThreadMode.MAIN)

fun onMessageEvent(event: MessageEvent) {

try {

setIndicators()

} catch (e: Exception) {}

}

Для открытия необходимого экрана по нажатию на уведомление в приложении используется ссылка сервиса Branch.io, описанной ниже. Благодаря этому в приложении реализован универсальный обработчик нажатия на уведомление, всегда открывается ссылка, а экран, необходимый для показа пользователю выбирается посредством библиотеки Branch.io.

Также для сообщений и комментариев в приложении используется пагинация. Сервер может присылать массив сообщений или комментариев в определённом количестве или до определённой даты. Эта информация в случае необходимости отправляется вместе с запросом.

 
< Пред   СОДЕРЖАНИЕ   Загрузить   След >