| | | | |
|:---:|:---:|:---:|:---:|
|

|

|

|

|
---
## Ключевые особенности
- **Независимый клиент** — Не форк Telegram для Android. MonoGram написан полностью с нуля как самостоятельный проект.
- **Material Design 3** — Красивый, адаптивный интерфейс, который отлично смотрится на телефонах, планшетах и складных устройствах.
- **Безопасность** — Встроенная биометрическая блокировка и зашифрованное локальное хранилище.
- **Мультимедиа** — Высокопроизводительное воспроизведение медиа с ExoPlayer и Coil 3.
- **Быстродействие** — Работает на Kotlin Coroutines и оптимизирован для производительности.
- **Clean Architecture** — Чёткое разделение ответственности с помощью слоёв Domain, Data и Presentation.
- **Паттерн MVI** — Предсказуемое управление состоянием с использованием MVIKotlin.
- **Без NFT и крипты** — MonoGram никогда не будет включать NFT, подарки и прочие функции, продвигаемые Telegram, которые мы считаем лишними в мессенджере.
---
## Начало работы
Следуйте этим шагам, чтобы настроить проект локально.
### Предварительные требования
- **Android Studio**: Ladybug или новее (рекомендуется).
- **JDK**: Java 17 или новее.
### 1. Клонирование репозитория
```bash
git clone --recurse-submodules https://github.com/monogram-android/monogram.git
cd monogram
```
### 2. Настройка API ключей Telegram
Для подключения к серверам Telegram вам понадобятся собственные учётные данные API.
1. Войдите на [my.telegram.org](https://my.telegram.org/).
2. Перейдите в **API development tools**.
3. Создайте новое приложение, чтобы получить `App api_id` и `App api_hash`.
4. Создайте файл `local.properties` в корневой директории проекта (если он не существует).
5. Добавьте следующие строки:
```properties
API_ID=12345678
API_HASH=your_api_hash_here
```
### 3. Настройка push-уведомлений
1. Войдите в [консоль Firebase](https://console.firebase.google.com).
2. Создайте новый проект.
3. Добавьте новое приложение с нужным `applicationId`. Если в проекте есть несколько вариантов с разными ID, создайте несколько приложений. **По умолчанию `applicationId` для debug и release сборок отличаются.**
4. Скачайте файл `google-services.json` и скопируйте его в корень модуля **app** (`monogram/app/google-services.json`). Если вы создали несколько приложений, скопируйте только самый последний конфиг.
5. Перейдите в раздел **Cloud Messaging**.
6. Нажмите **Manage service accounts**.
7. В открывшемся окне выберите раздел **Keys** вверху.
8. Нажмите **Add key** и выберите вариант **JSON**. Дождитесь скачивания файла.
9. Вернитесь на страницу, где вы получали App ID от Telegram.
10. Нажмите **Update** рядом с разделом FCM credentials.
11. Загрузите JSON сервисного аккаунта на открывшейся странице.
### 4. Первичная настройка: сборка libvpx
Для анимаций требуется собрать libvpx. Это нужно сделать до запуска сборки Gradle, иначе сборка завершится с ошибками.
1. Перейдите в директорию `presentation/src/main/cpp`
2. В `build.sh` укажите ваш `ANDROID_NDK_HOME`
3. Запустите `build.sh` и дождитесь завершения
### 5. Сборка и запуск
1. Откройте проект в **Android Studio**.
2. Увеличьте лимиты индексации IDE, чтобы `TdApi.java` (обёртка над TDLib) корректно индексировался. В **Android Studio** или **IntelliJ IDEA** откройте **Help → Edit Custom Properties...**, вставьте строки ниже и при необходимости перезапустите IDE:
```properties
# size in Kb
idea.max.intellisense.filesize=20480
# size in Kb
idea.max.content.load.filesize=20480
```
3. Синхронизируйте Gradle.
4. Выберите конфигурацию запуска `app`.
5. Подключите устройство или запустите эмулятор.
6. Нажмите **Run**.
---
## Сборка TDLib
Если вам необходимо собрать TDLib из исходного кода, сначала установите необходимые зависимости. Для дистрибутивов на основе Debian/Ubuntu:
```bash
sudo apt-get update
sudo apt-get install build-essential git curl wget php perl gperf unzip zip default-jdk cmake
```
Затем запустите скрипт сборки из корневой директории проекта:
```bash
./build-tdlib.sh
```
---
## Участие в разработке
Мы приветствуем любой вклад в развитие проекта — будь то исправление ошибок, улучшение документации или предложение новых функций.
1. **Проверьте Issues** — Посмотрите открытые задачи или создайте новую для обсуждения ваших идей.
2. **Работайте от `develop`** — Создавайте ветки от `develop` и держите все изменения на её базе.
3. **Fork & Branch** — Сделайте форк репозитория и создайте ветку для вашей функции.
4. **Стиль кода** — Следуйте существующему стилю кода Kotlin и принципам Clean Architecture.
5. **Отправьте PR** — Откройте Pull Request в `develop` с чётким описанием ваших изменений.
> [!IMPORTANT]
> - Соблюдайте [Условия использования Telegram API](https://core.telegram.org/api/terms).
> - Убедитесь, что ваш код проходит все проверки и тесты.
### Сообщения об ошибках и предложения
- **Ошибки** — Откройте issue и используйте тег `[Bug]` в заголовке (например, `[Bug] Приложение падает при запуске`). Список известных ошибок доступен на [**доске багов**](https://github.com/orgs/monogram-android/projects/3/views/1).
- **Запросы функций** — Откройте issue с тегом `[Feature]` (например, `[Feature] Поддержка отложенных сообщений`). Существующие запросы можно найти на [**доске функций**](https://github.com/orgs/monogram-android/projects/5/views/1).
---
## Переводы
MonoGram приветствует переводы от сообщества! Вы можете добавить свой язык, отредактировав файл строковых ресурсов.
Исходные строки находятся в [`presentation/src/main/res/values/string.xml`](https://github.com/monogram-android/monogram/blob/develop/presentation/src/main/res/values/string.xml). Чтобы добавить новый язык, создайте соответствующий файл `values-