Added QR code button with share functionality for mailto: links. Renamed "Copy Address" button to "Copy". Split setup instructions into two separate cards: DeltaChat/ArcaneChat and Email Clients (K-9 Mail, Thunderbird Mobile, FairEmail). Added ZXing library for QR code generation

This commit is contained in:
JB-SelfCompany
2025-12-25 22:30:41 +03:00
parent 3eb7cff2f6
commit efbdf39cdf
8 changed files with 235 additions and 22 deletions

View File

@@ -50,6 +50,8 @@ But there is a network, called **[Yggdrasil](https://yggdrasil-network.github.io
| Feature | Description |
|---------|-------------|
| 🔗 **Full DeltaChat/ArcaneChat Integration** | Seamless setup with the best decentralized messengers |
| 📧 **Email Client Support** | Works with K-9 Mail, Thunderbird Mobile, FairEmail, and any SMTP/IMAP client |
| 📱 **QR Code Sharing** | Generate and share mailto: links via QR codes |
| 📧 **Local SMTP/IMAP Server** | Complete mail server running directly on your device |
| 🔐 **Cryptographic Identity** | Automatic Ed25519 key generation - your mail identity cannot be spoofed |
| 🌍 **Yggdrasil Network** | Connect via configurable peers - censorship-resistant by design |
@@ -112,7 +114,21 @@ If automatic setup doesn't work:
5. Enter your Yggmail address and the password you set in Tyr
6. Tap "✓" to complete setup
> **Important**: Tyr must be running for your chat app to send and receive messages. Enable auto-start in Tyr settings for seamless experience.
### Setting up Other Email Clients
Tyr works with any standard email client. For K-9 Mail, Thunderbird Mobile, or FairEmail:
1. Complete Tyr onboarding and start the service
2. In Tyr's main screen, tap **"Email Client Setup"** card for detailed instructions
3. Configure your email client with:
- **Email**: Your mail address from Tyr (e.g., `abc123...@yggmail`)
- **Password**: The password you set during Tyr onboarding
- **IMAP**: 127.0.0.1:1143 (no encryption)
- **SMTP**: 127.0.0.1:1025 (no encryption)
**QR Code Sharing**: Tap the **"QR Code"** button in Tyr to generate a QR code for your mail address. You can share it via the system share sheet to quickly exchange addresses with contacts.
> **Important**: Tyr must be running for your email client to send and receive messages. Enable auto-start in Tyr settings for seamless experience.
---
@@ -192,6 +208,9 @@ Then copy `yggmail.aar` to `Tyr/app/libs/`
- **[Yggdrasil Network](https://yggdrasil-network.github.io/)**: The mesh network infrastructure
- **[DeltaChat](https://delta.chat/)**: Recommended email-based messenger client
- **[ArcaneChat](https://github.com/ArcaneChat/android)**: Alternative email-based messenger client
- **[K-9 Mail](https://k9mail.app/)**: Open-source email client for Android
- **[Thunderbird Mobile](https://www.thunderbird.net/mobile/)**: Mozilla's mobile email client (based on K-9)
- **[FairEmail](https://email.faircode.eu/)**: Privacy-oriented email client for Android
---

View File

@@ -48,6 +48,8 @@
| Функция | Описание |
|---------|----------|
| 🔗 **Полная интеграция с DeltaChat/ArcaneChat** | Бесшовная настройка с лучшими децентрализованными мессенджерами |
| 📧 **Поддержка почтовых клиентов** | Работает с K-9 Mail, Thunderbird Mobile, FairEmail и любыми SMTP/IMAP клиентами |
| 📱 **Обмен через QR-коды** | Генерация и обмен mailto: ссылками через QR-коды |
| 📧 **Локальный SMTP/IMAP сервер** | Полноценный почтовый сервер прямо на вашем устройстве |
| 🔐 **Криптографическая идентичность** | Автоматическая генерация Ed25519 ключей - вашу личность невозможно подделать |
| 🌍 **Сеть Yggdrasil** | Подключение через настраиваемые пиры - защита от цензуры по дизайну |
@@ -110,6 +112,20 @@ Tyr запускает полноценный почтовый сервер пр
5. Введите ваш Yggmail адрес и пароль, установленный в Tyr
6. Нажмите "✓" для завершения настройки
### Настройка других почтовых клиентов
Tyr работает с любым стандартным почтовым клиентом. Для K-9 Mail, Thunderbird Mobile или FairEmail:
1. Завершите онбординг Tyr и запустите сервис
2. На главном экране Tyr нажмите карточку **"Настройка почтовых клиентов"** для подробных инструкций
3. Настройте ваш почтовый клиент следующими параметрами:
- **Email**: Ваш почтовый адрес из Tyr (напр., `abc123...@yggmail`)
- **Пароль**: Пароль, установленный при онбординге Tyr
- **IMAP**: 127.0.0.1:1143 (без шифрования)
- **SMTP**: 127.0.0.1:1025 (без шифрования)
**Обмен через QR-код**: Нажмите кнопку **"QR-код"** в Tyr, чтобы сгенерировать QR-код для вашего почтового адреса. Вы можете поделиться им через системное меню обмена, чтобы быстро обмениваться адресами с контактами.
> **Важно**: Tyr должен быть запущен, чтобы ваше приложение могло отправлять и получать сообщения. Включите автозапуск в настройках Tyr для бесшовной работы.
---
@@ -190,6 +206,9 @@ gomobile bind -target=android -androidapi 23 -javapkg=com.jbselfcompany.tyr -ldf
- **[Yggdrasil Network](https://yggdrasil-network.github.io/)**: Инфраструктура mesh-сети
- **[DeltaChat](https://delta.chat/)**: Рекомендуемый клиент-мессенджер на основе email
- **[ArcaneChat](https://github.com/ArcaneChat/android)**: Альтернативный клиент-мессенджер на основе email
- **[K-9 Mail](https://k9mail.app/)**: Почтовый клиент с открытым исходным кодом для Android
- **[Thunderbird Mobile](https://www.thunderbird.net/mobile/)**: Мобильный почтовый клиент Mozilla (основан на K-9)
- **[FairEmail](https://email.faircode.eu/)**: Ориентированный на конфиденциальность почтовый клиент для Android
---

View File

@@ -16,8 +16,8 @@ android {
applicationId "com.jbselfcompany.tyr"
minSdk 23
targetSdk 33
versionCode 20
versionName "1.6.0"
versionCode 21
versionName "1.7.0"
resourceConfigurations += ['en', 'ru']
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
@@ -104,6 +104,9 @@ dependencies {
// WorkManager for battery-efficient background tasks
implementation 'androidx.work:work-runtime-ktx:2.9.0'
// QR Code generation
implementation 'com.google.zxing:core:3.5.3'
// Testing
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.3.0'

View File

Binary file not shown.

View File

@@ -29,6 +29,11 @@ import com.jbselfcompany.tyr.utils.AutoconfigServer
import com.jbselfcompany.tyr.utils.NetworkStatsMonitor
import com.jbselfcompany.tyr.utils.PermissionManager
import android.util.Log
import android.graphics.Bitmap
import android.graphics.Color
import android.widget.ImageView
import com.google.zxing.BarcodeFormat
import com.google.zxing.qrcode.QRCodeWriter
/**
* Main activity displaying service status and mail configuration.
@@ -148,9 +153,22 @@ class MainActivity : BaseActivity(), ServiceStatusListener {
}
}
// Setup instructions card
binding.cardInstructions.setOnClickListener {
showInstructionsDialog()
// Show QR code button
binding.buttonShowQr.setOnClickListener {
val address = configRepository.getMailAddress()
if (!address.isNullOrEmpty()) {
showQrCodeDialog(address)
}
}
// DeltaChat setup instructions card
binding.cardDeltachatSetup.setOnClickListener {
showDeltaChatInstructionsDialog()
}
// Email client setup instructions card
binding.cardEmailClientSetup.setOnClickListener {
showEmailClientInstructionsDialog()
}
updateUI()
@@ -179,10 +197,12 @@ class MainActivity : BaseActivity(), ServiceStatusListener {
binding.textMailAddress.visibility = View.VISIBLE
binding.buttonSetupDeltachat.visibility = View.VISIBLE
binding.buttonCopyAddress.visibility = View.VISIBLE
binding.buttonShowQr.visibility = View.VISIBLE
} else {
binding.textMailAddress.visibility = View.GONE
binding.buttonSetupDeltachat.visibility = View.GONE
binding.buttonCopyAddress.visibility = View.GONE
binding.buttonShowQr.visibility = View.GONE
}
// SMTP/IMAP info
@@ -338,10 +358,93 @@ class MainActivity : BaseActivity(), ServiceStatusListener {
).show()
}
private fun showInstructionsDialog() {
private fun showQrCodeDialog(mailAddress: String) {
try {
// Generate mailto URL
val mailtoUrl = "mailto:$mailAddress"
// Generate QR code
val qrBitmap = generateQrCode(mailtoUrl, 512, 512)
// Create ImageView for QR code
val imageView = ImageView(this).apply {
setImageBitmap(qrBitmap)
setPadding(32, 32, 32, 32)
}
// Show dialog
MaterialAlertDialogBuilder(this)
.setTitle(R.string.qr_code_title)
.setView(imageView)
.setPositiveButton(R.string.ok, null)
.setNeutralButton(R.string.share_mailto) { _, _ ->
shareMailto(mailtoUrl)
}
.show()
} catch (e: Exception) {
Log.e("MainActivity", "Error generating QR code", e)
Snackbar.make(
binding.root,
R.string.qr_code_error,
Snackbar.LENGTH_SHORT
).show()
}
}
private fun shareMailto(mailtoUrl: String) {
try {
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, mailtoUrl)
type = "text/plain"
}
val shareIntent = Intent.createChooser(sendIntent, null)
startActivity(shareIntent)
} catch (e: Exception) {
Log.e("MainActivity", "Error sharing mailto URL", e)
Snackbar.make(
binding.root,
R.string.qr_code_error,
Snackbar.LENGTH_SHORT
).show()
}
}
private fun generateQrCode(content: String, width: Int, height: Int): Bitmap {
val writer = QRCodeWriter()
val bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, width, height)
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565)
for (x in 0 until width) {
for (y in 0 until height) {
bitmap.setPixel(x, y, if (bitMatrix[x, y]) Color.BLACK else Color.WHITE)
}
}
return bitmap
}
private fun showDeltaChatInstructionsDialog() {
val mailAddress = configRepository.getMailAddress() ?: getString(R.string.your_email_address)
val instructions = getString(R.string.deltachat_instructions, mailAddress)
MaterialAlertDialogBuilder(this)
.setTitle(R.string.deltachat_setup)
.setMessage(R.string.deltachat_instructions)
.setMessage(instructions)
.setPositiveButton(R.string.ok, null)
.show()
}
private fun showEmailClientInstructionsDialog() {
val mailAddress = configRepository.getMailAddress() ?: getString(R.string.your_email_address)
val password = getString(R.string.your_password)
val instructions = getString(R.string.email_client_instructions, mailAddress, password)
MaterialAlertDialogBuilder(this)
.setTitle(R.string.email_client_setup_title)
.setMessage(instructions)
.setPositiveButton(R.string.ok, null)
.show()
}

View File

@@ -202,16 +202,36 @@
app:icon="@drawable/ic_play_arrow"
tools:visibility="visible" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_copy_address"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="wrap_content"
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/copy_address"
android:visibility="gone"
app:icon="@drawable/ic_play_arrow"
tools:visibility="visible" />
android:orientation="horizontal">
<com.google.android.material.button.MaterialButton
android:id="@+id/button_copy_address"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginEnd="8dp"
android:text="@string/copy_address"
android:visibility="gone"
app:icon="@drawable/ic_play_arrow"
tools:visibility="visible" />
<com.google.android.material.button.MaterialButton
android:id="@+id/button_show_qr"
style="@style/Widget.Material3.Button.TonalButton"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="@string/show_qr_code"
android:visibility="gone"
app:icon="@drawable/ic_play_arrow"
tools:visibility="visible" />
</LinearLayout>
</LinearLayout>
@@ -291,11 +311,12 @@
</com.google.android.material.card.MaterialCardView>
<!-- Instructions Card -->
<!-- DeltaChat/ArcaneChat Setup Card -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/card_instructions"
android:id="@+id/card_deltachat_setup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
app:cardElevation="2dp">
<LinearLayout
@@ -321,6 +342,36 @@
</com.google.android.material.card.MaterialCardView>
<!-- Email Client Setup Card -->
<com.google.android.material.card.MaterialCardView
android:id="@+id/card_email_client_setup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:cardElevation="2dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/email_client_setup_title"
android:textAppearance="?attr/textAppearanceHeadline6" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="@string/email_client_setup_hint"
android:textAppearance="?attr/textAppearanceBody2" />
</LinearLayout>
</com.google.android.material.card.MaterialCardView>
</LinearLayout>
</androidx.core.widget.NestedScrollView>

View File

@@ -68,8 +68,12 @@
<string name="peer_latency_unknown">Задержка: измеряется…</string>
<string name="yggdrasil_peers">Yggdrasil пиры</string>
<string name="copy_address">Копировать адрес</string>
<string name="copy_address">Копировать</string>
<string name="show_qr_code">QR-код</string>
<string name="address_copied">Адрес скопирован в буфер обмена</string>
<string name="share_mailto">Поделиться</string>
<string name="qr_code_title">QR-код почтового адреса</string>
<string name="qr_code_error">Не удалось создать QR-код</string>
<string name="setup_deltachat">Настроить DeltaChat/ArcaneChat</string>
<string name="dcaccount_opened">Открываю приложение с автоконфигурацией…</string>
<string name="dcaccount_copied">Ссылка DCACCOUNT скопирована! Откройте DeltaChat/ArcaneChat и вставьте её в экран настройки</string>
@@ -81,7 +85,12 @@
<string name="imap_server">IMAP: %1$s:%2$s</string>
<string name="deltachat_setup">Настройка DeltaChat/ArcaneChat</string>
<string name="deltachat_setup_hint">Нажмите для просмотра инструкций</string>
<string name="deltachat_instructions">Настройка DeltaChat/ArcaneChat:\n\n1. Установите и откройте приложение DeltaChat/ArcaneChat\n2. Нажмите \"Создать новый профиль\"\n3. Введите имя, при необходимости выберите аватар в верхней части экрана\n4. Нажмите \"Использовать другой сервер\" (под полями входа)\n5. Введите ваш email-адрес, указанный выше\n6. Введите пароль, установленный при первоначальной настройке\n7. Нажмите \"✓\" в правом верхнем углу для начала общения\n\nУбедитесь, что служба Tyr запущена перед использованием DeltaChat/ArcaneChat.</string>
<string name="deltachat_instructions">Настройка DeltaChat/ArcaneChat:\n\n1. Установите и откройте приложение DeltaChat/ArcaneChat\n2. Нажмите \"Создать новый профиль\"\n3. Введите имя, при необходимости выберите аватар в верхней части экрана\n4. Нажмите \"Использовать другой сервер\" (под полями входа)\n5. Введите ваш email-адрес: %1$s\n6. Введите пароль, установленный при первоначальной настройке\n7. Нажмите \"✓\" в правом верхнем углу для начала общения\n\nУбедитесь, что служба Tyr запущена перед использованием DeltaChat/ArcaneChat.</string>
<string name="email_client_setup_title">Настройка почтовых клиентов</string>
<string name="email_client_setup_hint">Нажмите для просмотра инструкций для K-9 Mail, Thunderbird, FairEmail</string>
<string name="your_email_address">ваш-email@yggmail</string>
<string name="your_password">ваш-пароль</string>
<string name="email_client_instructions">Настройка почтовых клиентов:\n\nEmail: %1$s\nПароль: %2$s\n\nIMAP (Входящие):\n Сервер: 127.0.0.1\n Порт: 1143\n Шифрование: Нет\n\nSMTP (Исходящие):\n Сервер: 127.0.0.1\n Порт: 1025\n Шифрование: Нет\n\n\nK-9 Mail / Thunderbird Mobile:\n\n1. Откройте приложение, нажмите Добавить аккаунт, затем Ручная настройка\n2. Введите ваш email и пароль\n3. Для IMAP: 127.0.0.1:1143 (без шифрования)\n4. Для SMTP: 127.0.0.1:1025 (без шифрования)\n5. Завершите настройку\n\n\nFairEmail:\n\n1. Откройте приложение, нажмите Ручная настройка, затем Пользовательский\n2. Введите ваш email и пароль\n3. IMAP: 127.0.0.1:1143 (без шифрования)\n4. SMTP: 127.0.0.1:1025 (без шифрования)\n5. Сохраните конфигурацию\n\n\nВажно:\n\n- Служба Tyr должна быть запущена\n- Используйте \"Нет\" для шифрования (локальное соединение)\n- Имя пользователя - ваш полный email адрес</string>
<!-- Onboarding -->
<string name="welcome_to_tyr">Добро пожаловать в Tyr</string>

View File

@@ -67,8 +67,12 @@
<string name="peer_latency_format">Latency: %d ms</string>
<string name="peer_latency_unknown">Latency: measuring…</string>
<string name="yggdrasil_peers">Yggdrasil Peers</string>
<string name="copy_address">Copy Address</string>
<string name="copy_address">Copy</string>
<string name="show_qr_code">QR Code</string>
<string name="address_copied">Address copied to clipboard</string>
<string name="share_mailto">Share</string>
<string name="qr_code_title">Mail Address QR Code</string>
<string name="qr_code_error">Failed to generate QR code</string>
<string name="setup_deltachat">Setup DeltaChat/ArcaneChat</string>
<string name="dcaccount_opened">Opening app with autoconfig…</string>
<string name="dcaccount_copied">DCACCOUNT link copied! Open DeltaChat/ArcaneChat and paste it in the setup screen</string>
@@ -80,7 +84,12 @@
<string name="imap_server">IMAP: %1$s:%2$s</string>
<string name="deltachat_setup">DeltaChat/ArcaneChat Setup</string>
<string name="deltachat_setup_hint">Tap to view setup instructions</string>
<string name="deltachat_instructions">DeltaChat/ArcaneChat setup:\n\n1. Install and open the DeltaChat/ArcaneChat app\n2. Click on "Create a new profile"\n3. Enter a name and select an avatar at the top of the screen if necessary\n4. Click on "Use a different server" (below the login fields)\n5. Enter your email address from above\n6. Enter the password set during the initial setup\n7. Click "✓" in the top right corner to start chatting. Make sure the Tyr service is running before using DeltaChat/ArcaneChat.</string>
<string name="deltachat_instructions">DeltaChat/ArcaneChat setup:\n\n1. Install and open the DeltaChat/ArcaneChat app\n2. Click on "Create a new profile"\n3. Enter a name and select an avatar at the top of the screen if necessary\n4. Click on "Use a different server" (below the login fields)\n5. Enter your email address: %1$s\n6. Enter the password set during the initial setup\n7. Click "✓" in the top right corner to start chatting\n\nMake sure the Tyr service is running before using DeltaChat/ArcaneChat.</string>
<string name="email_client_setup_title">Email Client Setup</string>
<string name="email_client_setup_hint">Tap to view setup instructions for K-9 Mail, Thunderbird, FairEmail</string>
<string name="your_email_address">your-email@yggmail</string>
<string name="your_password">your-password</string>
<string name="email_client_instructions">Email Client Setup:\n\nEmail: %1$s\nPassword: %2$s\n\nIMAP (Incoming):\n Server: 127.0.0.1\n Port: 1143\n Security: None\n\nSMTP (Outgoing):\n Server: 127.0.0.1\n Port: 1025\n Security: None\n\n\nK-9 Mail / Thunderbird Mobile:\n\n1. Open app, tap Add Account, then Manual Setup\n2. Enter your email and password\n3. For IMAP: 127.0.0.1:1143 (no encryption)\n4. For SMTP: 127.0.0.1:1025 (no encryption)\n5. Complete setup\n\n\nFairEmail:\n\n1. Open app, tap Manual Setup, then Custom\n2. Enter your email and password\n3. IMAP: 127.0.0.1:1143 (no encryption)\n4. SMTP: 127.0.0.1:1025 (no encryption)\n5. Save configuration\n\n\nImportant:\n\n- Tyr service must be running\n- Use "None" for encryption (local connection)\n- Username is your full email address</string>
<!-- Onboarding -->
<string name="welcome_to_tyr">Welcome to Tyr</string>