Я активно пользуюсь 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. На основе этого я прикинул, что для достижения желаемой цели я могу сделать форк официального 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, но это уже другая история.

Комментарии (14)


  1. nybkox
    19.02.2018 00:30

    Всё это ради отображения имени последнего отправителя. Похвальная целеустремлённость.


  1. zmirk
    19.02.2018 00:42

    Платформа Telegram закрытая, здесь ошибка в статье.


    1. Dmitresso
      19.02.2018 09:33

      Не благодарите
      Клиент — сервер


  1. Lungo
    19.02.2018 11:30

    Можно было просто поставить «Telegram X», там такой проблемы нет


    1. Slavik7 Автор
      19.02.2018 12:41

      Какой именно проблемы? Вот на скриншоте название нотификации у Telegram X при множестве чатов практически такое же (добавлена «X»), как в официальном клиенте. Полагаю, что на mi band 2 я увидел бы Telegram X, а не имя отправителя, как хотелось бы.

      image


      1. Lungo
        19.02.2018 12:50
        +1

        Я тоже пользуюсь Mi Band 2 и в данном случае на браслет придет уведомление именно с именем отправителя, а не «Telegram», при том, что на телефоне уведомление будет выглядеть именно так, как на Вашем скриншоте.
        Хотя, подозреваю, что разница скорее всего из-за версии Андроида, в моем случае это 8.1


  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)


    1. Slavik7 Автор
      19.02.2018 12:44

      При включенном local passcode тоже? Как я уже написал в статье искать другие связки уже существующих приложений не так весело, как сделать свой костылек. =) Да и к тому же официальный клиент мне в любом случае нравится больше, чем альтернативные.


      1. Angel2S2
        19.02.2018 13:45

        При включенном local passcode тоже?
        Не знаю, честно. Я миуи использовал всего пару дней на Lenovo P780 и давно, вроде как раз 8 версию. Все не тестировал. Не понравился он мне. Новее версию видел только у крестного на redmi, когда настраивал ему трубку после покупки.
        На самсунге есть «Защищенная папка», как я понимаю, это (почти) то же самое, что local passcode, но я ею не пользуюсь. «Двойными» аккаунтами тоже. Поэтому тут тоже сказать не могу. Но если нужно, могу проверить, не влом.

        Не оспариваю, разобраться в коде, сделать костылек — все это интересно. Да и новые знания и опыт как-никак )) Порой так же делаю. Пред. коммент писал с информационной целью, а не спорной ))


        1. Slavik7 Автор
          19.02.2018 13:55

          local passcode в самом приложении телеграма, если внутри поставить пароль, то в нотификацию уходит только "You have new message" и без ника, мое решение ник шлет в нотификацию в любом случае


          1. Angel2S2
            19.02.2018 14:08

            Ааа… Теперь понял. Не использую его. Если включить, так же как у оригинала, не показывает ник.


  1. Dj_Art
    19.02.2018 12:33

    В моих глазах репутация microsoft уже и так ниже некуда, но всё равно было обидно.

    Эм. А это тут при чем?


    1. Slavik7 Автор
      19.02.2018 12:34

      Статья — описание моего опыта и моих впечатлений от процесса изменения нотификаций. Я указал, где у меня были сложности при реализации фичи и между делом свое отношение к конкретной конторе. Плохо?


      1. Dj_Art
        19.02.2018 12:42

        Ну, после вашего комментария стало ясно:) Используйте explicit отсылки. А так, статья хорошая.