Skip to content

Latest commit

 

History

318 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

WPLauncher ES

A Windows Phone inspired launcher for Android written in OpenGL ES

Features

  • WP7 style tiles
  • Notifications on tiles
  • App list
  • Pin apps to the screen
  • Installed apps
  • Resizable tiles
  • Tile color
  • Photos live tile
  • Weather live tile

Tech stack

  • Java
  • OpenGL ES3.2
  • API Level 34

Screenshot

Screenshot

demo.mp4

Milestones

This is a living roadmap, all future milestones are refined as I go, and subject to change. M4 is in progress

M1 - POC / pre-alpha

M1 is all about laying the groundwork. Don't expect anything fancy here. At this phase the application is barely usable.

  • 4 columns
  • Show something on the tiles
  • Show app icon on tiles
  • Listview for the installed apps
  • Icon on list elements
  • Swipe between start page and application list page
  • Handle tap event on tiles
  • Long press on tiles
  • Long press on list items
  • Context menu
  • Pin installed apps to the screen
  • Unpin installed apps from the main screen
  • Launch app from the app list
  • Launch pinned apps
  • Uninstall app
  • Data structure to store tiles on the main screen
  • Rearrange tiles on the grid
  • Persist tile arrangement

M1.5

Consolidation

  • Extract draw contexts
  • App-list state machine (also fixed fling to keep momentum)
  • Tile-grid state machine
  • Fix de-select bug when rearranging tiles

M2 - MVP / alpha

M2 is the beginning of making the launcher usable in everyday use-cases.

  • Start working on "launcher apps/widgets/live tiles"
    • Clock
    • Launcher settings
    • Show notification count on tiles
    • Show notification content on corresponding tiles
  • Change accent color
  • Settings service
  • Persist settings
  • Resize tiles
  • Generic list view
  • Stack view
  • Basic flex layout
    • Support row and column layout modes
    • Support alignment
    • Flex layout as a child of flex layout
  • Absolute layout
    • Use Absolute layout for static tiles
  • Use an Icon UI element instead of basic textures for icons to be able to use them in layouts
  • Basic UI elements
    • Button
    • Checkbox

M2.5

I'm already daily-driving, you shouldn't be.

  • Checkbox border
  • Fix: pin the same tile multiple times
  • Don't show uninstall in the context menu for internal and system apps
  • Fix: tile overlap after resize
  • Remove uninstalled app from the applist/tilegrid
  • Fix: Updated app is removed from the grid and app-list instead of updating
  • Adjust notification count on tiles - don't allow overlap with the icon
  • Fix: Scrolling while swiping on the main screen (scrolling on tile-grid keeps working, WHILE in SWIPING state) -- keeping an eye out, this was a sneaky one
  • Fix: Some notifications are counted multiple times
  • Use AbsoluteLayout in the ClockHUB tile
  • Press "Home" button to jump back to the top of the tile-grid

M3 - pre-beta

Try to make it usable for the less crazy people

  • GLES 3.2
  • Make ContextMenu and MenuOption to use layouts and labels
  • Make ListItem use high level UI components
  • Embeddable ListView component
    • Make ListPage use ListView internally
  • Animations
    • Swipe animation on StartScreen
    • Animated snap on StartScreen when back or home button is pressed
    • Animate scroll to top on tile-grid when home or back button is pressed
    • Feedback to the user on tap (Rotation/animations/etc)
      • Button
      • Tiles
      • List items
      • InputBox
      • Labels with onclick handlers
      • Context menu
  • Gesture system refactor
  • Optimizations
    • Fix: janky scroll on the TileGrid + remain in ScrollState while flinging
    • Reduce GC pressure when measuring labels and textblocks during rendering
    • Reduce icon texture size in the app-list to 96x96
    • Reduce icon texture size on the tiles to 256x256
    • On-demand alloc of internal apps and screens
    • Optimize text wrapping in textblock
    • Do not render list items that are outside the viewport
    • Do not store textures when a single uniform color can be used (e.g. for the tile background)
  • Bug fixes
    • View crash logs
    • Fix: crash on empty notification content
    • Fix: crash on concurrent access to navigation stack
    • Fix: crash when onDestroy() fires before onSurfaceCreated()
    • Fix: null reference error crash in context menu
    • Fix: call layout() in StackLayout on resize
    • Fix: textblock: force-wrap overly wide words
    • Fix: do not go into context menu state when long-pressing a non-interactive element (fixes null reference crash in context menu)
    • Recycle unused temp bitmaps after texture upload
    • Fix: crash: concurrent modification exception in TextReaderScreen.draw() -> StackLayout.draw() [hopefully fixed by moving gesture handling to the gl thread]
    • Fix: Make context menu aware of the bottom and top margins of the list
    • Fix: Pressing back on the AppList while context menu is opened makes the StartScreen stuck on the TileGrid
  • Disable landscape mode
  • Search bar in the app-list
    • Kill ListPage in the app-list and replace it with a StackLayout + search box + ListView
    • InputBox component
    • ListView filter
  • Scissor test on tiles to prevent drawing out of the tile

