Как я подстраивал нотификации Telegram под Mi Band 2

Я активно пользуюсь mi band еще с первой версии. Изначально это устройство позиционировалось как фитнес браслет для подсчета шагов, отслеживания фаз сна и умного будильника, в новые версии стали добавлять также пульсометр и часы. Еще с первой версии благодаря приложению Notify & Fitness for Mi Band я настроил для каждого приложения в смартфоне свои цвета диодов и пользовался браслетом для нотификаций — если знать, из какого приложения поступила нотификация, то можно лишний раз не брать в руки смартфон. Во второй версии уже появился дисплейчик и с появлением новых прошивок mi band 2 научился показывать текст, что предоставило возможность отображать не только иконку приложения, но и дополнительную информацию, такую как имя отправителя сообщения в мессенджере.

Официальное приложение Mi Fit на данный момент умеет отображать имя звонящего, имя отправителя смс и различные иконки для остальных приложений. Как-то мне подсказали о наличии стороннего приложения Mi Band Master, в настройках которого можно выбрать, какую часть push-нотификации отобразить на дисплее браслета.

image

Я же воспользовался данной возможностью для отображения названия чата/имени пользователя, от которого мне пришло сообщение в телеграме.

Как правило push-нотификация в андроиде, по крайней в моем android 6 на редми 4 состоит из названия (name) и сообщения (message). Телеграм отправляет ник пользователя/чата в название нотификации.

image

В целом именно то, что мне нужно, но это работает, пока у меня есть непрочитанные сообщения только в одном чате. Если кто-то пишет в другом чате, а я еще не успел прочитать сообщения из предыдущего, то название нотификации превращается в «Telegram».

image

Соответственно на своем mi band 2 я вижу «Telegram», что доставляет мне неудобства. Как известно телеграм является open source проектом и исходники официальных клиентов под разные платформы доступны на github. На примере Telegram X я прикинул, что для достижения желаемой цели и я могу сделать форк официального android-клиента телеграма и подредактировать название нотификации под мои нужды.

Итак, после недолгих раздумий я определил такой план:

  1. форкнуть android-приложение, успешно собрать и установить на свой смартфон;
  2. найти в коде составление названия нотификации и сделать так, чтобы там отображалось название последнего чата, из которого поступила нотификация;
  3. настроить mi band master на мой форк, указать ему отображать название нотификации в моем mi band 2.


План достаточно простой, поэтому я практически сразу приступил к его реализации.

Форк приложения, сборка и установка


В репозитории андроид-клиента в readme предоставлена вся инструкция для сборки приложения и этого более чем достаточно. Я лишь сделал git clone, скачал android studio, открыл в нем проект, нажал build, после чего нажимал ok для установки всех необходимых версий sdk. Основные ступоры были на том, чтобы зарегистрироваться в таких сервисах как google, telegram, hockey и созданием keystore для подписи моего apk.

К слову о регистрации в сторонних сервисах: в BuildVars.java необходимо указать app_key от bing search api

public static String BING_SEARCH_KEY = ""; //obtain your own KEY at https://www.bing.com/dev/en-us/dev-center


Во время регистрации в данном сервисе на шаге получения кода на телефон для подтверждения регистрации я получил вот такую ошибку при первой же попытке и получал ее и далее:

Usage limit exceeded. Try again tomorrow.


В моих глазах репутация microsoft уже и так ниже некуда, но всё равно было обидно. Я не стал тратить на это время, просто собрал приложение без данной константы. Так даже и лучше, что я не только не хочу использовать bing search, но и не смогу совершить такую глупость.

Приложение успешно собралось, установилось на мой redmi 4 и все необходимое для меня в нем заработало, различий между официальным я не заметил.

Редактирование кода


Здесь я тоже не испытал никаких сложностей. С помощью Shift + Shift (или Ctrl + N) я ввел notification, там среди классов увидел NotificationsController,

image

открыл его, с помощью поиска по файлу и по методам (Ctrl + F12) я нашел метод showOrUpdateNotification, в котором формируется название и сообщение нотификации. Итого поиск нужного места в коде занял не более 5 минут.

Еще где-то до 10 минут я потратил на чтение кода и мой первый коммит.

Скомпилил приложение, с помощью двух посторонних аккаунтов я потестировал нотификации в смартфоне, обрадовался, что всё работает и настроил mi band master, но само собой не обошлось без но: при отсылке сообщения от второго аккаунта мой браслет показывал имя первого и наоборот, если я слал сообщение от первого аккаунта, когда уже были непрочитанные сообщения от обоих.

Почитал код, немного подебажил и разобрался, в чем проблема. Телеграм при каждом новом сообщении отсылает по нотификации для каждого чата, ибо в новых версиях андроида (у меня android 6) множество отправленных нотификаций от приложения группируются в одну, в которой можно увидеть список:

image

В моем случае вся группа отправленных в короткий период времени нотификаций отображается как одна, а mi band master отлавливает первую из них (предыдущий чат в моем случае тестирования) и показывает неверный контакт. Я сделал небольшой костыль в виде второго коммита чисто под мой redmi 4, чтобы отсылалась только одна последняя нотификация, которую получает mi band master и шлет мне корректное название чата на дисплей моего браслета.

Итоги


Теперь я вижу имя последнего отправителя сообщения мне в телеграме на дисплее mi band 2 даже при включенном локальном пароле в приложении, а также при множестве не прочитанных сообщений. Мое решение работает только в связке двух приложений и вероятно только на android 6. Всё это оказалось настолько просто благодаря open source и чистому коду разработчиков телеграма. Я не пробовал никакие другие форки и не искал других решений — это было не так интересно, как сделать самому. Подобную фичу для нотификаций можно дальше развить как настройку клиента и продвигать если не в официальное приложение, то в какие-нибудь самые успешные форки, например, Telegram X, но это уже другая история.

© Habrahabr.ru