Skip to content

Norbert-web/Bluebird

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

33 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

🐦 Bluebird

A full Windows 11 desktop experience β€” on Android.

Platform Kotlin Jetpack Compose API License Release Build


Bluebird is an open-source Android home screen replacement that recreates the Windows 11 desktop environment pixel-perfectly β€” complete with a floating windowed app system, real file explorer, and live notifications.


πŸ“¦ Download APK Β· πŸ“Έ Screenshots Β· ✨ Features Β· πŸ—οΈ Architecture Β· πŸš€ Getting Started


πŸ“‹ Table of Contents


πŸ”­ Overview

Bluebird transforms your Android device into a Windows 11 desktop. It is a fully functional home screen launcher β€” set it as your default launcher and your phone becomes a PC-style productivity device.

  • A floating windowed app system where every app opens in a draggable, resizable window
  • A real Windows 11 taskbar with clock, pinned apps, system tray, and Action Center
  • A Start Menu with app grid, search, user profile, and power options
  • A real file explorer powered by Android's File API β€” not simulated
  • Live system notifications via NotificationListenerService
  • Real phone dialer and SMS messaging using Android's native contact & telephony APIs
  • A media player with full playback controls powered by MediaPlayer
  • An image viewer with pinch-to-zoom, swipe navigation, and wallpaper-set support
  • A Recycle Bin β€” deleted files go here, restorable or permanently removed
  • A first-launch OOBE wizard (Out-of-Box Experience) for permissions, username, and avatar
  • Persistent wallpapers (home + lock screen) that survive restarts
  • Desktop shortcuts β€” pin any file, folder, or app directly to the desktop

Built entirely with Jetpack Compose and Kotlin, targeting Android 8.0+ (API 26+).


πŸ“Έ Screenshots

Desktop β€’ Start Menu β€’ File Explorer


✨ Features

πŸ–₯️ Desktop Environment

Feature Description
Floating Windows Every app opens in a draggable, focusable window with minimize/maximize/close
Acrylic Glassmorphism UI Frosted-glass panels with blur, transparency, and layered depth
Multi-window management Stack and switch between multiple open windows
Snap layout picker Windows 11–style snap layout overlay for quick window positioning
Desktop icons System icons (This PC, Recycle Bin, Settings, Network), file shortcuts, and app shortcuts
Right-click context menu Long-press desktop β†’ New Folder, New Text File, Personalize, Refresh, Display Settings
Desktop shortcuts Drag any file from File Explorer β†’ Create Shortcut; long-press app in Start Menu β†’ Add to Desktop
Scrollable desktop Desktop scrolls when icons exceed the screen area
5 built-in wallpapers Blue Bloom, Sunset Purple, Forest Green, Deep Space, Aurora β€” gradient themes
Custom wallpaper Pick any image from Gallery for home screen and lock screen separately
Wallpaper persistence Custom images copied to internal storage β€” survive app restarts and reboots
Double-tap taskbar toggle Double-tap the desktop to hide/show the taskbar (full immersive mode)
Dark / Light theme Full dark and light mode switching, live and persistent

πŸ“Œ Taskbar

Feature Description
Windows 11 taskbar Centered Start button, pinned apps, running window indicators, system tray
Pin to taskbar Long-press any app icon in Start Menu β†’ Pin to taskbar
Unpin from taskbar Long-press any pinned taskbar icon β†’ Unpin
Running window badges Dot indicator below any app with an open window
Window switcher Tap a running window's taskbar icon to focus or restore it
System tray Battery level, Wi-Fi indicator, Bluetooth, clock, date
Notification badge Badge count on Action Center button when there are unread notifications

πŸͺŸ Start Menu

Feature Description
App grid Pinned apps + all built-in apps in a 6-column icon grid
All Apps view Scroll through every installed app on the device
Real-time search Type to filter installed apps instantly
User profile Real username + avatar (from OOBE setup) shown in bottom bar
App context menu Long-press any app β†’ Open / Add to Desktop / Pin to Taskbar
Power menu Sleep, Lock, Restart, Shut Down options

πŸ—‚οΈ File Explorer (Real Filesystem)

