shill: Add code to track disconnect metric.

BUG=chromium-os:25958
TEST=Unit tests, network_WiFiManager

Change-Id: I4cee4d4380dc822c9bed61e006df304c6c6fbdde
Reviewed-on: https://gerrit.chromium.org/gerrit/15850
Commit-Ready: Thieu Le <thieule@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/metrics.cc b/metrics.cc
index 629a10c..7eb631b 100644
--- a/metrics.cc
+++ b/metrics.cc
@@ -20,6 +20,11 @@
 static base::LazyInstance<Metrics> g_metrics(base::LINKER_INITIALIZED);
 
 // static
+const char Metrics::kMetricDisconnect[] = "Network.Shill.%s.Disconnect";
+const int Metrics::kMetricDisconnectMax = 1;
+const int Metrics::kMetricDisconnectMin = 0;
+const int Metrics::kMetricDisconnectNumBuckets = 2;
+
 const char Metrics::kMetricNetworkChannel[] = "Network.Shill.%s.Channel";
 const int Metrics::kMetricNetworkChannelMax = Metrics::kWiFiChannelMax;
 const char Metrics::kMetricNetworkPhyMode[] = "Network.Shill.%s.PhyMode";
@@ -252,10 +257,14 @@
   return base::StringPrintf(metric_name, technology.c_str());
 }
 
-void Metrics::NotifyServiceDisconnect(const Service */*service*/,
-                                      bool /*manual_disconnect*/) {
-  // TODO(thieule): Handle service disconnects.
-  // crosbug.com/23253
+void Metrics::NotifyServiceDisconnect(const Service *service) {
+  Technology::Identifier technology = service->technology();
+  string histogram = GetFullMetricName(kMetricDisconnect, technology);
+  SendToUMA(histogram,
+            service->explicitly_disconnected(),
+            kMetricDisconnectMin,
+            kMetricDisconnectMax,
+            kMetricDisconnectNumBuckets);
 }
 
 void Metrics::NotifyPower() {