You are browsing as a guest. Sign up (or log in) to start making projects!

Standby

  • 7 Devlogs
  • 30 Total hours

An Android app similar to StandBy mode on iOS, with support for custom plugins.

Ship #1 Pending review

Standby

Standby is an simple Android app that turns your phone into basically a smart bedside or desk clock (similar to StandBy mode on iPhones).
Instead of a black screen while charging, your phone now is a nice little glanceable screen for a desk or nightstand. It can display many things and thanks to the customizability of the plugins, the limit is your imagination (you can probably run doom lol).

When I moved from iOS to Android, I didnt find an app that ticked all the boxes for me, they were all either paid or the useful features were all locked behind paywalls or they didnt look good… So I built Standby.

The core philosophy of Standby is for everything to be customizable and easy to do so. Plugins use the very well established HTML/CSS/JS to display and have access to both the web and local phone sensors if needed (permission is granted on a plugin by plugin basis).

The challenges

It was my first time coding an Android app, so it was hard for me to figure things out, but thanks to the assistance of generative AI tools and of numerous Youtube tutorials, I was able to (mostly) firgure things out.

I would say the AppWidgetHost part was the hardest to make, I constantly ran into issues where the third party widgets wasn’t updating properly or the widgets would just crash the app when selected. Those issues took a lot of head scratching to figure out.
The WebView part was surprisingly easy, since it was just pretty much a glorified web browser in the app.

Compose also helped a lot with the UI side of things, it was nice to have reusable things I can use instead of making my own UI components, etc. Though AI also helped a lot with UI due to simply how long it was to write the UI code.

Demo

You can watch the video demo to see how the app works in general: https://drive.google.com/file/d/1LBqg1Of4_amh87YIiEeGrte-fc33Wl7u/view?usp=sharing

There also many screenshots on GitHub showcasing plugins.

If you want to install the app, the signed APK is in the GitHub releases tab.
To load plugins into the app, download the plugin zips you want under plugins/build/ on GitHub and either import it using the local uploader or import it as a file from the app.

  • 7 devlogs
  • 30h
Try project → See source code →
Open comments for this post

1h 55m 56s logged

New plugins, night mode and page indicators

  • Added new half sized clock plugins and a bad apple plugin
  • Added a night mode for the app to allow for scheduled actions
  • Made a new banner for the app
0
0
14
Open comments for this post

4h 8m 2s logged

Fixed issues with weather provider and add AppWidgetHost functionality

  • Added AppWidgetHost functionality to the app, allowing for third party app widgets to be displayed in the app.
  • Removed GPS settings for privacy.
  • Added a hold menu for widgets to rename the widgets.
  • Added button to refresh plugins
0
0
11
Open comments for this post

4h 37m 55s logged

Updated clock faces, alarms, and added provider API

  • Added a clock face and updated the more colorful one to look better when the digits overlap each other.
  • Added a new sensor bridge method getNextAlarm(), to get the phone’s next alarm
  • Added the foundations for provider APIs and an example implementation using weather

The provider API handles more complex and repetitive tasks for the plugins. For instance, instead of having 2 plugins both having to send out API requests to get data, the app gets the weather data itself and distributes it to the plugins in a similar way to the SensorBridge JS interface.

The weather provider refreshes every hour and caches the response from open meteo and provides some basic helper methods. For instance getCurrentWeather() gives the current weather information in a JSON which is easily used by other plugins. It also manages weather icon loading and caching from OpenWeather and passes it to the plugin in base64.

0
0
7
Open comments for this post

3h 3m 28s logged

Import plugin dialog!

Added a popup when the user imports a new plugin, whether from file picker or from the web that lists the requested sensor access, the domains the plugin needs access to and general metadata about the plugin (author, name, description, etc).

Also, added a way to rename plugins to be able to differentiate between multiple instances of the same plugin, especially useful when you want to have multiple configs of the same plugin!

0
0
6
Open comments for this post

3h 51m 57s logged

Bug fixes & new plugins
I added a new weather plugin and a full screen digital clock plugin. I also migrated some of old plugins made before the plugin spec was written.


Also fixed a bug with stale plugin states. The old behavior was that the setup and the listeners captured a stale instance of the plugin params, which meant issues related to permissions and logging. For instance, logcat gives “PluginWebView com.geenk.standby D [Default Clock]” instead of logging it as [Weather plugin].


Also found an issue that kept crashing my phone over ADB screen mirroring, though the issue was more of an AOSP issue. (DEBUG crash_dump64 A Abort message: ’Splitting motion events requires a down time to be set for the target on connection …)

0
0
7
Open comments for this post

2h 50m 22s logged

More battery stats

I have added support for more battery data to be accessed by plugins, now with support for most battery data. The SensorBridge.kt now using JSON to send information to the plugin because I was having issues with List being sent over to WebView not working correctly.

Also added a battery plugin demonstrating the new battery information.

0
0
7
Open comments for this post

9h 49m 42s logged

Standby!

Sorry I forgot to break it down into smaller logs…
Standby now supports many new features.

  1. Full plugin spec
    Now the plugins for the app are no longer just HTML files. There is now a structure to the plugin zip files with support for customization of the plugin itself (ie changing accent colors, turning features on/off) that is reflected in the UI.
  2. Remote plugin uploading
    Instead of having to send the plugin to your phone, you can now enable a lightweight HTTP server where you can upload plugin files directly from your computer!
  3. Better security
    With the full plugin spec, there is now a whitelist for the allowed domains and phone sensor APIs [note this still needs to be tested further and needs a UI when the user imports a plugin]
  4. Side by side layout
    Now the app supports putting 2 half sized plugin next to each other, similar to iOS’s StandBy implementation. You can also have many different panels of plugins.
  5. OLED burn-in protection
    Since the app displays a static screen for most of the time, I have added in an OLED protection feature that turns off very other pixel and alternates it to reduce burn it (user configurable, can turn off up to ~83% of the pixels, though it is very dim).Also, for phones supporting lower refresh rates, there is now an option to force the app to the lowest refresh rate when idle.
  6. Better UI
    The old version had no animations and was pretty ugly in terms of UI. Now, the different buttons are animated and disappear when the app is idle. The UI now follows the phone’s colors.
0
0
7

Delete project?

Are you sure you want to permanently delete this project? This action cannot be undone.

All devlogs, followers, and associated data will be removed.

Followers

Loading…