Feature Description
True filesystem browsing Uses Android File API β€” real files, real sizes, real dates
Breadcrumb navigation Clickable path segments β€” tap any segment to jump there
List & Grid views Toggle between detail list and thumbnail grid
Sort options Sort by Name, Date, Size, or Type β€” ascending or descending
Hidden files toggle Show/hide dotfiles
File search Filter files in the current directory by name
File operations Copy, Cut, Paste, Rename, Delete (to Recycle Bin)
File context menu Long-press β†’ Open / Copy / Cut / Rename / Create Shortcut / Delete
Create desktop shortcut Right-click any file/folder β†’ Create Desktop Shortcut
New folder Create folders directly in current directory
Open with intent Tapping a file opens it with the correct system app
Quick Access panel Desktop, Downloads, Documents, Pictures, Music, Movies, DCIM, Storage
Storage progress bar Shows used/free internal storage in left panel
File type icons Distinct color-coded icons for images, video, audio, PDF, text, archives, APKs

πŸ–ΌοΈ Image Viewer

Feature Description
Full-screen viewer Opens any image in immersive full-screen mode
Pinch-to-zoom Multi-touch pinch zoom, pan, double-tap to zoom 2.5Γ—
Swipe navigation Swipe left/right to move between images in the same folder
Thumbnail strip Scrollable thumbnail row at the bottom for quick jump
Rotate Rotate image 90Β° CW or CCW
Share Share image via system share sheet
Set as wallpaper Set current image as home screen wallpaper instantly
Delete to bin Delete to Recycle Bin from inside the viewer
Image info panel File name, size, date modified, path

🎡 Media Player

Feature Description
Audio playback Plays MP3, WAV, OGG, FLAC, AAC, M4A via Android MediaPlayer
Video support MP4, MKV, AVI, MOV, WebM
Auto-playlist Loads all media files from the same folder into a playlist
Seek bar Real-time playback position with tap-to-seek
Track metadata Title, artist, album from file tags via MediaMetadataRetriever
Playback controls Play/Pause, Previous, Next, Shuffle, Repeat (Off / All / One)
Playlist panel Left sidebar with all tracks, now-playing indicator, equalizer animation
Duration display Track duration and current position always visible

πŸ“± Phone

Feature Description
Real contacts Reads contacts from ContactsContract β€” real names and numbers
Call log Reads last 100 calls from CallLog with incoming/outgoing/missed indicators
Numeric keypad Full dial pad that triggers ACTION_CALL intent
Contact search Search by name or number
One-tap call Tap any contact or call log entry to dial

πŸ’¬ Messages (SMS)

Feature Description
Real SMS threads Reads conversation threads from Telephony.Sms.Conversations
Message view Full conversation with sent/received bubbles
Send SMS Compose and send messages via ACTION_SENDTO intent
Contact resolution Phone numbers resolved to contact names automatically
New message Start a new conversation with any number
Conversation search Filter threads by name or message content

πŸ—‘οΈ Recycle Bin

Feature Description
System Recycle Bin All files deleted from File Explorer go here
Badge count Desktop Recycle Bin icon shows item count badge
Restore Restore items to their original paths
Permanent delete Remove items permanently one by one
Empty bin Delete all items at once with confirmation
Multi-select Checkbox multi-select for bulk operations
Item details Original path, deletion date, file size for every item

βš™οΈ Settings

Section Features
Personalization Wallpaper picker (home + lock screen), gradient presets, accent color (8 colors), dark/light mode
Display Brightness slider β†’ real Settings.System.SCREEN_BRIGHTNESS
Sound Volume slider β†’ real AudioManager.STREAM_MUSIC
Network Wi-Fi toggle β†’ opens system Wi-Fi settings; Bluetooth β†’ opens system Bluetooth settings
Battery Real battery level + charging status with progress bar
Storage Real used/free storage with progress bar
Apps List of all installed apps; tap to open App Info
Accounts User profile with avatar and name from OOBE
About Device model, manufacturer, Android version, API level, RAM, app version

πŸ”” Notifications

Feature Description
Live notifications NotificationListenerService reads real system notifications
Action Center Grouped notifications with app name, title, body, and timestamp
Dismiss Dismiss individual notifications or clear all
Auto-reconnect Service callbacks re-registered on every onResume()

πŸ” First-Launch Setup (OOBE)

Step Description
Welcome Animated welcome screen with Bluebird branding
Permissions Per-permission grant buttons for Storage, Contacts, SMS, Camera, Notifications
Username Enter your name β€” shown in Start Menu, Lock Screen, and Settings
Profile picture Pick from Gallery β€” stored persistently in internal storage
Skip support Every step can be skipped and revisited in Settings later

