An Android personal-assistant app with voice input/output, Groq AI integration, a JNI-backed native command layer, skills management, a sandboxed terminal, and local/cloud storage helpers.
- Voice Recognition — uses Android's built-in speech recognizer for hands-free input
- Text-to-Speech — spoken responses via Android's TTS engine
- Groq AI — chat via the Groq API (
llama-3.3-70b-versatile) with a rolling conversation history; falls back to offline rule-based responses when a key is not configured or the network is unavailable - Turbo Mode —
turbo on/off/statusforces all responses through the local rule engine for zero-latency replies - Skills Dashboard — list, add, update, and remove named skills; view turbo-mode status
- Sandbox Terminal — safe in-app terminal commands:
pwd,ls,cat,date,echo,build-tools - Native JNI Layer — a small C++ core (
assistantcoreshared library) handlesnative status,native help, andnative processcommands; a pure-Kotlin fallback is used automatically when the library is not available - Local File Actions — upload and download files through Android's Storage Access Framework (no storage permissions required)
- Cloud Storage Placeholders — prototype upload/download/list flows ready to be wired to a real cloud back-end
- Python Script Loading — load bundled or user-selected
.pyfiles for future assistant extensions
app/src/main/
├── java/com/manus/assistant/ # Kotlin source files
│ ├── MainActivity.kt # UI and input routing
│ ├── AssistantEngine.kt # Groq AI + local-rule orchestrator
│ ├── GroqApiClient.kt # Groq chat-completions HTTP client
│ ├── SkillsManager.kt # Persistent skills registry
│ ├── TerminalManager.kt # Sandboxed terminal command runner
│ ├── NativeCommandProcessor.kt# JNI bridge (Kotlin side)
│ ├── PythonScriptManager.kt # Python script loader
│ ├── CloudStorageManager.kt # Cloud storage placeholder manager
│ ├── ChatAdapter.kt # RecyclerView adapter for chat messages
│ └── ChatMessage.kt # Chat message data model
├── cpp/
│ ├── CMakeLists.txt # CMake build for the native library
│ └── native_command_processor.cpp
├── res/ # Layouts, strings, drawables
└── AndroidManifest.xml # Permissions: RECORD_AUDIO, INTERNET
| Tool | Version |
|---|---|
| JDK | 17+ |
| Android SDK | API 24 – 34 |
| Android NDK | 27.3.13750724 |
| CMake | 3.31.5 |
- Clone the repository.
- Create
local.propertiesin the project root and setsdk.dir=/path/to/Android/Sdk. - (Optional) Add
groq.api.key=<your-key>tolocal.properties, or exportGROQ_API_KEYin your shell. The app works without a key using its offline rule engine. - Install NDK and CMake if not already present:
sdkmanager "ndk;27.3.13750724" "cmake;3.31.5" - Build:
./gradlew assembleDebug --no-daemon
If dl.google.com is not reachable from your network, export GOOGLE_MAVEN_REPOSITORY_URL or pass -PgoogleMavenRepositoryUrl=https://your-mirror.example.com/android/maven2. The setting is respected in both pluginManagement (plugin artifacts) and dependencyResolutionManagement (library artifacts).
Set KEYSTORE_PATH, KEYSTORE_PASSWORD, KEY_ALIAS, and KEY_PASSWORD environment variables. When absent the build falls back to the debug key automatically.
GitHub Actions (android.yml) runs on every push/PR to main:
- Sets up JDK 17 and Android SDK
- Installs NDK 27.3.13750724 and CMake 3.31.5
- Runs unit tests (
./gradlew test) - Builds both debug and release APKs
- Uploads APKs as workflow artifacts (retained 14 days)
| Library | Purpose |
|---|---|
| AndroidX (core-ktx, appcompat, recyclerview) | UI and Jetpack utilities |
| Material Components | UI theming |
| OkHttp 4.12 | Groq API HTTP calls |
| Kotlin Coroutines 1.7 | Off-main-thread networking |
| Lifecycle Runtime KTX 2.7 | lifecycleScope coroutine support |
| JUnit 4 / OkHttp MockWebServer | Unit testing |
| Espresso | Instrumentation testing |