System tray: Disallow configure and toggles for secondary user

This CL:
* Shows the settings > details UI for non connectable networks
  for secondary users.
* Disables toggles for secondary users.

Bug: 843888,827096
Change-Id: Ie3b0554211e1ad42f910d921b55d6553e3a55836
Reviewed-on: https://chromium-review.googlesource.com/1089585
Commit-Queue: Steven Bennetts <stevenjb@chromium.org>
Reviewed-by: Kyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#565312}
diff --git a/ash/system/network/network_list.cc b/ash/system/network/network_list.cc
index 0709fe13..69c5e2b 100644
--- a/ash/system/network/network_list.cc
+++ b/ash/system/network/network_list.cc
@@ -66,9 +66,9 @@
 
 #include "ui/views/view.h"
 
+using chromeos::ManagedNetworkConfigurationHandler;
 using chromeos::NetworkHandler;
 using chromeos::NetworkStateHandler;
-using chromeos::ManagedNetworkConfigurationHandler;
 using chromeos::NetworkTypePattern;
 
 namespace ash {
@@ -303,6 +303,11 @@
         network_state_handler_->GetTechnologyState(
             NetworkTypePattern::Tether());
 
+    // Only enable the toggle for the primary user since secondary users can not
+    // change network configurations.
+    bool default_toggle_enabled =
+        Shell::Get()->session_controller()->IsUserPrimary();
+
     // If Cellular is available, toggle state and subtitle reflect Cellular.
     if (cellular_state != NetworkStateHandler::TECHNOLOGY_UNAVAILABLE) {
       const chromeos::DeviceState* cellular_device =
@@ -310,7 +315,7 @@
               NetworkTypePattern::Cellular());
       bool cellular_enabled =
           cellular_state == NetworkStateHandler::TECHNOLOGY_ENABLED;
-      SetToggleState(true /* toggle_enabled */, cellular_enabled);
+      SetToggleState(default_toggle_enabled, cellular_enabled);
 
       int subtitle = 0;
       if (!cellular_device ||
@@ -357,7 +362,7 @@
         // "Initializing...". TODO(stevenjb): Rename the string to _MOBILE.
         SetSubtitle(IDS_ASH_STATUS_TRAY_INITIALIZING_CELLULAR);
       } else {
-        SetToggleState(true /* toggle_enabled */, false /* is_on */);
+        SetToggleState(default_toggle_enabled, false /* is_on */);
         SetSubtitle(IDS_ASH_STATUS_TRAY_ENABLING_MOBILE_ENABLES_BLUETOOTH);
       }
       return;
@@ -375,7 +380,7 @@
         network_state_handler_->SetTechnologyEnabled(
             NetworkTypePattern::Tether(), true /* enabled */,
             chromeos::network_handler::ErrorCallback());
-        SetToggleState(true /* toggle_enabled */, true /* is_on */);
+        SetToggleState(default_toggle_enabled, true /* is_on */);
         // "Initializing...". TODO(stevenjb): Rename the string to _MOBILE.
         SetSubtitle(IDS_ASH_STATUS_TRAY_INITIALIZING_CELLULAR);
         return;
@@ -388,7 +393,7 @@
                               NetworkTypePattern::Tether())) {
       subtitle = IDS_ASH_STATUS_TRAY_NO_MOBILE_DEVICES_FOUND;
     }
-    SetToggleState(true /* toggle_enabled */, tether_enabled /* is_on */);
+    SetToggleState(default_toggle_enabled, tether_enabled /* is_on */);
     SetSubtitle(subtitle);
   }
 
@@ -431,12 +436,12 @@
  public:
   WifiHeaderRowView()
       : SectionHeaderRowView(IDS_ASH_STATUS_TRAY_NETWORK_WIFI),
-        join_(nullptr) {}
+        join_button_(nullptr) {}
 
   ~WifiHeaderRowView() override = default;
 
   void SetToggleState(bool toggle_enabled, bool is_on) override {
-    join_->SetEnabled(is_on);
+    join_button_->SetEnabled(toggle_enabled && is_on);
     SectionHeaderRowView::SetToggleState(toggle_enabled, is_on);
   }
 
@@ -460,15 +465,15 @@
     gfx::ImageSkia disabled_image = network_icon::GetImageForNewWifiNetwork(
         SkColorSetA(prominent_color, kDisabledJoinIconAlpha),
         SkColorSetA(prominent_color, kDisabledJoinBadgeAlpha));
-    join_ = new SystemMenuButton(this, normal_image, disabled_image,
-                                 IDS_ASH_STATUS_TRAY_OTHER_WIFI);
-    join_->SetInkDropColor(prominent_color);
-    join_->SetEnabled(enabled);
-    container()->AddView(TriView::Container::END, join_);
+    join_button_ = new SystemMenuButton(this, normal_image, disabled_image,
+                                        IDS_ASH_STATUS_TRAY_OTHER_WIFI);
+    join_button_->SetInkDropColor(prominent_color);
+    join_button_->SetEnabled(enabled);
+    container()->AddView(TriView::Container::END, join_button_);
   }
 
   void ButtonPressed(views::Button* sender, const ui::Event& event) override {
-    if (sender == join_) {
+    if (sender == join_button_) {
       Shell::Get()->metrics()->RecordUserMetricsAction(
           UMA_STATUS_AREA_NETWORK_JOIN_OTHER_CLICKED);
       Shell::Get()->system_tray_controller()->ShowNetworkCreate(
@@ -492,7 +497,7 @@
   static constexpr int kDisabledJoinIconAlpha = 0x1D;
 
   // A button to invoke "Join Wi-Fi network" dialog.
-  SystemMenuButton* join_;
+  SystemMenuButton* join_button_;
 
   DISALLOW_COPY_AND_ASSIGN(WifiHeaderRowView);
 };
@@ -919,9 +924,13 @@
     *separator_view = nullptr;
   }
 
+  // Only enable the toggle for the primary user since secondary users can not
+  // change network configurations.
+  bool default_toggle_enabled =
+      Shell::Get()->session_controller()->IsUserPrimary();
   // Mobile updates its toggle state independently.
   if (!pattern.MatchesPattern(NetworkTypePattern::Mobile()))
-    (*view)->SetToggleState(true /* toggle_enabled */, enabled /* is_on */);
+    (*view)->SetToggleState(default_toggle_enabled, enabled /* is_on */);
   PlaceViewAtIndex(*view, child_index++);
   return child_index;
 }
diff --git a/ash/system/network/network_state_list_detailed_view.cc b/ash/system/network/network_state_list_detailed_view.cc
index e2e0458..0cafd2de 100644
--- a/ash/system/network/network_state_list_detailed_view.cc
+++ b/ash/system/network/network_state_list_detailed_view.cc
@@ -232,24 +232,28 @@
   const NetworkState* network =
       NetworkHandler::Get()->network_state_handler()->GetNetworkStateFromGuid(
           guid);
-  // TODO(stevenjb): Test network->connectable() here instead of
-  // IsDefaultCellular once network configuration is integrated into Settings.
-  // crbug.com/380937.
-  if (!network || network->IsConnectingOrConnected() ||
-      network->IsDefaultCellular()) {
-    Shell::Get()->metrics()->RecordUserMetricsAction(
-        list_type_ == LIST_TYPE_VPN
-            ? UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS
-            : UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS);
-    Shell::Get()->system_tray_controller()->ShowNetworkSettings(
-        network ? network->guid() : std::string());
-  } else {
+  bool can_connect = network && !network->IsConnectingOrConnected();
+  if (network->IsDefaultCellular())
+    can_connect = false;  // Default Cellular network is not connectable.
+  if (!network->connectable() &&
+      !Shell::Get()->session_controller()->IsUserPrimary()) {
+    // Secondary users can only connect to fully configured networks.
+    can_connect = false;
+  }
+  if (can_connect) {
     Shell::Get()->metrics()->RecordUserMetricsAction(
         list_type_ == LIST_TYPE_VPN
             ? UMA_STATUS_AREA_CONNECT_TO_VPN
             : UMA_STATUS_AREA_CONNECT_TO_CONFIGURED_NETWORK);
     chromeos::NetworkConnect::Get()->ConnectToNetworkId(network->guid());
+    return;
   }
+  Shell::Get()->metrics()->RecordUserMetricsAction(
+      list_type_ == LIST_TYPE_VPN
+          ? UMA_STATUS_AREA_SHOW_VPN_CONNECTION_DETAILS
+          : UMA_STATUS_AREA_SHOW_NETWORK_CONNECTION_DETAILS);
+  Shell::Get()->system_tray_controller()->ShowNetworkSettings(
+      network ? network->guid() : std::string());
 }
 
 void NetworkStateListDetailedView::CreateExtraTitleRowButtons() {