shill: cellular: Improve cellular service name generation.

Changes include:

- Don't override the serving operator name with the one from the
  database if a name is provided by the network.

- Prefer presenting the serving operator name as the UI service name
  since that one can be controlled by carriers OTA.

- Include both the home provider and the serving operator in the
  service name per 3GPP rules.

BUG=chromium-os:21522,chromium-os:33584
TEST=Tested on device with different SIM cards and operators, unit tests.

Change-Id: I33513ad437b0c0fe0d6de40dda2360dfdbc45e34
Reviewed-on: https://gerrit.chromium.org/gerrit/30695
Tested-by: Darin Petkov <petkov@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Darin Petkov <petkov@chromium.org>
diff --git a/cellular_capability_gsm.cc b/cellular_capability_gsm.cc
index 4445de9..d045269 100644
--- a/cellular_capability_gsm.cc
+++ b/cellular_capability_gsm.cc
@@ -439,19 +439,28 @@
 }
 
 string CellularCapabilityGSM::CreateFriendlyServiceName() {
-  SLOG(Cellular, 2) << __func__;
-  if (registration_state_ == MM_MODEM_GSM_NETWORK_REG_STATUS_HOME &&
-      !cellular()->home_provider().GetName().empty()) {
-    return cellular()->home_provider().GetName();
+  SLOG(Cellular, 2) << __func__ << ": " << GetRoamingStateString();
+  string name = serving_operator_.GetName();
+  string home_provider_name = cellular()->home_provider().GetName();
+  if (!name.empty()) {
+    // If roaming, try to show "<home-provider> | <serving-operator>", per 3GPP
+    // rules (TS 31.102 and annex A of 122.101).
+    if (registration_state_ == MM_MODEM_GSM_NETWORK_REG_STATUS_ROAMING &&
+        !home_provider_name.empty()) {
+      return home_provider_name + " | " + name;
+    }
+    return name;
   }
-  if (!serving_operator_.GetName().empty()) {
-    return serving_operator_.GetName();
+  if (registration_state_ == MM_MODEM_GSM_NETWORK_REG_STATUS_HOME &&
+      !home_provider_name.empty()) {
+    return home_provider_name;
   }
   if (!carrier_.empty()) {
     return carrier_;
   }
-  if (!serving_operator_.GetCode().empty()) {
-    return "cellular_" + serving_operator_.GetCode();
+  string serving_operator_code = serving_operator_.GetCode();
+  if (!serving_operator_code.empty()) {
+    return "cellular_" + serving_operator_code;
   }
   return base::StringPrintf("GSMNetwork%u", friendly_service_name_id_++);
 }
@@ -488,6 +497,8 @@
     oper.SetName(spn_);
   }
   cellular()->set_home_provider(oper);
+  SLOG(Cellular, 2) << "Home provider: " << oper.GetCode() << ", "
+                    << oper.GetName() << ", " << oper.GetCountry();
   InitAPNList();
 }
 
@@ -500,15 +511,17 @@
         mobile_provider_lookup_by_network(cellular()->provider_db(),
                                           network_id.c_str());
     if (provider) {
-      const char *provider_name = mobile_provider_get_name(provider);
-      if (provider_name && *provider_name) {
-        serving_operator_.SetName(provider_name);
-        if (provider->country) {
-          serving_operator_.SetCountry(provider->country);
+      if (serving_operator_.GetName().empty()) {
+        const char *provider_name = mobile_provider_get_name(provider);
+        if (provider_name && *provider_name) {
+          serving_operator_.SetName(provider_name);
         }
-        SLOG(Cellular, 2) << "Operator name: " << serving_operator_.GetName()
-                          << ", country: " << serving_operator_.GetCountry();
       }
+      if (provider->country && *provider->country) {
+        serving_operator_.SetCountry(provider->country);
+      }
+      SLOG(Cellular, 2) << "Operator name: " << serving_operator_.GetName()
+                        << ", country: " << serving_operator_.GetCountry();
     } else {
       SLOG(Cellular, 2) << "GSM provider not found.";
     }