[cros] Add support for locale specific configuration in mobile config.

BUG=chrome-os-partner:8092
TEST=MobileConfigTest


Review URL: http://codereview.chromium.org/10141006

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@133667 0039d316-1c4b-4281-b951-d872f2087c98
parent 960adc17
...@@ -44,6 +44,10 @@ const char kDealExpireDateAttr[] = "expire_date"; ...@@ -44,6 +44,10 @@ const char kDealExpireDateAttr[] = "expire_date";
const char kLocalizedContentAttr[] = "localized_content"; const char kLocalizedContentAttr[] = "localized_content";
const char kNotificationTextAttr[] = "notification_text"; const char kNotificationTextAttr[] = "notification_text";
// Initial locale carrier config attributes.
const char kInitialLocalesAttr[] = "initial_locales";
const char kSetupURLAttr[] = "setup_url";
// Local config properties. // Local config properties.
const char kExcludeDealsAttr[] = "exclude_deals"; const char kExcludeDealsAttr[] = "exclude_deals";
...@@ -192,6 +196,20 @@ void MobileConfig::Carrier::RemoveDeals() { ...@@ -192,6 +196,20 @@ void MobileConfig::Carrier::RemoveDeals() {
STLDeleteValues(&deals_); STLDeleteValues(&deals_);
} }
// MobileConfig::LocaleConfig implementation. ----------------------------------
MobileConfig::LocaleConfig::LocaleConfig(DictionaryValue* locale_dict) {
InitFromDictionary(locale_dict);
}
MobileConfig::LocaleConfig::~LocaleConfig() {
}
void MobileConfig::LocaleConfig::InitFromDictionary(
base::DictionaryValue* locale_dict) {
locale_dict->GetString(kSetupURLAttr, &setup_url_);
}
// MobileConfig implementation, public ----------------------------------------- // MobileConfig implementation, public -----------------------------------------
// static // static
...@@ -215,6 +233,10 @@ const MobileConfig::Carrier* MobileConfig::GetCarrier( ...@@ -215,6 +233,10 @@ const MobileConfig::Carrier* MobileConfig::GetCarrier(
return NULL; return NULL;
} }
const MobileConfig::LocaleConfig* MobileConfig::GetLocaleConfig() const {
return locale_config_.get();
}
// MobileConfig implementation, protected -------------------------------------- // MobileConfig implementation, protected --------------------------------------
bool MobileConfig::LoadManifestFromString(const std::string& manifest) { bool MobileConfig::LoadManifestFromString(const std::string& manifest) {
...@@ -264,6 +286,17 @@ bool MobileConfig::LoadManifestFromString(const std::string& manifest) { ...@@ -264,6 +286,17 @@ bool MobileConfig::LoadManifestFromString(const std::string& manifest) {
} }
} }
DictionaryValue* initial_locales = NULL;
if (root_.get() && root_->GetDictionary(kInitialLocalesAttr,
&initial_locales)) {
DictionaryValue* locale_config_dict = NULL;
// Search for a config based on current initial locale.
if (initial_locales->GetDictionary(initial_locale_,
&locale_config_dict)) {
locale_config_.reset(new LocaleConfig(locale_config_dict));
}
}
return true; return true;
} }
......
...@@ -116,6 +116,27 @@ class MobileConfig : public CustomizationDocument { ...@@ -116,6 +116,27 @@ class MobileConfig : public CustomizationDocument {
DISALLOW_COPY_AND_ASSIGN(Carrier); DISALLOW_COPY_AND_ASSIGN(Carrier);
}; };
// Carrier config for a specific initial locale.
class LocaleConfig {
public:
explicit LocaleConfig(base::DictionaryValue* locale_dict);
~LocaleConfig();
const std::string& setup_url() const { return setup_url_; }
// Initializes local config carrier from supplied dictionary.
// Multiple calls supported (i.e. second call for local config).
void InitFromDictionary(base::DictionaryValue* locale_dict);
private:
// Carrier setup URL. Used in network menu ("Set-up Mobile Data" link).
// Displayed when SIM card is not installed on the device with a
// particular initial locale.
std::string setup_url_;
DISALLOW_COPY_AND_ASSIGN(LocaleConfig);
};
// External carrier ID (ex. "Verizon (us)") mapping to internal carrier ID. // External carrier ID (ex. "Verizon (us)") mapping to internal carrier ID.
typedef std::map<std::string, std::string> CarrierIdMap; typedef std::map<std::string, std::string> CarrierIdMap;
...@@ -124,9 +145,13 @@ class MobileConfig : public CustomizationDocument { ...@@ -124,9 +145,13 @@ class MobileConfig : public CustomizationDocument {
static MobileConfig* GetInstance(); static MobileConfig* GetInstance();
// Returns carrier by external ID. // Returns carrier by external ID or NULL if there's no such carrier.
const MobileConfig::Carrier* GetCarrier(const std::string& carrier_id) const; const MobileConfig::Carrier* GetCarrier(const std::string& carrier_id) const;
// Returns locale specific config by initial locale or NULL
// if there's no such config defined.
const MobileConfig::LocaleConfig* GetLocaleConfig() const;
protected: protected:
virtual bool LoadManifestFromString(const std::string& manifest) OVERRIDE; virtual bool LoadManifestFromString(const std::string& manifest) OVERRIDE;
...@@ -165,6 +190,9 @@ class MobileConfig : public CustomizationDocument { ...@@ -165,6 +190,9 @@ class MobileConfig : public CustomizationDocument {
// Carrier configuration (including carrier deals). // Carrier configuration (including carrier deals).
Carriers carriers_; Carriers carriers_;
// Initial locale specific config if defined.
scoped_ptr<LocaleConfig> locale_config_;
// Initial locale value. // Initial locale value.
std::string initial_locale_; std::string initial_locale_;
......
...@@ -46,6 +46,11 @@ const char kGoodMobileConfig[] = ...@@ -46,6 +46,11 @@ const char kGoodMobileConfig[] =
" ],\n" " ],\n"
" }," " },"
" }," " },"
" \"initial_locales\" : {\n"
" \"en-US\" : {\n"
" \"setup_url\" : \"accounts.carrier.com\",\n"
" },"
" },"
"}"; "}";
const char kOldDealMobileConfig[] = const char kOldDealMobileConfig[] =
...@@ -106,7 +111,12 @@ const char kLocalMobileConfig[] = ...@@ -106,7 +111,12 @@ const char kLocalMobileConfig[] =
" },\n" " },\n"
" ],\n" " ],\n"
" }," " },"
" }," " },"
" \"initial_locales\" : {\n"
" \"en-US\" : {\n"
" \"setup_url\" : \"accounts.carrier.com/localized/\",\n"
" },"
" },"
"}"; "}";
} // anonymous namespace } // anonymous namespace
...@@ -139,6 +149,17 @@ TEST(MobileConfigTest, Basic) { ...@@ -139,6 +149,17 @@ TEST(MobileConfigTest, Basic) {
base::Time reference_time; base::Time reference_time;
base::Time::FromString("31/12/12 0:00", &reference_time); base::Time::FromString("31/12/12 0:00", &reference_time);
EXPECT_EQ(reference_time, deal->expire_date()); EXPECT_EQ(reference_time, deal->expire_date());
const MobileConfig::LocaleConfig* locale_config;
locale_config = config.GetLocaleConfig();
EXPECT_TRUE(locale_config != NULL);
EXPECT_EQ("accounts.carrier.com", locale_config->setup_url());
// Check same manifest but with another initial locale.
MobileConfig config_uk(kGoodMobileConfig, "en-GB");
EXPECT_TRUE(config_uk.IsReady());
locale_config = config_uk.GetLocaleConfig();
EXPECT_TRUE(locale_config == NULL);
} }
TEST(MobileConfigTest, OldDeal) { TEST(MobileConfigTest, OldDeal) {
...@@ -213,6 +234,16 @@ TEST(MobileConfigTest, LocalConfig) { ...@@ -213,6 +234,16 @@ TEST(MobileConfigTest, LocalConfig) {
base::Time reference_time; base::Time reference_time;
base::Time::FromString("31/12/13 0:00", &reference_time); base::Time::FromString("31/12/13 0:00", &reference_time);
EXPECT_EQ(reference_time, deal->expire_date()); EXPECT_EQ(reference_time, deal->expire_date());
// Now reload same global/local config files but with proper initial locale.
MobileConfig config_us(kGoodMobileConfig, "en-US");
EXPECT_TRUE(config_us.IsReady());
config_us.LoadManifestFromString(kLocalMobileConfig);
EXPECT_TRUE(config_us.IsReady());
const MobileConfig::LocaleConfig* locale_config;
locale_config = config_us.GetLocaleConfig();
EXPECT_TRUE(locale_config != NULL);
EXPECT_EQ("accounts.carrier.com/localized/", locale_config->setup_url());
} }
} // namespace chromeos } // namespace chromeos
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment