Официальное приложение Mi Fit на данный момент умеет отображать имя звонящего, имя отправителя смс и различные иконки для остальных приложений. Как-то мне подсказали о наличии стороннего приложения Mi Band Master, в настройках которого можно выбрать, какую часть push-нотификации отобразить на дисплее браслета.
Я же воспользовался данной возможностью для отображения названия чата/имени пользователя, от которого мне пришло сообщение в телеграме.
Как правило push-нотификация в андроиде, по крайней в моем android 6 на редми 4 состоит из названия (name) и сообщения (message). Телеграм отправляет ник пользователя/чата в название нотификации.
В целом именно то, что мне нужно, но это работает, пока у меня есть непрочитанные сообщения только в одном чате. Если кто-то пишет в другом чате, а я еще не успел прочитать сообщения из предыдущего, то название нотификации превращается в “Telegram”.
Соответственно на своем mi band 2 я вижу “Telegram”, что доставляет мне неудобства. Как известно телеграм является open source проектом и исходники официальных клиентов под разные платформы доступны на github. На основе этого я прикинул, что для достижения желаемой цели я могу сделать форк официального android-клиента телеграма и подредактировать название нотификации под мои нужды.
Итак, после недолгих раздумий я определил такой план:
- форкнуть android-приложение, успешно собрать и установить на свой смартфон;
- найти в коде составление названия нотификации и сделать так, чтобы там отображалось название последнего чата, из которого поступила нотификация;
- настроить 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»,
открыл его, с помощью поиска по файлу и по методам (Ctrl + F12) я нашел метод showOrUpdateNotification, в котором формируется название и сообщение нотификации. Итого поиск нужного места в коде занял не более 5 минут.
Еще где-то до 10 минут я потратил на чтение кода и мой первый коммит.
Скомпилил приложение, с помощью двух посторонних аккаунтов я потестировал нотификации в смартфоне, обрадовался, что всё работает и настроил mi band master, но само собой не обошлось без но: при отсылке сообщения от второго аккаунта мой браслет показывал имя первого и наоборот, если я слал сообщение от первого аккаунта, когда уже были непрочитанные сообщения от обоих.
Почитал код, немного подебажил и разобрался, в чем проблема. Телеграм при каждом новом сообщении отсылает по нотификации для каждого чата, ибо в новых версиях андроида (у меня android 6) множество отправленных нотификаций от приложения группируются в одну, в которой можно увидеть список:
В моем случае вся группа отправленных в короткий период времени нотификаций отображается как одна, а mi band master отлавливает первую из них (предыдущий чат в моем случае тестирования) и показывает неверный контакт. Я сделал небольшой костыль в виде второго коммита чисто под мой redmi 4, чтобы отсылалась только одна последняя нотификация, которую получает mi band master и шлет мне корректное название чата на дисплей моего браслета.
Итоги
Теперь я вижу имя последнего отправителя сообщения мне в телеграме на дисплее mi band 2 даже при включенном локальном пароле в приложении, а также при множестве не прочитанных сообщений. Мое решение работает только в связке двух приложений и вероятно только на android 6. Всё это оказалось настолько просто благодаря open source и чистому коду разработчиков телеграма. Я не пробовал никакие другие форки и не искал других решений — это было не так интересно, как сделать самому. Подобную фичу для нотификаций можно дальше развить как настройку клиента и продвигать если не в официальное приложение, то в какие-нибудь самые успешные форки или альтернативные клиенты, например, Telegram X, но это уже другая история.
Комментарии (14)
Lungo
19.02.2018 11:30Можно было просто поставить «Telegram X», там такой проблемы нет
Slavik7 Автор
19.02.2018 12:41Какой именно проблемы? Вот на скриншоте название нотификации у Telegram X при множестве чатов практически такое же (добавлена «X»), как в официальном клиенте. Полагаю, что на mi band 2 я увидел бы Telegram X, а не имя отправителя, как хотелось бы.
Lungo
19.02.2018 12:50+1Я тоже пользуюсь Mi Band 2 и в данном случае на браслет придет уведомление именно с именем отправителя, а не «Telegram», при том, что на телефоне уведомление будет выглядеть именно так, как на Вашем скриншоте.
Хотя, подозреваю, что разница скорее всего из-за версии Андроида, в моем случае это 8.1
Angel2S2
19.02.2018 11:59Как я понимаю, это особенность вашей прошивки, а не клиента телеграмм. Если я верно понял, о какой группировке уведомлений вы пишите… В miui эта группировка уведомлений является опциональной и ее можно отключить (хотя, честно, не знаю как сейчас, в новых miui).
Давно использую неоф. клиент Plus Messenger + MiBand Tools (MB2), всегда отображает нотификации корректно.
Sony Xperia Z3C (5.1.1 и 6.0) и Samsung A3 2017 (7.0)Slavik7 Автор
19.02.2018 12:44При включенном local passcode тоже? Как я уже написал в статье искать другие связки уже существующих приложений не так весело, как сделать свой костылек. =) Да и к тому же официальный клиент мне в любом случае нравится больше, чем альтернативные.
Angel2S2
19.02.2018 13:45При включенном local passcode тоже?
Не знаю, честно. Я миуи использовал всего пару дней на Lenovo P780 и давно, вроде как раз 8 версию. Все не тестировал. Не понравился он мне. Новее версию видел только у крестного на redmi, когда настраивал ему трубку после покупки.
На самсунге есть «Защищенная папка», как я понимаю, это (почти) то же самое, что local passcode, но я ею не пользуюсь. «Двойными» аккаунтами тоже. Поэтому тут тоже сказать не могу. Но если нужно, могу проверить, не влом.
Не оспариваю, разобраться в коде, сделать костылек — все это интересно. Да и новые знания и опыт как-никак )) Порой так же делаю. Пред. коммент писал с информационной целью, а не спорной ))Slavik7 Автор
19.02.2018 13:55local passcode в самом приложении телеграма, если внутри поставить пароль, то в нотификацию уходит только "You have new message" и без ника, мое решение ник шлет в нотификацию в любом случае
Angel2S2
19.02.2018 14:08Ааа… Теперь понял. Не использую его. Если включить, так же как у оригинала, не показывает ник.
Dj_Art
19.02.2018 12:33В моих глазах репутация microsoft уже и так ниже некуда, но всё равно было обидно.
Эм. А это тут при чем?Slavik7 Автор
19.02.2018 12:34Статья — описание моего опыта и моих впечатлений от процесса изменения нотификаций. Я указал, где у меня были сложности при реализации фичи и между делом свое отношение к конкретной конторе. Плохо?
Dj_Art
19.02.2018 12:42Ну, после вашего комментария стало ясно:) Используйте explicit отсылки. А так, статья хорошая.
nybkox
Всё это ради отображения имени последнего отправителя. Похвальная целеустремлённость.