The problem: phone calculators are grids of tiny buttons designed for a mouse finger. One-handed, on the move, you mistype.
The solution: JusCalc replaces buttons with drag strips. Numbers live on two rotary dials — flick and release on your digit. Selections chase your finger, detent haptics tick, springs settle. No aiming, no mistypes.
| What it does | |
|---|---|
| No buttons | Every input is a drag or tap — usable one-handed, eyes half-open |
| Two ways to count | Rotary dials, or Number-dots mode: both bars become one 1–10 counter |
| Speaks results | 55000 → 55 THOUSAND, 1200000 → 1.2 MILLION |
| Remembers | Pull-down history survives restarts; tap a row to keep calculating |
| Dresses up | Six colorways: Olive, Cherry, Vanilla, Violet, Turquoise, Lavender |
| Offline | Zero network permission — your calculations never leave the phone |
| Control | Drag left | Drag right | Tap |
|---|---|---|---|
Top dial (5–9) |
higher digit | lower digit | nearest third |
Bottom dial (0–4) |
higher digit | lower digit | nearest third |
| Dots (both bars) | slide across — lit count = digit (10 → 0) |
continues into the other row | dot's position |
( ) pad |
pick from the ( ) row |
— | smart paren |
X pad |
× |
÷ (or up through ÷ × + −) |
× |
AC • pill |
• |
AC |
either half |
Del = pill |
= |
Del |
either half |
Display: tap copies (result after =, expression while typing) · hold opens settings · pull down reveals history. Back closes settings, then history, then the app.
| JusCalc | Stock calculator | Scientific apps | |
|---|---|---|---|
| Button-free input | ✅ everything drags | ❌ | ❌ |
| One-handed use | ✅ | ||
| Word-spelled results | ✅ 1.2 MILLION |
❌ 1200000 |
❌ |
| Persistent history | ✅ on-device | ✅ | |
| Scientific functions | ❌ (basic + parens) | ❌ | ✅ |
| Price / ads / tracking | ✅ free, none, none | ✅ |
Use JusCalc for everyday arithmetic with one thumb. Use something else for trig and logarithms.
Grab it from Releases (Android 7.0+). Coming from v1.0? Uninstall it first — v1.0.1 switched signatures.
git clone git@github.com:shubh72010/JusCalc.git
cd JusCalc
./gradlew :app:installRelease # or :app:installDebugRequires Android SDK 37 + JDK 17.
./gradlew :app:assembleDebug # debug APK
./gradlew :app:assembleRelease # upload-signed release APK
./gradlew :app:testDebugUnitTest # unit tests (CalcEngineTest must stay green)
./gradlew :app:lintRelease # must be 0 errors before any releasePush a v* tag and CI tests, builds, and publishes the APK to a GitHub Release with build provenance.
┌──────────────────────────────────────────────┐
│ MainActivity.kt — all UI + state │
│ Display · Dials · Dots · Pills · Pads │
│ HistoryPanel · SettingsSheet │
└──────────────────────┬───────────────────────┘
│ expr / =
▼
┌──────────────────────────────────────────────┐
│ CalcEngine.kt — EvalEx (BigDecimal, 12-digit)│
│ evaluate() → Ok | Err · numberToCompact() │
└──────────────────────┬───────────────────────┘
│ persist (30 cap)
▼
SharedPreferences
More: ARCHITECTURE.md · DESIGN_LANGUAGE.md · AGENTS.md
v1.0 was debug-signed, v1.0.1 uses the upload key — Android treats them as different apps. Uninstall v1.0 first (its history goes with it).
The network exposes the device twice. Pin every call:
export ANDROID_SERIAL=192.168.1.39:39585Install Android SDK Platform 37 via SDK Manager (sdkmanager "platforms;android-37"), then rebuild.
- Basic arithmetic only —
+ − × ÷, parens, decimals. No trig, logs, or matrices. - 28-character expressions, 30-entry history — caps, not bugs.
- Phone-first layout — no dedicated landscape/tablet arrangement.
- ~8 MB APK — R8/minify is off; size work hasn't mattered yet.
Fully. No network permission in the manifest — nothing leaves your phone.
On-device SharedPreferences, one line per entry. Uninstalling clears it; updates keep it.
The upload key is ready — that's the main blocker gone. Store listing is still to do.
BigDecimal math with correct precedence for free, no scripting engine, and anything it rejects becomes a clean ERROR. Less code, fewer bugs.
- Math: EvalEx (Apache-2.0)
- Geometry: Kyant0/Shapes
- Typeface: Geist (OFL), bundled in
res/font


