Browse Source

release(v1.001): live dual-color streaming input, clean classic UI, silent Mac overlay, newline support & black icon

main
Ali Alavi 3 hours ago
parent
commit
7ebc2b8278
  1. 36
      .gitignore
  2. BIN
      .gradle/8.11.1/checksums/checksums.lock
  3. BIN
      .gradle/8.11.1/checksums/md5-checksums.bin
  4. BIN
      .gradle/8.11.1/checksums/sha1-checksums.bin
  5. BIN
      .gradle/8.11.1/executionHistory/executionHistory.bin
  6. BIN
      .gradle/8.11.1/executionHistory/executionHistory.lock
  7. BIN
      .gradle/8.11.1/fileChanges/last-build.bin
  8. BIN
      .gradle/8.11.1/fileHashes/fileHashes.bin
  9. BIN
      .gradle/8.11.1/fileHashes/fileHashes.lock
  10. BIN
      .gradle/8.11.1/fileHashes/resourceHashesCache.bin
  11. 0
      .gradle/8.11.1/gc.properties
  12. BIN
      .gradle/buildOutputCleanup/buildOutputCleanup.lock
  13. 2
      .gradle/buildOutputCleanup/cache.properties
  14. BIN
      .gradle/buildOutputCleanup/outputFiles.bin
  15. BIN
      .gradle/file-system.probe
  16. 0
      .gradle/vcs-1/gc.properties
  17. 77
      README.md
  18. 42
      android/app/src/main/res/drawable/ic_mic_mac.xml
  19. 16
      android/app/src/main/res/drawable/ic_mic_minimal.xml
  20. 386
      android/server/relay_server.py
  21. 4
      app/build.gradle
  22. 305
      app/build/generated/data_binding_base_class_source_out/debug/out/com/soniox/remotemic/databinding/ActivityMainBinding.java
  23. 265
      app/build/generated/data_binding_base_class_source_out/release/out/com/soniox/remotemic/databinding/ActivityMainBinding.java
  24. 1
      app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json
  25. 1
      app/build/intermediates/annotation_processor_list/debugUnitTest/javaPreCompileDebugUnitTest/annotationProcessors.json
  26. 1
      app/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json
  27. 1
      app/build/intermediates/annotation_processor_list/releaseUnitTest/javaPreCompileReleaseUnitTest/annotationProcessors.json
  28. 2
      app/build/intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt
  29. 2
      app/build/intermediates/apk_ide_redirect_file/release/createReleaseApkListingFileRedirect/redirect.txt
  30. 2
      app/build/intermediates/app_metadata/debug/writeDebugAppMetadata/app-metadata.properties
  31. 2
      app/build/intermediates/app_metadata/release/writeReleaseAppMetadata/app-metadata.properties
  32. BIN
      app/build/intermediates/binary_art_profile/release/compileReleaseArtProfile/baseline.prof
  33. BIN
      app/build/intermediates/binary_art_profile_metadata/release/compileReleaseArtProfile/baseline.profm
  34. 1342
      app/build/intermediates/combined_art_profile/release/compileReleaseArtProfile/baseline-prof.txt
  35. 10
      app/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/output-metadata.json
  36. 10
      app/build/intermediates/compatible_screen_manifest/release/createReleaseCompatibleScreenManifests/output-metadata.json
  37. BIN
      app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/processDebugResources/R.jar
  38. BIN
      app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/release/processReleaseResources/R.jar
  39. BIN
      app/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar
  40. BIN
      app/build/intermediates/compile_app_classes_jar/release/bundleReleaseClassesToCompileJar/classes.jar
  41. BIN
      app/build/intermediates/data_binding_base_class_log_artifact/debug/dataBindingGenBaseClassesDebug/out/com.soniox.remotemic-binding_classes.json
  42. BIN
      app/build/intermediates/data_binding_base_class_log_artifact/release/dataBindingGenBaseClassesRelease/out/com.soniox.remotemic-binding_classes.json
  43. 1
      app/build/intermediates/data_binding_layout_info_type_merge/debug/mergeDebugResources/out/activity_main-layout.xml
  44. 1
      app/build/intermediates/data_binding_layout_info_type_merge/release/mergeReleaseResources/out/activity_main-layout.xml
  45. 1
      app/build/intermediates/data_binding_layout_info_type_package/debug/packageDebugResources/out/activity_main-layout.xml
  46. 1
      app/build/intermediates/data_binding_layout_info_type_package/release/packageReleaseResources/out/activity_main-layout.xml
  47. 89
      app/build/intermediates/default_proguard_files/global/proguard-android-optimize.txt-8.4.2
  48. 95
      app/build/intermediates/default_proguard_files/global/proguard-android.txt-8.4.2
  49. 89
      app/build/intermediates/default_proguard_files/global/proguard-defaults.txt-8.4.2
  50. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_0/graph.bin
  51. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_1/graph.bin
  52. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_2/graph.bin
  53. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_3/graph.bin
  54. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_4/graph.bin
  55. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_5/graph.bin
  56. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_6/graph.bin
  57. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_7/graph.bin
  58. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_0/graph.bin
  59. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_1/graph.bin
  60. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_2/graph.bin
  61. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_3/graph.bin
  62. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_4/graph.bin
  63. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_5/graph.bin
  64. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_6/graph.bin
  65. BIN
      app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_7/graph.bin
  66. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_0/graph.bin
  67. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_1/graph.bin
  68. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_2/graph.bin
  69. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_3/graph.bin
  70. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_4/graph.bin
  71. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_5/graph.bin
  72. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_6/graph.bin
  73. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_7/graph.bin
  74. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_0/graph.bin
  75. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_1/graph.bin
  76. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_2/graph.bin
  77. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_3/graph.bin
  78. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_4/graph.bin
  79. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_5/graph.bin
  80. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_6/graph.bin
  81. BIN
      app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_7/graph.bin
  82. BIN
      app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex
  83. BIN
      app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex
  84. BIN
      app/build/intermediates/dex/debug/mergeProjectDexDebug/10/classes.dex
  85. BIN
      app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex
  86. BIN
      app/build/intermediates/dex/release/mergeDexRelease/classes.dex
  87. BIN
      app/build/intermediates/dex/release/mergeDexRelease/classes2.dex
  88. BIN
      app/build/intermediates/dex_archive_input_jar_hashes/debug/dexBuilderDebug/out
  89. BIN
      app/build/intermediates/dex_archive_input_jar_hashes/release/dexBuilderRelease/out
  90. BIN
      app/build/intermediates/dex_metadata_directory/release/compileReleaseArtProfile/0/.dm
  91. BIN
      app/build/intermediates/dex_metadata_directory/release/compileReleaseArtProfile/1/.dm
  92. 5
      app/build/intermediates/dex_metadata_directory/release/compileReleaseArtProfile/dex-metadata-map.properties
  93. 1
      app/build/intermediates/dex_number_of_buckets_file/debug/dexBuilderDebug/out
  94. 1
      app/build/intermediates/dex_number_of_buckets_file/release/dexBuilderRelease/out
  95. BIN
      app/build/intermediates/external_libs_dex/release/mergeExtDexRelease/classes.dex
  96. BIN
      app/build/intermediates/incremental/dataBindingGenBaseClassesDebug/base_builder_log.json
  97. BIN
      app/build/intermediates/incremental/dataBindingGenBaseClassesRelease/base_builder_log.json
  98. BIN
      app/build/intermediates/incremental/debug-mergeJavaRes/merge-state
  99. BIN
      app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1FHHRWDDArcggrwmJBxs1FyYsD4=
  100. BIN
      app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1bV38vxKu8s45m0jMDRfRZE34Js=

36
.gitignore

@ -1,29 +1,11 @@
# Android
.gradle/
build/
app/build/
*.apk
*.aab
local.properties
.idea/
*.iml
# macOS & Swift
mac/build/
mac/dmg_staging/
*.dmg
*.zip
*.DS_Store
.build/
# Python
__pycache__/
*.pyc
.venv/
venv/
*.log
# Hermes / Temp
*.swp
*.bak
.gradle
/local.properties
/.idea
.DS_Store
/build
/app/build
/captures
.externalNativeBuild
.cxx
local.properties

BIN
.gradle/8.11.1/checksums/checksums.lock

BIN
.gradle/8.11.1/checksums/md5-checksums.bin

BIN
.gradle/8.11.1/checksums/sha1-checksums.bin

BIN
.gradle/8.11.1/executionHistory/executionHistory.bin

