Как я подстраивал нотификации 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. На основе этого я прикинул, что для достижения желаемой цели я могу сделать форк официального 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
      Всё это ради отображения имени последнего отправителя. Похвальная целеустремлённость.
      • –4
        Платформа Telegram закрытая, здесь ошибка в статье.
      • 0
        Можно было просто поставить «Telegram X», там такой проблемы нет
        • 0
          Какой именно проблемы? Вот на скриншоте название нотификации у Telegram X при множестве чатов практически такое же (добавлена «X»), как в официальном клиенте. Полагаю, что на mi band 2 я увидел бы Telegram X, а не имя отправителя, как хотелось бы.

          image
          • +1
            Я тоже пользуюсь Mi Band 2 и в данном случае на браслет придет уведомление именно с именем отправителя, а не «Telegram», при том, что на телефоне уведомление будет выглядеть именно так, как на Вашем скриншоте.
            Хотя, подозреваю, что разница скорее всего из-за версии Андроида, в моем случае это 8.1
        • +1
          Как я понимаю, это особенность вашей прошивки, а не клиента телеграмм. Если я верно понял, о какой группировке уведомлений вы пишите… В miui эта группировка уведомлений является опциональной и ее можно отключить (хотя, честно, не знаю как сейчас, в новых miui).

          Давно использую неоф. клиент Plus Messenger + MiBand Tools (MB2), всегда отображает нотификации корректно.
          Sony Xperia Z3C (5.1.1 и 6.0) и Samsung A3 2017 (7.0)
          • 0
            При включенном local passcode тоже? Как я уже написал в статье искать другие связки уже существующих приложений не так весело, как сделать свой костылек. =) Да и к тому же официальный клиент мне в любом случае нравится больше, чем альтернативные.

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

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

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

                • 0
                  Ааа… Теперь понял. Не использую его. Если включить, так же как у оригинала, не показывает ник.
          • 0
            В моих глазах репутация microsoft уже и так ниже некуда, но всё равно было обидно.

            Эм. А это тут при чем?
            • 0
              Статья — описание моего опыта и моих впечатлений от процесса изменения нотификаций. Я указал, где у меня были сложности при реализации фичи и между делом свое отношение к конкретной конторе. Плохо?
              • 0
                Ну, после вашего комментария стало ясно:) Используйте explicit отсылки. А так, статья хорошая.

            Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

            Самое читаемое