1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_H_
6 #define UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_H_
7 
8 #include "ui/base/clipboard/clipboard.h"
9 
10 #include <jni.h>
11 #include <stddef.h>
12 #include <stdint.h>
13 
14 #include "base/android/scoped_java_ref.h"
15 #include "base/callback_forward.h"
16 #include "base/component_export.h"
17 #include "base/macros.h"
18 #include "base/time/time.h"
19 
20 namespace ui {
21 
22 class ClipboardAndroid : public Clipboard {
23  public:
24   // Callback called whenever the clipboard is modified.  The parameter
25   // represents the time of the modification.
26   using ModifiedCallback = base::RepeatingCallback<void(base::Time)>;
27 
28   // Called by Java when the Java Clipboard is notified that the clipboard has
29   // changed.
30   void OnPrimaryClipChanged(JNIEnv* env,
31                             const base::android::JavaParamRef<jobject>& obj);
32 
33   // Called by Java when the Java Clipboard is notified that the window focus
34   // has changed. Since Chrome will not receive OnPrimaryClipChanged call from
35   // Android if Chrome is in background,Clipboard handler needs to check the
36   // content of clipboard didn't change, when Chrome is back in foreground.
37   void OnPrimaryClipTimestampInvalidated(
38       JNIEnv* env,
39       const base::android::JavaParamRef<jobject>& obj,
40       const jlong j_timestamp_ms);
41 
42   // Called by Java side.
43   int64_t GetLastModifiedTimeToJavaTime(JNIEnv* env);
44 
45   // Sets the callback called whenever the clipboard is modified.
46   COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
47   void SetModifiedCallback(ModifiedCallback cb);
48 
49   // Sets the last modified time without calling the above callback.
50   COMPONENT_EXPORT(UI_BASE_CLIPBOARD)
51   void SetLastModifiedTimeWithoutRunningCallback(base::Time time);
52 
53  private:
54   friend class Clipboard;
55 
56   ClipboardAndroid();
57   ~ClipboardAndroid() override;
58 
59   // Clipboard overrides:
60   void OnPreShutdown() override;
61   uint64_t GetSequenceNumber(ClipboardBuffer buffer) const override;
62   bool IsFormatAvailable(const ClipboardFormatType& format,
63                          ClipboardBuffer buffer,
64                          const DataTransferEndpoint* data_dst) const override;
65   void Clear(ClipboardBuffer buffer) override;
66   void ReadAvailableTypes(ClipboardBuffer buffer,
67                           const DataTransferEndpoint* data_dst,
68                           std::vector<base::string16>* types) const override;
69   std::vector<base::string16> ReadAvailablePlatformSpecificFormatNames(
70       ClipboardBuffer buffer,
71       const DataTransferEndpoint* data_dst) const override;
72   void ReadText(ClipboardBuffer buffer,
73                 const DataTransferEndpoint* data_dst,
74                 base::string16* result) const override;
75   void ReadAsciiText(ClipboardBuffer buffer,
76                      const DataTransferEndpoint* data_dst,
77                      std::string* result) const override;
78   void ReadHTML(ClipboardBuffer buffer,
79                 const DataTransferEndpoint* data_dst,
80                 base::string16* markup,
81                 std::string* src_url,
82                 uint32_t* fragment_start,
83                 uint32_t* fragment_end) const override;
84   void ReadSvg(ClipboardBuffer buffer,
85                const DataTransferEndpoint* data_dst,
86                base::string16* result) const override;
87   void ReadRTF(ClipboardBuffer buffer,
88                const DataTransferEndpoint* data_dst,
89                std::string* result) const override;
90   void ReadImage(ClipboardBuffer buffer,
91                  const DataTransferEndpoint* data_dst,
92                  ReadImageCallback callback) const override;
93   void ReadCustomData(ClipboardBuffer buffer,
94                       const base::string16& type,
95                       const DataTransferEndpoint* data_dst,
96                       base::string16* result) const override;
97   void ReadBookmark(const DataTransferEndpoint* data_dst,
98                     base::string16* title,
99 
100                     std::string* url) const override;
101   void ReadData(const ClipboardFormatType& format,
102                 const DataTransferEndpoint* data_dst,
103                 std::string* result) const override;
104   base::Time GetLastModifiedTime() const override;
105   void ClearLastModifiedTime() override;
106   void WritePortableRepresentations(
107       ClipboardBuffer buffer,
108       const ObjectMap& objects,
109       std::unique_ptr<DataTransferEndpoint> data_src) override;
110   void WritePlatformRepresentations(
111       ClipboardBuffer buffer,
112       std::vector<Clipboard::PlatformRepresentation> platform_representations,
113       std::unique_ptr<DataTransferEndpoint> data_src) override;
114   void WriteText(const char* text_data, size_t text_len) override;
115   void WriteHTML(const char* markup_data,
116                  size_t markup_len,
117                  const char* url_data,
118                  size_t url_len) override;
119   void WriteSvg(const char* markup_data, size_t markup_len) override;
120   void WriteRTF(const char* rtf_data, size_t data_len) override;
121   void WriteBookmark(const char* title_data,
122                      size_t title_len,
123                      const char* url_data,
124                      size_t url_len) override;
125   void WriteWebSmartPaste() override;
126   void WriteBitmap(const SkBitmap& bitmap) override;
127   void WriteData(const ClipboardFormatType& format,
128                  const char* data_data,
129                  size_t data_len) override;
130 
131   DISALLOW_COPY_AND_ASSIGN(ClipboardAndroid);
132 };
133 
134 }  // namespace ui
135 
136 #endif  // UI_BASE_CLIPBOARD_CLIPBOARD_ANDROID_H_
137