Index: chromeos/components/tether/host_scan_device_prioritizer_impl.cc |
diff --git a/chromeos/components/tether/host_scan_device_prioritizer_impl.cc b/chromeos/components/tether/host_scan_device_prioritizer_impl.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f293ec1817e8863c45c494c23c2ebae3018517d7 |
--- /dev/null |
+++ b/chromeos/components/tether/host_scan_device_prioritizer_impl.cc |
@@ -0,0 +1,105 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chromeos/components/tether/host_scan_device_prioritizer_impl.h" |
+ |
+#include "base/memory/ptr_util.h" |
+#include "base/values.h" |
+#include "chromeos/components/tether/device_id_tether_network_guid_map.h" |
+#include "chromeos/components/tether/pref_names.h" |
+#include "chromeos/components/tether/tether_host_response_recorder.h" |
+#include "chromeos/network/network_state.h" |
+#include "chromeos/network/network_state_handler.h" |
+#include "components/prefs/pref_registry_simple.h" |
+#include "components/prefs/pref_service.h" |
+ |
+namespace chromeos { |
+ |
+namespace tether { |
+ |
+namespace { |
+ |
+cryptauth::RemoteDevice Move(const cryptauth::RemoteDevice& remote_device) { |
+ return remote_device; |
+} |
+ |
+std::unique_ptr<ManagedState> Move( |
+ std::unique_ptr<ManagedState>& tether_network_state) { |
+ return std::move(tether_network_state); |
+} |
+ |
+} // namespace |
+ |
+HostScanDevicePrioritizerImpl::HostScanDevicePrioritizerImpl( |
+ TetherHostResponseRecorder* tether_host_response_recorder, |
+ DeviceIdTetherNetworkGuidMap* device_id_tether_network_guid_map) |
+ : tether_host_response_recorder_(tether_host_response_recorder), |
+ device_id_tether_network_guid_map_(device_id_tether_network_guid_map) {} |
+ |
+HostScanDevicePrioritizerImpl::~HostScanDevicePrioritizerImpl() {} |
+ |
+void HostScanDevicePrioritizerImpl::SortByHostScanOrder( |
+ std::vector<cryptauth::RemoteDevice>* remote_devices) const { |
+ SortNetworks(remote_devices); |
+} |
+ |
+void HostScanDevicePrioritizerImpl::SortTetherNetworkList( |
+ NetworkStateHandler::ManagedStateList* tether_networks) const { |
+ SortNetworks(tether_networks); |
+} |
+ |
+template <typename T> |
+void HostScanDevicePrioritizerImpl::SortNetworks( |
+ std::vector<T>* list_to_sort) const { |
+ // First, fetch the hosts which have previously responded. |
+ std::vector<std::string> prioritized_ids = |
+ tether_host_response_recorder_->GetPreviouslyAvailableHostIds(); |
+ |
+ std::vector<std::string> previously_connectable_host_ids = |
+ tether_host_response_recorder_->GetPreviouslyConnectedHostIds(); |
+ if (!previously_connectable_host_ids.empty()) { |
+ // If there is a most-recently connectable host, insert it at the front of |
+ // the list. |
+ prioritized_ids.insert(prioritized_ids.begin(), |
+ previously_connectable_host_ids[0]); |
+ } |
+ |
+ // Iterate from the last stored ID to the first stored ID. This ensures that |
+ // the items at the front of the list end up in the front of the prioritized |
+ // |list_to_sort| vector. |
+ for (auto prioritized_it = prioritized_ids.rbegin(); |
+ prioritized_it != prioritized_ids.rend(); ++prioritized_it) { |
+ // Iterate through |list_to_sort| to see if a device ID exists which is |
+ // equal to |stored_id|. If one exists, remove it from its previous |
+ // position in the list and add it at the front instead. |
+ for (auto list_to_sort_it = list_to_sort->begin(); |
+ list_to_sort_it != list_to_sort->end(); ++list_to_sort_it) { |
+ if (GetDeviceId(*list_to_sort_it) != *prioritized_it) { |
+ continue; |
+ } |
+ |
+ T entry_to_move = Move(*list_to_sort_it); |
+ list_to_sort->erase(list_to_sort_it); |
+ list_to_sort->emplace(list_to_sort->begin(), Move(entry_to_move)); |
+ break; |
+ } |
+ } |
+} |
+ |
+std::string HostScanDevicePrioritizerImpl::GetDeviceId( |
+ const cryptauth::RemoteDevice& remote_device) const { |
+ return remote_device.GetDeviceId(); |
+} |
+ |
+std::string HostScanDevicePrioritizerImpl::GetDeviceId( |
+ const std::unique_ptr<ManagedState>& tether_network_state) const { |
+ NetworkState* network_state = |
+ static_cast<NetworkState*>(tether_network_state.get()); |
+ return device_id_tether_network_guid_map_->GetDeviceIdForTetherNetworkGuid( |
+ network_state->guid()); |
+} |
+ |
+} // namespace tether |
+ |
+} // namespace chromeos |