Merge remote-tracking branch 'remotes/weave/master' into weave_aosp-master

* remotes/weave/master:
  Replace https://www.googleapis.com/clouddevices/v1/ with https://www.googleapis.com/weave/v1.
  Set "WiFi discovery" bit of device flags according state of Hosted SSID. Return true only if device is hosting AP or if flags are being generated for SSID.
  Updated api_key, client_id and client_secret
  Add missing UI device kinds
diff --git a/examples/provider/file_config_store.cc b/examples/provider/file_config_store.cc
index 44f2c30..8e72792 100644
--- a/examples/provider/file_config_store.cc
+++ b/examples/provider/file_config_store.cc
@@ -38,9 +38,16 @@
   settings->model_id = "AAAAA";
   settings->pairing_modes = {PairingType::kEmbeddedCode};
   settings->embedded_code = "0000";
-  settings->client_id = "58855907228.apps.googleusercontent.com";
-  settings->client_secret = "eHSAREAHrIqPsHBxCE9zPPBi";
-  settings->api_key = "AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA";
+
+  // Keys owners:
+  //   avakulenko@google.com
+  //   gene@chromium.org
+  //   vitalybuka@chromium.org
+  settings->client_id =
+      "338428340000-vkb4p6h40c7kja1k3l70kke8t615cjit.apps.googleusercontent."
+      "com";
+  settings->client_secret = "LS_iPYo_WIOE0m2VnLdduhnx";
+  settings->api_key = "AIzaSyACK3oZtmIylUKXiTMqkZqfuRiCgQmQSAQ";
 
   settings->disable_security = disable_security_;
   return true;
diff --git a/src/config.cc b/src/config.cc
index 9a18bb0..52f5ea1 100644
--- a/src/config.cc
+++ b/src/config.cc
@@ -44,6 +44,9 @@
 
 }  // namespace config_keys
 
+const char kWeaveUrl[] = "https://www.googleapis.com/weave/v1/";
+const char kDeprecatedUrl[] = "https://www.googleapis.com/clouddevices/v1/";
+
 namespace {
 
 const int kCurrentConfigVersion = 1;
@@ -60,7 +63,7 @@
 Config::Settings CreateDefaultSettings() {
   Config::Settings result;
   result.oauth_url = "https://accounts.google.com/o/oauth2/";
-  result.service_url = "https://www.googleapis.com/clouddevices/v1/";
+  result.service_url = kWeaveUrl;
   result.local_anonymous_access_role = AuthScope::kViewer;
   result.pairing_modes.emplace(PairingType::kPinCode);
   result.device_id = base::GenerateGUID();
@@ -162,8 +165,11 @@
   if (dict->GetString(config_keys::kOAuthURL, &tmp))
     set_oauth_url(tmp);
 
-  if (dict->GetString(config_keys::kServiceURL, &tmp))
+  if (dict->GetString(config_keys::kServiceURL, &tmp)) {
+    if (tmp == kDeprecatedUrl)
+      tmp = kWeaveUrl;
     set_service_url(tmp);
+  }
 
   if (dict->GetString(config_keys::kName, &tmp))
     set_name(tmp);
diff --git a/src/config_unittest.cc b/src/config_unittest.cc
index fbfd25f..10ed07e 100644
--- a/src/config_unittest.cc
+++ b/src/config_unittest.cc
@@ -53,8 +53,7 @@
   EXPECT_EQ("", GetSettings().client_secret);
   EXPECT_EQ("", GetSettings().api_key);
   EXPECT_EQ("https://accounts.google.com/o/oauth2/", GetSettings().oauth_url);
-  EXPECT_EQ("https://www.googleapis.com/clouddevices/v1/",
-            GetSettings().service_url);
+  EXPECT_EQ("https://www.googleapis.com/weave/v1/", GetSettings().service_url);
   EXPECT_EQ("", GetSettings().oem_name);
   EXPECT_EQ("", GetSettings().model_name);
   EXPECT_EQ("", GetSettings().model_id);
diff --git a/src/privet/device_ui_kind.cc b/src/privet/device_ui_kind.cc
index 08b9312..ed7c5ff 100644
--- a/src/privet/device_ui_kind.cc
+++ b/src/privet/device_ui_kind.cc
@@ -20,6 +20,12 @@
     return "camera";
   if (kind == "AB")
     return "developmentBoard";
+  if (kind == "AH")
+    return "acHeating";
+  if (kind == "AI")
+    return "light";
+  if (kind == "AO")
+    return "lock";
   if (kind == "AE")
     return "printer";
   if (kind == "AF")
diff --git a/src/privet/wifi_ssid_generator.cc b/src/privet/wifi_ssid_generator.cc
index a049c20..697e5d8 100644
--- a/src/privet/wifi_ssid_generator.cc
+++ b/src/privet/wifi_ssid_generator.cc
@@ -52,6 +52,10 @@
 }
 
 std::string WifiSsidGenerator::GenerateFlags() const {
+  return GenerateFlagsInternal(false);
+}
+
+std::string WifiSsidGenerator::GenerateFlagsInternal(bool for_ssid) const {
   std::bitset<6> flags1;
   // Device needs WiFi configuration.
   flags1[0] = wifi_ && IsSetupNeeded(wifi_->GetConnectionState());
@@ -59,8 +63,9 @@
   flags1[1] = IsSetupNeeded(gcd_->GetConnectionState());
 
   std::bitset<6> flags2;
+
   // Device is discoverable over WiFi.
-  flags2[0] = true;
+  flags2[0] = for_ssid || (wifi_ && !wifi_->GetHostedSsid().empty());
 
   std::string result{2, base64chars[0]};
   result[0] = base64chars[flags1.to_ulong()];
@@ -77,7 +82,7 @@
 
   std::string result =
       base::StringPrintf(kSsidFormat, name.c_str(), idx.c_str(),
-                         model_id.c_str(), GenerateFlags().c_str());
+                         model_id.c_str(), GenerateFlagsInternal(true).c_str());
   CHECK_EQ(result[result.size() - 11], '.');
   return result;
 }
