Android client for the Voice note-taking application. Syncs with a Voice server to retrieve and display notes.
- View notes synced from a Voice server
- Configure sync server settings
- Manual sync with the server
- Material Design 3 / Material You theming
- Follows system light/dark theme
- Android 10 (API 29) or higher
- Voice sync server running and accessible
- MANAGE_EXTERNAL_STORAGE - Grants full filesystem access, needed to store audio files in a user-accessible location for integrating with additional tools.
- Android SDK with:
- SDK Platform 35
- Build Tools 34
- NDK 29.x
- Rust toolchain with Android targets:
rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android
cargo install cargo-ndk- JDK 17+ (Android Studio includes one)
- Clone with submodules:
git clone --recursive https://github.com/dotancohen/VoiceAndroid.git
cd VoiceAndroid- Set up local.properties:
echo "sdk.dir=/path/to/Android/Sdk" > local.properties- Build Rust native libraries (if not already built):
export ANDROID_NDK_HOME=/path/to/ndk
cd submodules/voicecore
# Build for all architectures
for target in aarch64-linux-android armv7-linux-androideabi x86_64-linux-android i686-linux-android; do
cargo ndk -t $target --platform 29 build --release --no-default-features --features uniffi
done
# Copy libraries
cd ../..
mkdir -p app/src/main/jniLibs/{arm64-v8a,armeabi-v7a,x86_64,x86}
cp submodules/voicecore/target/aarch64-linux-android/release/libvoicecore.so app/src/main/jniLibs/arm64-v8a/
cp submodules/voicecore/target/armv7-linux-androideabi/release/libvoicecore.so app/src/main/jniLibs/armeabi-v7a/
cp submodules/voicecore/target/x86_64-linux-android/release/libvoicecore.so app/src/main/jniLibs/x86_64/
cp submodules/voicecore/target/i686-linux-android/release/libvoicecore.so app/src/main/jniLibs/x86/- Generate Kotlin bindings (if not already generated):
cd submodules/voicecore
cargo build --release --features uniffi
./target/release/uniffi-bindgen generate \
--library target/release/libvoicecore.so \
--language kotlin \
--out-dir ../../app/src/main/java- Build the APK:
./gradlew assembleDebugThe APK will be at app/build/outputs/apk/debug/app-debug.apk
In the app's Settings screen, configure:
- Server URL: The URL of your Voice sync server (e.g.,
https://myserver.com:8384) - Server Peer ID: The 32-character hex device ID of the server
- Device Name: A friendly name for this device
- Device ID: Auto-generated or paste an existing ID to link with another installation
- Kotlin + Jetpack Compose: Modern Android UI toolkit
- Rust Core (via UniFFI): Cross-platform business logic shared with desktop
- MVVM: Clean architecture with ViewModels and Repository pattern
VoiceAndroid/
├── app/
│ └── src/main/
│ ├── java/com/dotancohen/voiceandroid/
│ │ ├── data/ # Repository and data models
│ │ ├── ui/ # Compose UI screens
│ │ ├── viewmodel/ # ViewModels
│ │ └── MainActivity.kt
│ ├── jniLibs/ # Native Rust libraries
│ └── res/ # Android resources
├── submodules/
│ └── voicecore/ # Rust core library
└── gradle/
GPL version 3.0 or above