Meeting Room Little Helper

Сегодня я расскажу вам о приложении, которое создавалось в «Аркадии» для удобства бронирования переговорных комнат.

in13mzeaark_jofotlnhcini5uw.jpeg

Есть два основных сценария использования этого приложения:

1. Поиск свободной комнаты
Ежедневно в компании проходит множество митингов, переговорки бронируют менеджеры, разработчики и сотрудники HR-отдела. Поиск комнаты для митинга может быть довольно долгим и рутинным занятием. Чтобы понять, какая из комнат свободна в данный момент, необходимо зайти в календарь Outlook (или открыть дверь, отвлекая внимание участников проходящего совещания), просмотреть полное расписание по комнатам, найти свободный слот времени и создать appointment. За это время кто-то из сотрудников может забронировать комнату, и тогда необходимо начинать поиск заново. Гораздо удобнее сделать бронирование нажатием одной кнопки при помощи приложения, заранее получив подсказки о статусе комнат.

2. Ad hoc бронирование
Довольно часто возникает ситуация, когда нужно собраться минут на 15, чтобы коротко обсудить текущие задачи по проекту. В этом случае нет смысла занимать комнату на целый час, да может и не быть свободных слотов на выбранное время. Но если остаётся хотя бы 10 минут до следующего митинга, приложение позволит забронировать комнату, и для короткого митинга этого может быть вполне достаточно. Также иногда возникает ситуация, когда комната была забронирована на долгий срок, например, 2 часа, но митинг завершился раньше. В этом случае по завершении митинга можно нажать на кнопку отмены и освободить комнату.

Выбор платформы для решения


В качестве операционной системы был изначально выбран Android, так как он поддерживает кастомизацию (в том числе включение-отключение по расписанию, автозапуск приложений), и в продаже имеется большое количество моделей устройств.

Было рассмотрено несколько вариантов. В качестве информационного табло нет необходимости выбирать топовую модель планшета: на каждую комнату требуется отдельный девайс, и с ростом цены одного планшета стоимость конечного решения значительно вырастает. Но в то же время, нельзя брать самые дешёвые устройства — у них слабая, «мутная» IPS матрица, низкое разрешение, устаревшая версия ОС, и такое решение выглядело бы весьма непрезентабельно. В итоге мы сделали выбор в пользу Alcatel OneTouch Pixi 3 (10) 3G — планшета с довольно средними характеристиками: 1280×800 TFT IPS, Android 5.1, ОЗУ 1 Гб, процессор MediaTek MT8321 1300 МГц, в котором 3G модуль идёт в придачу за довольно разумную цену — около 8 тысяч рублей (на текущий момент стоимость устройства ниже).

Для блокировки аппаратных клавиш и системных элементов экрана мы заказали корпус из чёрного оргстекла. Корпус выполняет роль защитного чехла и крепления устройства на стену и имеет отверстия для установки. На данный момент установлено 5 планшетов у входа в каждую из переговорных комнат. У нас переговорки названы в честь классических языков программирования: Cobol, Prolog, Fortran, Ada, Pascal, каждая имеет собственную иконку, которая отображаются на экране рядом с номером комнаты.

cmwzfekk6fadtqi9iddmajrjjwu.png

Приложение позволяет забронировать комнату (создать appointment) на заданный промежуток времени: 15, 30, 45 мин, а также 1, 1.5, 2 часа. Если пользователь решил выбрать интервал 2 часа, а комната свободна лишь часть этого времени, то будет предложено бронирование с учётом ограничений. Нижняя панель приложения отображает текущие статусы других переговорных комнат: красный — комната занята, зелёный — свободна, и серый, если возникли проблемы при получении статуса (например, произошёл сбой при запросе статуса).

Ключевой функциональностью приложения и вау-фактором является распознавание лиц с помощью Microsoft Face API. При каждом бронировании с помощью фронтальной камеры создаётся снимок пользователя, который используется для сопоставления с предварительно обработанным списком фотографий сотрудников из Exchange. Если пользователь был успешно распознан, в названии бронирования указывается его имя, т.е. не требуется вручную вводить автора митинга, что весьма экономит время. На распознавание влияет освещённость помещения, и главное — исходная фотография пользователя, загруженная в качестве аватара.

Разработка и планирование


На этапе планирования разработки возник вопрос, какое из существующих решений для доступа использовать для бронирования комнат и получения статусов — Office 365 Android SDK или EWS API. Как оказалось, функциональность адаптированной под Android версии EWS Java API (официальная версия EWS Java API) более универсальна и позволяет подключаться как к облачной версии, так и к локальному Exchange.

