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 3 // found in the LICENSE file. 4 5 #include "chrome/browser/ui/android/autofill/autofill_popup_view_android.h" 6 7 #include "base/android/jni_android.h" 8 #include "base/android/jni_string.h" 9 #include "chrome/browser/ui/android/window_android_helper.h" 10 #include "chrome/browser/ui/autofill/autofill_popup_controller.h" 11 #include "content/public/browser/android/content_view_core.h" 12 #include "jni/AutofillPopupGlue_jni.h" 13 #include "ui/android/view_android.h" 14 #include "ui/android/window_android.h" 15 #include "ui/gfx/rect.h" 16 17 namespace autofill { 18 19 AutofillPopupViewAndroid::AutofillPopupViewAndroid( 20 AutofillPopupController* controller) 21 : controller_(controller) {} 22 23 AutofillPopupViewAndroid::~AutofillPopupViewAndroid() {} 24 25 void AutofillPopupViewAndroid::Show() { 26 JNIEnv* env = base::android::AttachCurrentThread(); 27 ui::ViewAndroid* view_android = controller_->container_view(); 28 29 DCHECK(view_android); 30 31 java_object_.Reset(Java_AutofillPopupGlue_create( 32 env, 33 reinterpret_cast<jint>(this), 34 view_android->GetWindowAndroid()->GetJavaObject().obj(), 35 view_android->GetJavaObject().obj())); 36 37 UpdateBoundsAndRedrawPopup(); 38 } 39 40 void AutofillPopupViewAndroid::Hide() { 41 JNIEnv* env = base::android::AttachCurrentThread(); 42 Java_AutofillPopupGlue_hide(env, java_object_.obj()); 43 delete this; 44 } 45 46 void AutofillPopupViewAndroid::UpdateBoundsAndRedrawPopup() { 47 JNIEnv* env = base::android::AttachCurrentThread(); 48 Java_AutofillPopupGlue_setAnchorRect(env, 49 java_object_.obj(), 50 controller_->element_bounds().x(), 51 controller_->element_bounds().y(), 52 controller_->element_bounds().width(), 53 controller_->element_bounds().height()); 54 55 // We need an array of AutofillSuggestion. 56 size_t count = controller_->names().size(); 57 58 ScopedJavaLocalRef<jobjectArray> data_array = 59 Java_AutofillPopupGlue_createAutofillSuggestionArray(env, count); 60 61 for (size_t i = 0; i < count; ++i) { 62 ScopedJavaLocalRef<jstring> name = 63 base::android::ConvertUTF16ToJavaString(env, controller_->names()[i]); 64 ScopedJavaLocalRef<jstring> subtext = 65 base::android::ConvertUTF16ToJavaString(env, 66 controller_->subtexts()[i]); 67 Java_AutofillPopupGlue_addToAutofillSuggestionArray( 68 env, 69 data_array.obj(), 70 i, 71 name.obj(), 72 subtext.obj(), 73 controller_->identifiers()[i]); 74 } 75 76 Java_AutofillPopupGlue_show(env, java_object_.obj(), data_array.obj()); 77 } 78 79 void AutofillPopupViewAndroid::SuggestionSelected(JNIEnv* env, 80 jobject obj, 81 jint list_index) { 82 controller_->AcceptSuggestion(list_index); 83 } 84 85 void AutofillPopupViewAndroid::RequestHide(JNIEnv* env, jobject obj) { 86 controller_->Hide(); 87 } 88 89 void AutofillPopupViewAndroid::InvalidateRow(size_t) {} 90 91 // static 92 bool AutofillPopupViewAndroid::RegisterAutofillPopupViewAndroid(JNIEnv* env) { 93 return RegisterNativesImpl(env); 94 } 95 96 // static 97 AutofillPopupView* AutofillPopupView::Create( 98 AutofillPopupController* controller) { 99 return new AutofillPopupViewAndroid(controller); 100 } 101 102 } // namespace autofill 103