BIN
.gradle/8.11.1/executionHistory/executionHistory.lock

BIN
.gradle/8.11.1/fileChanges/last-build.bin

BIN
.gradle/8.11.1/fileHashes/fileHashes.bin

BIN
.gradle/8.11.1/fileHashes/fileHashes.lock

BIN
.gradle/8.11.1/fileHashes/resourceHashesCache.bin

0
.gradle/8.11.1/gc.properties

BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock

2
.gradle/buildOutputCleanup/cache.properties

@ -0,0 +1,2 @@
#Sat Aug 22 18:24:24 UTC 2026
gradle.version=8.11.1

BIN
.gradle/buildOutputCleanup/outputFiles.bin

BIN
.gradle/file-system.probe

0
.gradle/vcs-1/gc.properties

77
README.md

@ -1,77 +0,0 @@
# 🎙️ Soniox Mobile to Mac (v1.0 Stable)
سیستم پیشرفته و فوق‌سریع تایپ صوتی بیسیم از گوشی اندروید و هدست به مکینتاش (macOS) با هوش مصنوعی سانی‌اوکس (Soniox AI).
---
## 🌟 ویژگی‌های کلیدی (Key Features)
1. **تایپ صوتی بیسیم از اندروید به مک (Android ➡️ Mac):**
- پشتیبانی از حالت **Hold-to-Talk** و **کلید سخت‌افزاری کم کردن صدا (Volume Down)** گوشی.
- ویرایشگر زنده متن روی گوشی با امکان تایپ دستی، اصلاح کلمات و دکمه اختصاصی **«🚀 درج متن در مک» (`Cmd + V`)**.
- حذف کامل لاگ‌های حجیم از صفحه اصلی و انتقال آن به پنجره هوشمند دیباگ (BottomSheet).
2. **معماری فوق‌سریع استریم زنده (Pipelined Real-time Streaming v3.0):**
- **اتصال دائمی دوطرفه (Persistent Duplex WebSocket):** صفر میلی‌ثانیه تأخیر شروع در صحبت مجدد.
- **استخر اتصالات گرم (Pre-Warmed Upstream Pool):** اتصال همیشه آماده به سانی‌اوکس روی سرور لینوکس.
- **تایپ فوری در مک:** تأخیر کلی رها کردن دکمه تا تایپ در مک کمتر از **۲۵۰ میلی‌ثانیه**.
3. **جلوگیری قطعی از شکستن خط و تکرار متن (Zero Newlines & Strict Dedup):**
* پالایش خودکار کلمات زائد و جلوگیری از ارسال کاراکترهای `\r\n` (بدون ارسال اینتر ناخواسته).
* کش هوشمند `Session ID` برای جلوگیری از تایپ تکراری جملات.
4. **اپلیکیشن اختصاصی مک (macOS Native MenuBar App):**
- پشتیبانی از کلید میانبر سیستمی **`Option` (⌥)** به صورت Hold-to-Talk و **`Caps Lock`** به صورت Toggle.
- درج مستقیم متن در فیلد متنی فعال بدون نیاز به فوکوس دستی.
---
## 📁 ساختار پروژه (Repository Structure)
```
soniox-mobile-to-mac/
├── android/ # اپلیکیشن نیتیو اندروید (Kotlin, OkHttp, Material 3)
│ ├── app/src/main/ # سورس کدها و لایه‌بندی UI
│ └── build.gradle # تنظیمات بیلد اندروید
├── mac/ # اپلیکیشن نیتیو مک‌او‌اس (Swift, AppKit, CoreAudio)
│ ├── src/ # سورس کدهای کلاینت مک و سرویس Paste
│ ├── package.sh # اسکریپت بیلد .app و پکیج‌بندی .dmg
│ └── Info.plist # دسترسی‌ها و تنظیمات امنیتی مک
├── server/ # گیت‌وی پرسرعت رله سرور (Python aiohttp/websockets)
│ ├── relay_server.py
│ └── soniox-relay.service
└── README.md
```
---
## 🚀 راهنمای راه‌اندازی و اجرا
### ۱. اجرای سرور گیت‌وی (Linux Server):
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install aiohttp websockets
python3 server/relay_server.py
```
*(سرویس روی پورت `0.0.0.0:8999` آماده پاسخگویی می‌شود).*
### ۲. بیلد و اجرای کلاینت مک (macOS):
```bash
cd mac
chmod +x package.sh
./package.sh
open "/Applications/Soniox Voice.app"
```
### ۳. بیلد و نصب اپلیکیشن اندروید:
```bash
cd android
./gradlew assembleDebug
# فایل APK خروجی در app/build/outputs/apk/debug/app-debug.apk ساخته می‌شود
```
---
## 📜 لایسنس
توسعه یافته برای شرکت NewHorizon.

42
android/app/src/main/res/drawable/ic_mic_mac.xml

@ -1,42 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="64dp"
android:height="64dp"
android:viewportWidth="64"
android:viewportHeight="64">
<!-- Microphone Capsule Base & Stand (Deep Sleek Black / Slate) -->
<!-- Mic Top Head / Capsule -->
<path
android:fillColor="#0F172A"
android:pathData="M32,6 C26.48,6 22,10.48 22,16 L22,30 C22,35.52 26.48,40 32,40 C37.52,40 42,35.52 42,30 L42,16 C42,10.48 37.52,6 32,6 Z" />
<!-- Mic Mesh Highlight / Inner Grille Lines -->
<path
android:fillColor="#334155"
android:pathData="M24,20 L40,20 L40,22 L24,22 Z M24,15 L40,15 L40,17 L24,17 Z M26,10 L38,10 L38,12 L26,12 Z" />
<!-- Outer Mic Cradle / U-Bracket -->
<path
android:fillColor="#0F172A"
android:pathData="M48,27 C48,36.2 40.7,43.7 34.5,44.8 L34.5,52 L40,52 C41.1,52 42,52.9 42,54 C42,55.1 41.1,56 40,56 L24,56 C22.9,56 22,55.1 22,54 C22,52.9 22.9,52 24,52 L29.5,52 L29.5,44.8 C23.3,43.7 16,36.2 16,27 L20,27 C20,34 25.4,39.5 32,39.5 C38.6,39.5 44,34 44,27 L48,27 Z" />
<!-- Mac Desktop / Display Badge Accent on Mic Body -->
<!-- Mini Mac Display / Apple Screen Symbol in Sleek Silver Accent -->
<path
android:fillColor="#38BDF8"
android:pathData="M28,26 L36,26 C37.1,26 38,26.9 38,28 L38,33 C38,34.1 37.1,35 36,35 L28,35 C26.9,35 26,34.1 26,33 L26,28 C26,26.9 26.9,26 28,26 Z" />
<path
android:fillColor="#0F172A"
android:pathData="M29,28 L35,28 L35,32 L29,32 Z" />
<path
android:fillColor="#38BDF8"
android:pathData="M30,35 L34,35 L35,37 L29,37 Z" />
<!-- Apple Leaf Accent at Top Corner -->
<path
android:fillColor="#10B981"
android:pathData="M48,10 C48,7.2 46.2,5.2 44,5 C43.8,7.4 45.4,9.8 48,10 Z" />
<path
android:fillColor="#0F172A"
android:pathData="M49.5,10.2 C48.3,10.2 47.3,10.9 46.5,10.9 C45.7,10.9 44.8,10.3 43.6,10.3 C41.6,10.3 39.8,12 39.8,15.2 C39.8,19.2 43.2,24 46.5,24 C47.5,24 48.2,23.3 49.3,23.3 C50.4,23.3 51,24 52.1,24 C54.3,24 56.5,20.8 57.1,19.5 C53.4,17.7 53,12.5 56.6,10.8 C55.3,8.9 53.3,8.7 52.4,8.7 C51.2,8.7 50.3,9.5 49.5,10.2 Z" />
</vector>

16
android/app/src/main/res/drawable/ic_mic_minimal.xml

@ -1,16 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="48dp"
android:height="48dp"
android:viewportWidth="24"
android:viewportHeight="24">
<!-- Minimalist Deep Matte Black Microphone Body -->
<path
android:fillColor="#0F172A"
android:pathData="M12,14 C13.66,14 15,12.66 15,11 L15,5 C15,3.34 13.66,2 12,2 C10.34,2 9,3.34 9,5 L9,11 C9,12.66 10.34,14 12,14 Z" />
<!-- Minimalist Outer Base Stand & Cradle -->
<path
android:fillColor="#0F172A"
android:pathData="M17.3,11 C17.3,13.93 14.93,16.3 12,16.3 C9.07,16.3 6.7,13.93 6.7,11 L5,11 C5,14.49 7.72,17.36 11,17.85 L11,21 L13,21 L13,17.85 C16.28,17.36 19,14.49 19,11 L17.3,11 Z" />
</vector>

386
android/server/relay_server.py

@ -1,386 +0,0 @@
#!/usr/bin/env python3
"""
Soniox Collaborative Bi-Directional Input Synchronization Gateway (v5.0)
- Real-time Google Docs / Figma style collaborative mirroring between Mac and Android.
- Monotonic revision counters, echo-loop suppression, and sub-15ms WebSocket routing.
- Cursor-aware voice insertion and instant text editing.
"""
import asyncio
import json
import logging
import re
import subprocess
import time
from collections import OrderedDict
import aiohttp
from aiohttp import web
import websockets
from websockets.protocol import State
logging.basicConfig(level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger("SyncGateway")
connected_mac_websockets = set()
connected_phone_websockets = set()
# Global Room State Snapshot (Single Source of Truth)
current_room_state = {
"type": "sync_state",
"source": "server_init",
"app": "Desktop",
"text": "",
"cursor": 0,
"selection": 0,
"revision": 0,
"timestamp": time.time()
}
room_lock = asyncio.Lock()
SONIOX_WS_URL = (
"wss://translate.compare.soniox.com/compare/api/compare-websocket"
"?language_hints=fa&language_hints=en&language_hints=ar"
"&enable_speaker_diarization=false&enable_language_identification=true"
"&enable_endpoint_detection=false&providers=soniox"
)
SONIOX_HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
"Origin": "https://translate.compare.soniox.com",
}
def is_ws_open(ws) -> bool:
if ws is None:
return False
if hasattr(ws, 'closed'):
return not ws.closed
if hasattr(ws, 'state'):
return ws.state == State.OPEN
return True
class SonioxPool:
"""Pre-warms upstream WebSockets to Soniox for 0ms speech start delay."""
def __init__(self, size=3):
self._pool = asyncio.Queue(maxsize=size)
self._refilling = False
async def get_session(self):
while not self._pool.empty():
try:
ws = self._pool.get_nowait()
if is_ws_open(ws):
asyncio.create_task(self.refill())
return ws
except asyncio.QueueEmpty:
break
logger.info("Pool empty, connecting fresh Soniox session...")
asyncio.create_task(self.refill())
return await self._create_ws()
async def _create_ws(self):
try:
return await websockets.connect(
SONIOX_WS_URL,
additional_headers=SONIOX_HEADERS,
open_timeout=3.5,
ping_interval=20,
)
except Exception as e:
logger.error("Failed to connect to upstream Soniox: %s", e)
return None
async def refill(self):
if self._refilling or self._pool.full():
return
self._refilling = True
try:
while not self._pool.full():
ws = await self._create_ws()
if ws and is_ws_open(ws):
await self._pool.put(ws)
else:
break
finally:
self._refilling = False
soniox_pool = SonioxPool()
def sanitize_and_flatten_text(text: str) -> str:
if not text:
return ""
flattened = re.sub(r"[\r\n\t]+", " ", text)
flattened = re.sub(r"\s+", " ", flattened).strip()
return flattened
async def broadcast_state(payload_dict: dict, exclude_ws=None):
"""Broadcasts state snapshot to all connected clients (Mac and Phone) except sender."""
global current_room_state
async with room_lock:
current_room_state["revision"] += 1
payload_dict["revision"] = current_room_state["revision"]
payload_dict["timestamp"] = time.time()
# Update our cached authoritative state
current_room_state.update(payload_dict)
payload_str = json.dumps(payload_dict, ensure_ascii=False)
# 1. Send to Phone clients
dead_phones = set()
for ws in list(connected_phone_websockets):
if ws is exclude_ws:
continue
try:
if is_ws_open(ws):
await ws.send_str(payload_str)
else:
dead_phones.add(ws)
except Exception:
dead_phones.add(ws)
for dead in dead_phones:
connected_phone_websockets.discard(dead)
# 2. Send to Mac clients
dead_macs = set()
for ws in list(connected_mac_websockets):
if ws is exclude_ws:
continue
try:
if is_ws_open(ws):
await ws.send_str(payload_str)
else:
dead_macs.add(ws)
except Exception:
dead_macs.add(ws)
for dead in dead_macs:
connected_mac_websockets.discard(dead)
async def handle_phone_stream_ws(request):
"""Duplex WebSocket for Android client (Real-time Live Sync + Audio Dictation)."""
ws = web.WebSocketResponse(heartbeat=12.0)
await ws.prepare(request)
client_ip = request.remote
logger.info("📱 Android Client Connected: %s", client_ip)
connected_phone_websockets.add(ws)
# Immediately hydrate phone with full current state!
async with room_lock:
await ws.send_str(json.dumps(current_room_state, ensure_ascii=False))
active_soniox_ws = None
reader_task = None
stop_event = asyncio.Event()
current_session_id = ""
full_final_tokens = []
current_non_final = ""
async def soniox_reader(soniox_ws, sid):
nonlocal current_non_final
try:
async for s_msg in soniox_ws:
if not is_ws_open(ws):
break
try:
data = json.loads(s_msg)
if data.get("type") == "data" and "parts" in data:
new_finals = []
new_non_finals = []
got_fin = False
for p in data["parts"]:
if p.get("translation_status") == "translation":
continue
txt = p.get("text", "")
is_final = p.get("is_final", False)
if "<fin>" in txt:
got_fin = True
clean = txt.replace("<fin>", "")
if clean: new_finals.append(clean)
elif is_final:
if txt: new_finals.append(txt)
else:
if txt: new_non_finals.append(txt)
if new_finals:
full_final_tokens.extend(new_finals)
current_non_final = "".join(new_non_finals)
live_text = sanitize_and_flatten_text("".join(full_final_tokens) + current_non_final)
if live_text and is_ws_open(ws):
await ws.send_str(json.dumps({
"type": "live",
"session_id": sid,
"text": live_text
}))
if got_fin or data.get("session_ended") or data.get("type") == "session_done":
stop_event.set()
break
except Exception as e:
logger.warning("Soniox parse error: %s", e)
except Exception as e:
logger.warning("Soniox reader error: %s", e)
finally:
stop_event.set()
try:
async for msg in ws:
if msg.type == aiohttp.WSMsgType.BINARY:
# Live PCM audio chunk
if active_soniox_ws and is_ws_open(active_soniox_ws):
await active_soniox_ws.send(msg.data)
elif msg.type == aiohttp.WSMsgType.TEXT:
try:
data = json.loads(msg.data)
except Exception:
continue
msg_type = data.get("type") or data.get("action")
sid = data.get("session_id", f"sess_{int(time.time()*1000)}")
if msg_type == "sync_state" or msg_type == "phone_input_edit" or msg_type == "update_input":
# Phone edited text: broadcast to Mac immediately!
data["source"] = "android"
data["type"] = "sync_state"
await broadcast_state(data, exclude_ws=ws)
elif msg_type == "start":
current_session_id = sid
full_final_tokens.clear()
current_non_final = ""
stop_event.clear()
active_soniox_ws = await soniox_pool.get_session()
if not active_soniox_ws or not is_ws_open(active_soniox_ws):
await ws.send_str(json.dumps({"type": "error", "message": "Upstream Soniox unavailable"}))
continue
if reader_task and not reader_task.done():
reader_task.cancel()
reader_task = asyncio.create_task(soniox_reader(active_soniox_ws, current_session_id))
logger.info("🎙️ Started Live Speech Session: %s", current_session_id)
elif msg_type == "stop":
if active_soniox_ws and is_ws_open(active_soniox_ws):
await active_soniox_ws.send(json.dumps({"type": "finalize"}))
try:
await asyncio.wait_for(stop_event.wait(), timeout=0.55)
except asyncio.TimeoutError:
pass
raw_final = "".join(full_final_tokens) + current_non_final
clean_final = sanitize_and_flatten_text(raw_final)
logger.info("⚡ Session %s final text: '%s'", sid, clean_final)
# Return final speech text to phone
if is_ws_open(ws):
await ws.send_str(json.dumps({
"type": "final",
"session_id": sid,
"text": clean_final,
"cursor_pos": data.get("cursor_pos", -1)
}))
if reader_task and not reader_task.done():
reader_task.cancel()
if active_soniox_ws:
try:
await active_soniox_ws.close()
except Exception:
pass
active_soniox_ws = None
asyncio.create_task(soniox_pool.refill())
elif msg.type in (aiohttp.WSMsgType.CLOSE, aiohttp.WSMsgType.ERROR):
break
finally:
connected_phone_websockets.discard(ws)
if reader_task and not reader_task.done():
reader_task.cancel()
if active_soniox_ws:
try:
await active_soniox_ws.close()
except Exception:
pass
asyncio.create_task(soniox_pool.refill())
logger.info("📱 Android Client disconnected: %s", client_ip)
return ws
async def handle_mac_ws(request):
"""Persistent WebSocket for Mac Bridge (receives live Mac typing & pushes edits)."""
ws = web.WebSocketResponse(heartbeat=10.0)
await ws.prepare(request)
client_ip = request.remote
logger.info("🖥️ Mac client connected: %s", client_ip)
connected_mac_websockets.add(ws)
try:
await ws.send_str(json.dumps({"type": "welcome", "message": "Connected to Soniox Sync Gateway"}))
async for msg in ws:
if msg.type == aiohttp.WSMsgType.TEXT:
try:
data = json.loads(msg.data)
msg_type = data.get("type")
if msg_type == "sync_state" or msg_type == "mac_input_state":
# Mac reports typing / cursor change: broadcast to all phones immediately!
data["source"] = "mac"
data["type"] = "sync_state"
await broadcast_state(data, exclude_ws=ws)
elif msg_type == "ping":
await ws.send_str(json.dumps({"type": "pong"}))
except Exception as e:
logger.warning("Mac message error: %s", e)
elif msg.type in (aiohttp.WSMsgType.CLOSE, aiohttp.WSMsgType.ERROR):
break
finally:
connected_mac_websockets.discard(ws)
logger.info("🖥️ Mac client disconnected: %s", client_ip)
return ws
async def handle_health(request):
async with room_lock:
state_copy = dict(current_room_state)
return web.json_response({
"status": "ok",
"service": "Soniox Collaborative Sync Gateway v5.0",
"connected_macs": len(connected_mac_websockets),
"connected_phones": len(connected_phone_websockets),
"current_app": state_copy.get("app", ""),
"current_revision": state_copy.get("revision", 0),
"current_text_len": len(state_copy.get("text", ""))
})
async def handle_paste(request):
try:
data = await request.json()
text = data.get("text", "")
cursor = data.get("cursor_pos") or data.get("cursor")
data["source"] = "http_post"
data["type"] = "sync_state"
await broadcast_state(data)
return web.json_response({"status": "synced", "revision": current_room_state["revision"]})
except Exception as e:
return web.json_response({"error": str(e)}, status=400)
async def start_background_tasks(app):
asyncio.create_task(soniox_pool.refill())
def create_app():
app = web.Application(client_max_size=25 * 1024 * 1024)
app.on_startup.append(start_background_tasks)
app.router.add_get("/health", handle_health)
app.router.add_get("/status", handle_health)
app.router.add_post("/paste", handle_paste)
app.router.add_get("/ws/stream", handle_phone_stream_ws)
app.router.add_get("/ws/mac", handle_mac_ws)
return app
if __name__ == "__main__":
app = create_app()
web.run_app(app, host="0.0.0.0", port=8999)

4
android/app/build.gradle → app/build.gradle

@ -11,8 +11,8 @@ android {
applicationId "com.soniox.remotemic"
minSdk 24
targetSdk 34
versionCode 1
versionName "1.0.0"
versionCode 2
versionName "1.001"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

305
app/build/generated/data_binding_base_class_source_out/debug/out/com/soniox/remotemic/databinding/ActivityMainBinding.java

@ -0,0 +1,305 @@
// Generated by view binder compiler. Do not edit!
package com.soniox.remotemic.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import com.google.android.material.button.MaterialButton;
import com.soniox.remotemic.R;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final LinearLayout actionButtonsRow;
@NonNull
public final View actionDivider;
@NonNull
public final LinearLayout bottomVoiceSection;
@NonNull
public final TextView btnClearText;
@NonNull
public final MaterialButton btnCopyText;
@NonNull
public final FrameLayout btnMic;
@NonNull
public final ImageButton btnOpenLogs;
@NonNull
public final MaterialButton btnSendToMac;
@NonNull
public final EditText etTranscript;
@NonNull
public final LinearLayout headerLayout;
@NonNull
public final ImageView ivMicIcon;
@NonNull
public final LinearLayout layoutStatus;
@NonNull
public final LinearLayout mainBoxCard;
@NonNull
public final FrameLayout micContainer;
@NonNull
public final ConstraintLayout rootLayout;
@NonNull
public final View statusIndicator;
@NonNull
public final LinearLayout topBoxBar;
@NonNull
public final TextView tvCharCount;
@NonNull
public final TextView tvInstruction;
@NonNull
public final TextView tvMacStatus;
@NonNull
public final TextView tvSubtitle;
@NonNull
public final TextView tvTitle;
@NonNull
public final View viewGlow;
private ActivityMainBinding(@NonNull ConstraintLayout rootView,
@NonNull LinearLayout actionButtonsRow, @NonNull View actionDivider,
@NonNull LinearLayout bottomVoiceSection, @NonNull TextView btnClearText,
@NonNull MaterialButton btnCopyText, @NonNull FrameLayout btnMic,
@NonNull ImageButton btnOpenLogs, @NonNull MaterialButton btnSendToMac,
@NonNull EditText etTranscript, @NonNull LinearLayout headerLayout,
@NonNull ImageView ivMicIcon, @NonNull LinearLayout layoutStatus,
@NonNull LinearLayout mainBoxCard, @NonNull FrameLayout micContainer,
@NonNull ConstraintLayout rootLayout, @NonNull View statusIndicator,
@NonNull LinearLayout topBoxBar, @NonNull TextView tvCharCount,
@NonNull TextView tvInstruction, @NonNull TextView tvMacStatus, @NonNull TextView tvSubtitle,
@NonNull TextView tvTitle, @NonNull View viewGlow) {
this.rootView = rootView;
this.actionButtonsRow = actionButtonsRow;
this.actionDivider = actionDivider;
this.bottomVoiceSection = bottomVoiceSection;
this.btnClearText = btnClearText;
this.btnCopyText = btnCopyText;
this.btnMic = btnMic;
this.btnOpenLogs = btnOpenLogs;
this.btnSendToMac = btnSendToMac;
this.etTranscript = etTranscript;
this.headerLayout = headerLayout;
this.ivMicIcon = ivMicIcon;
this.layoutStatus = layoutStatus;
this.mainBoxCard = mainBoxCard;
this.micContainer = micContainer;
this.rootLayout = rootLayout;
this.statusIndicator = statusIndicator;
this.topBoxBar = topBoxBar;
this.tvCharCount = tvCharCount;
this.tvInstruction = tvInstruction;
this.tvMacStatus = tvMacStatus;
this.tvSubtitle = tvSubtitle;
this.tvTitle = tvTitle;
this.viewGlow = viewGlow;
}
@Override
@NonNull
public ConstraintLayout getRoot() {
return rootView;
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.activity_main, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static ActivityMainBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.actionButtonsRow;
LinearLayout actionButtonsRow = ViewBindings.findChildViewById(rootView, id);
if (actionButtonsRow == null) {
break missingId;
}
id = R.id.actionDivider;
View actionDivider = ViewBindings.findChildViewById(rootView, id);
if (actionDivider == null) {
break missingId;
}
id = R.id.bottomVoiceSection;
LinearLayout bottomVoiceSection = ViewBindings.findChildViewById(rootView, id);
if (bottomVoiceSection == null) {
break missingId;
}
id = R.id.btnClearText;
TextView btnClearText = ViewBindings.findChildViewById(rootView, id);
if (btnClearText == null) {
break missingId;
}
id = R.id.btnCopyText;
MaterialButton btnCopyText = ViewBindings.findChildViewById(rootView, id);
if (btnCopyText == null) {
break missingId;
}
id = R.id.btnMic;
FrameLayout btnMic = ViewBindings.findChildViewById(rootView, id);
if (btnMic == null) {
break missingId;
}
id = R.id.btnOpenLogs;
ImageButton btnOpenLogs = ViewBindings.findChildViewById(rootView, id);
if (btnOpenLogs == null) {
break missingId;
}
id = R.id.btnSendToMac;
MaterialButton btnSendToMac = ViewBindings.findChildViewById(rootView, id);
if (btnSendToMac == null) {
break missingId;
}
id = R.id.etTranscript;
EditText etTranscript = ViewBindings.findChildViewById(rootView, id);
if (etTranscript == null) {
break missingId;
}
id = R.id.headerLayout;
LinearLayout headerLayout = ViewBindings.findChildViewById(rootView, id);
if (headerLayout == null) {
break missingId;
}
id = R.id.ivMicIcon;
ImageView ivMicIcon = ViewBindings.findChildViewById(rootView, id);
if (ivMicIcon == null) {
break missingId;
}
id = R.id.layoutStatus;
LinearLayout layoutStatus = ViewBindings.findChildViewById(rootView, id);
if (layoutStatus == null) {
break missingId;
}
id = R.id.mainBoxCard;
LinearLayout mainBoxCard = ViewBindings.findChildViewById(rootView, id);
if (mainBoxCard == null) {
break missingId;
}
id = R.id.micContainer;
FrameLayout micContainer = ViewBindings.findChildViewById(rootView, id);
if (micContainer == null) {
break missingId;
}
ConstraintLayout rootLayout = (ConstraintLayout) rootView;
id = R.id.statusIndicator;
View statusIndicator = ViewBindings.findChildViewById(rootView, id);
if (statusIndicator == null) {
break missingId;
}
id = R.id.topBoxBar;
LinearLayout topBoxBar = ViewBindings.findChildViewById(rootView, id);
if (topBoxBar == null) {
break missingId;
}
id = R.id.tvCharCount;
TextView tvCharCount = ViewBindings.findChildViewById(rootView, id);
if (tvCharCount == null) {
break missingId;
}
id = R.id.tvInstruction;
TextView tvInstruction = ViewBindings.findChildViewById(rootView, id);
if (tvInstruction == null) {
break missingId;
}
id = R.id.tvMacStatus;
TextView tvMacStatus = ViewBindings.findChildViewById(rootView, id);
if (tvMacStatus == null) {
break missingId;
}
id = R.id.tvSubtitle;
TextView tvSubtitle = ViewBindings.findChildViewById(rootView, id);
if (tvSubtitle == null) {
break missingId;
}
id = R.id.tvTitle;
TextView tvTitle = ViewBindings.findChildViewById(rootView, id);
if (tvTitle == null) {
break missingId;
}
id = R.id.viewGlow;
View viewGlow = ViewBindings.findChildViewById(rootView, id);
if (viewGlow == null) {
break missingId;
}
return new ActivityMainBinding((ConstraintLayout) rootView, actionButtonsRow, actionDivider,
bottomVoiceSection, btnClearText, btnCopyText, btnMic, btnOpenLogs, btnSendToMac,
etTranscript, headerLayout, ivMicIcon, layoutStatus, mainBoxCard, micContainer,
rootLayout, statusIndicator, topBoxBar, tvCharCount, tvInstruction, tvMacStatus,
tvSubtitle, tvTitle, viewGlow);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}

265
app/build/generated/data_binding_base_class_source_out/release/out/com/soniox/remotemic/databinding/ActivityMainBinding.java

@ -0,0 +1,265 @@
// Generated by view binder compiler. Do not edit!
package com.soniox.remotemic.databinding;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.viewbinding.ViewBinding;
import androidx.viewbinding.ViewBindings;
import com.google.android.material.button.MaterialButton;
import com.soniox.remotemic.R;
import java.lang.NullPointerException;
import java.lang.Override;
import java.lang.String;
public final class ActivityMainBinding implements ViewBinding {
@NonNull
private final ConstraintLayout rootView;
@NonNull
public final TextView btnClearLogs;
@NonNull
public final TextView btnCopyLogs;
@NonNull
public final FrameLayout btnMic;
@NonNull
public final MaterialButton btnSaveHost;
@NonNull
public final MaterialButton btnSetVoiceInput;
@NonNull
public final EditText etServerHost;
@NonNull
public final LinearLayout headerLayout;
@NonNull
public final ImageView ivMicIcon;
@NonNull
public final LinearLayout macConfigCard;
@NonNull
public final FrameLayout micContainer;
@NonNull
public final LinearLayout middleSection;
@NonNull
public final ScrollView scrollViewLogs;
@NonNull
public final ScrollView scrollViewTranscript;
@NonNull
public final View statusIndicator;
@NonNull
public final TextView tvInstruction;
@NonNull
public final TextView tvLogs;
@NonNull
public final TextView tvMacStatus;
@NonNull
public final TextView tvTranscript;
@NonNull
public final View viewGlow;
private ActivityMainBinding(@NonNull ConstraintLayout rootView, @NonNull TextView btnClearLogs,
@NonNull TextView btnCopyLogs, @NonNull FrameLayout btnMic,
@NonNull MaterialButton btnSaveHost, @NonNull MaterialButton btnSetVoiceInput,
@NonNull EditText etServerHost, @NonNull LinearLayout headerLayout,
@NonNull ImageView ivMicIcon, @NonNull LinearLayout macConfigCard,
@NonNull FrameLayout micContainer, @NonNull LinearLayout middleSection,
@NonNull ScrollView scrollViewLogs, @NonNull ScrollView scrollViewTranscript,
@NonNull View statusIndicator, @NonNull TextView tvInstruction, @NonNull TextView tvLogs,
@NonNull TextView tvMacStatus, @NonNull TextView tvTranscript, @NonNull View viewGlow) {
this.rootView = rootView;
this.btnClearLogs = btnClearLogs;
this.btnCopyLogs = btnCopyLogs;
this.btnMic = btnMic;
this.btnSaveHost = btnSaveHost;
this.btnSetVoiceInput = btnSetVoiceInput;
this.etServerHost = etServerHost;
this.headerLayout = headerLayout;
this.ivMicIcon = ivMicIcon;
this.macConfigCard = macConfigCard;
this.micContainer = micContainer;
this.middleSection = middleSection;
this.scrollViewLogs = scrollViewLogs;
this.scrollViewTranscript = scrollViewTranscript;
this.statusIndicator = statusIndicator;
this.tvInstruction = tvInstruction;
this.tvLogs = tvLogs;
this.tvMacStatus = tvMacStatus;
this.tvTranscript = tvTranscript;
this.viewGlow = viewGlow;
}
@Override
@NonNull
public ConstraintLayout getRoot() {
return rootView;
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater) {
return inflate(inflater, null, false);
}
@NonNull
public static ActivityMainBinding inflate(@NonNull LayoutInflater inflater,
@Nullable ViewGroup parent, boolean attachToParent) {
View root = inflater.inflate(R.layout.activity_main, parent, false);
if (attachToParent) {
parent.addView(root);
}
return bind(root);
}
@NonNull
public static ActivityMainBinding bind(@NonNull View rootView) {
// The body of this method is generated in a way you would not otherwise write.
// This is done to optimize the compiled bytecode for size and performance.
int id;
missingId: {
id = R.id.btnClearLogs;
TextView btnClearLogs = ViewBindings.findChildViewById(rootView, id);
if (btnClearLogs == null) {
break missingId;
}
id = R.id.btnCopyLogs;
TextView btnCopyLogs = ViewBindings.findChildViewById(rootView, id);
if (btnCopyLogs == null) {
break missingId;
}
id = R.id.btnMic;
FrameLayout btnMic = ViewBindings.findChildViewById(rootView, id);
if (btnMic == null) {
break missingId;
}
id = R.id.btnSaveHost;
MaterialButton btnSaveHost = ViewBindings.findChildViewById(rootView, id);
if (btnSaveHost == null) {
break missingId;
}
id = R.id.btnSetVoiceInput;
MaterialButton btnSetVoiceInput = ViewBindings.findChildViewById(rootView, id);
if (btnSetVoiceInput == null) {
break missingId;
}
id = R.id.etServerHost;
EditText etServerHost = ViewBindings.findChildViewById(rootView, id);
if (etServerHost == null) {
break missingId;
}
id = R.id.headerLayout;
LinearLayout headerLayout = ViewBindings.findChildViewById(rootView, id);
if (headerLayout == null) {
break missingId;
}
id = R.id.ivMicIcon;
ImageView ivMicIcon = ViewBindings.findChildViewById(rootView, id);
if (ivMicIcon == null) {
break missingId;
}
id = R.id.macConfigCard;
LinearLayout macConfigCard = ViewBindings.findChildViewById(rootView, id);
if (macConfigCard == null) {
break missingId;
}
id = R.id.micContainer;
FrameLayout micContainer = ViewBindings.findChildViewById(rootView, id);
if (micContainer == null) {
break missingId;
}
id = R.id.middleSection;
LinearLayout middleSection = ViewBindings.findChildViewById(rootView, id);
if (middleSection == null) {
break missingId;
}
id = R.id.scrollViewLogs;
ScrollView scrollViewLogs = ViewBindings.findChildViewById(rootView, id);
if (scrollViewLogs == null) {
break missingId;
}
id = R.id.scrollViewTranscript;
ScrollView scrollViewTranscript = ViewBindings.findChildViewById(rootView, id);
if (scrollViewTranscript == null) {
break missingId;
}
id = R.id.statusIndicator;
View statusIndicator = ViewBindings.findChildViewById(rootView, id);
if (statusIndicator == null) {
break missingId;
}
id = R.id.tvInstruction;
TextView tvInstruction = ViewBindings.findChildViewById(rootView, id);
if (tvInstruction == null) {
break missingId;
}
id = R.id.tvLogs;
TextView tvLogs = ViewBindings.findChildViewById(rootView, id);
if (tvLogs == null) {
break missingId;
}
id = R.id.tvMacStatus;
TextView tvMacStatus = ViewBindings.findChildViewById(rootView, id);
if (tvMacStatus == null) {
break missingId;
}
id = R.id.tvTranscript;
TextView tvTranscript = ViewBindings.findChildViewById(rootView, id);
if (tvTranscript == null) {
break missingId;
}
id = R.id.viewGlow;
View viewGlow = ViewBindings.findChildViewById(rootView, id);
if (viewGlow == null) {
break missingId;
}
return new ActivityMainBinding((ConstraintLayout) rootView, btnClearLogs, btnCopyLogs, btnMic,
btnSaveHost, btnSetVoiceInput, etServerHost, headerLayout, ivMicIcon, macConfigCard,
micContainer, middleSection, scrollViewLogs, scrollViewTranscript, statusIndicator,
tvInstruction, tvLogs, tvMacStatus, tvTranscript, viewGlow);
}
String missingId = rootView.getResources().getResourceName(id);
throw new NullPointerException("Missing required view with ID: ".concat(missingId));
}
}

1
app/build/intermediates/annotation_processor_list/debug/javaPreCompileDebug/annotationProcessors.json

@ -0,0 +1 @@
{}

1
app/build/intermediates/annotation_processor_list/debugUnitTest/javaPreCompileDebugUnitTest/annotationProcessors.json

@ -0,0 +1 @@
{}

1
app/build/intermediates/annotation_processor_list/release/javaPreCompileRelease/annotationProcessors.json

@ -0,0 +1 @@
{}

1
app/build/intermediates/annotation_processor_list/releaseUnitTest/javaPreCompileReleaseUnitTest/annotationProcessors.json

@ -0,0 +1 @@
{}

2
app/build/intermediates/apk_ide_redirect_file/debug/createDebugApkListingFileRedirect/redirect.txt

@ -0,0 +1,2 @@
#- File Locator -
listingFile=../../../../outputs/apk/debug/output-metadata.json

2
app/build/intermediates/apk_ide_redirect_file/release/createReleaseApkListingFileRedirect/redirect.txt

@ -0,0 +1,2 @@
#- File Locator -
listingFile=../../../../outputs/apk/release/output-metadata.json

2
app/build/intermediates/app_metadata/debug/writeDebugAppMetadata/app-metadata.properties

@ -0,0 +1,2 @@
appMetadataVersion=1.1
androidGradlePluginVersion=8.4.2

2
app/build/intermediates/app_metadata/release/writeReleaseAppMetadata/app-metadata.properties

@ -0,0 +1,2 @@
appMetadataVersion=1.1
androidGradlePluginVersion=8.4.2

BIN
app/build/intermediates/binary_art_profile/release/compileReleaseArtProfile/baseline.prof

BIN
app/build/intermediates/binary_art_profile_metadata/release/compileReleaseArtProfile/baseline.profm

1342
app/build/intermediates/combined_art_profile/release/compileReleaseArtProfile/baseline-prof.txt
File diff suppressed because it is too large
View File

10
app/build/intermediates/compatible_screen_manifest/debug/createDebugCompatibleScreenManifests/output-metadata.json

@ -0,0 +1,10 @@
{
"version": 3,
"artifactType": {
"type": "COMPATIBLE_SCREEN_MANIFEST",
"kind": "Directory"
},
"applicationId": "com.soniox.remotemic",
"variantName": "debug",
"elements": []
}

10
app/build/intermediates/compatible_screen_manifest/release/createReleaseCompatibleScreenManifests/output-metadata.json

@ -0,0 +1,10 @@
{
"version": 3,
"artifactType": {
"type": "COMPATIBLE_SCREEN_MANIFEST",
"kind": "Directory"
},
"applicationId": "com.soniox.remotemic",
"variantName": "release",
"elements": []
}

BIN
app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/debug/processDebugResources/R.jar

BIN
app/build/intermediates/compile_and_runtime_not_namespaced_r_class_jar/release/processReleaseResources/R.jar

BIN
app/build/intermediates/compile_app_classes_jar/debug/bundleDebugClassesToCompileJar/classes.jar

BIN
app/build/intermediates/compile_app_classes_jar/release/bundleReleaseClassesToCompileJar/classes.jar

BIN
app/build/intermediates/data_binding_base_class_log_artifact/debug/dataBindingGenBaseClassesDebug/out/com.soniox.remotemic-binding_classes.json

BIN
app/build/intermediates/data_binding_base_class_log_artifact/release/dataBindingGenBaseClassesRelease/out/com.soniox.remotemic-binding_classes.json

1
app/build/intermediates/data_binding_layout_info_type_merge/debug/mergeDebugResources/out/activity_main-layout.xml

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.soniox.remotemic" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="androidx.constraintlayout.widget.ConstraintLayout" rootNodeViewId="@+id/rootLayout"><Targets><Target id="@+id/rootLayout" tag="layout/activity_main_0" view="androidx.constraintlayout.widget.ConstraintLayout"><Expressions/><location startLine="1" startOffset="0" endLine="252" endOffset="51"/></Target><Target id="@+id/headerLayout" view="LinearLayout"><Expressions/><location startLine="11" startOffset="4" endLine="83" endOffset="18"/></Target><Target id="@+id/tvTitle" view="TextView"><Expressions/><location startLine="25" startOffset="12" endLine="32" endOffset="42"/></Target><Target id="@+id/tvSubtitle" view="TextView"><Expressions/><location startLine="34" startOffset="12" endLine="41" endOffset="41"/></Target><Target id="@+id/layoutStatus" view="LinearLayout"><Expressions/><location startLine="45" startOffset="8" endLine="70" endOffset="22"/></Target><Target id="@+id/statusIndicator" view="View"><Expressions/><location startLine="54" startOffset="12" endLine="59" endOffset="62"/></Target><Target id="@+id/tvMacStatus" view="TextView"><Expressions/><location startLine="61" startOffset="12" endLine="69" endOffset="42"/></Target><Target id="@+id/btnOpenLogs" view="ImageButton"><Expressions/><location startLine="73" startOffset="8" endLine="82" endOffset="43"/></Target><Target id="@+id/mainBoxCard" view="LinearLayout"><Expressions/><location startLine="86" startOffset="4" endLine="194" endOffset="18"/></Target><Target id="@+id/topBoxBar" view="LinearLayout"><Expressions/><location startLine="99" startOffset="8" endLine="133" endOffset="22"/></Target><Target id="@+id/tvCharCount" view="TextView"><Expressions/><location startLine="115" startOffset="12" endLine="121" endOffset="41"/></Target><Target id="@+id/btnClearText" view="TextView"><Expressions/><location startLine="123" startOffset="12" endLine="132" endOffset="41"/></Target><Target id="@+id/etTranscript" view="EditText"><Expressions/><location startLine="136" startOffset="8" endLine="150" endOffset="37"/></Target><Target id="@+id/actionDivider" view="View"><Expressions/><location startLine="152" startOffset="8" endLine="157" endOffset="53"/></Target><Target id="@+id/actionButtonsRow" view="LinearLayout"><Expressions/><location startLine="160" startOffset="8" endLine="193" endOffset="22"/></Target><Target id="@+id/btnCopyText" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="167" startOffset="12" endLine="175" endOffset="40"/></Target><Target id="@+id/btnSendToMac" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="182" startOffset="12" endLine="192" endOffset="40"/></Target><Target id="@+id/bottomVoiceSection" view="LinearLayout"><Expressions/><location startLine="197" startOffset="4" endLine="250" endOffset="18"/></Target><Target id="@+id/micContainer" view="FrameLayout"><Expressions/><location startLine="206" startOffset="8" endLine="238" endOffset="21"/></Target><Target id="@+id/viewGlow" view="View"><Expressions/><location startLine="213" startOffset="12" endLine="219" endOffset="62"/></Target><Target id="@+id/btnMic" view="FrameLayout"><Expressions/><location startLine="222" startOffset="12" endLine="237" endOffset="25"/></Target><Target id="@+id/ivMicIcon" view="ImageView"><Expressions/><location startLine="231" startOffset="16" endLine="236" endOffset="52"/></Target><Target id="@+id/tvInstruction" view="TextView"><Expressions/><location startLine="241" startOffset="8" endLine="249" endOffset="38"/></Target></Targets></Layout>

1
app/build/intermediates/data_binding_layout_info_type_merge/release/mergeReleaseResources/out/activity_main-layout.xml

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.soniox.remotemic" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="androidx.constraintlayout.widget.ConstraintLayout"><Targets><Target tag="layout/activity_main_0" view="androidx.constraintlayout.widget.ConstraintLayout"><Expressions/><location startLine="1" startOffset="0" endLine="287" endOffset="51"/></Target><Target id="@+id/headerLayout" view="LinearLayout"><Expressions/><location startLine="10" startOffset="4" endLine="67" endOffset="18"/></Target><Target id="@+id/statusIndicator" view="View"><Expressions/><location startLine="50" startOffset="12" endLine="55" endOffset="62"/></Target><Target id="@+id/tvMacStatus" view="TextView"><Expressions/><location startLine="57" startOffset="12" endLine="65" endOffset="42"/></Target><Target id="@+id/btnSetVoiceInput" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="70" startOffset="4" endLine="84" endOffset="64"/></Target><Target id="@+id/macConfigCard" view="LinearLayout"><Expressions/><location startLine="87" startOffset="4" endLine="118" endOffset="18"/></Target><Target id="@+id/etServerHost" view="EditText"><Expressions/><location startLine="98" startOffset="8" endLine="108" endOffset="37"/></Target><Target id="@+id/btnSaveHost" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="110" startOffset="8" endLine="117" endOffset="37"/></Target><Target id="@+id/middleSection" view="LinearLayout"><Expressions/><location startLine="121" startOffset="4" endLine="233" endOffset="18"/></Target><Target id="@+id/scrollViewTranscript" view="ScrollView"><Expressions/><location startLine="148" startOffset="12" endLine="164" endOffset="24"/></Target><Target id="@+id/tvTranscript" view="TextView"><Expressions/><location startLine="155" startOffset="16" endLine="163" endOffset="45"/></Target><Target id="@+id/btnCopyLogs" view="TextView"><Expressions/><location startLine="192" startOffset="16" endLine="200" endOffset="45"/></Target><Target id="@+id/btnClearLogs" view="TextView"><Expressions/><location startLine="202" startOffset="16" endLine="211" endOffset="45"/></Target><Target id="@+id/scrollViewLogs" view="ScrollView"><Expressions/><location startLine="214" startOffset="12" endLine="231" endOffset="24"/></Target><Target id="@+id/tvLogs" view="TextView"><Expressions/><location startLine="221" startOffset="16" endLine="230" endOffset="45"/></Target><Target id="@+id/micContainer" view="FrameLayout"><Expressions/><location startLine="236" startOffset="4" endLine="271" endOffset="17"/></Target><Target id="@+id/viewGlow" view="View"><Expressions/><location startLine="246" startOffset="8" endLine="252" endOffset="58"/></Target><Target id="@+id/btnMic" view="FrameLayout"><Expressions/><location startLine="255" startOffset="8" endLine="270" endOffset="21"/></Target><Target id="@+id/ivMicIcon" view="ImageView"><Expressions/><location startLine="264" startOffset="12" endLine="269" endOffset="48"/></Target><Target id="@+id/tvInstruction" view="TextView"><Expressions/><location startLine="274" startOffset="4" endLine="285" endOffset="55"/></Target></Targets></Layout>

1
app/build/intermediates/data_binding_layout_info_type_package/debug/packageDebugResources/out/activity_main-layout.xml

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.soniox.remotemic" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="androidx.constraintlayout.widget.ConstraintLayout" rootNodeViewId="@+id/rootLayout"><Targets><Target id="@+id/rootLayout" tag="layout/activity_main_0" view="androidx.constraintlayout.widget.ConstraintLayout"><Expressions/><location startLine="1" startOffset="0" endLine="252" endOffset="51"/></Target><Target id="@+id/headerLayout" view="LinearLayout"><Expressions/><location startLine="11" startOffset="4" endLine="83" endOffset="18"/></Target><Target id="@+id/tvTitle" view="TextView"><Expressions/><location startLine="25" startOffset="12" endLine="32" endOffset="42"/></Target><Target id="@+id/tvSubtitle" view="TextView"><Expressions/><location startLine="34" startOffset="12" endLine="41" endOffset="41"/></Target><Target id="@+id/layoutStatus" view="LinearLayout"><Expressions/><location startLine="45" startOffset="8" endLine="70" endOffset="22"/></Target><Target id="@+id/statusIndicator" view="View"><Expressions/><location startLine="54" startOffset="12" endLine="59" endOffset="62"/></Target><Target id="@+id/tvMacStatus" view="TextView"><Expressions/><location startLine="61" startOffset="12" endLine="69" endOffset="42"/></Target><Target id="@+id/btnOpenLogs" view="ImageButton"><Expressions/><location startLine="73" startOffset="8" endLine="82" endOffset="43"/></Target><Target id="@+id/mainBoxCard" view="LinearLayout"><Expressions/><location startLine="86" startOffset="4" endLine="194" endOffset="18"/></Target><Target id="@+id/topBoxBar" view="LinearLayout"><Expressions/><location startLine="99" startOffset="8" endLine="133" endOffset="22"/></Target><Target id="@+id/tvCharCount" view="TextView"><Expressions/><location startLine="115" startOffset="12" endLine="121" endOffset="41"/></Target><Target id="@+id/btnClearText" view="TextView"><Expressions/><location startLine="123" startOffset="12" endLine="132" endOffset="41"/></Target><Target id="@+id/etTranscript" view="EditText"><Expressions/><location startLine="136" startOffset="8" endLine="150" endOffset="37"/></Target><Target id="@+id/actionDivider" view="View"><Expressions/><location startLine="152" startOffset="8" endLine="157" endOffset="53"/></Target><Target id="@+id/actionButtonsRow" view="LinearLayout"><Expressions/><location startLine="160" startOffset="8" endLine="193" endOffset="22"/></Target><Target id="@+id/btnCopyText" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="167" startOffset="12" endLine="175" endOffset="40"/></Target><Target id="@+id/btnSendToMac" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="182" startOffset="12" endLine="192" endOffset="40"/></Target><Target id="@+id/bottomVoiceSection" view="LinearLayout"><Expressions/><location startLine="197" startOffset="4" endLine="250" endOffset="18"/></Target><Target id="@+id/micContainer" view="FrameLayout"><Expressions/><location startLine="206" startOffset="8" endLine="238" endOffset="21"/></Target><Target id="@+id/viewGlow" view="View"><Expressions/><location startLine="213" startOffset="12" endLine="219" endOffset="62"/></Target><Target id="@+id/btnMic" view="FrameLayout"><Expressions/><location startLine="222" startOffset="12" endLine="237" endOffset="25"/></Target><Target id="@+id/ivMicIcon" view="ImageView"><Expressions/><location startLine="231" startOffset="16" endLine="236" endOffset="52"/></Target><Target id="@+id/tvInstruction" view="TextView"><Expressions/><location startLine="241" startOffset="8" endLine="249" endOffset="38"/></Target></Targets></Layout>

1
app/build/intermediates/data_binding_layout_info_type_package/release/packageReleaseResources/out/activity_main-layout.xml

@ -0,0 +1 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?><Layout layout="activity_main" modulePackage="com.soniox.remotemic" filePath="app/src/main/res/layout/activity_main.xml" directory="layout" isMerge="false" isBindingData="false" rootNodeType="androidx.constraintlayout.widget.ConstraintLayout"><Targets><Target tag="layout/activity_main_0" view="androidx.constraintlayout.widget.ConstraintLayout"><Expressions/><location startLine="1" startOffset="0" endLine="287" endOffset="51"/></Target><Target id="@+id/headerLayout" view="LinearLayout"><Expressions/><location startLine="10" startOffset="4" endLine="67" endOffset="18"/></Target><Target id="@+id/statusIndicator" view="View"><Expressions/><location startLine="50" startOffset="12" endLine="55" endOffset="62"/></Target><Target id="@+id/tvMacStatus" view="TextView"><Expressions/><location startLine="57" startOffset="12" endLine="65" endOffset="42"/></Target><Target id="@+id/btnSetVoiceInput" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="70" startOffset="4" endLine="84" endOffset="64"/></Target><Target id="@+id/macConfigCard" view="LinearLayout"><Expressions/><location startLine="87" startOffset="4" endLine="118" endOffset="18"/></Target><Target id="@+id/etServerHost" view="EditText"><Expressions/><location startLine="98" startOffset="8" endLine="108" endOffset="37"/></Target><Target id="@+id/btnSaveHost" view="com.google.android.material.button.MaterialButton"><Expressions/><location startLine="110" startOffset="8" endLine="117" endOffset="37"/></Target><Target id="@+id/middleSection" view="LinearLayout"><Expressions/><location startLine="121" startOffset="4" endLine="233" endOffset="18"/></Target><Target id="@+id/scrollViewTranscript" view="ScrollView"><Expressions/><location startLine="148" startOffset="12" endLine="164" endOffset="24"/></Target><Target id="@+id/tvTranscript" view="TextView"><Expressions/><location startLine="155" startOffset="16" endLine="163" endOffset="45"/></Target><Target id="@+id/btnCopyLogs" view="TextView"><Expressions/><location startLine="192" startOffset="16" endLine="200" endOffset="45"/></Target><Target id="@+id/btnClearLogs" view="TextView"><Expressions/><location startLine="202" startOffset="16" endLine="211" endOffset="45"/></Target><Target id="@+id/scrollViewLogs" view="ScrollView"><Expressions/><location startLine="214" startOffset="12" endLine="231" endOffset="24"/></Target><Target id="@+id/tvLogs" view="TextView"><Expressions/><location startLine="221" startOffset="16" endLine="230" endOffset="45"/></Target><Target id="@+id/micContainer" view="FrameLayout"><Expressions/><location startLine="236" startOffset="4" endLine="271" endOffset="17"/></Target><Target id="@+id/viewGlow" view="View"><Expressions/><location startLine="246" startOffset="8" endLine="252" endOffset="58"/></Target><Target id="@+id/btnMic" view="FrameLayout"><Expressions/><location startLine="255" startOffset="8" endLine="270" endOffset="21"/></Target><Target id="@+id/ivMicIcon" view="ImageView"><Expressions/><location startLine="264" startOffset="12" endLine="269" endOffset="48"/></Target><Target id="@+id/tvInstruction" view="TextView"><Expressions/><location startLine="274" startOffset="4" endLine="285" endOffset="55"/></Target></Targets></Layout>

89
app/build/intermediates/default_proguard_files/global/proguard-android-optimize.txt-8.4.2

@ -0,0 +1,89 @@
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimizations: If you don't want to optimize, use the proguard-android.txt configuration file
# instead of this one, which turns off the optimization flags.
-allowaccessmodification
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**

95
app/build/intermediates/default_proguard_files/global/proguard-android.txt-8.4.2

@ -0,0 +1,95 @@
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize steps (and performs some
# of these optimizations on its own).
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.
-dontoptimize
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**

89
app/build/intermediates/default_proguard_files/global/proguard-defaults.txt-8.4.2

@ -0,0 +1,89 @@
# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
#
# Starting with version 2.2 of the Android plugin for Gradle, this file is distributed together with
# the plugin and unpacked at build-time. The files in $ANDROID_HOME are no longer maintained and
# will be ignored by new version of the Android plugin for Gradle.
# Optimizations can be turned on and off in the 'postProcessing' DSL block.
# The configuration below is applied if optimizations are enabled.
-allowaccessmodification
# Preserve some attributes that may be required for reflection.
-keepattributes AnnotationDefault,
EnclosingMethod,
InnerClasses,
RuntimeVisibleAnnotations,
RuntimeVisibleParameterAnnotations,
RuntimeVisibleTypeAnnotations,
Signature
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.google.android.vending.licensing.ILicensingService
-dontnote com.android.vending.licensing.ILicensingService
-dontnote com.google.vending.licensing.ILicensingService
-dontnote com.google.android.vending.licensing.ILicensingService
# For native methods, see https://www.guardsquare.com/manual/configuration/examples#native
-keepclasseswithmembernames,includedescriptorclasses class * {
native <methods>;
}
# Keep setters in Views so that animations can still work.
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
# We want to keep methods in Activity that could be used in the XML attribute onClick.
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
# For enumeration classes, see https://www.guardsquare.com/manual/configuration/examples#enumerations
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keepclassmembers class * implements android.os.Parcelable {
public static final ** CREATOR;
}
# Preserve annotated Javascript interface methods.
-keepclassmembers class * {
@android.webkit.JavascriptInterface <methods>;
}
# The support libraries contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version. We know about them, and they are safe.
-dontnote android.support.**
-dontnote androidx.**
-dontwarn android.support.**
-dontwarn androidx.**
# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep
-keep @android.support.annotation.Keep class * {*;}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <methods>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <fields>;
}
-keepclasseswithmembers class * {
@android.support.annotation.Keep <init>(...);
}
# These classes are duplicated between android.jar and org.apache.http.legacy.jar.
-dontnote org.apache.http.**
-dontnote android.net.http.**
# These classes are duplicated between android.jar and core-lambda-stubs.jar.
-dontnote java.lang.invoke.**

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_0/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_1/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_2/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_3/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_4/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_5/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_6/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/dirs_bucket_7/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_0/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_1/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_2/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_3/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_4/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_5/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_6/graph.bin

BIN
app/build/intermediates/desugar_graph/debug/dexBuilderDebug/out/currentProject/jar_2e905f7bad43601e5238551e2a22b17b9192a3cb123aa9b50c670b4471ce9046_bucket_7/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_0/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_1/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_2/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_3/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_4/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_5/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_6/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/dirs_bucket_7/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_0/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_1/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_2/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_3/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_4/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_5/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_6/graph.bin

BIN
app/build/intermediates/desugar_graph/release/dexBuilderRelease/out/currentProject/jar_b161204a70da50c08087acc74a897770c8f29dc930592cff708db20d899045c2_bucket_7/graph.bin

BIN
app/build/intermediates/dex/debug/mergeExtDexDebug/classes.dex

BIN
app/build/intermediates/dex/debug/mergeProjectDexDebug/0/classes.dex

BIN
app/build/intermediates/dex/debug/mergeProjectDexDebug/10/classes.dex

BIN
app/build/intermediates/dex/debug/mergeProjectDexDebug/5/classes.dex

BIN
app/build/intermediates/dex/release/mergeDexRelease/classes.dex

BIN
app/build/intermediates/dex/release/mergeDexRelease/classes2.dex

BIN
app/build/intermediates/dex_archive_input_jar_hashes/debug/dexBuilderDebug/out

BIN
app/build/intermediates/dex_archive_input_jar_hashes/release/dexBuilderRelease/out

BIN
app/build/intermediates/dex_metadata_directory/release/compileReleaseArtProfile/0/.dm

BIN
app/build/intermediates/dex_metadata_directory/release/compileReleaseArtProfile/1/.dm

5
app/build/intermediates/dex_metadata_directory/release/compileReleaseArtProfile/dex-metadata-map.properties

@ -0,0 +1,5 @@
31=0/.dm
2147483647=0/.dm
28=1/.dm
29=1/.dm
30=1/.dm

1
app/build/intermediates/dex_number_of_buckets_file/debug/dexBuilderDebug/out

@ -0,0 +1 @@
8

1
app/build/intermediates/dex_number_of_buckets_file/release/dexBuilderRelease/out

@ -0,0 +1 @@
8

BIN
app/build/intermediates/external_libs_dex/release/mergeExtDexRelease/classes.dex

BIN
app/build/intermediates/incremental/dataBindingGenBaseClassesDebug/base_builder_log.json

BIN
app/build/intermediates/incremental/dataBindingGenBaseClassesRelease/base_builder_log.json

BIN
app/build/intermediates/incremental/debug-mergeJavaRes/merge-state

BIN
app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1FHHRWDDArcggrwmJBxs1FyYsD4=

BIN
app/build/intermediates/incremental/debug-mergeJavaRes/zip-cache/1bV38vxKu8s45m0jMDRfRZE34Js=

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save