πŸ”’ Lock Screen

Feature Description
Custom wallpaper Shows lock screen wallpaper (separate from home wallpaper)
Live clock Large 12-hour clock with date
User avatar Profile picture or initial letter shown on lock screen
Tap to unlock Single tap unlocks back to the desktop

πŸ“± Built-in Apps

App Icon Description
File Explorer πŸ“ Real filesystem browser
Settings βš™οΈ Full settings panel
Phone πŸ“ž Real dialer with contacts & call log
Messages πŸ’¬ Real SMS reader and sender
Media Player 🎡 Audio/video player with playlist
Image Viewer πŸ–ΌοΈ Full-screen image viewer
Recycle Bin πŸ—‘οΈ Deleted files manager
Browser 🌐 WebView-based browser
Calculator πŸ”’ Standard calculator
Calendar πŸ“… Month calendar view
Photos πŸ–ΌοΈ Photo gallery
Task Manager πŸ“Š Running processes viewer
Text Editor πŸ“ In-launcher editor with syntax highlighting

πŸ—οΈ Architecture

Bluebird uses a single-ViewModel, unidirectional data flow architecture:

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                        MainActivity                         β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
β”‚  β”‚   SetupScreen       β”‚    β”‚      DesktopScreen          β”‚ β”‚
β”‚  β”‚   (OOBE Wizard)     β”‚    β”‚                             β”‚ β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚ β”‚
β”‚                             β”‚  β”‚ Desktop  β”‚ β”‚ Windows β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ (Icons,  β”‚ β”‚ Manager β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ Wallpaperβ”‚ β”‚         β”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ Context  β”‚ β”‚ Floatingβ”‚  β”‚ β”‚
β”‚                             β”‚  β”‚ Menu)    β”‚ β”‚ Windows β”‚  β”‚ β”‚
β”‚                             β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚ β”‚
β”‚                             β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚ β”‚
β”‚                             β”‚  β”‚      Taskbar          β”‚   β”‚ β”‚
β”‚                             β”‚  β”‚  Start β”‚ Apps β”‚ Tray  β”‚   β”‚ β”‚
β”‚                             β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚ β”‚
β”‚                             β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚ β”‚
β”‚                             β”‚  β”‚  Overlays (animated)  β”‚   β”‚ β”‚
β”‚                             β”‚  β”‚  Start Menu β”‚ Search  β”‚   β”‚ β”‚
β”‚                             β”‚  β”‚  Action Centerβ”‚ Power  β”‚   β”‚ β”‚
β”‚                             β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚ β”‚
β”‚                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  LauncherViewModel   β”‚
                    β”‚                      β”‚
                    β”‚  LauncherUiState     β”‚
                    β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚
                    β”‚  β”‚ wallpaper       β”‚ β”‚
                    β”‚  β”‚ userProfile     β”‚ β”‚
                    β”‚  β”‚ installedApps   β”‚ β”‚
                    β”‚  β”‚ pinnedApps      β”‚ β”‚
                    β”‚  β”‚ openWindows     β”‚ β”‚
                    β”‚  β”‚ notifications   β”‚ β”‚
                    β”‚  β”‚ desktopShortcutsβ”‚ β”‚
                    β”‚  β”‚ recycleBinItems β”‚ β”‚
                    β”‚  β”‚ overlayStates   β”‚ β”‚
                    β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                               β”‚
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β”‚               β”‚               β”‚
     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”
     β”‚  SharedPrefs   β”‚  β”‚ Android    β”‚  β”‚ System      β”‚
     β”‚  (persistence) β”‚  β”‚ APIs       β”‚  β”‚ Services    β”‚
     β”‚                β”‚  β”‚ File, SMS  β”‚  β”‚ Wallpaper   β”‚
     β”‚  - wallpaper   β”‚  β”‚ Contacts   β”‚  β”‚ AudioManagerβ”‚
     β”‚  - username    β”‚  β”‚ CallLog    β”‚  β”‚ Notificationβ”‚
     β”‚  - pinned apps β”‚  β”‚ PackageMgr β”‚  β”‚ Listener    β”‚
     β”‚  - shortcuts   β”‚  β”‚ MediaPlayerβ”‚  β”‚ BatteryMgr  β”‚
     β”‚  - recycle bin β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Data Flow

