diff options
8 files changed, 121 insertions, 69 deletions
diff --git a/chrome/browser/chromeos/cros/network_library.cc b/chrome/browser/chromeos/cros/network_library.cc index db3396a..1511bc7 100644 --- a/chrome/browser/chromeos/cros/network_library.cc +++ b/chrome/browser/chromeos/cros/network_library.cc @@ -468,16 +468,26 @@ string16 CellularDataPlan::GetUsageInfo() const { return string16(); } +base::TimeDelta CellularDataPlan::remaining_time() const { + base::TimeDelta time = plan_end_time - update_time; + return time.InMicroseconds() < 0 ? base::TimeDelta() : time; +} + int64 CellularDataPlan::remaining_minutes() const { - return base::TimeDelta(plan_end_time - update_time).InMinutes(); + return remaining_time().InMinutes(); +} + +int64 CellularDataPlan::remaining_data() const { + int64 data = plan_data_bytes - data_bytes_used; + return data < 0 ? 0 : data; } int64 CellularDataPlan::remaining_mbytes() const { - return (plan_data_bytes - data_bytes_used) / (1024 * 1024); + return remaining_data() / (1024 * 1024); } string16 CellularDataPlan::GetPlanExpiration() const { - return TimeFormat::TimeRemaining(plan_end_time - base::Time::Now()); + return TimeFormat::TimeRemaining(remaining_time()); } //////////////////////////////////////////////////////////////////////////////// @@ -582,38 +592,43 @@ void CellularNetwork::Clear() { prl_version_ = 0; } -bool CellularNetwork::is_gsm() const { - return network_technology_ != NETWORK_TECHNOLOGY_EVDO && - network_technology_ != NETWORK_TECHNOLOGY_1XRTT && - network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN; +const CellularDataPlan* CellularNetwork::GetSignificantDataPlan() const { + const CellularDataPlan* significant = NULL; + const CellularDataPlanVector& plans = GetDataPlans(); + for (CellularDataPlanVector::const_iterator iter = plans.begin(); + iter != plans.end(); + ++iter) { + // Set significant to the first plan or to first non metered base plan. + if (significant == NULL || + significant->plan_type == CELLULAR_DATA_PLAN_METERED_BASE) + significant = *iter; + } + return significant; } -CellularNetwork::DataLeft CellularNetwork::data_left() const { - if (data_plans_.empty()) +CellularNetwork::DataLeft CellularNetwork::GetDataLeft() const { + const CellularDataPlan* plan = GetSignificantDataPlan(); + if (!plan) return DATA_NORMAL; - const CellularDataPlan& plan(data_plans_[0]); - if (plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED) { - base::TimeDelta remaining = plan.plan_end_time - plan.update_time; + if (plan->plan_type == CELLULAR_DATA_PLAN_UNLIMITED) { + base::TimeDelta remaining = plan->plan_end_time - plan->update_time; if (remaining <= base::TimeDelta::FromSeconds(0)) return DATA_NONE; - else if (remaining <= - base::TimeDelta::FromSeconds(kCellularDataVeryLowSecs)) + if (remaining <= base::TimeDelta::FromSeconds(kCellularDataVeryLowSecs)) return DATA_VERY_LOW; - else if (remaining <= base::TimeDelta::FromSeconds(kCellularDataLowSecs)) + if (remaining <= base::TimeDelta::FromSeconds(kCellularDataLowSecs)) return DATA_LOW; - else - return DATA_NORMAL; - } else if (plan.plan_type == CELLULAR_DATA_PLAN_METERED_PAID || - plan.plan_type == CELLULAR_DATA_PLAN_METERED_BASE) { - int64 remaining = plan.plan_data_bytes - plan.data_bytes_used; + } else if (plan->plan_type == CELLULAR_DATA_PLAN_METERED_PAID || + plan->plan_type == CELLULAR_DATA_PLAN_METERED_BASE) { + int64 remaining = plan->plan_data_bytes - plan->data_bytes_used; if (remaining <= 0) return DATA_NONE; - else if (remaining <= kCellularDataVeryLowBytes) + if (remaining <= kCellularDataVeryLowBytes) return DATA_VERY_LOW; - else if (remaining <= kCellularDataLowBytes) + // For base plans, we do not care about low data. + if (remaining <= kCellularDataLowBytes && + plan->plan_type != CELLULAR_DATA_PLAN_METERED_BASE) return DATA_LOW; - else - return DATA_NORMAL; } return DATA_NORMAL; } @@ -1554,8 +1569,24 @@ class NetworkLibraryImpl : public NetworkLibrary { cellular1->set_name("Fake Cellular 1"); cellular1->set_strength(70); cellular1->set_connected(true); - cellular1->set_activation_state(ACTIVATION_STATE_PARTIALLY_ACTIVATED); + cellular1->set_activation_state(ACTIVATION_STATE_ACTIVATED); cellular1->set_payment_url(std::string("http://www.google.com")); + cellular1->set_network_technology(NETWORK_TECHNOLOGY_EVDO); + + CellularDataPlan* base_plan = new CellularDataPlan(); + base_plan->plan_name = "Base plan"; + base_plan->plan_type = CELLULAR_DATA_PLAN_METERED_BASE; + base_plan->plan_data_bytes = 100ll * 1024 * 1024; + base_plan->data_bytes_used = 75ll * 1024 * 1024; + cellular1->data_plans_.push_back(base_plan); + + CellularDataPlan* paid_plan = new CellularDataPlan(); + paid_plan->plan_name = "Paid plan"; + paid_plan->plan_type = CELLULAR_DATA_PLAN_METERED_PAID; + paid_plan->plan_data_bytes = 5ll * 1024 * 1024 * 1024; + paid_plan->data_bytes_used = 3ll * 1024 * 1024 * 1024; + cellular1->data_plans_.push_back(paid_plan); + cellular_networks_.push_back(cellular1); cellular_ = cellular1; diff --git a/chrome/browser/chromeos/cros/network_library.h b/chrome/browser/chromeos/cros/network_library.h index b0b993a..af122c5 100644 --- a/chrome/browser/chromeos/cros/network_library.h +++ b/chrome/browser/chromeos/cros/network_library.h @@ -12,6 +12,7 @@ #include "base/gtest_prod_util.h" #include "base/observer_list.h" #include "base/platform_thread.h" +#include "base/scoped_vector.h" #include "base/singleton.h" #include "base/string16.h" #include "base/timer.h" @@ -199,7 +200,9 @@ class CellularDataPlan { string16 GetPlanExpiration() const; // Formats plan usage info. string16 GetUsageInfo() const; + base::TimeDelta remaining_time() const; int64 remaining_minutes() const; + int64 remaining_data() const; int64 remaining_mbytes() const; std::string plan_name; CellularDataPlanType plan_type; @@ -210,7 +213,7 @@ class CellularDataPlan { int64 data_bytes_used; }; -typedef std::vector<CellularDataPlan> CellularDataPlanVector; +typedef ScopedVector<CellularDataPlan> CellularDataPlanVector; class CellularNetwork : public WirelessNetwork { public: @@ -254,8 +257,11 @@ class CellularNetwork : public WirelessNetwork { const std::string& hardware_revision() const { return hardware_revision_; } const std::string& last_update() const { return last_update_; } const unsigned int prl_version() const { return prl_version_; } - bool is_gsm() const; - DataLeft data_left() const; + bool is_gsm() const { + return network_technology_ != NETWORK_TECHNOLOGY_EVDO && + network_technology_ != NETWORK_TECHNOLOGY_1XRTT && + network_technology_ != NETWORK_TECHNOLOGY_UNKNOWN; + } // WirelessNetwork overrides. virtual void Clear(); @@ -265,12 +271,23 @@ class CellularNetwork : public WirelessNetwork { } void SetDataPlans(const CellularDataPlanList* data_plan_list) { - data_plans_.clear(); + data_plans_.reset(); for (size_t i = 0; i < data_plan_list->plans_size; i++) { const CellularDataPlanInfo* info(data_plan_list->GetCellularDataPlan(i)); - data_plans_.push_back(CellularDataPlan(*info)); + data_plans_.push_back(new CellularDataPlan(*info)); } } + + // This returns the significant data plan. If the user only has the + // base data plan, then return that. If there is a base and a paid data plan, + // then the significant one is the paid one. So return the paid plan. + // If there are no data plans, then this method returns NULL. + // This returns a pointer to a member of data_plans_, so if SetDataPlans() + // gets called, the result becomes invalid. + const CellularDataPlan* GetSignificantDataPlan() const; + + DataLeft GetDataLeft() const; + // Return a string representation of network technology. std::string GetNetworkTechnologyString() const; // Return a string representation of activation state. diff --git a/chrome/browser/chromeos/dom_ui/internet_options_handler.cc b/chrome/browser/chromeos/dom_ui/internet_options_handler.cc index 4b32ffd..a609c80 100644 --- a/chrome/browser/chromeos/dom_ui/internet_options_handler.cc +++ b/chrome/browser/chromeos/dom_ui/internet_options_handler.cc @@ -445,15 +445,14 @@ void InternetOptionsHandler::OnCellularDataPlanChanged( } DictionaryValue* InternetOptionsHandler::CellularDataPlanToDictionary( - const chromeos::CellularDataPlan& plan) { - + const chromeos::CellularDataPlan* plan) { DictionaryValue* plan_dict = new DictionaryValue(); - plan_dict->SetInteger("plan_type", plan.plan_type); - plan_dict->SetString("name", plan.plan_name); - plan_dict->SetString("planSummary", plan.GetPlanDesciption()); - plan_dict->SetString("dataRemaining", plan.GetDataRemainingDesciption()); - plan_dict->SetString("planExpires", plan.GetPlanExpiration()); - plan_dict->SetString("warning", plan.GetRemainingWarning()); + plan_dict->SetInteger("plan_type", plan->plan_type); + plan_dict->SetString("name", plan->plan_name); + plan_dict->SetString("planSummary", plan->GetPlanDesciption()); + plan_dict->SetString("dataRemaining", plan->GetDataRemainingDesciption()); + plan_dict->SetString("planExpires", plan->GetPlanExpiration()); + plan_dict->SetString("warning", plan->GetRemainingWarning()); return plan_dict; } diff --git a/chrome/browser/chromeos/dom_ui/internet_options_handler.h b/chrome/browser/chromeos/dom_ui/internet_options_handler.h index 5456391..124dc35 100644 --- a/chrome/browser/chromeos/dom_ui/internet_options_handler.h +++ b/chrome/browser/chromeos/dom_ui/internet_options_handler.h @@ -69,7 +69,7 @@ class InternetOptionsHandler // Converts CellularDataPlan structure into dictionary for JS. Formats // plan settings into human readable texts. DictionaryValue* CellularDataPlanToDictionary( - const chromeos::CellularDataPlan& plan); + const chromeos::CellularDataPlan* plan); // Creates the map of a network ListValue* GetNetwork(const std::string& service_path, const SkBitmap& icon, const std::string& name, bool connecting, bool connected, diff --git a/chrome/browser/chromeos/network_message_observer.cc b/chrome/browser/chromeos/network_message_observer.cc index 945b9e0..b7336f6 100644 --- a/chrome/browser/chromeos/network_message_observer.cc +++ b/chrome/browser/chromeos/network_message_observer.cc @@ -174,26 +174,29 @@ void NetworkMessageObserver::OnCellularDataPlanChanged(NetworkLibrary* obj) { const CellularNetwork* cellular = obj->cellular_network(); if (!cellular) return; - // Active plan is the first one in the list. Use empty one if none found. - const CellularDataPlanVector& plans = cellular->GetDataPlans(); - CellularDataPlan plan = plans.empty() ? CellularDataPlan() : plans[0]; + const CellularDataPlan* plan = cellular->GetSignificantDataPlan(); + std::string new_plan_name = plan ? plan->plan_name : ""; + CellularDataPlanType new_plan_type = plan ? plan->plan_type : + CELLULAR_DATA_PLAN_UNKNOWN; + // If connected cellular network changed, or data plan is different, then // it's a new network. Then hide all previous notifications. bool new_plan = false; if (cellular->service_path() != cellular_service_path_) { cellular_service_path_ = cellular->service_path(); new_plan = true; - } else if (plan.plan_name != cellular_data_plan_.plan_name || - plan.plan_type != cellular_data_plan_.plan_type) { + } else if (new_plan_name != cellular_data_plan_name_ || + new_plan_type != cellular_data_plan_type_) { new_plan = true; } - cellular_data_plan_ = plan; + cellular_data_plan_name_ = new_plan_name; + cellular_data_plan_type_ = new_plan_type; if (new_plan) { notification_low_data_.Hide(); notification_no_data_.Hide(); - if (plans.empty() && cellular->needs_new_plan()) { + if (!plan && cellular->needs_new_plan()) { notification_no_data_.set_title( l10n_util::GetStringFUTF16(IDS_NETWORK_NO_DATA_PLAN_TITLE, UTF8ToUTF16(cellular->service_name()))); @@ -205,29 +208,29 @@ void NetworkMessageObserver::OnCellularDataPlanChanged(NetworkLibrary* obj) { NewCallback(this, &NetworkMessageObserver::OpenMobileSetupPage), false, false); return; - } else if (plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED) { + } else if (cellular_data_plan_type_ == CELLULAR_DATA_PLAN_UNLIMITED) { notification_no_data_.set_title( l10n_util::GetStringFUTF16(IDS_NETWORK_DATA_EXPIRED_TITLE, - ASCIIToUTF16(plan.plan_name))); + ASCIIToUTF16(cellular_data_plan_name_))); notification_low_data_.set_title( l10n_util::GetStringFUTF16(IDS_NETWORK_NEARING_EXPIRATION_TITLE, - ASCIIToUTF16(plan.plan_name))); + ASCIIToUTF16(cellular_data_plan_name_))); } else { notification_no_data_.set_title( l10n_util::GetStringFUTF16(IDS_NETWORK_OUT_OF_DATA_TITLE, - ASCIIToUTF16(plan.plan_name))); + ASCIIToUTF16(cellular_data_plan_name_))); notification_low_data_.set_title( l10n_util::GetStringFUTF16(IDS_NETWORK_LOW_DATA_TITLE, - ASCIIToUTF16(plan.plan_name))); + ASCIIToUTF16(cellular_data_plan_name_))); } } - if (plan.plan_type == CELLULAR_DATA_PLAN_UNKNOWN) + if (cellular_data_plan_type_ == CELLULAR_DATA_PLAN_UNKNOWN) return; - if (cellular->data_left() == CellularNetwork::DATA_NONE) { + if (cellular->GetDataLeft() == CellularNetwork::DATA_NONE) { notification_low_data_.Hide(); - int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? + int message = cellular_data_plan_type_ == CELLULAR_DATA_PLAN_UNLIMITED ? IDS_NETWORK_MINUTES_REMAINING_MESSAGE : IDS_NETWORK_DATA_REMAINING_MESSAGE; notification_no_data_.Show(l10n_util::GetStringFUTF16( @@ -235,14 +238,14 @@ void NetworkMessageObserver::OnCellularDataPlanChanged(NetworkLibrary* obj) { l10n_util::GetStringUTF16(IDS_NETWORK_PURCHASE_MORE_MESSAGE), NewCallback(this, &NetworkMessageObserver::OpenMobileSetupPage), false, false); - } else if (cellular->data_left() == CellularNetwork::DATA_VERY_LOW) { + } else if (cellular->GetDataLeft() == CellularNetwork::DATA_VERY_LOW) { notification_no_data_.Hide(); - int message = plan.plan_type == CELLULAR_DATA_PLAN_UNLIMITED ? + int message = cellular_data_plan_type_ == CELLULAR_DATA_PLAN_UNLIMITED ? IDS_NETWORK_MINUTES_REMAINING_MESSAGE : IDS_NETWORK_DATA_REMAINING_MESSAGE; - int64 remaining = plan.plan_type == - CELLULAR_DATA_PLAN_UNLIMITED ? plan.remaining_minutes() : - plan.remaining_mbytes(); + int64 remaining = cellular_data_plan_type_ == CELLULAR_DATA_PLAN_UNLIMITED ? + plan->remaining_minutes() : + plan->remaining_mbytes(); notification_low_data_.Show(l10n_util::GetStringFUTF16( message, UTF8ToUTF16(base::Int64ToString(remaining))), l10n_util::GetStringUTF16(IDS_NETWORK_MORE_INFO_MESSAGE), diff --git a/chrome/browser/chromeos/network_message_observer.h b/chrome/browser/chromeos/network_message_observer.h index a6dd9fd..71bc1ab 100644 --- a/chrome/browser/chromeos/network_message_observer.h +++ b/chrome/browser/chromeos/network_message_observer.h @@ -49,8 +49,9 @@ class NetworkMessageObserver : public NetworkLibrary::NetworkManagerObserver, // Current connect celluar service path. std::string cellular_service_path_; - // Last cellular data plan data. - CellularDataPlan cellular_data_plan_; + // Last cellular data plan name and type. + std::string cellular_data_plan_name_; + CellularDataPlanType cellular_data_plan_type_; // Notification for connection errors SystemNotification notification_connection_error_; diff --git a/chrome/browser/chromeos/status/network_menu.cc b/chrome/browser/chromeos/status/network_menu.cc index 080c13f..ff2d255 100644 --- a/chrome/browser/chromeos/status/network_menu.cc +++ b/chrome/browser/chromeos/status/network_menu.cc @@ -400,7 +400,7 @@ SkBitmap NetworkMenu::IconForNetworkStrength(const CellularNetwork* cellular) { nextafter(static_cast<float>(kNumWifiImages), 0)); index = std::max(std::min(index, kNumWifiImages - 1), 0); const int* images = kBarsImages; - switch (cellular->data_left()) { + switch (cellular->GetDataLeft()) { case CellularNetwork::DATA_NONE: case CellularNetwork::DATA_VERY_LOW: images = kBarsImagesVLowData; @@ -438,7 +438,7 @@ SkBitmap NetworkMenu::BadgeForNetworkTechnology( int id = -1; if (cellular->network_technology() == NETWORK_TECHNOLOGY_EVDO) { - switch (cellular->data_left()) { + switch (cellular->GetDataLeft()) { case CellularNetwork::DATA_NONE: case CellularNetwork::DATA_VERY_LOW: id = IDR_STATUSBAR_NETWORK_3G_ERROR; @@ -451,7 +451,7 @@ SkBitmap NetworkMenu::BadgeForNetworkTechnology( break; } } else if (cellular->network_technology() == NETWORK_TECHNOLOGY_1XRTT) { - switch (cellular->data_left()) { + switch (cellular->GetDataLeft()) { case CellularNetwork::DATA_NONE: case CellularNetwork::DATA_VERY_LOW: id = IDR_STATUSBAR_NETWORK_1X_ERROR; @@ -651,10 +651,11 @@ void NetworkMenu::InitMenuItems() { label.clear(); if (active_cellular->needs_new_plan()) { label = l10n_util::GetStringUTF16(IDS_OPTIONS_SETTINGS_NO_PLAN_LABEL); - } else if (!active_cellular->GetDataPlans().empty()) { - const chromeos::CellularDataPlan& plan = - *active_cellular->GetDataPlans().begin(); - label = plan.GetUsageInfo(); + } else { + const chromeos::CellularDataPlan* plan = + active_cellular->GetSignificantDataPlan(); + if (plan) + label = plan->GetUsageInfo(); } if (label.length()) { menu_items_.push_back( diff --git a/chrome/browser/chromeos/status/network_menu_button.cc b/chrome/browser/chromeos/status/network_menu_button.cc index 2a422d3..63df514 100644 --- a/chrome/browser/chromeos/status/network_menu_button.cc +++ b/chrome/browser/chromeos/status/network_menu_button.cc @@ -181,7 +181,7 @@ void NetworkMenuButton::SetNetworkIcon(const Network* network) { } else if (network->type() == TYPE_CELLULAR) { const CellularNetwork* cellular = static_cast<const CellularNetwork*>(network); - if (cellular->data_left() == CellularNetwork::DATA_NONE) { + if (cellular->GetDataLeft() == CellularNetwork::DATA_NONE) { // If no data, then we show 0 bars. SetIcon(*rb.GetBitmapNamed(IDR_STATUSBAR_NETWORK_BARS0)); } else { |