Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UX changes #29

Closed
20 tasks done
smichel17 opened this issue Apr 2, 2016 · 31 comments
Closed
20 tasks done

UX changes #29

smichel17 opened this issue Apr 2, 2016 · 31 comments

Comments

@smichel17
Copy link
Member

List of changes to consider this ticket closed:

  • Bump to v2.7.0 😃
  • Snack bar when top switch is disabled
    • More contrast with dark theme.
  • 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.
  • Add FAB that toggles pause/resume.
    • The FAB should not be visible when the app bar switch is off
    • Animate the FAB appearing and disappearing like this.
  • APP BAR SWITCH
    • When it's off, all settings except "Dark theme", "Visit the project page", and "Email me..." are grayed out and inaccessible.
      • The ADD button should also gray out to reflect that it is not clickable.
      • The three moons should all gray out.
    • When it's off, the notification should not appear.
    • Pausing or resuming the filter via notification or FAB does not change the position.
    • When switched on, the filter should start paused.
  • 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.
      • 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...")
  • 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.
  • Setting "Toggle filter automatically" to "sun" immediately sets toggle times to a reasonable default
    • One suggestion in Automatic turning, based on location #5 is approximating sunset/sunrise times based on time zone.
    • 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.
  • Remove "Keep running after reboot" setting
    • The service, if enabled, should always stay running after reboot.
  • 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:

  1. Red Moon disabled
  2. Red Moon enabled
    1. Filter paused
    2. Filter on
      1. Profile a
      2. Profile b
      3. 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.

@smichel17
Copy link
Member Author

I changed my mind about the below section, which I left here, quoted, for clarity. See the new comment.

If we keep extending the state hierarchy:

  1. Red Moon disabled
  2. Red Moon enabled
    1. Filter on
    2. Filter paused
      1. Profile
        1. Filter auto-on
      2. Filter auto-off

With this, we can re-add the 'close' button in the notification that we "removed" (if these weren't presented together) above. Its function is now to set the program state to 2.ii.a.b and close the notification. That means the filter will be disabled until the next 'auto-on' time.~~

You could add a global option "Always show notification." If this setting is disabled, the notification doesn't show when Red Moon is in state 2.ii.a.b, and if restarting the service at a given time is possible, you can kill the service during that time.

@smichel17
Copy link
Member Author

(3) in the original post is related to #5

@raatmarien
Copy link
Member

Thanks a lot for these insights! I don't have much design experience myself, so this really helps a lot.

I will go over this in detail after I've relicensed Red Moon to the GPLv3+.

raatmarien added a commit that referenced this issue Apr 3, 2016
See #29

Use a switch instead of a checkbox for the theme selection as per point
2. I also removed the unneeded summary from the preference.
@raatmarien
Copy link
Member

I've started with the easiest part, I've changed the CheckBoxPreference for a dark theme to a SwitchPreference and removed the summary. I hope this satisfies point 2.

raatmarien added a commit that referenced this issue Apr 3, 2016
See #29

Group the settings into 4 categories as per the material design
guidelines. https://www.google.com/design/spec/patterns/settings.html
raatmarien added a commit that referenced this issue Apr 3, 2016
See #29

Update the text on the time and automatic filter preferences to be more
descriptive and display the current state in the summary.
raatmarien added a commit that referenced this issue Apr 3, 2016
See #29

Remove the "Always open on startup" preference, since it doesn't have a
clear usage scenario and may confuse the users.

I've also reordened the preferences, since a separated category for one
preference is unneeded. Instead I've made a separate PreferenceCategory
for the contact information.
@smichel17
Copy link
Member Author

I tried the most recent changes. I think they're a great improvement! Actually, enough of an improvement (and time to think) that I've changed my mind about some features. I also think this thread is getting a bit hard to follow (and want to keep the scope reasonable), so I'm going to give a list of features to close this issue and omit the context.*

List moved to the first post for easier tracking.

* If you disagree with any of these or have questions, ask and I'll give my reasoning, I just don't want to clutter the comment if everyone agrees with the suggestions.

@raatmarien
Copy link
Member

Thanks a lot, this is very helpful!

  • Remove all drop-down actions in notification except pause/resume.

I'm wondering what your reasoning is for not including a stop button in the notification. Does a stop button in the notification make it too easy for the user to accidentally stop the service?

I'm also thinking of adding a "pause for 30 min" button to the notification and was wondering how you would feel about that? Would it be helpful to the user, or overly complicated?

  • Remove "Keep running after reboot" setting

Without this setting, I think the filter state should persist after a reboot. Would you agree?

  • Add FAB that toggles pause/resume.

Should the FAB just be the primary colour of Red Moon (red), or should I choose a tint colour?

Thanks again!

raatmarien added a commit that referenced this issue Apr 4, 2016
See #29

Red Moon now acts like this setting is always checked.
raatmarien added a commit that referenced this issue Apr 4, 2016
@smichel17
Copy link
Member Author

I'm wondering what your reasoning is for not including a stop button in the notification. Does a stop button in the notification make it too easy for the user to accidentally stop the service?

Exactly 😄

I think the top-level switch should be the only place a user can enable/disable the service. If there's some way to stop the service from running when the filter is off and then automatically start it again at a specified time, that might be useful, too -- but that's an implementation detail to save battery, not something visible to the user, who's thinking in terms of "Red Moon is enabled/disabled".

I'm also thinking of adding a "pause for 30 min" button to the notification and was wondering how you would feel about that? Would it be helpful to the user, or overly complicated?

I think this is a good idea, but I'm also trying to limit the scope of this issue so it's easier to follow. However, if it's easier to do that than switch to a 1-button notification, by all means go for it :)

Without this setting, I think the filter state should persist after a reboot. Would you agree?

Yes!

Should the FAB just be the primary colour of Red Moon (red), or should I choose a tint colour?

This is a visual design question, which I don't have any particular expertise in. I skimmed the Material design guidelines on color and FABs; I'd try it with the primary color and see how it looks, then go from there.

It might also make sense to use the small FAB variant, but that'd be an easier decision to make if I could see it in action (ie, just pick one and go with it and we can assess if it's better to use small or normal-sized later).

