Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(208)

Unified Diff: chromeos/network/network_state_handler.cc

Issue 2945643002: [CrOS Tether] Sort Tether network lists. (Closed)
Patch Set: Order active networks before non-active. Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chromeos/network/network_state_handler.cc
diff --git a/chromeos/network/network_state_handler.cc b/chromeos/network/network_state_handler.cc
index e95ba4f933e7f194fb4f7a195450912dac57e161..873b759dd48c906c320bba99474508445f61b8bc 100644
--- a/chromeos/network/network_state_handler.cc
+++ b/chromeos/network/network_state_handler.cc
@@ -428,31 +428,58 @@ void NetworkStateHandler::GetNetworkListByType(const NetworkTypePattern& type,
int count = list->size();
- if (type.Equals(NetworkTypePattern::Tether()) ||
- (limit != 0 && count >= limit)) {
- // If only searching for Tether networks, there is no need to continue
- // searching through other network types; likewise, if the limit has already
- // been reached, there is no need to continue searching.
- return;
+ // Only add more networks if the limit has not yet been reached.
+ if (limit == 0 || count < limit) {
stevenjb 2017/06/21 20:59:04 Instead of indenting this, modify the test in line
Kyle Horimoto 2017/06/21 22:17:07 Done.
+ for (auto iter = network_list_.begin(); iter != network_list_.end();
+ ++iter) {
+ const NetworkState* network = (*iter)->AsNetworkState();
+ DCHECK(network);
+ if (!network->update_received() || !network->Matches(type))
+ continue;
+ if (configured_only && !network->IsInProfile())
+ continue;
+ if (visible_only && !network->visible())
+ continue;
+ if (network->type() == shill::kTypeWifi &&
+ !network->tether_guid().empty()) {
+ // Wi-Fi networks which are actually underlying Wi-Fi hotspots for a
+ // Tether network should not be returned since they should only be shown
+ // to the user as Tether networks.
+ continue;
+ }
+ if (network->type() == shill::kTypeEthernet) {
+ // Ethernet networks should always be in front.
+ list->insert(list->begin(), network);
+ } else {
+ list->push_back(network);
+ }
+ if (limit > 0 && ++count >= limit)
+ break;
+ }
}
- for (auto iter = network_list_.begin(); iter != network_list_.end(); ++iter) {
- const NetworkState* network = (*iter)->AsNetworkState();
- DCHECK(network);
- if (!network->update_received() || !network->Matches(type))
- continue;
- if (configured_only && !network->IsInProfile())
- continue;
- if (visible_only && !network->visible())
- continue;
- if (network->type() == shill::kTypeEthernet) {
- // Ethernet networks should always be in front.
- list->insert(list->begin(), network);
- } else {
- list->push_back(network);
+ if (type.MatchesPattern(NetworkTypePattern::Tether())) {
+ // Tether networks were added to |list| above before non-Tether networks.
+ // Thus, if |type| includes Tether networks, it is possible that |list|
+ // contains some non-active Tether networks before some active (i.e.,
+ // connecting or connected) non-Tether networks. Active networks should
+ // always be listed first, so adjust the list accordingly.
+ size_t last_active_network_index = -1;
+ for (size_t i = 0; i < list->size(); ++i) {
+ const NetworkState* network = list->at(i);
+ if (network->IsConnectingState() || network->IsConnectedState()) {
+ // A new active network has been found in the list.
+ last_active_network_index++;
+
+ if (i != last_active_network_index) {
+ // If this is an active network that is not in the correct order
+ // (i.e., it is listed after non-active networks), move it to the
+ // correct spot.
+ list->erase(list->begin() + i);
+ list->insert(list->begin() + last_active_network_index, network);
+ }
+ }
}
stevenjb 2017/06/21 20:59:04 Can we move this logic to a separate helper?
Kyle Horimoto 2017/06/21 22:17:07 Done.
- if (limit > 0 && ++count >= limit)
- break;
}
}
@@ -538,6 +565,8 @@ void NetworkStateHandler::AddTetherNetworkState(const std::string& guid,
tether_network_state->set_signal_strength(signal_strength);
tether_network_list_.push_back(std::move(tether_network_state));
+ network_list_sorted_ = false;
+
NotifyNetworkListChanged();
}
@@ -562,6 +591,7 @@ bool NetworkStateHandler::UpdateTetherNetworkProperties(
tether_network_state->set_carrier(carrier);
tether_network_state->set_battery_percentage(battery_percentage);
tether_network_state->set_signal_strength(signal_strength);
+ network_list_sorted_ = false;
NotifyNetworkPropertiesUpdated(tether_network_state);
return true;
@@ -581,6 +611,7 @@ bool NetworkStateHandler::SetTetherNetworkHasConnectedToHost(
}
tether_network_state->set_tether_has_connected_to_host(true);
+ network_list_sorted_ = false;
NotifyNetworkPropertiesUpdated(tether_network_state);
return true;
@@ -634,6 +665,7 @@ bool NetworkStateHandler::DisassociateTetherNetworkStateFromWifiNetwork(
wifi_network_state->set_tether_guid(std::string());
tether_network_state->set_tether_guid(std::string());
+ network_list_sorted_ = false;
NotifyNetworkPropertiesUpdated(wifi_network_state);
NotifyNetworkPropertiesUpdated(tether_network_state);
@@ -681,6 +713,7 @@ bool NetworkStateHandler::AssociateTetherNetworkStateWithWifiNetwork(
tether_network_state->set_tether_guid(wifi_network_guid);
wifi_network_state->set_tether_guid(tether_network_guid);
+ network_list_sorted_ = false;
NotifyNetworkPropertiesUpdated(wifi_network_state);
NotifyNetworkPropertiesUpdated(tether_network_state);
@@ -739,8 +772,9 @@ void NetworkStateHandler::SetTetherNetworkStateConnectionState(
std::string prev_connection_state = tether_network_state->connection_state();
tether_network_state->set_connection_state(connection_state);
- DCHECK(!tether_network_state->is_captive_portal());
+ network_list_sorted_ = false;
+ DCHECK(!tether_network_state->is_captive_portal());
if (ConnectionStateChanged(tether_network_state, prev_connection_state,
false /* prev_is_captive_portal */)) {
NET_LOG(EVENT) << "Changing connection state for Tether network with GUID "
@@ -752,6 +786,17 @@ void NetworkStateHandler::SetTetherNetworkStateConnectionState(
}
}
+void NetworkStateHandler::SetTetherNetworkListSorter(
+ const TetherNetworkListSorter* tether_network_list_sorter) {
+ if (tether_technology_state_ != TECHNOLOGY_ENABLED) {
+ NET_LOG(ERROR) << "SetTetherNetworkListSorter() called when Tether "
+ << "networks are not enabled.";
+ return;
+ }
+
+ tether_network_list_sorter_ = tether_network_list_sorter;
+}
+
void NetworkStateHandler::EnsureTetherDeviceState() {
bool should_be_present =
tether_technology_state_ != TechnologyState::TECHNOLOGY_UNAVAILABLE;
@@ -1207,8 +1252,10 @@ void NetworkStateHandler::ManagedStateListChanged(
}
}
-// TODO(khorimoto): Add sorting for the Tether network list as well.
void NetworkStateHandler::SortNetworkList() {
+ if (tether_network_list_sorter_)
+ tether_network_list_sorter_->SortTetherNetworkList(&tether_network_list_);
+
// Note: usually active networks will precede inactive networks, however
// this may briefly be untrue during state transitions (e.g. a network may
// transition to idle before the list is updated).

Powered by Google App Engine
This is Rietveld 408576698