Chromium Code Reviews| Index: chromeos/network/network_state_handler.cc |
| diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc |
| index aa91883ab1f970acc6a663a61eb14ce3c50e329d..c7c82ebfd652adf710e9220c15c405c83147622e 100644 |
| --- a/chromeos/network/network_state_handler.cc |
| +++ b/chromeos/network/network_state_handler.cc |
| @@ -222,7 +222,7 @@ const NetworkState* NetworkStateHandler::FirstNetworkByType( |
| if (!network->update_received()) |
| continue; |
| if (!network->visible()) |
| - continue; |
| + break; |
|
pneubeck (no reviews)
2014/06/16 14:38:15
did the ordering by Shill change in the meanwhile
stevenjb
2014/06/16 19:54:49
This was an ordering issue that is now addressed i
|
| if (network->Matches(type)) |
| return network; |
| } |
| @@ -461,34 +461,6 @@ void NetworkStateHandler::UpdateManagedList(ManagedState::ManagedType type, |
| STLDeleteContainerPairSecondPointers(managed_map.begin(), managed_map.end()); |
| } |
| -void NetworkStateHandler::UpdateVisibleNetworks( |
| - const base::ListValue& entries) { |
| - NET_LOG_DEBUG(base::StringPrintf("UpdateVisibleNetworks"), |
| - base::StringPrintf("%" PRIuS, entries.GetSize())); |
| - // Create a map of all networks and clear the visible state. |
| - ManagedStateList* network_list = |
| - GetManagedList(ManagedState::MANAGED_TYPE_NETWORK); |
| - typedef std::map<std::string, NetworkState*> NetworkMap; |
| - NetworkMap network_map; |
| - for (ManagedStateList::iterator iter = network_list->begin(); |
| - iter != network_list->end(); ++iter) { |
| - NetworkState* network = (*iter)->AsNetworkState(); |
| - network_map[network->path()] = network; |
| - network->set_visible(false); |
| - } |
| - // Look up each entry and set the associated network to visible. |
| - for (base::ListValue::const_iterator iter = entries.begin(); |
| - iter != entries.end(); ++iter) { |
| - std::string path; |
| - (*iter)->GetAsString(&path); |
| - NetworkMap::iterator found = network_map.find(path); |
| - if (found != network_map.end()) |
| - found->second->set_visible(true); |
| - else |
| - NET_LOG_DEBUG("Visible network not in list", path); |
| - } |
| -} |
| - |
| void NetworkStateHandler::ProfileListChanged() { |
| NET_LOG_EVENT("ProfileListChanged", "Re-Requesting Network Properties"); |
| for (ManagedStateList::iterator iter = network_list_.begin(); |
| @@ -566,7 +538,7 @@ void NetworkStateHandler::UpdateNetworkServiceProperty( |
| if (!changed) |
| return; |
| - if (key == shill::kStateProperty) { |
| + if (key == shill::kStateProperty || key == shill::kVisibleProperty) { |
| if (ConnectionStateChanged(network, prev_connection_state)) { |
| OnNetworkConnectionStateChanged(network); |
| // If the connection state changes, other properties such as IPConfig |
| @@ -680,28 +652,12 @@ void NetworkStateHandler::TechnologyListChanged() { |
| void NetworkStateHandler::ManagedStateListChanged( |
| ManagedState::ManagedType type) { |
| if (type == ManagedState::MANAGED_TYPE_NETWORK) { |
| + UpdateNetworkList(); |
|
pneubeck (no reviews)
2014/06/16 14:38:15
Just noting that networks are added at distributed
stevenjb
2014/06/16 19:54:49
So, I thought about this a bunch, and while in pra
|
| // Notify observers that the list of networks has changed. |
| NET_LOG_EVENT("NOTIFY:NetworkListChanged", |
| base::StringPrintf("Size:%" PRIuS, network_list_.size())); |
| FOR_EACH_OBSERVER(NetworkStateHandlerObserver, observers_, |
| NetworkListChanged()); |
| - // Update UMA stats. |
| - size_t shared = 0, unshared = 0, visible = 0; |
| - for (ManagedStateList::iterator iter = network_list_.begin(); |
| - iter != network_list_.end(); ++iter) { |
| - NetworkState* network = (*iter)->AsNetworkState(); |
| - if (network->visible()) |
| - ++visible; |
| - if (network->IsInProfile()) { |
| - if (network->IsPrivate()) |
| - ++unshared; |
| - else |
| - ++shared; |
| - } |
| - } |
| - UMA_HISTOGRAM_COUNTS_100("Networks.Visible", visible); |
| - UMA_HISTOGRAM_COUNTS_100("Networks.RememberedShared", shared); |
| - UMA_HISTOGRAM_COUNTS_100("Networks.RememberedUnshared", unshared); |
| } else if (type == ManagedState::MANAGED_TYPE_DEVICE) { |
| std::string devices; |
| for (ManagedStateList::const_iterator iter = device_list_.begin(); |
| @@ -717,6 +673,62 @@ void NetworkStateHandler::ManagedStateListChanged( |
| } |
| } |
| +void NetworkStateHandler::UpdateNetworkList() { |
| + // Sort networks as follows: |
|
pneubeck (no reviews)
2014/06/16 14:38:15
Better also mention that it's a stable sort that m
stevenjb
2014/06/16 19:54:49
Done.
|
| + // * Connected or connecting networks (should be listed first by Shill) |
| + // * Visible non-wifi networks |
| + // * Visible wifi networks |
| + // * Hidden (wifi) networks |
| + // Also update UMA stats. |
| + bool listing_active_networks = true; |
| + size_t shared = 0, unshared = 0; |
| + ManagedStateList active, wifi_visible, wifi_hidden; |
|
pneubeck (no reviews)
2014/06/16 14:38:15
is there an expected case, where this reordering a
stevenjb
2014/06/16 19:54:49
Shill is sorting by type then by state, type, visi
|
| + for (ManagedStateList::iterator iter = network_list_.begin(); |
| + iter != network_list_.end(); ++iter) { |
| + NetworkState* network = (*iter)->AsNetworkState(); |
| + if (network->IsConnectedState() || network->IsConnectingState()) { |
| + active.push_back(network); |
| + if (!listing_active_networks) { |
| + NET_LOG_ERROR("Active network follows inactive network", |
| + GetLogName(network)); |
| + } |
| + } else { |
| + listing_active_networks = false; |
| + if (network->visible()) { |
| + if (!NetworkTypePattern::WiFi().MatchesType(network->type())) { |
| + // List visible non-wifi networks immediately after active networks. |
|
pneubeck (no reviews)
2014/06/16 14:38:15
is this the difference to Shill's order?
Note that
stevenjb
2014/06/16 19:54:49
Done.
|
| + active.push_back(network); |
| + } else { |
| + wifi_visible.push_back(network); |
| + } |
| + } else { |
| + wifi_hidden.push_back(network); |
| + } |
| + } |
| + if (network->IsInProfile()) { |
| + if (network->IsPrivate()) |
| + ++unshared; |
| + else |
| + ++shared; |
| + } |
| + } |
| + |
| + // Update |network_list_|. |
| + network_list_.clear(); |
| + network_list_.insert( |
| + network_list_.end(), active.begin(), active.end()); |
| + network_list_.insert( |
| + network_list_.end(), wifi_visible.begin(), wifi_visible.end()); |
| + network_list_.insert( |
| + network_list_.end(), wifi_hidden.begin(), wifi_hidden.end()); |
| + |
| + // Update histograms. |
| + UMA_HISTOGRAM_COUNTS_100("Networks.Visible", |
| + active.size() + wifi_visible.size()); |
|
pneubeck (no reviews)
2014/06/16 14:38:15
optional nit: use a visible counter
stevenjb
2014/06/16 19:54:49
Done.
|
| + UMA_HISTOGRAM_COUNTS_100("Networks.RememberedShared", shared); |
| + UMA_HISTOGRAM_COUNTS_100("Networks.RememberedUnshared", unshared); |
| +} |
| + |
| void NetworkStateHandler::DefaultNetworkServiceChanged( |
| const std::string& service_path) { |
| // Shill uses '/' for empty service path values; check explicitly for that. |