Chromium Code Reviews| Index: ui/gfx/android/device_display_info.cc |
| diff --git a/ui/gfx/android/device_display_info.cc b/ui/gfx/android/device_display_info.cc |
| index 16fd2acb1d8a280f67c787dce12ddab15645c650..f93446fc33d8bb2ee7d5e92b9be81722fb24142d 100644 |
| --- a/ui/gfx/android/device_display_info.cc |
| +++ b/ui/gfx/android/device_display_info.cc |
| @@ -14,52 +14,139 @@ using base::android::ScopedJavaLocalRef; |
| namespace gfx { |
| + |
|
Yaron
2013/10/10 11:52:46
nit: remove
|
| DeviceDisplayInfo::DeviceDisplayInfo() { |
| - JNIEnv* env = AttachCurrentThread(); |
| - j_device_info_.Reset(Java_DeviceDisplayInfo_create(env, |
| - base::android::GetApplicationContext())); |
| } |
| DeviceDisplayInfo::~DeviceDisplayInfo() { |
| } |
| int DeviceDisplayInfo::GetDisplayHeight() { |
| - JNIEnv* env = AttachCurrentThread(); |
| - jint result = |
| - Java_DeviceDisplayInfo_getDisplayHeight(env, j_device_info_.obj()); |
| - return static_cast<int>(result); |
| + return SharedDisplayInfo::GetDisplayHeight(); |
| } |
| int DeviceDisplayInfo::GetDisplayWidth() { |
| - JNIEnv* env = AttachCurrentThread(); |
| - jint result = |
| - Java_DeviceDisplayInfo_getDisplayWidth(env, j_device_info_.obj()); |
| - return static_cast<int>(result); |
| + return SharedDisplayInfo::GetDisplayWidth(); |
| } |
| int DeviceDisplayInfo::GetBitsPerPixel() { |
| - JNIEnv* env = AttachCurrentThread(); |
| - jint result = |
| - Java_DeviceDisplayInfo_getBitsPerPixel(env, j_device_info_.obj()); |
| - return static_cast<int>(result); |
| + return SharedDisplayInfo::GetBitsPerPixel(); |
| } |
| int DeviceDisplayInfo::GetBitsPerComponent() { |
| - JNIEnv* env = AttachCurrentThread(); |
| - jint result = |
| - Java_DeviceDisplayInfo_getBitsPerComponent(env, j_device_info_.obj()); |
| - return static_cast<int>(result); |
| + return SharedDisplayInfo::GetBitsPerComponent(); |
| } |
| double DeviceDisplayInfo::GetDIPScale() { |
| + return SharedDisplayInfo::GetDIPScale(); |
| +} |
| + |
| +static pthread_rwlock_t rwlock_ = PTHREAD_RWLOCK_INITIALIZER; |
| + |
| +struct ScopedReadLock { |
|
Yaron
2013/10/10 11:52:46
Use the locking primitives from base if you still
ostap
2013/10/10 16:29:50
I'm sorry, I didn't find read/write lock implement
|
| + ScopedReadLock() { |
| + pthread_rwlock_rdlock(&rwlock_); |
| + } |
| + |
| + ~ScopedReadLock() { |
| + pthread_rwlock_unlock(&rwlock_); |
| + } |
| +}; |
| + |
| +struct ScopedWriteLock { |
| + ScopedWriteLock() { |
| + pthread_rwlock_wrlock(&rwlock_); |
| + } |
| + |
| + ~ScopedWriteLock() { |
| + pthread_rwlock_unlock(&rwlock_); |
| + } |
| +}; |
| + |
| +scoped_ptr<SharedDisplayInfo> SharedDisplayInfo::instance_; |
|
Yaron
2013/10/10 11:52:46
Use base::LazyInstance
|
| + |
| +int SharedDisplayInfo::GetDisplayHeight() { |
| + SharedDisplayInfo* instance = Instance(); |
| + ScopedReadLock read_lock; |
| + return instance->display_height_; |
| +} |
| + |
| +int SharedDisplayInfo::GetDisplayWidth() { |
| + SharedDisplayInfo* instance = Instance(); |
| + ScopedReadLock read_lock; |
| + return instance->display_width_; |
| +} |
| + |
| +int SharedDisplayInfo::GetBitsPerPixel() { |
| + SharedDisplayInfo* instance = Instance(); |
| + ScopedReadLock read_lock; |
| + return instance->bits_per_pixel_; |
| +} |
| + |
| +int SharedDisplayInfo::GetBitsPerComponent() { |
| + SharedDisplayInfo* instance = Instance(); |
| + ScopedReadLock read_lock; |
| + return instance->bits_per_component_; |
| +} |
| + |
| +double SharedDisplayInfo::GetDIPScale() { |
| + SharedDisplayInfo* instance = Instance(); |
| + ScopedReadLock read_lock; |
| + return instance->dip_scale_; |
| +} |
| + |
| +void UpdateSharedDisplayInfo( |
| + JNIEnv* env, jobject obj, jint display_height, |
|
Yaron
2013/10/10 11:52:46
In C++, these should be one per line per style gui
|
| + jint display_width, jint bits_per_pixel, |
| + jint bits_per_component, jdouble dip_scale) { |
| + SharedDisplayInfo::UpdateDisplayInfo(env, obj, display_height, |
| + display_width, bits_per_pixel, bits_per_component, dip_scale); |
| +} |
| + |
| +void SharedDisplayInfo::UpdateDisplayInfo(JNIEnv*, jobject, jint display_height, |
|
Yaron
2013/10/10 11:52:46
Same as above
|
| + jint display_width, jint bits_per_pixel, jint bits_per_component, |
| + jdouble dip_scale) { |
| + SharedDisplayInfo* instance = Instance(); |
| + |
| + ScopedWriteLock write_lock; |
| + |
| + instance->display_height_ = static_cast<int>(display_height); |
| + instance->display_width_ = static_cast<int>(display_width); |
| + instance->bits_per_pixel_ = static_cast<int>(bits_per_pixel); |
| + instance->bits_per_component_ = static_cast<int>(bits_per_component); |
| + instance->dip_scale_ = static_cast<int>(dip_scale); |
|
Yaron
2013/10/10 11:52:46
dip_scale_ is a double
|
| +} |
| + |
| +SharedDisplayInfo* SharedDisplayInfo::Instance() { |
| + if (instance_) return instance_.get(); |
| + |
| + { |
| + // Have to scope this block to avoid lock conflict |
| + // with UpdateDisplayInfo method. |
| + ScopedWriteLock write_lock; |
| + if (!instance_) { |
| + instance_.reset(new SharedDisplayInfo()); |
| + } |
| + } |
| + |
| + instance_->RegisterListener(); |
| + |
| + return instance_.get(); |
| +} |
| + |
| +SharedDisplayInfo::SharedDisplayInfo() { |
| + JNIEnv* env = AttachCurrentThread(); |
| + j_device_info_.Reset(Java_DeviceDisplayInfo_create(env, |
|
Yaron
2013/10/10 11:52:46
It's not clear to me why you need this anymore. L
ostap
2013/10/10 15:34:40
On 2013/10/10 11:52:46, Yaron wrote:
The problem
|
| + base::android::GetApplicationContext())); |
| +} |
| + |
| +void SharedDisplayInfo::RegisterListener() { |
| JNIEnv* env = AttachCurrentThread(); |
| - jdouble result = |
| - Java_DeviceDisplayInfo_getDIPScale(env, j_device_info_.obj()); |
| - return static_cast<double>(result); |
| + |
| + Java_DeviceDisplayInfo_registerListener(env, j_device_info_.obj()); |
| } |
| -// static |
| -bool DeviceDisplayInfo::RegisterDeviceDisplayInfo(JNIEnv* env) { |
| +bool SharedDisplayInfo::RegisterSharedDeviceDisplayInfo(JNIEnv* env) { |
| return RegisterNativesImpl(env); |
| } |