Infinite 2D home screen launcher for Android.
Pan. Zoom. Place apps and tools in a world, not in pages.
Most launchers optimize for fixed pages and static icon grids. Canvas Launcher optimizes for spatial memory and flow:
- no page borders;
- no forced row/column lock;
- no context switch between "home pages".
Apps, notes, frames, and widgets live in one shared coordinate space you can navigate like a map.
| Metric | Current value |
|---|---|
| Gradle modules | 12 |
| Automated test files | 74 |
Total test cases (@Test) |
665 |
| Unit test cases | 649 |
| Android instrumentation test cases | 16 |
| Aggregate instruction coverage (Jacoco) | 81.69% |
| Min SDK / Target SDK | 26 / 36 |
| App version | 1.0.0 |
| Canvas widgets | 5 implemented types |
- onboarding flow (
DefaultActivity) with launcher-role request and fallback path; - production
HOMEactivity (MainActivity) withsingleTasklauncher behavior; - package change receiver (
PACKAGE_ADDED/REMOVED/CHANGED) with event bus propagation.
- one-finger pan, two-finger zoom, world/screen coordinate transforms;
- minimap projection for spatial orientation at low zoom;
- viewport culling for large datasets;
- edit-mode drag with snap guides and edge auto-pan;
- gesture arbitration to reduce accidental mode conflicts.
- brush strokes, sticky notes, text blocks, frames;
- inline editing for text/title entities;
- move/resize/delete for editable objects;
- multi-select with computed selection bounds;
- undo stack for canvas-edit operations.
Canvas widgets are not a placeholder state. The following types are implemented end-to-end (UI + state + persistence + tests):
ClockDigitalClockAnalogWeatherNotificationsCalendar(today's events)
Related platform integration is wired:
- notification listener service for live notification feed;
- Android 13+ notifications permission handling;
- runtime calendar permission flow (
READ_CALENDAR) for the Calendar widget; - coarse/fine location flow for weather context.
- direct app launch from canvas;
- searchable app panel with "show on canvas";
- uninstall action from in-app management flow;
- ranked search overlay with quick top-result launch;
- optional web fallback search from launcher input.
- modes:
SPIRAL,RECTANGLE,CIRCLE,OVAL,SMART_AUTO,ICON_COLOR; - semantic grouping by app intent domain (communication, social, media, games, productivity, finance, etc.);
- vendor clustering for unknown semantic buckets;
- auto-generated labeled frames for semantic and color-based layouts.
- theme modes: system / light / dark;
- 4 light palettes + 4 dark palettes;
- language modes: system, English, Russian, Spanish, German, French, Portuguese (Brazil).
- viewport culling in
core:performanceto avoid over-drawing offscreen app icons; - cache stack for app icons: in-memory LRU + disk cache + batched preload + in-flight deduplication;
- predictable layout placement with collision-safe fallback search for dense app sets;
- modular dependency graph that keeps feature code isolated and testable;
- release build with shrinking/optimization enabled (
isMinifyEnabled = truefor release).
graph TD
A[app] --> D[domain]
A --> FL[feature:launcher]
A --> FC[feature:canvas]
A --> FA[feature:apps]
A --> CD[core:database]
A --> CP[core:packages]
A --> CS[core:settings]
A --> CU[core:ui]
A --> CM[core:model]
A --> CC[core:common]
A --> CPerf[core:performance]
D --> CM
D --> CC
D --> CPerf
FL --> D
FL --> FC
FL --> FA
FL --> CP
FL --> CPerf
FA --> CD
CP --> D
CS --> D
| Module | Responsibility |
|---|---|
:app |
Activities, launcher role flow, settings screens, receiver wiring, app-level composition |
:domain |
Use cases, contracts, layout strategies, orchestration-level business logic |
:feature:launcher |
Main launcher presentation, tools overlay, edit orchestration, widget runtime |
:feature:canvas |
Infinite canvas rendering, gesture handling, drag and transform logic |
:feature:apps |
Apps data sources and repository bindings |
:core:database |
Room database, DAO APIs, entities, migrations, schema snapshots |
:core:packages |
PackageManager integrations, launch service, icon cache, package event bus |
:core:performance |
Camera math, coordinate transforms, viewport culling and minimap helpers |
:core:settings |
DataStore-backed preferences and mapping layer |
:core:model |
Shared cross-module models for app/canvas/ui state |
:core:ui |
Shared Compose theme system and reusable UI primitives |
:core:common |
Result/coroutine abstractions and common utilities |
Coverage and test counts below are generated from the repository state after local test execution on April 5, 2026.
- total instruction coverage: 81.69% (
covered=52964,missed=11871); - total test cases: 665;
- local connected smoke run: 16/16 instrumentation tests passed on device.
| Module | Coverage |
|---|---|
:domain |
98.20% |
:core:performance |
98.21% |
:core:model |
95.21% |
:core:ui |
95.35% |
:core:common |
96.55% |
:feature:apps |
97.07% |
:core:database |
85.03% |
:core:settings |
80.78% |
:feature:launcher |
80.50% |
:app |
78.73% |
:feature:canvas |
76.69% |
:core:packages |
69.59% |
GitHub Actions workflow (.github/workflows/ci.yml) runs on pushes and pull requests to main, using JDK 21 and Android SDK setup, with the project test/build checks.
- Android Studio (recent stable);
- Android SDK 26+;
- JDK 21 recommended.
# macOS / Linux
./gradlew :app:assembleDebug
# Windows PowerShell
.\gradlew :app:assembleDebug# macOS / Linux
./gradlew :domain:test :core:model:test :core:performance:test :core:common:test :core:settings:testDebugUnitTest :core:database:testDebugUnitTest :core:packages:testDebugUnitTest :core:ui:testDebugUnitTest :feature:apps:testDebugUnitTest :feature:canvas:testDebugUnitTest :feature:launcher:testDebugUnitTest :app:testDebugUnitTest
# Windows PowerShell
.\gradlew :domain:test :core:model:test :core:performance:test :core:common:test :core:settings:testDebugUnitTest :core:database:testDebugUnitTest :core:packages:testDebugUnitTest :core:ui:testDebugUnitTest :feature:apps:testDebugUnitTest :feature:canvas:testDebugUnitTest :feature:launcher:testDebugUnitTest :app:testDebugUnitTestpowershell -ExecutionPolicy Bypass -File .\tmp_cov.ps1- Infinite canvas launcher base
- Smart semantic layout presets
- Icon-color clustering presets
- Editable canvas objects (brush/notes/text/frames)
- Canvas widgets (clock/weather/notifications/calendar)
- Folders and advanced icon customization
- Backup/export/import of canvas state
- Macrobenchmark + startup/jank automation
- Optional cloud sync
Contributions are welcome.
Start with:
High-impact contribution areas:
- interaction polish for dense-canvas workflows;
- accessibility and localization depth;
- higher coverage in
core:packagesand complex launcher UI branches; - backup/sync architecture proposals.
Distributed under the MIT License. See LICENSE for details.
