Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Side by Side Diff: ui/base/clipboard/clipboard_android.cc

Issue 2766623003: Make Android Clipboard Keep Track of Last Modified Time (Closed)
Patch Set: ted's comments Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/base/clipboard/clipboard_android.h" 5 #include "ui/base/clipboard/clipboard_android.h"
6 6
7 #include <algorithm>
8
7 #include "base/android/context_utils.h" 9 #include "base/android/context_utils.h"
8 #include "base/android/jni_string.h" 10 #include "base/android/jni_string.h"
9 #include "base/lazy_instance.h" 11 #include "base/lazy_instance.h"
10 #include "base/stl_util.h" 12 #include "base/stl_util.h"
11 #include "base/strings/utf_string_conversions.h" 13 #include "base/strings/utf_string_conversions.h"
12 #include "base/synchronization/lock.h" 14 #include "base/synchronization/lock.h"
13 #include "jni/Clipboard_jni.h" 15 #include "jni/Clipboard_jni.h"
14 #include "third_party/skia/include/core/SkBitmap.h" 16 #include "third_party/skia/include/core/SkBitmap.h"
15 #include "ui/gfx/geometry/size.h" 17 #include "ui/gfx/geometry/size.h"
16 18
(...skipping 24 matching lines...) Expand all
41 const char kHTMLFormat[] = "html"; 43 const char kHTMLFormat[] = "html";
42 const char kRTFFormat[] = "rtf"; 44 const char kRTFFormat[] = "rtf";
43 const char kBitmapFormat[] = "bitmap"; 45 const char kBitmapFormat[] = "bitmap";
44 const char kWebKitSmartPasteFormat[] = "webkit_smart"; 46 const char kWebKitSmartPasteFormat[] = "webkit_smart";
45 const char kBookmarkFormat[] = "bookmark"; 47 const char kBookmarkFormat[] = "bookmark";
46 48
47 class ClipboardMap { 49 class ClipboardMap {
48 public: 50 public:
49 ClipboardMap(); 51 ClipboardMap();
50 std::string Get(const std::string& format); 52 std::string Get(const std::string& format);
53 int64_t GetLastClipboardChangeTimeInMillis();
51 bool HasFormat(const std::string& format); 54 bool HasFormat(const std::string& format);
52 void Set(const std::string& format, const std::string& data); 55 void Set(const std::string& format, const std::string& data);
53 void CommitToAndroidClipboard(); 56 void CommitToAndroidClipboard();
54 void Clear(); 57 void Clear();
55 58
56 private: 59 private:
57 void UpdateFromAndroidClipboard(); 60 void UpdateFromAndroidClipboard();
58 std::map<std::string, std::string> map_; 61 std::map<std::string, std::string> map_;
59 base::Lock lock_; 62 base::Lock lock_;
60 63
64 int64_t last_clipboard_change_time_ms_;
65
61 // Java class and methods for the Android ClipboardManager. 66 // Java class and methods for the Android ClipboardManager.
62 ScopedJavaGlobalRef<jobject> clipboard_manager_; 67 ScopedJavaGlobalRef<jobject> clipboard_manager_;
63 }; 68 };
64 base::LazyInstance<ClipboardMap>::Leaky g_map = LAZY_INSTANCE_INITIALIZER; 69 base::LazyInstance<ClipboardMap>::Leaky g_map = LAZY_INSTANCE_INITIALIZER;
65 70
66 ClipboardMap::ClipboardMap() { 71 ClipboardMap::ClipboardMap() {
67 clipboard_manager_.Reset(Java_Clipboard_create( 72 clipboard_manager_.Reset(Java_Clipboard_create(
68 AttachCurrentThread(), base::android::GetApplicationContext())); 73 AttachCurrentThread(), base::android::GetApplicationContext()));
69 DCHECK(clipboard_manager_.obj()); 74 DCHECK(clipboard_manager_.obj());
70 } 75 }
71 76
72 std::string ClipboardMap::Get(const std::string& format) { 77 std::string ClipboardMap::Get(const std::string& format) {
73 base::AutoLock lock(lock_); 78 base::AutoLock lock(lock_);
74 UpdateFromAndroidClipboard(); 79 UpdateFromAndroidClipboard();
75 std::map<std::string, std::string>::const_iterator it = map_.find(format); 80 std::map<std::string, std::string>::const_iterator it = map_.find(format);
76 return it == map_.end() ? std::string() : it->second; 81 return it == map_.end() ? std::string() : it->second;
77 } 82 }
78 83
84 int64_t ClipboardMap::GetLastClipboardChangeTimeInMillis() {
85 base::AutoLock lock(lock_);
86 UpdateFromAndroidClipboard();
87 return last_clipboard_change_time_ms_;
88 }
89
79 bool ClipboardMap::HasFormat(const std::string& format) { 90 bool ClipboardMap::HasFormat(const std::string& format) {
80 base::AutoLock lock(lock_); 91 base::AutoLock lock(lock_);
81 UpdateFromAndroidClipboard(); 92 UpdateFromAndroidClipboard();
82 return base::ContainsKey(map_, format); 93 return base::ContainsKey(map_, format);
83 } 94 }
84 95
85 void ClipboardMap::Set(const std::string& format, const std::string& data) { 96 void ClipboardMap::Set(const std::string& format, const std::string& data) {
86 base::AutoLock lock(lock_); 97 base::AutoLock lock(lock_);
87 map_[format] = data; 98 map_[format] = data;
88 } 99 }
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 164
154 std::map<std::string, std::string> android_clipboard_state; 165 std::map<std::string, std::string> android_clipboard_state;
155 166
156 ScopedJavaLocalRef<jstring> jtext = 167 ScopedJavaLocalRef<jstring> jtext =
157 Java_Clipboard_getCoercedText(env, clipboard_manager_); 168 Java_Clipboard_getCoercedText(env, clipboard_manager_);
158 ScopedJavaLocalRef<jstring> jhtml = 169 ScopedJavaLocalRef<jstring> jhtml =
159 Java_Clipboard_getHTMLText(env, clipboard_manager_); 170 Java_Clipboard_getHTMLText(env, clipboard_manager_);
160 171
161 AddMapEntry(env, &android_clipboard_state, kPlainTextFormat, jtext); 172 AddMapEntry(env, &android_clipboard_state, kPlainTextFormat, jtext);
162 AddMapEntry(env, &android_clipboard_state, kHTMLFormat, jhtml); 173 AddMapEntry(env, &android_clipboard_state, kHTMLFormat, jhtml);
174 last_clipboard_change_time_ms_ =
175 Java_Clipboard_getClipboardContentChangeTimeInMillis(env,
176 clipboard_manager_);
163 177
164 if (!MapIsSubset(android_clipboard_state, map_)) 178 if (!MapIsSubset(android_clipboard_state, map_))
165 android_clipboard_state.swap(map_); 179 android_clipboard_state.swap(map_);
166 } 180 }
167 181
168 } // namespace 182 } // namespace
169 183
170 // Clipboard::FormatType implementation. 184 // Clipboard::FormatType implementation.
171 Clipboard::FormatType::FormatType() { 185 Clipboard::FormatType::FormatType() {
172 } 186 }
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after
394 DCHECK(CalledOnValidThread()); 408 DCHECK(CalledOnValidThread());
395 NOTIMPLEMENTED(); 409 NOTIMPLEMENTED();
396 } 410 }
397 411
398 void ClipboardAndroid::ReadData(const Clipboard::FormatType& format, 412 void ClipboardAndroid::ReadData(const Clipboard::FormatType& format,
399 std::string* result) const { 413 std::string* result) const {
400 DCHECK(CalledOnValidThread()); 414 DCHECK(CalledOnValidThread());
401 *result = g_map.Get().Get(format.ToString()); 415 *result = g_map.Get().Get(format.ToString());
402 } 416 }
403 417
418 base::Time ClipboardAndroid::GetClipboardLastModifiedTime() const {
419 DCHECK(CalledOnValidThread());
420 return base::Time::FromJavaTime(
421 g_map.Get().GetLastClipboardChangeTimeInMillis());
422 }
423
404 // Main entry point used to write several values in the clipboard. 424 // Main entry point used to write several values in the clipboard.
405 void ClipboardAndroid::WriteObjects(ClipboardType type, 425 void ClipboardAndroid::WriteObjects(ClipboardType type,
406 const ObjectMap& objects) { 426 const ObjectMap& objects) {
407 DCHECK(CalledOnValidThread()); 427 DCHECK(CalledOnValidThread());
408 DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE); 428 DCHECK_EQ(type, CLIPBOARD_TYPE_COPY_PASTE);
409 g_map.Get().Clear(); 429 g_map.Get().Clear();
410 430
411 for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end(); 431 for (ObjectMap::const_iterator iter = objects.begin(); iter != objects.end();
412 ++iter) { 432 ++iter) {
413 DispatchObject(static_cast<ObjectType>(iter->first), iter->second); 433 DispatchObject(static_cast<ObjectType>(iter->first), iter->second);
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 g_map.Get().Set(kBitmapFormat, packed); 480 g_map.Get().Set(kBitmapFormat, packed);
461 } 481 }
462 482
463 void ClipboardAndroid::WriteData(const Clipboard::FormatType& format, 483 void ClipboardAndroid::WriteData(const Clipboard::FormatType& format,
464 const char* data_data, 484 const char* data_data,
465 size_t data_len) { 485 size_t data_len) {
466 g_map.Get().Set(format.ToString(), std::string(data_data, data_len)); 486 g_map.Get().Set(format.ToString(), std::string(data_data, data_len));
467 } 487 }
468 488
469 } // namespace ui 489 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698