@smichel17
Copy link
Member Author

Do you get notifications when I edit my comments, or should I also make comment saying what I edited?

  • Setting "Toggle filter automatically" to "sun" immediately sets toggle times to a reasonable default

@raatmarien
Copy link
Member

Thanks for the answers!

Do you get notifications when I edit my comments, or should I also make comment saying what I edited?

I don't get any notifications when you edit your comments, so a comment would be helpful.

  • Setting "Toggle filter automatically" to "sun" immediately sets toggle times to a reasonable default

Sadly, the timezone doesn't provide any information for the sunset and sunrise times in the users local times. However, I think it is a good idea to provide a default for sunrise and sunset times instead of using the custom times.

@smichel17
Copy link
Member Author

Sadly, the timezone doesn't provide any information for the sunset and sunrise times in the users local times. However, I think it is a good idea to provide a default for sunrise and sunset times instead of using the custom times.

Isn't that what sunrisesunsetlib-java could do?

@raatmarien
Copy link
Member

Isn't that something sunrisesunsetlib-java could do?

No, unfortunately sunsetsunriselib-java needs a location and a timezone in which to return the time. See https://github.com/mikereedell/sunrisesunsetlib-java/blob/master/src/main/java/com/luckycatlabs/sunrisesunset/SunriseSunsetCalculator.java.

raatmarien added a commit that referenced this issue Apr 5, 2016
See #29

The location preference doesn't yet affect the actual sun time
calculations, nor does it update automatically when sun mode is set.
@smichel17
Copy link
Member Author

This addresses the first part of your comment on #33, and also reflects my latest thinking about how states should work. Essentially, there should only be on/off. You can manually toggle the filter on/off; red moon also includes settings to automatically turn the filter on and off at certain times. The app does not distinguish between a manual or automatic start/stop.

Added to top post:

  • Remove all references to "Pausing" or "resuming" the filter. These become "turning the filter off/on"

This makes both the code base and the user interface way simpler. Profiles become a part of settings, not connected to state:

  1. Red Moon disabled
  2. Red Moon enabled
    1. Filter on
    2. Filter off
  • [Selected profile]

raatmarien added a commit that referenced this issue Apr 5, 2016
See #29

The location is now updated silently when:
* The user selects the sun mode
* The filter is automatically turned on or off

Furthermore the location is explicitly updated when the user taps the
LocationPreference.

The AutomaticFilterChangeReceiver has been simplified, since it doesn't
have to find the sunset nor a location anymore, but just reads the
current on and off times. The on and off times are saved in the keys off
the new FilterTimePreferences. They change to sunrise and sunset times
when the sun mode is selected, automatically backing up the custom
times.

When the location fails to update when it has been explicitly called by
the user, a toast with a notice is displayed.

When the user selects the sun mode with a unset location, sensible
default sunrise and sunset values are set as turn on and off times.
@raatmarien
Copy link
Member

Should the filter automatically turn on at the set time if the user has disabled Red Moon?

@smichel17
Copy link
Member Author

Should the filter automatically turn on at the set time if the user has disabled Red Moon?

No. If Red Moon is disabled, the Red Moon service should be off, there should be no notification, etc.
The automatic toggle should set pause/resume state, not enable/disable state.