User Gesture β†’ Composable β†’ ViewModel.action() β†’ UiState update β†’ Recompose

All state lives in a single LauncherUiState data class, collected as StateFlow by Compose. No Room database β€” all persistence is through SharedPreferences with Gson serialization for complex objects.


πŸ› οΈ Tech Stack

Category Technology Version
Language Kotlin 2.0.0
UI Framework Jetpack Compose BOM 2024.08.00
Architecture MVVM + StateFlow β€”
Build System Gradle (KTS) 8.5.2
Navigation None (custom window manager) β€”
Image Loading Coil 2.7.0
JSON Gson 2.11.0
Persistence SharedPreferences + DataStore 1.1.1
Icons Material Icons Extended BOM
System UI Accompanist SystemUI 0.34.0
Permissions Accompanist Permissions 0.34.0
Drawable Rendering Accompanist DrawablePainter 0.34.0
Splash Screen AndroidX Core SplashScreen 1.0.1
Min SDK Android 8.0 (Oreo) API 26
Target SDK Android 15 API 35
Compile SDK 35 β€”
Java Version 17 β€”

πŸ“ Project Structure

Bluebird/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ build.gradle.kts
β”‚   β”œβ”€β”€ proguard-rules.pro
β”‚   └── src/main/
β”‚       β”œβ”€β”€ AndroidManifest.xml
β”‚       └── java/com/bluebird/
β”‚           β”œβ”€β”€ BluebirdApplication.kt
β”‚           β”œβ”€β”€ DesktopModeHelper.kt
β”‚           β”œβ”€β”€ LauncherApplication.kt
β”‚           β”œβ”€β”€ LauncherViewModel.kt          # Core logic (~92KB) β€” all state & business logic
β”‚           β”œβ”€β”€ MainActivity.kt               # Entry point, OOBE routing, immersive mode
β”‚           β”‚
β”‚           β”œβ”€β”€ browser/
β”‚           β”‚   β”œβ”€β”€ data/
β”‚           β”‚   β”‚   └── BrowserRepository.kt
β”‚           β”‚   β”œβ”€β”€ ui/
β”‚           β”‚   β”‚   β”œβ”€β”€ BrowserScreen.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ NewTabPage.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ components/
β”‚           β”‚   β”‚   β”‚   β”œβ”€β”€ Dialogs.kt
β”‚           β”‚   β”‚   β”‚   └── NavigationComponents.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ keyboard/
β”‚           β”‚   β”‚   β”‚   └── FloatingKeyboard.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ model/
β”‚           β”‚   β”‚   β”‚   └── Models.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ panels/
β”‚           β”‚   β”‚   β”‚   └── Panels.kt
β”‚           β”‚   β”‚   └── webview/
β”‚           β”‚   β”‚       └── BrowserWebView.kt
β”‚           β”‚   └── utils/
β”‚           β”‚       β”œβ”€β”€ AdBlocker.kt
β”‚           β”‚       β”œβ”€β”€ DownloadHelper.kt
β”‚           β”‚       β”œβ”€β”€ UrlUtils.kt
β”‚           β”‚       └── UserAgents.kt
β”‚           β”‚
β”‚           β”œβ”€β”€ data/
β”‚           β”‚   β”œβ”€β”€ BootReceiver.kt           # Auto-launch on device boot
β”‚           β”‚   └── NotificationListener.kt   # NotificationListenerService
β”‚           β”‚
β”‚           β”œβ”€β”€ editor/
β”‚           β”‚   β”œβ”€β”€ core/
β”‚           β”‚   β”‚   β”œβ”€β”€ EditorModels.kt
β”‚           β”‚   β”‚   └── PremiumEditorState.kt
β”‚           β”‚   β”œβ”€β”€ editor/actions/
β”‚           β”‚   β”‚   └── TextActions.kt
β”‚           β”‚   β”œβ”€β”€ highlighting/
β”‚           β”‚   β”‚   └── SyntaxEngine.kt       # Syntax/code highlighting engine
β”‚           β”‚   β”œβ”€β”€ ui/
β”‚           β”‚   β”‚   β”œβ”€β”€ components/
β”‚           β”‚   β”‚   β”‚   └── EditorComponents.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ screens/
β”‚           β”‚   β”‚   β”‚   └── PremiumTextEditorScreen.kt
β”‚           β”‚   β”‚   └── theme/
β”‚           β”‚   β”‚       └── EditorThemes.kt
β”‚           β”‚   └── utils/
β”‚           β”‚       └── EditorPreferences.kt
β”‚           β”‚
β”‚           β”œβ”€β”€ ui/
β”‚           β”‚   β”œβ”€β”€ components/
β”‚           β”‚   β”‚   β”œβ”€β”€ ActionCenter.kt       # Notification panel + quick tiles
β”‚           β”‚   β”‚   β”œβ”€β”€ CommonComponents.kt   # AcrylicSurface, AppIconSmall, shared UI
β”‚           β”‚   β”‚   β”œβ”€β”€ Desktop.kt            # Wallpaper, icons, context menu (~104KB)
β”‚           β”‚   β”‚   β”œβ”€β”€ DesktopPreferences.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ DesktopWallpaperState.kt
β”‚           β”‚   β”‚   β”œβ”€β”€ SearchOverlay.kt      # Global search overlay
β”‚           β”‚   β”‚   β”œβ”€β”€ StartMenu.kt          # Start menu, app grid, power menu (~98.6KB)
β”‚           β”‚   β”‚   β”œβ”€β”€ Taskbar.kt            # Bluebird taskbar, tray, clock (~75.3KB)
β”‚           β”‚   β”‚   β”œβ”€β”€ WidgetsPanel.kt       # Widgets slide-in panel
β”‚           β”‚   β”‚   └── WindowManager.kt      # Floating window container & routing
β”‚           β”‚   β”œβ”€β”€ screens/
β”‚           β”‚   β”‚   β”œβ”€β”€ AppScreens.kt         # Calculator, Calendar, Photos, TaskManager
β”‚           β”‚   β”‚   β”œβ”€β”€ BrowserScreen.kt      # WebView browser (legacy screen)
β”‚           β”‚   β”‚   β”œβ”€β”€ DesktopScreen.kt      # Root desktop compositor
β”‚           β”‚   β”‚   β”œβ”€β”€ FileExplorerScreen.kt # Real file manager
β”‚           β”‚   β”‚   β”œβ”€β”€ ImageViewerScreen.kt  # Full-screen image viewer
β”‚           β”‚   β”‚   β”œβ”€β”€ Launcherupdatesettings.kt # In-app update settings
β”‚           β”‚   β”‚   β”œβ”€β”€ LockScreenActivity.kt # System lock screen activity
β”‚           β”‚   β”‚   β”œβ”€β”€ MediaPlayerScreen.kt  # Audio/video player
β”‚           β”‚   β”‚   β”œβ”€β”€ MessagesScreen.kt     # SMS reader/sender
β”‚           β”‚   β”‚   β”œβ”€β”€ PhoneScreen.kt        # Dialer + contacts + call log
β”‚           β”‚   β”‚   β”œβ”€β”€ RecycleBinScreen.kt   # Recycle bin manager
β”‚           β”‚   β”‚   β”œβ”€β”€ SettingsScreen.kt     # Full settings (12 categories)
β”‚           β”‚   β”‚   β”œβ”€β”€ SetupScreen.kt        # First-launch OOBE wizard
β”‚           β”‚   β”‚   └── TextEditorScreen.kt   # In-launcher text/code editor
β”‚           β”‚   └── theme/
β”‚           β”‚       └── Theme.kt              # Win11Colors, dark/light Material3 themes
β”‚           β”‚
β”‚           └── update/
β”‚               β”œβ”€β”€ UpdateManager.kt          # GitHub-based update checker & downloader
β”‚               β”œβ”€β”€ UpdateNotificationHelper.kt
β”‚               └── Updatemodels.kt
β”‚
β”œβ”€β”€ gradle/
β”‚   β”œβ”€β”€ libs.versions.toml                    # Version catalog (all dependencies)
β”‚   └── wrapper/
β”‚       └── gradle-wrapper.properties
β”‚
β”œβ”€β”€ build.gradle.kts                          # Project-level build config
β”œβ”€β”€ settings.gradle.kts                       # Module settings
β”œβ”€β”€ gradle.properties                         # Gradle JVM args
β”œβ”€β”€ CHANGELOG.md
β”œβ”€β”€ CONTRIBUTING.md
β”œβ”€β”€ LICENSE
β”œβ”€β”€ SECURITY.md
└── README.md

