diff options
Diffstat (limited to 'content/browser/android/date_time_chooser_android.cc')
-rw-r--r-- | content/browser/android/date_time_chooser_android.cc | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/content/browser/android/date_time_chooser_android.cc b/content/browser/android/date_time_chooser_android.cc index 87f02b9f..f6b50c9 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())); } // ---------------------------------------------------------------------------- |