shill: cellular: Update status when registration is lost.

BUG=chromium-os:36626
TEST=Unit tests, cellular_ModemControl, network_ModemControl

Change-Id: Ia151d6e22620b3e93789800a8c0666d6bee707bf
Reviewed-on: https://gerrit.chromium.org/gerrit/38671
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Ready: Thieu Le <thieule@chromium.org>
Reviewed-by: Thieu Le <thieule@chromium.org>
Tested-by: Thieu Le <thieule@chromium.org>
diff --git a/cellular.cc b/cellular.cc
index 9b3e04b..a244595 100644
--- a/cellular.cc
+++ b/cellular.cc
@@ -590,22 +590,21 @@
     return;
   }
   set_modem_state(new_state);
+  if (old_state >= kModemStateRegistered &&
+      new_state < kModemStateRegistered) {
+    capability_->SetUnregistered(new_state == kModemStateSearching);
+    HandleNewRegistrationState();
+  }
   switch (new_state) {
     case kModemStateDisabled:
       SetEnabled(false);
       break;
     case kModemStateEnabled:
-    case kModemStateSearching:
-      // Note: we only handle changes to Enabled from the Registered
-      // state here. Changes from Disabled to Enabled are handled in
-      // the DBusPropertiesChanged handler.
-      if (old_state == kModemStateRegistered) {
-        capability_->SetUnregistered(new_state == kModemStateSearching);
-        HandleNewRegistrationState();
-      } else {
-        SLOG(Cellular, 2) << __func__ << ": Ignoring state change to Enabled";
-      }
+      // Transition from Disabled to Enabled is handled in the
+      // DBusPropertiesChanged handler.
+      SLOG(Cellular, 2) << __func__ << ": Ignoring state change to Enabled";
       // Intentionally falls through.
+    case kModemStateSearching:
     case kModemStateRegistered:
       // If the modem state changes from Connecting/Connected/Disconnecting
       // to Registered/Enabled/Searching, then it's an indication that the