πŸ” Permissions

Bluebird requests the following permissions, each explained:

Permission Why it's needed Required?
QUERY_ALL_PACKAGES List all installed apps in Start Menu βœ… Yes
RECEIVE_BOOT_COMPLETED Auto-start as home screen after reboot βœ… Yes
SET_WALLPAPER / SET_WALLPAPER_HINTS Apply custom wallpaper to system βœ… Yes
READ_MEDIA_IMAGES/VIDEO/AUDIO Browse media files in File Explorer βœ… Yes
READ_EXTERNAL_STORAGE Filesystem access (Android ≀ 12) βœ… Yes
MANAGE_EXTERNAL_STORAGE Full filesystem access for File Explorer ⚠️ Optional
READ_CONTACTS Show real contacts in Phone app ⚠️ Optional
CALL_PHONE Dial calls from the Phone dialer ⚠️ Optional
READ_CALL_LOG Show recent calls in Phone app ⚠️ Optional
READ_SMS / SEND_SMS / RECEIVE_SMS Read and send messages ⚠️ Optional
CAMERA Take profile picture during OOBE ⚠️ Optional
POST_NOTIFICATIONS Show system notifications ⚠️ Optional
BIND_NOTIFICATION_LISTENER_SERVICE Read live notifications via system service ⚠️ Optional
INTERNET / ACCESS_NETWORK_STATE Browser app, network status, update checker ⚠️ Optional
BLUETOOTH_CONNECT / BLUETOOTH_SCAN Bluetooth status in Quick Settings ⚠️ Optional
WRITE_SETTINGS Adjust screen brightness ⚠️ Optional
BATTERY_STATS Real battery level in status bar ⚠️ Optional

