shill: Move Metrics from singleton to Shill daemon

While implementing chromium-os:24810, it was discovered that Metrics is
cleaner if it is passed around like ControlInterface, Dispatcher,
Manager, etc.  This approach also makes Metrics more testable.

BUG=chromium-os:24810
TEST=Unit tests, network_WiFiManager suite

Change-Id: I556a1bd11f21f0b93ecfeaae8855dfb99ed5e5f9
Reviewed-on: https://gerrit.chromium.org/gerrit/14099
Commit-Ready: Thieu Le <thieule@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/device_info.cc b/device_info.cc
index 79588d2..9849cb6 100644
--- a/device_info.cc
+++ b/device_info.cc
@@ -61,9 +61,11 @@
 
 DeviceInfo::DeviceInfo(ControlInterface *control_interface,
                        EventDispatcher *dispatcher,
+                       Metrics *metrics,
                        Manager *manager)
     : control_interface_(control_interface),
       dispatcher_(dispatcher),
+      metrics_(metrics),
       manager_(manager),
       link_callback_(NewCallback(this, &DeviceInfo::LinkMsgHandler)),
       address_callback_(NewCallback(this, &DeviceInfo::AddressMsgHandler)),
@@ -209,18 +211,19 @@
         manager_->modem_info()->OnDeviceInfoAvailable(link_name);
         return;
       case Technology::kEthernet:
-        device = new Ethernet(control_interface_, dispatcher_, manager_,
-                              link_name, address, dev_index);
+        device = new Ethernet(control_interface_, dispatcher_, metrics_,
+                              manager_, link_name, address, dev_index);
         device->EnableIPv6Privacy();
         break;
       case Technology::kWifi:
-        device = new WiFi(control_interface_, dispatcher_, manager_,
+        device = new WiFi(control_interface_, dispatcher_, metrics_, manager_,
                           link_name, address, dev_index);
         device->EnableIPv6Privacy();
         break;
       default:
-        device = new DeviceStub(control_interface_, dispatcher_, manager_,
-                                link_name, address, dev_index, technology);
+        device = new DeviceStub(control_interface_, dispatcher_, metrics_,
+                                manager_, link_name, address, dev_index,
+                                technology);
         break;
     }
     RegisterDevice(device);