List of changes to consider this ticket closed:
- [x] Bump to v2.7.0 :smiley:
- [x] Snack bar when top switch is disabled
- [x] More contrast with dark theme.
- [x] Remove all drop-down actions in notification except pause/resume.
- Tapping the text will still open the app.
- Alternative: replace the 'close' button with "pause for X minutes"
- There's probably a good way to show this with an icon; I'm not sure what that should look like.
- When the filter is temporarily paused, the notification text should read "Paused for [X] minutes"
- If there are 15 or fewer seconds left, "Paused for [X] seconds."
- Hitting "Pause for X minutes" while the filter is paused will reset the pause time to X minutes.
- [x] Add FAB that toggles pause/resume.
- [x] The FAB should not be visible when the app bar switch is off
- [x] Animate the FAB appearing and disappearing like this.
- APP BAR SWITCH
- [x] When it's off, all settings except "Dark theme", "Visit the project page", and "Email me..." are grayed out and inaccessible.
- [x] The ADD button should also gray out to reflect that it is not clickable.
- [x] The three moons should all gray out.
- [x] When it's off, the notification should not appear.
- [x] Pausing or resuming the filter via notification or FAB does not change the position.
- [x] When switched on, the filter should start paused.
- For this release; the end goal is more nuanced behavior; see #34.
- [x] Add "Location" setting below "turn off time"
- Grayed out unless "Toggle filter automatically" is set to "sun"
- Secondary text reads "Lat: ##.## Long: ##.##"
- If location has never been set, Secondary text reads "Not set"
- Tapping the setting attempts to update the location.
- Updates toggle times if location update is successful.
- [x] If it fails, it shows an error message "Enable location services to update location"
(Replace the current message starting with "location service isn't enabled...")
- [x] In "sun" mode, secondary text for "Turn filter off" and "Turn filter on" shows in-use (not custom) times.
- The custom times should still be saved & restored if the user returns to using the custom times.
- [x] Setting "Toggle filter automatically" to "sun" immediately sets toggle times to a reasonable default
- One suggestion in #5 is approximating sunset/sunrise times based on time zone.
- [x] In "sun" mode, each time the filter is automatically toggled, Red Moon attempts to update location.
- This attempt fails or succeeds silently.
- If it succeeds, updates toggle times, too.
- No change if it fails.
- [x] Remove "Keep running after reboot" setting
- The service, if enabled, should always stay running after reboot.
- [x] Remove "Contact" header (move these settings under "Other")
The rest of this comment is out of date. It may still be useful for context.
Some of this (anything quoted) is pulling from the Material guidelines (settings and selection controls). The rest is from my experience as a UX designer (in training).
1. Clarify the how users interact with the app
Add a FAB & change notification, the top-level switch, startup settings, & the automatic filter backend.
I wrote out a bunch of reasons why the current behavior is confusing, but they're cluttering this section so I moved them down to the bottom of this post 0 so here we can focus on solutions.
The user doesn't distinguish between the service and the filter. They only care about 3 questions:
- Am I interested in using Red Moon? Probably yes, but this setting should exist so the app can easily be completely disabled without uninstalling it. It's changed so infrequently that it doesn't need to exist outside the app.
- Do I want Red Moon running right now? Ie, they want to be able to manually stop the service.
- What parameters should it run under? Both filter parameters and timing. The user configures these (in a profile) and then forgets about it. Maybe occasionally they'll switch profiles. If they're constantly tweaking profile settings, we're doing something wrong or there's a feature we're lacking.
So here's a state hierarchy:
- Red Moon disabled
- Red Moon enabled
- Filter paused
- Filter on
- Profile a
- Profile b
- etc
Each indentation level is a layer of abstraction, and we have controls at each layer. If you mix layers, you'll end up with settings in places that don't make sense1.
The user doesn't care if Red Moon is able to turn off the service in the background, nor if the service starts on boot or if service is able to restart across reboots -- they only care what state the app is in. So the question becomes, where do we control elements of each state, and which states should persist across reboot? Here are my conclusions:
Remove both 'Startup' settings. They both have to do with implementation details that users don't care about.
- If a user wants a filter that they have to manually enable and disable that's on after every reboot, they'll already be using a profile where the filter is always on and just pause it manually.
The top-level switch should enable/disable Red Moon. Its state should persist across reboot.
- The only way to toggle this setting is tapping the slider in the app.
- control via intent can happen at a higher level
- Remove the 'close' button from the notification. It would be too easy for a user to disable Red Moon when they intended to turn off the filter. If you want to keep this button, repurpose it. See the 2nd comment in this thread.
Add a FAB that pauses and resumes the filter. Its state should not persist across reboot.
- If Red Moon is disabled, the FAB will enable it as well as resuming the filter.
- The 'pause' button in the drop-down notification will have identical behavior, except it'll never be shown while Red Moon is disabled.
- If you use this button while Red Moon is disabled (state 1), it will enable red moon and turn the filter on.
Changes to the filter settings get their own section at the bottom.
2. Change "Dark theme" to a switch and remove the secondary text.
Secondary text is optional. If the label is sufficient on its own, don't add a secondary text description.
[...]
If you have a single option, avoid using a checkbox and use an on/off switch instead.
"Dark theme" is pretty universally understood.
Switches are pretty overrated; they're often more confusing than a checkbox would be. That said, they have their place on lone settings or when changing the setting has an immediate effect (like toggling wifi or switching theme). Dark theme is both.
3. Shuffle around settings under the 'automatic filter' header
For non-switch settings, secondary text should show the current status of a setting only.
The first 3 lines mimic Twilight's interface. 'Location' should be smaller than Twilight's and only show the coordinates in its secondary text.
~~Automatic filter~~ Filter times
- {Always | Sun | Custom}
[slider bar for viewing current times or setting them if 'custom' is selected]
- Location
[coordinates]
'Location' opens up a new activity that guides you through the process of picking your location. That screen has 4 options:
- Automatic (accurate)
Requires location services
- Automatic (approximate)
Estimate location from system date/time
- Enter coordinates
- Search by city
0: It should be possible to understand how all settings will affect behavior without actually testing out different combinations of settings. It boils down to whether there a difference between a filter that's on but paused and a disabled filter. Ie, can the service be running and the filter be disabled? Related questions that follow:
- Does the notification showing mean the service is running or that the filter is on?
- If I have I have automatic filter times set but I pause the filter, will the filter turn on at sunset or be paused indefinitely?
- Does the top level switch start and stop the filter or the service?
- Does the 'automatic filter' setting start and stop the filter or the service?
- Does the stop button in the notification stop the service or filter?
My best guesses for the answers are:
- The notification tells whether the service is running or not, as does the switch.
- The filter turns on when the service starts, but can be paused through the notification.
- Automatic filter toggles the service on and off.
Could you explain what the actual relationship between filter and service is? If it's different enough from my guess that implementing my suggestions would be difficult, I'll make some modifications.
1: It's pretty clear that the team behind Twilight did their homework for the design, but they got lost in the details. They decided "always on" should be at the manual-intervention level; I think it's a profile setting. They also decided "filter times" should be a global setting, when I think it's also a profile setting. Changing it is larger-scope than this ticket, though. I am only including changes here that I think should be uncontroversial.