⚠️ MANAGE_EXTERNAL_STORAGE requires manual grant in Android Settings on API 30+. The OOBE wizard guides the user through this.

⚠️ Notification Listener must be manually granted in Settings β†’ Notifications β†’ Notification Access. The OOBE wizard opens this screen directly.


πŸš€ Getting Started

Prerequisites

  • Android Studio Hedgehog (2023.1.1) or newer
  • JDK 17 or newer
  • Android device or emulator running Android 8.0+ (API 26+)
  • Gradle 8.5.2

Clone the Repository

git clone https://github.com/norbert-web/bluebird.git
cd bluebird

Open in Android Studio

  1. Open Android Studio
  2. Click File β†’ Open and select the Bluebird/ folder
  3. Wait for Gradle sync to complete
  4. Connect your device or start an emulator

Set as Default Launcher

After installing, Android will prompt you to select a default launcher. Choose Bluebird and tap Always. If not prompted:

  1. Go to Settings β†’ Apps β†’ Default Apps β†’ Home App
  2. Select Bluebird

πŸ”¨ Building from Source

Debug Build (for development)

./gradlew assembleDebug

Output: app/build/outputs/apk/debug/app-debug.apk

Release Build

  1. Create a keystore (first time only):
keytool -genkey -v -keystore bluebird-release.jks \
  -keyalg RSA -keysize 2048 -validity 10000 \
  -alias bluebird
  1. Configure signing in app/build.gradle.kts:
android {
    signingConfigs {
        create("release") {
            storeFile = file("../bluebird-release.jks")
            storePassword = System.getenv("KEYSTORE_PASS")
            keyAlias = "bluebird"
            keyPassword = System.getenv("KEY_PASS")
        }
    }
    buildTypes {
        release {
            signingConfig = signingConfigs.getByName("release")
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
}
  1. Build:
KEYSTORE_PASS=yourpassword KEY_PASS=yourkeypass ./gradlew assembleRelease

Output: app/build/outputs/apk/release/app-release.apk

Install Directly to Device

# Debug
./gradlew installDebug

# Or use ADB manually
adb install -r app/build/outputs/apk/debug/app-debug.apk

Run Tests

./gradlew test          # Unit tests
./gradlew connectedTest # Instrumented tests (requires device/emulator)

πŸ“¦ Download & Releases

Latest Release: v1.6.0

⬇️ Download from GitHub Releases β†’

Installing the APK

  1. Download the latest bluebird-release.apk from GitHub Releases
  2. On your Android device, go to Settings β†’ Security β†’ Install unknown apps
  3. Enable Allow from this source for your browser or file manager
  4. Open the downloaded APK and tap Install
  5. When prompted to choose a launcher, select Bluebird β†’ Always

Sideload via ADB

adb install bluebird-release.apk

βš™οΈ Configuration

Bluebird stores all user preferences in SharedPreferences under the key launcher_prefs_v2. There is no config file β€” everything is configured through the in-app Settings and OOBE wizard.

Resetting to defaults

To fully reset Bluebird:

adb shell pm clear com.bluebird

Or: Android Settings β†’ Apps β†’ Bluebird β†’ Storage β†’ Clear Data

Changing the package name

If you want to publish your own fork, change the package name in:

  1. app/build.gradle.kts β†’ namespace and applicationId
  2. app/src/main/AndroidManifest.xml β†’ android:authorities in the FileProvider
  3. Rename the Java package directory from com/bluebird/ to your new package

⚠️ Known Limitations

Limitation Reason Workaround
Wi-Fi cannot be toggled programmatically Removed in Android 10 (API 29) by Google Tapping Wi-Fi opens system Wi-Fi Settings
Bluetooth toggle Deprecated for third-party apps in Android 13 Tapping opens system Bluetooth Settings
MANAGE_EXTERNAL_STORAGE Requires manual grant on Android 11+ OOBE wizard provides a direct link
Notification Listener Requires manual grant in system settings OOBE wizard opens the settings screen
File deletions are permanent Recycle Bin tracks metadata but File.delete() can't be reliably undone on all devices Items appear in Recycle Bin with restore option
Screen brightness control Requires WRITE_SETTINGS which must be granted manually Settings β†’ Display β†’ System permissions
Wallpaper on lock screen Android system lock screen is separate from the in-app lock screen Use the in-app lock (Start β†’ Power β†’ Lock) for Bluebird's lock screen

πŸ—ΊοΈ Roadmap

Upcoming

  • Resizable floating windows (drag handles on edges/corners)
  • Remote Schools built-in learning app (Uganda curriculum P1–S6)
  • Taskbar auto-hide mode (hover to reveal)
  • Multiple virtual desktops
  • Window transparency controls

Future

  • Widget support (third-party app widgets on desktop)
  • Clipboard manager
  • Screen recording
  • Keyboard shortcuts (for physical keyboards)
  • Custom accent color picker (full color wheel)
  • Cloud sync for settings and shortcuts
  • Theming engine (custom themes beyond dark/light)

🀝 Contributing

Contributions are warmly welcome! Here's how to get started:

Bug Reports

Use the GitHub Issues tracker. Please include:

  • Android version and device model
  • Steps to reproduce
  • Expected vs actual behavior
  • Logcat output (filter by com.bluebird)

Pull Requests

  1. Fork the repository
  2. Create a branch: git checkout -b feature/your-feature-name
  3. Make your changes following the existing code style
  4. Test on a real device (emulators may not support all launcher features)
  5. Commit with a clear message: git commit -m "feat: add window resize handles"
  6. Push and open a Pull Request

Code Style

  • Follow Kotlin coding conventions
  • Use Jetpack Compose best practices (hoisted state, stable parameters)
  • Keep Composables small and focused
  • Add @Preview annotations where useful
  • State mutations must go through LauncherViewModel β€” never mutate state directly in a composable

Branching Strategy

Branch Purpose
main Stable, released code
develop Integration branch for next release
feature/* New features
fix/* Bug fixes
release/* Release preparation

πŸ“œ License

MIT License

Copyright (c) 2025 Bluebird Contributors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

πŸ™ Credits

Libraries Used

Library License Purpose
Jetpack Compose Apache 2.0 UI framework
Coil Apache 2.0 Image loading
Gson Apache 2.0 JSON serialization
Accompanist Apache 2.0 System UI, permissions, painter
Material Icons Extended Apache 2.0 Icon set
AndroidX DataStore Apache 2.0 Preferences persistence
AndroidX SplashScreen Apache 2.0 Splash screen API

Design Inspiration

  • Windows 11 by Microsoft β€” for the UI design language, Fluent Design system, and Acrylic material

Contributors


πŸ“¬ Contact


Made with 🫑πŸ’ͺπŸ’— and Kotlin Β· ⬆️ Back to top