[setui_client] Allow setting multiple display fields

Fixed: 68961
Test: fx test -o setui_client_interface_test

Change-Id: If28252d0ac56f321dd05fb2afd9a69133eaa9a02
Reviewed-on: https://fuchsia-review.googlesource.com/c/fuchsia/+/492959
Reviewed-by: William Xiao <wxyz@google.com>
Commit-Queue: Chip Fukuhara <cfukuhara@google.com>
diff --git a/garnet/bin/setui_client/src/display.rs b/garnet/bin/setui_client/src/display.rs
index 229f919..02eae00 100644
--- a/garnet/bin/setui_client/src/display.rs
+++ b/garnet/bin/setui_client/src/display.rs
@@ -16,65 +16,32 @@
     theme: Option<Theme>,
     screen_enabled: Option<bool>,
 ) -> WatchOrSetResult {
-    let mut output = String::new();
-
-    if let Some(auto_brightness_value) = auto_brightness {
-        let mut settings = DisplaySettings::EMPTY;
-        settings.auto_brightness = Some(auto_brightness_value);
-
-        let mutate_result = proxy.set(settings).await?;
-        match mutate_result {
-            Ok(_) => output.push_str(&format!(
-                "Successfully set auto_brightness to {}",
-                auto_brightness_value
-            )),
-            Err(err) => output.push_str(&format!("{:?}", err)),
-        }
-    } else if let Some(brightness_value) = brightness {
-        let mut settings = DisplaySettings::EMPTY;
-        settings.brightness_value = Some(brightness_value);
-
-        let mutate_result = proxy.set(settings).await?;
-        match mutate_result {
-            Ok(_) => {
-                output.push_str(&format!("Successfully set brightness to {}", brightness_value))
-            }
-            Err(err) => output.push_str(&format!("{:?}", err)),
-        }
-    } else if light_sensor {
+    // Light sensor Watch.
+    if light_sensor {
         return Ok(Either::Watch(utils::watch_to_stream(proxy, |p| p.watch_light_sensor2(0.0))));
-    } else if let Some(mode) = low_light_mode {
-        let mut settings = DisplaySettings::EMPTY;
-        settings.low_light_mode = Some(mode);
-
-        let mutate_result = proxy.set(settings).await?;
-        match mutate_result {
-            Ok(_) => output.push_str(&format!("Successfully set low_light_mode to {:?}", mode)),
-            Err(err) => output.push_str(&format!("{:?}", err)),
-        }
-    } else if let Some(Theme { theme_type: Some(theme_type), .. }) = theme {
-        let mut settings = DisplaySettings::EMPTY;
-        settings.theme = Some(Theme { theme_type: Some(theme_type), ..Theme::EMPTY });
-
-        let mutate_result = proxy.set(settings).await?;
-        match mutate_result {
-            Ok(_) => output.push_str(&format!("Successfully set theme to {:?}", theme_type)),
-            Err(err) => output.push_str(&format!("{:?}", err)),
-        }
-    } else if let Some(screen_enabled) = screen_enabled {
-        let mut settings = DisplaySettings::EMPTY;
-        settings.screen_enabled = Some(screen_enabled);
-
-        let mutate_result = proxy.set(settings).await?;
-        match mutate_result {
-            Ok(_) => {
-                output.push_str(&format!("Successfully set screen_enabled to {:?}", screen_enabled))
-            }
-            Err(err) => output.push_str(&format!("{:?}", err)),
-        }
-    } else {
-        return Ok(Either::Watch(utils::watch_to_stream(proxy, |p| p.watch())));
     }
 
-    Ok(Either::Set(output))
+    // Set call.
+    let mut settings = DisplaySettings::EMPTY;
+    settings.auto_brightness = auto_brightness;
+    settings.brightness_value = brightness;
+    settings.low_light_mode = low_light_mode;
+    settings.screen_enabled = screen_enabled;
+
+    if let Some(Theme { theme_type: Some(theme_type), .. }) = theme {
+        settings.theme = Some(Theme { theme_type: Some(theme_type), ..Theme::EMPTY });
+    }
+
+    if settings == DisplaySettings::EMPTY {
+        // No fields were set, interpret as a Watch.
+        return Ok(Either::Watch(utils::watch_to_stream(proxy, |p| p.watch())));
+    } else {
+        let mutate_result = proxy.set(settings.clone()).await?;
+        match mutate_result {
+            Ok(_) => {
+                Ok(Either::Set(format!("Successfully set display settings to {:?}", settings)))
+            }
+            Err(err) => Ok(Either::Set(format!("{:?}", err))),
+        }
+    }
 }
diff --git a/garnet/bin/setui_client/src/interface_test.rs b/garnet/bin/setui_client/src/interface_test.rs
index f3f8e4f..6a5d015 100644
--- a/garnet/bin/setui_client/src/interface_test.rs
+++ b/garnet/bin/setui_client/src/interface_test.rs
@@ -227,6 +227,9 @@
     println!("  client calls set screen enabled");
     validate_display(None, None, None, Some(ThemeType::Dark), Some(false)).await?;
 
+    println!("  client can modify multiple settings");
+    validate_display(Some(0.3), Some(false), None, Some(ThemeType::Light), Some(true)).await?;
+
     println!("factory reset tests");
     println!("  client calls set local reset allowed");
     validate_factory_reset(true).await?;