I have used the language "pause/resume" across this thread to be consistent about what functionality I'm talking about and so it's confusing to have an item in here for changing that vocab, so I moved that part to its own issue, #35.

@smichel17
Copy link
Member Author

Added:

  • When the top-level switch is off, all other settings are grayed out and inaccessible.

@smichel17
Copy link
Member Author

Added:

@raatmarien
Copy link
Member

No. If Red Moon is disabled, the Red Moon service should be off, there should be no notification, etc.

Great, thanks for the quick answer.

  • When the top-level switch is off, all other settings are grayed out and inaccessible.

Could you elaborate your reasoning on this? I'm afraid users might be confused as to why they are unable to edit any settings.

  • When switched on for the first time, the filter should start paused.

With switched on, do you mean when the user first opens the app or when the user first presses the top switch?

@breversa
Copy link

breversa commented Apr 6, 2016

(What's a FAB, anyway ?)

@smichel17
Copy link
Member Author

@smichel17
Copy link
Member Author

Could you elaborate your reasoning on this? I'm afraid users might be confused as to why they are unable to edit any settings.

The reason is, it provides a VERY strong visual queue that this switch enables and disables ALL functionality. It's the same reason we gray out the "Location" setting when using custom times. Sure, we could technically set the location, but the setting isn't in use, so we gray it out.

The top switch is always visible. If it's the only toggle-able thing, I think it should be clear. Particularly, after the user has toggled it ONCE, seeing all the settings suddenly become un-gray will be such strong feedback that they will never be confused again.

It is a good point, though, that the first time a user opens the app (or if a different user is borrowing the phone and opens the app) they may be confused. Added a few lines to the top post.

With switched on, do you mean when the user first opens the app or when the user first presses the top switch?

I mean any time the top switch moves from 'off' to 'on'.

As noted, this is not the long-term plan (if you set automatic filter and then disable Red Moon, then enable it again, the filter should be off if it's night and on if it's day). However, that functionality is #34, and I'd rather not hold up the next release for it :)

raatmarien added a commit that referenced this issue Apr 6, 2016
See #29

The doesn't yet toggle the filter.
raatmarien added a commit that referenced this issue Apr 6, 2016
See #29

The user can now toggle pause/resume with the floating action button and
toggle disable/enable with the switch in the app bar.

When Red Moon is disabled, there is no notification and all settings are
grayed out.

When Red Moon is enabled and the filter is paused, the settings are
accessible and there is a notification in the notification tray, but the
filter is not running.

When Red Moon is enabled and the filter is resumed, the settings are
accessible and there is a notification in the notificaton tray and the
filter is running.

The filter will still be turned automatically when Red Moon is enabled.
raatmarien added a commit that referenced this issue Apr 6, 2016
See #29

Red Moon will no longer startup on the set times if it is disabled (the
switch in the app bar is off).
@raatmarien
Copy link
Member

  • When it's off, the notification & the FAB should both disappear.

Is it important that the FAB disappears? I would think it provides an extra option for users who only want to see the notification if the filter is actually on and want a way to instantly enable Red Moon and turn on the filter manually.

  • When the app is opened, if the switch is off, there is a visual indicator prompting the user to turn it on.
    • I'm imagining some text saying "Enable Red Moon" and an (animated -- moves up and down a bit?) up-arrow in the upper right corner pointing to the switch.
    • When the user scrolls through the (disabled) settings, this indicator should disappear.

I will look into how to do this. I'm not sure it will be easy to have an arrow pointing to the switch, since it can be in different places depending on the device (think RTL layouts).

@smichel17
Copy link
Member Author

Is it important that the FAB disappears? I would think it provides an extra option for users who only want to see the notification if the filter is actually on and want a way to instantly enable Red Moon and turn on the filter manually.

At the time I was thinking that the user should have to turn on the top-level switch to enable the app, period -- to force the user to understand the function of the top toggle (vs the FAB or notification).

I will look into how to do this. I'm not sure it will be easy to have an arrow pointing to the switch, since it can be in different places depending on the device (think RTL layouts).

It doesn't need to be an arrow*. For example, you could dim the whole screen except for a circle around the toggle, and maybe add some descriptive text, and that would do the job just as well.


That said... I do still think it would be better to have the FAB disappear and a visual queue that guides you to turning on the top-level switch. However, if we kept the FAB, I wouldn't be worried about users finding a way to turn on the app anymore, so the visual queue is no longer needed.

That is to say, I think it's a nice-to-have and outside the scope of this ticket. Almost done! 😃

*The purpose is to highlight, "this is the action you are expected to take." As to what it should look like -- honestly that's a visual design thing that I don't have any special knowledge or strong feelings about.

@smichel17
Copy link
Member Author

Just tested this out, and I have a few thoughts:

  • The ADD button should also gray out to reflect that it is not clickable.
  • The three moons should all gray out.
  • The three 'other' settings do not need to be grayed out.

Mockup of the faded stuff:

gray moons and ADD button

After trying it, I do think it is confusing at first -- even with the FAB -- why all the settings are disabled. As I expected, after toggling the app bar switch (I might as well call it the right name) once, it was immediately clear what's going on. The FAB actually makes this worse: when you use the FAB to enable, there's so much activity that it's easy to miss the app bar switch turning on, which means the user may not learn what it does. So, I'll go back to what I said at first. See also: the animation

  • The FAB should not be visible when the app bar switch is off

Just removing the FAB right away doesn't solve things -- it's still too difficult to notice the app bar slider. I made a super fast & lazy mockup, that I think does the job:

disabled

Implementation details:

  • The mockup is black with 75% opacity. This may or may not look best when actually implemented.
  • It should be at the same level as the app bar (4dp high, I believe).
    • This puts it under the FAB (6dp), so the FAB can animate on to the screen while the overlay is sliding off.
  • I am not certain exactly what animations should be used. My best guesses:
    • The overlay should be in place when the app loads.
    • Upon turning on the app bar switch, the overlay should slide quickly downward off the screen without changing elevation.
      • Alternative: it's not actually an overlay, it's just dimming, and it fades when the switch is activated.

raatmarien added a commit that referenced this issue Apr 7, 2016
See #29

The add/delete profile button now grays when Red Moon is disabled.
raatmarien added a commit that referenced this issue Apr 7, 2016
See #29

The preferences under the "Other" PreferenceCategory will no longer be
disabled when Red Moon is disabled.
raatmarien added a commit that referenced this issue Apr 7, 2016
raatmarien added a commit that referenced this issue Apr 8, 2016
raatmarien added a commit that referenced this issue Apr 8, 2016
@raatmarien
Copy link
Member

When Red Moon is disabled, the FAB fades out and a snackbar with help fades in. I chose this over a black overlay, because some settings remain accessible when Red Moon is disabled.

Screenshot:

  • Bump to v3.0 😃
    • Removed settings -> broke backwards compatibility -> major version bump!
    • Or maybe I'm looking at things wrong and it should just be 2.7.0.

I feel v2.7.0 is more appropriate, since users can upgrade without loss of settings.

If you agree it is ready, I will release the new version and close this issue.

@smichel17
Copy link
Member Author

I feel v2.7.0 is more appropriate, since users can upgrade without loss of settings.

No strong feelings, sounds good!

If you agree it is ready, I will release the new version and close this issue.

One last thing: the snack bar needs a little more contrast with the background when the dark theme is enabled. Options I can think of: Lighten it a bit, darken it further, add a lighter gray line along the top.

snackbar-dark

@smichel17
Copy link
Member Author

When Red Moon is disabled, the FAB fades out and a snackbar with help fades in. I chose this over a black overlay, because some settings remain accessible when Red Moon is disabled.

I was thinking black overlay only on first run (once the user has toggled once, they'll remember how to replicate the behavior in the future), but I like this solution more.

raatmarien added a commit that referenced this issue Apr 8, 2016
See #29

Change color of the help snackbar in the dark theme to white for more
contrast.
@raatmarien
Copy link
Member

One last thing: the snack bar needs a little more contrast with the background when the dark theme is enabled. Options I can think of: Lighten it a bit, darken it further, add a lighter gray line along the top.

Nice catch, I changed it to the standard android white when dark mode is enabled for contrast.

@raatmarien
Copy link
Member

Version 2.7.0 released!

Thank you so much for all your hard work! The UX a lot better now 😄 👍.

@ghost
Copy link

ghost commented Apr 12, 2016

@raatmarien just a small detail, you should replace the checkbox by a switch, Material Design specs say about checkboxes:

Checkboxes allow the user to select multiple options from a set.
If you have multiple options appearing in a list, you can preserve space by using checkboxes instead of on/off switches.
If you have a single option, avoid using a checkbox and use an on/off switch instead.

And about switches:

On/off switches toggle the state of a single settings option.
The option that the switch controls, as well as the state it’s in, should be made clear from the corresponding inline label. Switches take on the same visual properties of the radio button.
The on/off slide toggle with the text “on” and “off” included within the asset is deprecated. Use the switch shown here instead.

Source: Components – Selection controls

@smichel17
Copy link
Member Author

@M2ck I missed that the first time around, thanks for the catch 😄
I made a new issue for this, #49

@ghost
Copy link

ghost commented Apr 12, 2016

@smichel17 Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

No branches or pull requests

3 participants