1 // Copyright (c) 2013 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 #include "content/browser/android/date_time_chooser_android.h" 6 7 #include "base/android/jni_string.h" 8 #include "content/common/view_messages.h" 9 #include "content/public/browser/android/content_view_core.h" 10 #include "content/public/browser/render_view_host_observer.h" 11 #include "jni/DateTimeChooserAndroid_jni.h" 12 13 using base::android::AttachCurrentThread; 14 using base::android::ConvertJavaStringToUTF16; 15 using base::android::ConvertUTF8ToJavaString; 16 17 18 namespace content { 19 20 // Updates date/time via IPC to the RenderView 21 class DateTimeChooserAndroid::DateTimeIPCSender : 22 public RenderViewHostObserver { 23 public: 24 explicit DateTimeIPCSender(RenderViewHost* sender); 25 virtual ~DateTimeIPCSender() {} 26 void ReplaceDateTime(int dialog_type, 27 int year, int month, int day, int hour, int minute, int second, int week); 28 void CancelDialog(); 29 30 private: 31 DISALLOW_COPY_AND_ASSIGN(DateTimeIPCSender); 32 }; 33 34 DateTimeChooserAndroid::DateTimeIPCSender::DateTimeIPCSender( 35 RenderViewHost* sender) 36 : RenderViewHostObserver(sender) { 37 } 38 39 void DateTimeChooserAndroid::DateTimeIPCSender::ReplaceDateTime( 40 int dialog_type, 41 int year, int month, int day, int hour, int minute, int second, int week) { 42 ViewHostMsg_DateTimeDialogValue_Params value; 43 value.year = year; 44 value.month = month; 45 value.day = day; 46 value.hour = hour; 47 value.minute = minute; 48 value.second = second; 49 value.week = week; 50 value.dialog_type = dialog_type; 51 Send(new ViewMsg_ReplaceDateTime(routing_id(), value)); 52 } 53 54 void DateTimeChooserAndroid::DateTimeIPCSender::CancelDialog() { 55 Send(new ViewMsg_CancelDateTimeDialog(routing_id())); 56 } 57 58 // DateTimeChooserAndroid implementation 59 DateTimeChooserAndroid::DateTimeChooserAndroid() 60 : sender_(NULL) { 61 } 62 63 DateTimeChooserAndroid::~DateTimeChooserAndroid() { 64 } 65 66 // static 67 void DateTimeChooserAndroid::InitializeDateInputTypes( 68 int text_input_type_date, int text_input_type_date_time, 69 int text_input_type_date_time_local, int text_input_type_month, 70 int text_input_type_time, int text_input_type_week) { 71 JNIEnv* env = AttachCurrentThread(); 72 Java_DateTimeChooserAndroid_initializeDateInputTypes( 73 env, 74 text_input_type_date, text_input_type_date_time, 75 text_input_type_date_time_local, text_input_type_month, 76 text_input_type_time, text_input_type_week); 77 } 78 79 void DateTimeChooserAndroid::ReplaceDateTime( 80 JNIEnv* env, jobject, int dialog_type, 81 int year, int month, int day, int hour, int minute, int second, int week) { 82 sender_->ReplaceDateTime( 83 dialog_type, year, month, day, hour, minute, second, week); 84 } 85 86 void DateTimeChooserAndroid::CancelDialog(JNIEnv* env, jobject) { 87 sender_->CancelDialog(); 88 } 89 90 void DateTimeChooserAndroid::ShowDialog( 91 ContentViewCore* content, RenderViewHost* sender, 92 int type, int year, int month, int day, 93 int hour, int minute, int second, int week, double min, double max) { 94 if (sender_) 95 delete sender_; 96 sender_ = new DateTimeIPCSender(sender); 97 98 JNIEnv* env = AttachCurrentThread(); 99 j_date_time_chooser_.Reset(Java_DateTimeChooserAndroid_createDateTimeChooser( 100 env, content->GetJavaObject().obj(), 101 reinterpret_cast<intptr_t>(this), 102 type, year, month, day, hour, minute, second, week, min, max)); 103 } 104 105 // ---------------------------------------------------------------------------- 106 // Native JNI methods 107 // ---------------------------------------------------------------------------- 108 bool RegisterDateTimeChooserAndroid(JNIEnv* env) { 109 bool registered = RegisterNativesImpl(env); 110 if (registered) 111 DateTimeChooserAndroid::InitializeDateInputTypes( 112 ui::TEXT_INPUT_TYPE_DATE, 113 ui::TEXT_INPUT_TYPE_DATE_TIME, 114 ui::TEXT_INPUT_TYPE_DATE_TIME_LOCAL, 115 ui::TEXT_INPUT_TYPE_MONTH, 116 ui::TEXT_INPUT_TYPE_TIME, 117 ui::TEXT_INPUT_TYPE_WEEK); 118 return registered; 119 } 120 121 } // namespace content 122