Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
ab634ce
feat: add webApp support
junioraww Sep 19, 2026
c983508
feat: add ability to rearrange panel buttons
junioraww Sep 19, 2026
825e43f
feat: implement webApp logging & network filters
junioraww Sep 20, 2026
023edd1
feat: voice and video notes playback, sync, volume, transcription, an…
junioraww Sep 20, 2026
ee56711
feat: message editing, deletion logging, diff-based edit history stor…
junioraww Sep 20, 2026
137a370
fix: edit history persistence, edit timeout handling, debug error and…
junioraww Sep 20, 2026
02ded0d
fix: audio & video message sending fixes
junioraww Sep 20, 2026
d2652c4
fix: normalize video timestamps with setpts and fix CI bun install
junioraww Sep 20, 2026
3bc9b85
fix: restore app parameter in upload for Android target
junioraww Sep 20, 2026
9cd5142
fix: load video notes, voice and media using Mintsifry root certificate
junioraww Sep 20, 2026
727b172
feat: persistent media playback header, sequential autoplay playlist,…
junioraww Sep 20, 2026
10a5f0c
feat: upload videos as video message & audios as voice message, fixes
junioraww Sep 20, 2026
2c1d465
feat: better caching; add more tests related to scroll and playlists;…
junioraww Sep 21, 2026
8eeb2df
fix: use canvas to render videomessages
junioraww Sep 21, 2026
1b13699
feat: add tracing
junioraww Sep 21, 2026
1a903d5
fix: video messages convertations
junioraww Sep 22, 2026
de41024
fix: add deep link support for all platforms
junioraww Sep 22, 2026
e839f33
fix: enhance webApp bridge
junioraww Sep 22, 2026
6bce944
fix: android UI issues with video- & voicemessages, lags
junioraww Sep 22, 2026
25088ab
fix: enhance notifications on Android & complete server sync
junioraww Sep 22, 2026
a24fd6e
fix: attaches dropout cut
junioraww Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/android-debug-build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ jobs:
x86_64-linux-android

- name: Install dependencies
run: bun install --frozen-lockfile
run: bun install

- name: Patch Tauri identifier and Android path
run: |
Expand Down Expand Up @@ -120,7 +120,7 @@ jobs:

- name: Patch Cargo.toml for CI
run: |
sed -i 's|path = "../../rumax"|git = "https://github.com/me0wkie/rumax.git", branch = "main"|g' src-tauri/Cargo.toml
sed -i 's|path = "../../rumax"|git = "https://github.com/junioraww/rumax.git", branch = "dev"|g' src-tauri/Cargo.toml

echo "Cargo.toml updated:"
grep rumax src-tauri/Cargo.toml
Expand Down
8 changes: 4 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@
</div>

<b>Что НЕ реализовано:</b>
Уведомления, звонки, поддержка WebApps, в том числе сферум, стикеры, скачивание чатов, работа с папками, настройки приватности
Звонки, работа с папками, настройки приватности

<b>Что реализовано:</b>
➕ Вход, регистрация, работа с контактами, каналы и чаты, функции сообщений, сохранение удаленных сообщений, включение шифрования
➕ Вход, регистрация, работа с контактами, каналы и чаты, стикеры, медиа, веб-приложения (Сферум и Цифровой ID), работа с папками, сохранение удаленных сообщений, включение шифрования

<b>Что еще будет:</b>
➕ Светлая тема, Telegram Proxy, разные интерфейсы, шифрованные звонки, поддержка кастомного сервера
Expand Down Expand Up @@ -211,8 +211,8 @@ $ rm -rf ~/.local/share/org.meowkie.max

## В планах

