Index: device/battery/battery_monitor_impl.cc |
diff --git a/device/battery/battery_monitor_impl.cc b/device/battery/battery_monitor_impl.cc |
index dc07b62df1a8a2485016c3a059ee0be294c76c51..62cbf60011d4d1c12e890b8814bef074b0c08510 100644 |
--- a/device/battery/battery_monitor_impl.cc |
+++ b/device/battery/battery_monitor_impl.cc |
@@ -17,20 +17,41 @@ void BatteryMonitorImpl::Create( |
BatteryMonitorImpl::BatteryMonitorImpl( |
mojo::InterfaceRequest<BatteryMonitor> request) |
: binding_(this, request.Pass()), |
- subscription_(BatteryStatusService::GetInstance()->AddCallback( |
- base::Bind(&BatteryMonitorImpl::DidChange, base::Unretained(this)))) { |
+ status_to_report_(false) { |
+ // NOTE: DidChange may be called before AddCallback returns. This is done to |
+ // report current status. |
+ subscription_ = BatteryStatusService::GetInstance()->AddCallback( |
+ base::Bind(&BatteryMonitorImpl::DidChange, base::Unretained(this))); |
} |
BatteryMonitorImpl::~BatteryMonitorImpl() { |
} |
+void BatteryMonitorImpl::QueryNextStatus( |
+ const BatteryStatusCallback& callback) { |
+ callbacks_.push_back(callback); |
+ |
+ if (status_to_report_) |
+ ReportStatus(); |
+} |
+ |
void BatteryMonitorImpl::RegisterSubscription() { |
} |
void BatteryMonitorImpl::DidChange(const BatteryStatus& battery_status) { |
- BatteryStatusPtr status(BatteryStatus::New()); |
- *status = battery_status; |
- binding_.client()->DidChange(status.Pass()); |
+ status_ = battery_status; |
+ status_to_report_ = true; |
+ |
+ if (!callbacks_.empty()) |
+ ReportStatus(); |
+} |
+ |
+void BatteryMonitorImpl::ReportStatus() { |
+ for (const auto& callback : callbacks_) |
+ callback.Run(status_.Clone()); |
+ callbacks_.clear(); |
+ |
+ status_to_report_ = false; |
} |
} // namespace device |