Index: content/browser/power_save_blocker_android.cc |
=================================================================== |
--- content/browser/power_save_blocker_android.cc (revision 201139) |
+++ content/browser/power_save_blocker_android.cc (working copy) |
@@ -4,25 +4,73 @@ |
#include "content/browser/power_save_blocker_impl.h" |
+#include "base/atomicops.h" |
#include "base/logging.h" |
+#include "content/browser/android/content_video_view.h" |
+#include "content/public/browser/browser_thread.h" |
namespace content { |
+namespace { |
+base::subtle::Atomic32 g_blocker_count = 0; |
+} // namespace |
class PowerSaveBlockerImpl::Delegate |
- : public base::RefCounted<PowerSaveBlockerImpl::Delegate> { |
+ : public base::RefCountedThreadSafe<PowerSaveBlockerImpl::Delegate> { |
+ public: |
+ Delegate(PowerSaveBlockerType type, const std::string& reason) |
+ : type_(type), reason_(reason) {} |
+ |
+ // Does the actual work to apply or remove the desired power save block. |
+ void ApplyBlock(); |
+ void RemoveBlock(); |
+ |
+ PowerSaveBlockerType type() { return type_; } |
+ |
private: |
- friend class base::RefCounted<Delegate>; |
+ friend class base::RefCountedThreadSafe<Delegate>; |
~Delegate() {} |
+ |
+ PowerSaveBlockerType type_; |
+ const std::string reason_; |
qinmin
2013/05/21 17:18:40
nit: you can remove this, not being used
|
+ |
+ DISALLOW_COPY_AND_ASSIGN(Delegate); |
}; |
+void PowerSaveBlockerImpl::Delegate::ApplyBlock() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ ContentVideoView::KeepScreenOn(true); |
+} |
+ |
+void PowerSaveBlockerImpl::Delegate::RemoveBlock() { |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
+ ContentVideoView::KeepScreenOn(false); |
+} |
+ |
PowerSaveBlockerImpl::PowerSaveBlockerImpl(PowerSaveBlockerType type, |
- const std::string& reason) { |
- // TODO(wangxianzhu): Implement it. |
+ const std::string& reason) |
+ : delegate_(new Delegate(type, reason)) { |
// This may be called on any thread. |
- NOTIMPLEMENTED(); |
+ if (type == kPowerSaveBlockPreventDisplaySleep) { |
+ int32 count = base::subtle::NoBarrier_AtomicIncrement(&g_blocker_count, 1); |
+ DCHECK_GT(count, 0); |
+ if (count == 1) { |
qinmin
2013/05/21 14:49:56
hmm...I think you don't need the global here. You
|
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&Delegate::ApplyBlock, delegate_)); |
+ } |
+ } |
} |
PowerSaveBlockerImpl::~PowerSaveBlockerImpl() { |
+ if (delegate_->type() == kPowerSaveBlockPreventDisplaySleep) { |
+ int32 count = base::subtle::NoBarrier_AtomicIncrement(&g_blocker_count, -1); |
+ DCHECK_GE(count, 0); |
+ if (count == 0) { |
+ BrowserThread::PostTask( |
+ BrowserThread::UI, FROM_HERE, |
+ base::Bind(&Delegate::RemoveBlock, delegate_)); |
+ } |
+ } |
} |
} // namespace content |