M3.5

Try it at your own risk

  • Make the crash-log viewer scrollable (ScrollView component)
  • Adjust button border drawing when no icon is set
  • About page in Launcher Settings
  • Clear search-box when pressing back on the app-list
  • Support cursor in input boxes
    • Show current cursor position
    • Set cursor position
    • Insert text at cursor position
    • Delete text at cursor position
  • Try perspective projection instead of orthographic
  • Use stencil buffer instead of scissor test for drawing tiles
  • Use stencil buffer to clip list view
  • Use stencil buffer to clip scroll view
  • Fix: Uninstalling applications with multiple intents: Only one intent is removed from the applist
  • Viewport culling on tile-grid

M4 - Beta

Feature-creep!

  • More live-tiles
    • Photos
    • Weather
  • Light mode/Dark mode support
    • Dropdown component
    • Theming support
  • Animated tile resize
  • Animate internal app/subpage navigation
  • Re-ask for permissions from the launcher settings
  • Input box cursor
    • Proper cursor in the textbox
    • Draggable cursor
    • Top level overlay for adorners
    • Fix: InputBox cursor behavior is different on the emulator then on real hardware (onComposingText etc...)
  • Modal
  • Animate modal open/close
  • StackLayout horizontal orientation
  • Extract ScreenNavigator into a separate component
  • Cycling between notifications should be animated
  • Debug menu
    • Crash app button
    • Restart app button
    • Reset configuration button
  • Scroll in edit mode:
    • Scroll instead of moving the tile when the scroll movement is not started on the tile
    • Adjust dragged tile position while auto-scrolling when reaching the boundaries
  • Fix: crash on modal dismiss
  • Fix: null pointer exception in TileGrid.Tile.getDragInfo() - maybe fixed by #85
  • Fix: tile keeps spinning indefinitely after dismissing the last notification
  • Fix: checkbox label is squashed
  • Fix: Dirty flag is set on tiles on scroll stop
  • Call layout() in the parent layout on a component resize

M4.5

Cleaning up the accumulated mess

  • Cache UI element size measurement results
  • Double call of createTile in tileService
  • Add stencil clipping to layouts
  • Make Notification surface layout more symmetric
  • Don't recalculate matrices every frame
  • Open system settings from launcher settings
  • TextBlock wrapping: never start a new line with space
  • Discard keyboard on tapping outside the input box
  • Fix: Scroll/drag lags behind finger movement
  • Gesture handling is a hot garbage
  • Show the context menu in the new overlay system
  • Opening a large crash-log crashes the launcher on texture creation
  • Fix: Adjust the layer offset of the opened pages so spinning tiles won't overlap with the animated page
  • Relayout on child size change should be implicit

M5 - Beta 2

Creep got too big

  • More live tiles
    • Tasks
    • Step Counter
  • Device resolution independent UI (https://developer.android.com/training/multiscreen/screendensities)
    • Make dragging in edit mode density aware
  • Animate context menu
  • Custom tile color
  • Show a transparent tile on the drop-target
  • Reduce memory footprint by not keeping bitmaps in memory (see the TODO App.java)
  • Floating tiles in edit-mode
  • 6 column mode setting
  • Make checkbox use higher level components (then kill TileUtil.java)
  • Show weather icon on the Glance tile
  • Add tile adorners to the top level overlay

M5.5

Janitor for hire

  • Fix: TouchHandler: Force state reset on focus loss. Pressed state can stick when a touch moves out of bounds before hitting Move threshold
  • Close dropdown on focus loss

M6 - RC

Can we release now, pls?

  • Landscape mode support
  • Background image with transparent tiles
  • WP7/7.8 start screen setting
  • Group apps by the first letter in the app list
  • Application icon
  • Privacy policy
  • Lower min API level / raise target API level
  • License
  • Generic pivot view (tabbed view)
    • Settings subpages use pivot view with one tab
  • Multi lang support
  • Rebrand to something else than WPLauncher ES
  • First start experience
    • Pin some default tiles to the start screen on first start
    • Quick tutorial on first start

Bugs that need repro:

Haven't seen these for a while

  • Fix: All pinned tiles got cleared from the start screen - May have been fixed in M4
  • Fix: black bar in the place of the notification count when all previous notifications were dismissed (on real hardware, needs repro)
  • Fix: sometimes tiles don't spin when there is a notification (detected on real hardware, needs repro)
  • Fix: Tile bg after resize is dark (needs repro)

Backlog

Nice to have, but I feel no pressure to implement them for now

  • Reconsider tile reflow logic (tile occupancy bool map, for every tile top to bottom -> remove -> find the highest available pos where it fits -> place?)

About

A Windows Phone inspired launcher for Android written in OpenGL ES

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages