summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/cros/network_library.cc81
-rw-r--r--chrome/browser/chromeos/cros/network_library.h27
-rw-r--r--chrome/browser/chromeos/dom_ui/internet_options_handler.cc15
-rw-r--r--chrome/browser/chromeos/dom_ui/internet_options_handler.h2
-rw-r--r--chrome/browser/chromeos/network_message_observer.cc43
-rw-r--r--chrome/browser/chromeos/network_message_observer.h5
-rw-r--r--chrome/browser/chromeos/status/network_menu.cc15
-rw-r--r--chrome/browser/chromeos/status/network_menu_button.cc2
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 {