Skip to content

xusnitdinov/StickySpace

Repository files navigation

StickySpace

StickySpace is an offline Android app that lets you leave sticky notes in physical space using AR.

You create places (desk, kitchen, desk again…), walk around with the camera, aim at a wall or empty air, and stick notes there. Notes can be plain text, to-dos, or ideas - with optional sketches. Everything is stored on the phone (Room / SQLite). There is no account and no cloud.

Latest APK: StickySpace-1.6.1.apk

Needs an ARCore-supported phone. Install the APK and allow installs from your browser/files app if asked.


What you can do

Feature What it means
Places Named rooms / spots you open into AR
Folders Group places on the home screen
AR placement Aim → set Near / Mid / Far (or a slider) → Place note
Note types Text, To-do checklist, Idea
Colors + sketch Paper-style stickies with optional drawing
Room lock Capture a textured landmark so notes hold across app restarts
Tap to delete Tap a floating sticky to remove it

Room lock (important)

Without a lock, note positions are relative to a temporary AR session origin. When the app dies, ARCore starts a new world - so notes look wrong next time. That is an ARCore limitation, not a “forgot to save” bug.

Lock grabs a unique textured thing in the room (poster, art, patterned object) as an ARCore Augmented Image. Sticky poses are then stored relative to that landmark, so reopening the place and looking at the same spot brings them back.

How to use it

  1. Place some notes (or lock first - both work).
  2. Tap the lock icon and aim at something textured.
  3. Point at that same spot again until status says the lock is bound / found.
  4. Leave AR and come back later - look at the lock spot to recover positions.

Tech stack

Layer Choice
Language Kotlin
UI Jetpack Compose + Material 3
Navigation Navigation Compose
AR Google ARCore via SceneView arsceneview:2.3.0
Local DB Room (SQLite) - file stickyspace.db
Min / target SDK 24 / 35
Version 1.6.1 (versionCode 9)

Fully offline. Drawings and lock photos are files under the app’s private storage; metadata lives in Room.


How the app is structured

app/src/main/java/com/stickyspace/app/
├── MainActivity.kt          # Entry: theme + navigation
├── StickySpaceApp.kt        # Application: builds Room DB + NoteRepository
├── data/
│   ├── Entities.kt          # Folder, Place, Note (+ NoteType, colors)
│   ├── Daos.kt              # Room DAOs
│   ├── AppDatabase.kt       # DB definition (v5)
│   └── NoteRepository.kt    # Single API for UI: CRUD, landmarks, sketches
└── ui/
    ├── StickySpaceNav.kt    # home ↔ AR({placeId})
    ├── theme/Theme.kt
    ├── home/
    │   ├── HomeScreen.kt    # Places / folders / FAB
    │   └── HomeViewModel.kt
    ├── ar/
    │   └── ArNotesScreen.kt # Camera, placement, lock, projection
    ├── compose/
    │   └── NoteComposerDialog.kt  # Text / todo / idea + draw pad
    └── components/
        └── PaperStickyNote.kt     # On-screen paper sticky widget

Boot path

  1. StickySpaceApp creates AppDatabase and a NoteRepository.
  2. MainActivity wraps UI in StickySpaceTheme and starts StickySpaceNav.
  3. Navigation is two screens only:
    • home → manage folders & places
    • ar/{placeId} → live AR for that place

Data model

  • Folder - optional grouping for places.
  • Place - a named location. Optional landmarkPath / landmarkWidthMeters for room lock (isLocked when landmark path is set).
  • Note - belongs to a place (CASCADE delete). Stores text, type, color, optional sketch file path, and local pose (localX, localY, localZ) relative to the current origin (session plane/camera or locked landmark).

NoteRepository is the only layer screens talk to for persistence: create/move/delete places & folders, add/delete notes, save/clear landmarks, remap poses after lock.

Home UI

HomeScreen + HomeViewModel observe folders and places as Flows. You can create places/folders, expand folders, move places between folders, delete, and open a place into AR.

AR screen (the core)

ArNotesScreen hosts an ARSceneView and does the hard work:

  1. Camera permission - requested on entry.
  2. Session config - horizontal + vertical planes, instant placement, depth when supported, optional Augmented Image DB when the place is locked.
  3. Origin
    • Unlocked: session origin from a tracked plane (or camera-forward fallback).
    • Locked: Augmented Image center pose once the landmark is fully tracked.
  4. Placement - “Place note here” (or tap) puts a pose at camera-forward × distance (Near / Mid / Far / slider). Opens the composer sheet.
  5. Composer - builds TEXT / TODO / IDEA (+ optional bitmap sketch). Repository writes the row + sketch file with local coords.
  6. Rendering - each frame projects saved notes to screen as Compose PaperStickyNotes (not 3D models). Size scales with depth so farther stickies look smaller. Off-screen / behind-camera notes are hidden.
  7. Room lock - captures a center-cropped camera frame as a landmark JPEG, enables Augmented Images on the live session, and remaps existing note locals from the old session origin into landmark space when the lock spot is first found.
  8. Unlock - clears landmark files/DB fields and remounts AR in session mode.

Helper bits in the same file: origin anchors, screen projection matrices, light smoothing of sticker XY so they don’t jitter every frame.

Composer & stickies

  • NoteComposerSheet - type chips, color dots, text/checklist fields, finger-draw canvas.
  • PaperStickyNote - paper look used both in the composer preview and floating over the camera feed.

Build from source

Requirements: Android Studio (or JDK 17 + Android SDK), local.properties with sdk.dir=....

set JAVA_HOME=C:\Program Files\Android\Android Studio\jbr
gradlew.bat assembleDebug

Output: app/build/outputs/apk/debug/app-debug.apk
Release downloads use the renamed asset: StickySpace-1.6.1.apk.


Known limits (honest)

  • Unlocked places will drift after kill/restart - use Room lock for persistence.
  • Lock needs a textured real-world patch; blank walls fail often.
  • Schema bumps currently use Room fallbackToDestructiveMigration() - upgrading DB version can wipe local data.
  • Debug APK is signed for sideloading / demos, not Play Store release signing.

License / status

MIT Personal / portfolio project. Demo-quality: great for showing offline AR + Compose + Room; not polished product shipping.

About

AR sticky notes for Android - places, folders, drawings, room lock

Resources

Stars

1 star

Watchers

1 watching

Forks

Packages

 
 
 

Contributors

Languages