Изначально в компании был настроен on-premises Exchange, но наши айтишники как раз планировали миграцию на Office 365 Exchange Online, поэтому была поставлена задача использовать наиболее универсальное решение, чтобы в дальнейшем переход не привёл к значительному изменению кода. Миграция на облачное API потребовала изменения учётных записей в приложении и смены URL (метод setUrl класса ExchangeService): для On-premises Exchange требуется базовый URL https://mail.DOMAIN/EWS/Exchange.asmx, где DOMAIN — доменное имя компании, а для Office 365 Exchange Online — https://outlook.office365.com/EWS/Exchange.asmx. (ручная настройка необходима, если не работает Autodiscover)

Особенности интеграции


При интеграции EWS API возникли трудности в связи с тем, что библиотека написана в первую очередь для Java SE и тянет за собой устаревший Apache Http Client и DNS клиент (в отличие от Office 365 SDK, который построен на более современной архитектуре).
Проблему с Apache Http Client удалось решить с помощью добавления строчки в defaultConfig build.gradle модуля приложения:

useLibrary 'org.apache.http.legacy'


Поддержка клиента была удалена начиная с Android SDK 23 (6.0), поэтому в данный момент для всех legacy библиотек, использующих apache client, требуется эта настройка. В качестве DNS клиента идеально подошёл минималистичный MiniDNS (minidns-core).

Вызовы к API удобнее всего оборачивать с использованием RxJava, т.к. они обрабатываются синхронно и блокируют UI поток. Например (RxJava 1):

Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
		// вызовы Exchange API
}
})
.subscribeOn(Schedulers.io());


Если комната была забронирована с помощью приложения, можно отменить бронирование либо продлить его. В случае продления пользователю будет предложено максимально доступное время. Для отмены бронирований, сделанных под личным аккаунтом пользователя, предполагается использование десктопной или мобильной версии Outlook.

op9nt8xddaruhemuzagqxmjcu9g.png

Если у пользователя, создавшего текущий митинг, установлен аватар, он будет отображён при нажатии по иконке комнаты. Фотографии хранятся по адресу (для Office 365 Exchange Online):
https://outlook.office365.com/EWS/Exchange.asmx/s/GetUserPhoto? email=EMAIL&size=SIZE

Где EMAIL — email адрес пользователя, а SIZE — размер фотографии, например, HR96×96. Более подробную информацию можно найти на странице MSDN.

При настройке аккаунтов для комнат есть одна важная особенность. Должно быть два типа аккаунтов — один для получения информации о статусах всех комнат (с полными правами) и второй для бронирования. Если осуществлять бронирование с использованием админского аккаунта, appointment может создаться поверх уже существующих, об этом необходимо помнить, чтобы не было путаницы.

Чтобы упростить установку будущих обновлений, устройства настроены на получение Firebase Push Notifications. При создании push-сообщения можно указать конкретное устройство (номер комнаты) или все устройства для одновременного обновления. Как только уведомление поступает, начинается скачивание пакета установки (APK) с внутреннего FTPS сервера компании. Ограничения системы безопасности Android требуют ручного подтверждения установки, но обычно этот процесс не занимает более пары минут.

Возможно, вы обратили внимание на QR-код рядом с иконкой комнаты. Сделан он для получения feedback’а, ссылку можно открыть на мобильном устройстве и оставить отзыв о работе приложения, если при использовании возникли какие-либо проблемы.

srk9qtzisfqiwao7paxxvlhq_tc.png

Проблемы и их решение


Как оказалось, довольно сложно договориться с бизнес-центром о подключении электричества к установленным планшетам (на стенах и под потолком нет розеток), поэтому было решено сделать питание на основе компактных литиевых батарей на 18 Ah (power bank). Для экономии энергии планшеты настроены на выключение в 20:00 и включение ежедневно в 8:00 по будням, что позволяет реже менять батареи.

Наши сисадмины настроили отдельную Wi-Fi сеть для устройств и включили фильтрацию по IP-адресам (в ПО от Cisco отсутствует возможность фильтрации по URL) для безопасности. К сожалению, это не позволило использовать привычные инструменты, такие как Crashlytics от Fabric, для трекинга ошибок, т.к. IP-адреса периодически менялись, но удалось без проблем открыть доступ к Firebase (что позволяет использовать push-уведомления и хранить логи в базе данных) и Azure Cloud (Microsoft Face API).

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

© Habrahabr.ru