- [ ] Мини-приложения и Сферум
- [ ] Уведомления
- [x] Мини-приложения и Сферум
- [x] Уведомления
- [ ] Шифрование в группах по схеме MLS
- [ ] Установка любых реакций и фона
- [ ] Звонки с e2e шифрованием
Expand Down
33 changes: 32 additions & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "maxplus",
"version": "0.1.0",
"version": "0.1.3",
"description": "",
"type": "module",
"scripts": {
Expand Down Expand Up @@ -29,7 +29,9 @@
"fflate": "^0.8.3",
"jsqr": "^1.4.0",
"libsodium-wrappers-sumo": "^0.8.4",
"lottie-web": "^5.13.0"
"lottie-web": "^5.13.0",
"mp4-muxer": "^5.2.2",
"opus-recorder": "^8.0.5"
},
"devDependencies": {
"@playwright/test": "^1.63.0",
Expand Down
9 changes: 9 additions & 0 deletions playwright.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,15 @@ export default defineConfig({
fullyParallel: true,
reporter: 'list',
use: {
browserName: 'firefox',
trace: 'off',
},
projects: [
{
name: 'firefox',
use: {
browserName: 'firefox',
},
},
],
});
9 changes: 6 additions & 3 deletions src-tauri/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "maxplus"
version = "0.1.0"
version = "0.1.3"
description = "A Tauri App"
authors = ["you"]
edition = "2021"
Expand All @@ -25,7 +25,7 @@ serde_json = "1"
tauri-plugin-android-fs = "29.0.0"
tauri-plugin-stronghold = "2.3.2"
tauri-plugin-notifications = { version = "0.5.0-rc.13", features = ["push-notifications"] }
tauri-plugin-http = "2.6.0"
tauri-plugin-http = "~2.6.0"
tauri-plugin-opener = "2.5.5"
tauri-plugin-upload = "2.4.1"
tauri-plugin-dialog = "2.7.3"
Expand All @@ -36,11 +36,12 @@ url = "2.5.7"
uuid = { version = "1.18.1", features = ["v4"] }
futures-util = "0.3.31"
webpki-roots = "1.0.4"
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls-webpki-roots", "blocking"] }
reqwest = { version = "0.12", default-features = false, features = ["json", "rustls-tls-webpki-roots", "blocking", "gzip", "brotli", "deflate"] }
rmp-serde = "1.3.0"
openssl = { version = "0.10", features = ["vendored"] }
urlencoding = "2.1"
tiny_http = "0.12.0"
flate2 = "1.0"
dirs = "6.0.0"
mime_guess = "2.0.5"
base64 = "0.22.1"
Expand All @@ -53,6 +54,8 @@ chacha20poly1305 = "0.11.0"
walkdir = "2.5.0"
sha2 = "0.11.0"
jni = "0.22.4"
tauri-plugin-single-instance = { version = "2.4.5", features = ["deep-link"] }
tauri-plugin-deep-link = "2.4.10"

[profile.dev]
incremental = true
Expand Down
4 changes: 3 additions & 1 deletion src-tauri/Info.ios.plist
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
<key>NSFaceIDUsageDescription</key>
<string>Authenticate with biometric</string>
<key>NSCameraUsageDescription</key>
<string>Read QR codes</string>
<string>Camera access for photos and video notes</string>
<key>NSMicrophoneUsageDescription</key>
<string>Microphone access for voice and video notes</string>
</dict>
</plist>
3 changes: 2 additions & 1 deletion src-tauri/capabilities/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
{
"identifier": "http:default",
"allow": [{ "url": "https://**" }]
}
},
"deep-link:default"
]
}
2 changes: 1 addition & 1 deletion src-tauri/capabilities/mobile.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"identifier": "mobile-capability",
"platforms": ["android", "iOS"],
"windows": ["main"],
"permissions": ["barcode-scanner:default", "biometric:default"]
"permissions": ["barcode-scanner:default", "biometric:default", "deep-link:default"]
}
6 changes: 5 additions & 1 deletion src-tauri/gen/android/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ key.properties
!/app/src/main/res/drawable-nodpi/
!/app/src/main/res/drawable-nodpi/**
!/app/src/main/res/mipmap-anydpi-v26/
!/app/src/main/res/mipmap-anydpi-v26/**
!/app/src/main/res/mipmap-anydpi-v26/**
!/app/src/main/res/xml/
!/app/src/main/res/xml/**
!/app/src/main/res/raw/
!/app/src/main/res/raw/**
37 changes: 35 additions & 2 deletions src-tauri/gen/android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,22 @@

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />

<!-- AndroidTV support -->
<uses-feature android:name="android.hardware.camera" android:required="false" />
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false" />
<uses-feature android:name="android.hardware.microphone" android:required="false" />
<uses-feature android:name="android.software.leanback" android:required="false" />

<application
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:label="@string/app_name"
android:theme="@style/Theme.maxplus"
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="${usesCleartextTraffic}">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode"
Expand All @@ -32,6 +38,33 @@
<!-- AndroidTV support -->
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
<!-- DEEP LINK PLUGIN. AUTO-GENERATED. DO NOT REMOVE. -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="org.chromium.arc.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="max" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="org.chromium.arc.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="max.ru" />
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="org.chromium.arc.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https" />
<data android:scheme="http" />
<data android:host="www.max.ru" />
</intent-filter>
<!-- DEEP LINK PLUGIN. AUTO-GENERATED. DO NOT REMOVE. -->
</activity>

<receiver
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class NotificationHelper(private val ctx: Context) {
}

private external fun isChatMutedNative(account: Long, chatId: Long, appDir: String): Boolean
private external fun isNotificationsEnabledNative(account: Long, appDir: String): Boolean

companion object {
const val CHANNEL_ID = "MESSAGES_CHANNEL_ID"
Expand Down Expand Up @@ -117,6 +118,15 @@ class NotificationHelper(private val ctx: Context) {
}
val account = (data["c"] ?: data["account_id"])?.toLongOrNull() ?: 0L

try {
if (!isNotificationsEnabledNative(account, ctx.applicationInfo.dataDir)) {
Log.d("MaxPlus", "handleIncomingMessage: notifications disabled for account $account")
return
}
} catch (e: Throwable) {
Log.e("MaxPlus", "isNotificationsEnabledNative error", e)
}

try {
if (isChatMutedNative(account, chatId, ctx.applicationInfo.dataDir)) {
Log.d("MaxPlus", "handleIncomingMessage: chat $chatId is muted")
Expand All @@ -126,6 +136,7 @@ class NotificationHelper(private val ctx: Context) {
Log.e("MaxPlus", "isChatMutedNative error", e)
}


val mid = data["msgid"] ?: data["mid"] ?: ""
val text = data["msg"] ?: data["body"] ?: data["text"] ?: "Сообщение"
val senderId = data["suid"] ?: ""
Expand Down Expand Up @@ -202,8 +213,10 @@ class NotificationHelper(private val ctx: Context) {

val isGroup = chatId < 0 || title != newest.senderName
val style = NotificationCompat.MessagingStyle(userPerson)
.setConversationTitle(title)
.setGroupConversation(isGroup)
if (isGroup) {
style.conversationTitle = title
}

for (h in history) {
val isMe = h.senderId == "me" || h.senderName == "Вы"
Expand Down Expand Up @@ -245,8 +258,6 @@ class NotificationHelper(private val ctx: Context) {

val builder = NotificationCompat.Builder(ctx, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(newest.text)
.setLargeIcon(chatAvatar)
.setStyle(style)
.setContentIntent(contentIntent)
Expand Down
33 changes: 33 additions & 0 deletions src-tauri/gen/android/app/src/main/res/raw/rootca_ssl_rsa2022.crt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
-----BEGIN CERTIFICATE-----
MIIFwjCCA6qgAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwcDELMAkGA1UEBhMCUlUx
PzA9BgNVBAoMNlRoZSBNaW5pc3RyeSBvZiBEaWdpdGFsIERldmVsb3BtZW50IGFu
ZCBDb21tdW5pY2F0aW9uczEgMB4GA1UEAwwXUnVzc2lhbiBUcnVzdGVkIFJvb3Qg
Q0EwHhcNMjIwMzAxMjEwNDE1WhcNMzIwMjI3MjEwNDE1WjBwMQswCQYDVQQGEwJS
VTE/MD0GA1UECgw2VGhlIE1pbmlzdHJ5IG9mIERpZ2l0YWwgRGV2ZWxvcG1lbnQg
YW5kIENvbW11bmljYXRpb25zMSAwHgYDVQQDDBdSdXNzaWFuIFRydXN0ZWQgUm9v
dCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAMfFOZ8pUAL3+r2n
qqE0Zp52selXsKGFYoG0GM5bwz1bSFtCt+AZQMhkWQheI3poZAToYJu69pHLKS6Q
XBiwBC1cvzYmUYKMYZC7jE5YhEU2bSL0mX7NaMxMDmH2/NwuOVRj8OImVa5s1F4U
zn4Kv3PFlDBjjSjXKVY9kmjUBsXQrIHeaqmUIsPIlNWUnimXS0I0abExqkbdrXbX
YwCOXhOO2pDUx3ckmJlCMUGacUTnylyQW2VsJIyIGA8V0xzdaeUXg0VZ6ZmNUr5Y
Ber/EAOLPb8NYpsAhJe2mXjMB/J9HNsoFMBFJ0lLOT/+dQvjbdRZoOT8eqJpWnVD
U+QL/qEZnz57N88OWM3rabJkRNdU/Z7x5SFIM9FrqtN8xewsiBWBI0K6XFuOBOTD
4V08o4TzJ8+Ccq5XlCUW2L48pZNCYuBDfBh7FxkB7qDgGDiaftEkZZfApRg2E+M9
G8wkNKTPLDc4wH0FDTijhgxR3Y4PiS1HL2Zhw7bD3CbslmEGgfnnZojNkJtcLeBH
BLa52/dSwNU4WWLubaYSiAmA9IUMX1/RpfpxOxd4Ykmhz97oFbUaDJFipIggx5sX
ePAlkTdWnv+RWBxlJwMQ25oEHmRguNYf4Zr/Rxr9cS93Y+mdXIZaBEE0KS2iLRqa
OiWBki9IMQU4phqPOBAaG7A+eP8PAgMBAAGjZjBkMB0GA1UdDgQWBBTh0YHlzlpf
BKrS6badZrHF+qwshzAfBgNVHSMEGDAWgBTh0YHlzlpfBKrS6badZrHF+qwshzAS
BgNVHRMBAf8ECDAGAQH/AgEEMA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsF
AAOCAgEAALIY1wkilt/urfEVM5vKzr6utOeDWCUczmWX/RX4ljpRdgF+5fAIS4vH
tmXkqpSCOVeWUrJV9QvZn6L227ZwuE15cWi8DCDal3Ue90WgAJJZMfTshN4OI8cq
W9E4EG9wglbEtMnObHlms8F3CHmrw3k6KmUkWGoa+/ENmcVl68u/cMRl1JbW2bM+
/3A+SAg2c6iPDlehczKx2oa95QW0SkPPWGuNA/CE8CpyANIhu9XFrj3RQ3EqeRcS
AQQod1RNuHpfETLU/A2gMmvn/w/sx7TB3W5BPs6rprOA37tutPq9u6FTZOcG1Oqj
C/B7yTqgI7rbyvox7DEXoX7rIiEqyNNUguTk/u3SZ4VXE2kmxdmSh3TQvybfbnXV
4JbCZVaqiZraqc7oZMnRoWrXRG3ztbnbes/9qhRGI7PqXqeKJBztxRTEVj8ONs1d
WN5szTwaPIvhkhO3CO5ErU2rVdUr89wKpNXbBODFKRtgxUT70YpmJ46VVaqdAhOZ
D9EUUn4YaeLaS8AjSF/h7UkjOibNc4qVDiPP+rkehFWM66PVnP1Msh93tc+taIfC
EYVMxjh8zNbFuoc7fzvvrFILLe7ifvEIUqSVIC/AzplM/Jxw7buXFeGP1qVCBEHq
391d/9RAfaZ12zkwFsl+IKwE/OZxW8AHa9i1p4GO0YSNuczzEm4=
-----END CERTIFICATE-----
5 changes: 5 additions & 0 deletions src-tauri/gen/android/app/src/main/res/xml/file_paths.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="." />
<cache-path name="my_cache_images" path="." />
</paths>
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
<certificates src="@raw/rootca_ssl_rsa2022" />
</trust-anchors>
</base-config>
</network-security-config>
Loading
Loading