diff --git a/src/privet/wifi_ssid_generator.h b/src/privet/wifi_ssid_generator.h
index d720fb5..2b86f28 100644
--- a/src/privet/wifi_ssid_generator.h
+++ b/src/privet/wifi_ssid_generator.h
@@ -30,6 +30,7 @@
 
   // Sets object to use |n| instead of random number for SSID generation.
   void SetRandomForTests(int n);
+  std::string GenerateFlagsInternal(bool for_ssid) const;
 
   const CloudDelegate* gcd_{nullptr};
   const WifiDelegate* wifi_{nullptr};
diff --git a/src/privet/wifi_ssid_generator_unittest.cc b/src/privet/wifi_ssid_generator_unittest.cc
index 3bd561f..398e105 100644
--- a/src/privet/wifi_ssid_generator_unittest.cc
+++ b/src/privet/wifi_ssid_generator_unittest.cc
@@ -22,7 +22,26 @@
   WifiSsidGenerator ssid_generator_{&gcd_, &wifi_};
 };
 
-TEST_F(WifiSsidGeneratorTest, GenerateFlags) {
+TEST_F(WifiSsidGeneratorTest, GenerateFlagsNoHostedAp) {
+  EXPECT_EQ(ssid_generator_.GenerateFlags().size(), 2);
+
+  wifi_.connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
+  gcd_.connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
+  EXPECT_EQ("DA", ssid_generator_.GenerateFlags());
+
+  wifi_.connection_state_ = ConnectionState{ConnectionState::kOnline};
+  EXPECT_EQ("CA", ssid_generator_.GenerateFlags());
+
+  gcd_.connection_state_ = ConnectionState{ConnectionState::kOffline};
+  EXPECT_EQ("AA", ssid_generator_.GenerateFlags());
+
+  wifi_.connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
+  EXPECT_EQ("BA", ssid_generator_.GenerateFlags());
+}
+
+TEST_F(WifiSsidGeneratorTest, GenerateFlagsWithHostedAp) {
+  EXPECT_CALL(wifi_, GetHostedSsid())
+      .WillRepeatedly(Return(ssid_generator_.GenerateSsid()));
   EXPECT_EQ(ssid_generator_.GenerateFlags().size(), 2);
 
   wifi_.connection_state_ = ConnectionState{ConnectionState::kUnconfigured};
diff --git a/src/weave_unittest.cc b/src/weave_unittest.cc
index fb00cc9..63d3348 100644
--- a/src/weave_unittest.cc
+++ b/src/weave_unittest.cc
@@ -344,19 +344,17 @@
   auto draft = CreateDictionaryValue(kDeviceResource);
   auto response = CreateDictionaryValue(kRegistrationResponse);
   response->Set("deviceDraft", draft->DeepCopy());
-  ExpectRequest(
-      HttpClient::Method::kPatch,
-      "https://www.googleapis.com/clouddevices/v1/registrationTickets/"
-      "TICKET_ID?key=TEST_API_KEY",
-      ValueToString(*response));
+  ExpectRequest(HttpClient::Method::kPatch,
+                "https://www.googleapis.com/weave/v1/registrationTickets/"
+                "TICKET_ID?key=TEST_API_KEY",
+                ValueToString(*response));
 
   response = CreateDictionaryValue(kRegistrationFinalResponse);
   response->Set("deviceDraft", draft->DeepCopy());
-  ExpectRequest(
-      HttpClient::Method::kPost,
-      "https://www.googleapis.com/clouddevices/v1/registrationTickets/"
-      "TICKET_ID/finalize?key=TEST_API_KEY",
-      ValueToString(*response));
+  ExpectRequest(HttpClient::Method::kPost,
+                "https://www.googleapis.com/weave/v1/registrationTickets/"
+                "TICKET_ID/finalize?key=TEST_API_KEY",
+                ValueToString(*response));
 
   ExpectRequest(HttpClient::Method::kPost,
                 "https://accounts.google.com/o/oauth2/token",