Ловим усталость с помощью AndroidWear
Это небольшая история про один из экспериментов нашей компетенции Wearables.
Мы провели его больше года тому назад, поэтому код изрядно устарел, да и AndroidWear-приложением сегодня уже никого не удивишь, однако задумка была очень интересной, и поработать над ней было здорово. За что огромное спасибо авторам идеи: Арсению Печенкину и VP of Engineering Роману Чернышеву, благодаря которым стартовал этот R&D.
Посмотреть код можно на GitHub. А вот небольшая презентация.
У мозга человека есть особенность — когда человек утомляется, его внимательность падает. Да и не только от утомления: от скачков давления, от температуры, или если граммов 300 опрокинуть (для кого-то — 1000), слова тоже начнут невпопад произноситься, а слоги — плохо связываться. Есть даже научные методы установления уровня утомления / алкогольного опьянения, используемые, например, полицией, среди которых — пройти по бордюру эн метров, не пошатнувшись, дотронуться мизинцем до своего носа, произнести некоторую установленную скороговорку и т. п.
В былые времена признаки и принипы умственного утомления были описаны даже в ГОСТах, например, вот.
Если всерьез, для работников умственного труда и для людей, принимающих ответственные решения, адекватный самоконтроль важен, и тест на определение умственного утомления (а значит, и адекватности реакции и решений) нужен. Есть достаточно простые, но эффективные методики для диагностики таких состояний.
Зная, чтотолько набирающая популярность платформа AndroidWear, поддерживает не только тач-инпут, но и голосовой ввод, мы решили попробовать реализовать тесты сразу двух типов:
- тест-головоломку на определение совпадения текстового описания с формой/цветом геометрической фигуры;
- тест на отчетливость произнесения набора контрольных фраз.
Сразу скажу — голосовой ввод на тот момент различал произвольные слова не так уж хорошо. Это вам не работа с предопределенным набором команд «ok, Google». Однако при некоторой тренировке добиться заметных различий между фразой, четко сказанной отдохнувшим человеком, и той же фразой, произнесенной в спешке или в состоянии полудремы, удалось весьма наглядно.
Повторюсь: коду уже больше года, и в нем вы не найдете ни Ambient Mode, ни кастомного WatchFace, ни некоторых других новинок, пришедших с обновлениями SDK за этот год.
Но кое-что полезное из проекта мы все же вынесли.
SpeechRecognizer
В первую очередь, это работа с android.speech.SpeechRecognizer.
SpeechRecognizer в AndroidWear на момент написания проекта имел два заметных ограничения по сравнению с мобильным Android:
- Ограничено число результатов распознавания лишь одним значением. Речь о массиве значений, получаемых из Bundle results в коллбэке android.speech.RecognitionListener#onResults. С одной стороны, это сделано для улучшения перформанса, и в надежде, что распознавание голоса эволюционирует и даст достаточно точный результат. С другой — из-за этого на AndroidWear не проходит трюк с выбором одного из n кандидатов на распознанную фразу, который работал на handheld Android. В результате — никакой ручной регулировки точности, и «полная чистота эксперимента» :).
- Нет возможности подключить custom recognition animation. Это позволило бы сделать красивый эквалайзер для распознавания голоса, реагирующий на android.speech.RecognitionListener#onRmsChanged, вписывающийся в тему приожения вместо стандартного белого экрана с красной кнопкой голосового ввода Google. Но без этого, впрочем, вполне можно жить.
Использование полезного тулкита на AndroidWear
Как показала практика, и ButterKnife, и GreenDao ORM, и многие другие удобные инструменты, облегчающие и ускоряющие разарботку, прекрасно работают в AndroidWear-проекте. Более того, в ходе проекта мы опробовали возможность создавать общие Android-компоненты: CustomView, диалоги и даже Activity, доступные из общей библиотеки для обоих проектов (и mobile, и wear).
Работа с базой данных
Для себя я давно завел правило использовать ORM всегда, когда это возможно, избавляясь от пачки самописных классов с множестом публичных статических констант. И за это время такой подход сэкономил немало времени и показал себя очень хорошо. Скажу лишь, что GreenDao, используемая в проекте, мне не очень понравилась — Sprinkles или DbFlow решают эти же задачи проще и элегантнее. Но это — мое личное мнение, и, если вам интересно посмотреть на живой пример применения GreenDao и кодогенератора, строящего классы ORM для работы проекта, — милости просим в код.WearableConnector
Редактировать шаблоны фраз на часах (у которых нет клавиатуры) не очень удобно, поэтому редактор мы разместили на смартфоне. За отправку шаблонов на часы и результатов обратно на телефон используется GoogleApiClient Wearable.API.\
Для обмена данными (DataItems и Messages) создали класс WearableConnector. Все, что он обеспечивает, — единый протокол (включая path для DataMapRequests и вызовов sendMessage).
Синхронизацией темплейтов голосовых заданий и настроек заведуют DataItems. Это данные, которые предполагается хранить неизменными достаточно долго, и механизм синхронизации DataItems обеспечивает оптимизацию обновления этих данных с мимнимальным пейлоадом.
Передача результатов с часов на смартфон реализована с помощью Messages.API — таким образом, как только тест завершен, результат сразу отправляется на смартфон и добавляется к списку результатов, уже сохраненных в базе.
Как мы видии, бывает два типа результатов — Speech test и Shape test.
Отмечу, что Shape test изначально разрабатывался для handheld и уже после был перенесен в виде CustomView в AndroidWear часть проекта. Это лишний раз подтвердило догадку, что реализации многих компонентов очень хорошо переносятся с mobile-платформы на wear.
Результатом эксперимента стало приложение, которое позволит простыми наручными средствами (такими как ваш AndroidWear smartwatch) проверить степень утомления и сохранить некоторые результаты на ваш смартфон. Ну и, конечно, опыт разработки под AndroidWear, которая не только увлекательна, но и достаточно легка и приятна, особенно за счет переносимости и компонентов, и вашего любимого инструментария из обычного Android проекта в проект для AndroidWear.
Первый релиз Languor v1.0.5 доступен на Github.
Бодрости вам, мобильности и неутомимости! И до новых встреч.