diff options
Diffstat (limited to 'device')
-rw-r--r-- | device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java | 45 | ||||
-rw-r--r-- | device/battery/battery_monitor.mojom | 11 | ||||
-rw-r--r-- | device/battery/battery_monitor_impl.cc | 31 | ||||
-rw-r--r-- | device/battery/battery_monitor_impl.h | 11 | ||||
-rw-r--r-- | device/battery/battery_status_service.h | 1 |
5 files changed, 74 insertions, 25 deletions
diff --git a/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java b/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java index e441589..364e21a 100644 --- a/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java +++ b/device/battery/android/java/src/org/chromium/device/battery/BatteryMonitorImpl.java @@ -7,7 +7,9 @@ package org.chromium.device.battery; import org.chromium.mojo.system.MojoException; import org.chromium.mojom.device.BatteryMonitor; import org.chromium.mojom.device.BatteryStatus; -import org.chromium.mojom.device.BatteryStatusObserver; + +import java.util.ArrayList; +import java.util.List; /** * Android implementation of the battery monitor service defined in @@ -16,12 +18,15 @@ import org.chromium.mojom.device.BatteryStatusObserver; public class BatteryMonitorImpl implements BatteryMonitor { // Factory that created this instance and notifies it about battery status changes. private final BatteryMonitorFactory mFactory; + private final List<QueryNextStatusResponse> mCallbacks; + private BatteryStatus mStatus; + private boolean mHasStatusToReport; private boolean mSubscribed; - private BatteryStatusObserver mClient; - public BatteryMonitorImpl(BatteryMonitorFactory batteryMonitorFactory) { mFactory = batteryMonitorFactory; + mCallbacks = new ArrayList<QueryNextStatusResponse>(); + mHasStatusToReport = false; mSubscribed = true; } @@ -33,11 +38,6 @@ public class BatteryMonitorImpl implements BatteryMonitor { } @Override - public void setClient(BatteryStatusObserver client) { - mClient = client; - } - - @Override public void close() { unsubscribe(); } @@ -47,12 +47,29 @@ public class BatteryMonitorImpl implements BatteryMonitor { unsubscribe(); } - /** - * Notifies the client passing the given battery status information. - */ + @Override + public void queryNextStatus(QueryNextStatusResponse callback) { + mCallbacks.add(callback); + + if (mHasStatusToReport) { + reportStatus(); + } + } + void didChange(BatteryStatus batteryStatus) { - if (mClient != null) { - mClient.didChange(batteryStatus); + mStatus = batteryStatus; + mHasStatusToReport = true; + + if (!mCallbacks.isEmpty()) { + reportStatus(); } - }; + } + + void reportStatus() { + for (QueryNextStatusResponse callback : mCallbacks) { + callback.call(mStatus); + } + mCallbacks.clear(); + mHasStatusToReport = false; + } } diff --git a/device/battery/battery_monitor.mojom b/device/battery/battery_monitor.mojom index 880685e..88a43d2 100644 --- a/device/battery/battery_monitor.mojom +++ b/device/battery/battery_monitor.mojom @@ -6,11 +6,10 @@ module device; import "device/battery/battery_status.mojom"; -// A BatteryMonitor will periodically call its client's DidChange method. -[Client=BatteryStatusObserver] interface BatteryMonitor { -}; - -interface BatteryStatusObserver { - DidChange(BatteryStatus status); + // Battery status is reported once it changes or immediately if this is the + // first call to QueryNextStatus on this instance. QueryNextStatus calls may + // be throttled by the service. Overlapping calls to QueryNextStatus are + // supported. + QueryNextStatus() => (BatteryStatus status); }; diff --git a/device/battery/battery_monitor_impl.cc b/device/battery/battery_monitor_impl.cc index dc07b62..62cbf60 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 diff --git a/device/battery/battery_monitor_impl.h b/device/battery/battery_monitor_impl.h index 7916b0d..49e85708 100644 --- a/device/battery/battery_monitor_impl.h +++ b/device/battery/battery_monitor_impl.h @@ -5,6 +5,8 @@ #ifndef DEVICE_BATTERY_BATTERY_MONITOR_IMPL_H_ #define DEVICE_BATTERY_BATTERY_MONITOR_IMPL_H_ +#include <vector> + #include "base/memory/scoped_ptr.h" #include "device/battery/battery_export.h" #include "device/battery/battery_monitor.mojom.h" @@ -19,14 +21,23 @@ class BatteryMonitorImpl : public BatteryMonitor { mojo::InterfaceRequest<BatteryMonitor> request); private: + typedef mojo::Callback<void(BatteryStatusPtr)> BatteryStatusCallback; + explicit BatteryMonitorImpl(mojo::InterfaceRequest<BatteryMonitor> request); ~BatteryMonitorImpl() override; + // BatteryMonitor methods: + void QueryNextStatus(const BatteryStatusCallback& callback) override; + void RegisterSubscription(); void DidChange(const BatteryStatus& battery_status); + void ReportStatus(); mojo::StrongBinding<BatteryMonitor> binding_; scoped_ptr<BatteryStatusService::BatteryUpdateSubscription> subscription_; + std::vector<BatteryStatusCallback> callbacks_; + BatteryStatus status_; + bool status_to_report_; DISALLOW_COPY_AND_ASSIGN(BatteryMonitorImpl); }; diff --git a/device/battery/battery_status_service.h b/device/battery/battery_status_service.h index fd52b6b..a4cfac7d 100644 --- a/device/battery/battery_status_service.h +++ b/device/battery/battery_status_service.h @@ -30,6 +30,7 @@ class DEVICE_BATTERY_EXPORT BatteryStatusService { // Adds a callback to receive battery status updates. Must be called on the // main thread. The callback itself will be called on the main thread as well. + // NOTE: The callback may be run before AddCallback returns! scoped_ptr<BatteryUpdateSubscription> AddCallback( const BatteryUpdateCallback& callback); |