Index: content/browser/android/date_time_chooser_android.cc |
diff --git a/content/browser/android/date_time_chooser_android.cc b/content/browser/android/date_time_chooser_android.cc |
index 87f02b9f72960de9e72c916663917a99b7cdc703..f6b50c9da4b6b8cf97e45bbf03fcc77713562bd3 100644 |
--- a/content/browser/android/date_time_chooser_android.cc |
+++ b/content/browser/android/date_time_chooser_android.cc |
@@ -4,17 +4,41 @@ |
#include "content/browser/android/date_time_chooser_android.h" |
+#include "base/android/jni_android.h" |
#include "base/android/jni_string.h" |
+#include "base/i18n/char_iterator.h" |
+#include "content/common/date_time_suggestion.h" |
#include "content/common/view_messages.h" |
#include "content/public/browser/android/content_view_core.h" |
#include "content/public/browser/render_view_host.h" |
#include "jni/DateTimeChooserAndroid_jni.h" |
+#include "third_party/icu/source/common/unicode/uchar.h" |
+#include "third_party/icu/source/common/unicode/unistr.h" |
using base::android::AttachCurrentThread; |
using base::android::ConvertJavaStringToUTF16; |
using base::android::ConvertUTF8ToJavaString; |
+using base::android::ConvertUTF16ToJavaString; |
+namespace { |
+ |
+string16 SanitizeSuggestionString(const string16& string) { |
+ string16 trimmed = string.substr(0, 255); |
+ icu::UnicodeString sanitized; |
+ base::i18n::UTF16CharIterator sanitized_iterator(&trimmed); |
+ while (!sanitized_iterator.end()) { |
+ UChar c = sanitized_iterator.get(); |
+ if (u_isprint(c)) |
+ sanitized.append(c); |
+ sanitized_iterator.Advance(); |
+ } |
+ return string16(sanitized.getBuffer(), |
+ static_cast<size_t>(sanitized.length())); |
+} |
+ |
+} // namespace |
+ |
namespace content { |
// DateTimeChooserAndroid implementation |
@@ -55,10 +79,29 @@ void DateTimeChooserAndroid::ShowDialog( |
double dialog_value, |
double min, |
double max, |
- double step) { |
+ double step, |
+ const std::vector<DateTimeSuggestion>& suggestions) { |
host_ = host; |
JNIEnv* env = AttachCurrentThread(); |
+ ScopedJavaLocalRef<jobjectArray> suggestions_array; |
+ |
+ if (suggestions.size() > 0) { |
+ suggestions_array = |
+ Java_DateTimeChooserAndroid_createSuggestionsArray(env, |
+ suggestions.size()); |
+ for (size_t i = 0; i < suggestions.size(); ++i) { |
+ const content::DateTimeSuggestion& suggestion = suggestions[i]; |
+ ScopedJavaLocalRef<jstring> localized_value = ConvertUTF16ToJavaString( |
+ env, SanitizeSuggestionString(suggestion.localized_value)); |
+ ScopedJavaLocalRef<jstring> label = ConvertUTF16ToJavaString( |
+ env, SanitizeSuggestionString(suggestion.label)); |
+ Java_DateTimeChooserAndroid_setDateTimeSuggestionAt(env, |
+ suggestions_array.obj(), i, |
+ suggestion.value, localized_value.obj(), label.obj()); |
+ } |
+ } |
+ |
j_date_time_chooser_.Reset(Java_DateTimeChooserAndroid_createDateTimeChooser( |
env, |
content->GetJavaObject().obj(), |
@@ -67,7 +110,8 @@ void DateTimeChooserAndroid::ShowDialog( |
dialog_value, |
min, |
max, |
- step)); |
+ step, |
+ suggestions_array.obj())); |
} |
// ---------------------------------------------------------------------------- |