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/AutofillPopupBridge_jni.h"
13#include "ui/base/android/view_android.h"
14#include "ui/base/android/window_android.h"
15#include "ui/gfx/rect.h"
16
17namespace autofill {
18
19AutofillPopupViewAndroid::AutofillPopupViewAndroid(
20    AutofillPopupController* controller)
21    : controller_(controller) {}
22
23AutofillPopupViewAndroid::~AutofillPopupViewAndroid() {}
24
25void 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_AutofillPopupBridge_create(
32      env,
33      reinterpret_cast<intptr_t>(this),
34      view_android->GetWindowAndroid()->GetJavaObject().obj(),
35      view_android->GetJavaObject().obj()));
36
37  UpdateBoundsAndRedrawPopup();
38}
39
40void AutofillPopupViewAndroid::Hide() {
41  controller_ = NULL;
42  JNIEnv* env = base::android::AttachCurrentThread();
43  Java_AutofillPopupBridge_hide(env, java_object_.obj());
44}
45
46void AutofillPopupViewAndroid::UpdateBoundsAndRedrawPopup() {
47  JNIEnv* env = base::android::AttachCurrentThread();
48  Java_AutofillPopupBridge_setAnchorRect(
49      env,
50      java_object_.obj(),
51      controller_->element_bounds().x(),
52      controller_->element_bounds().y(),
53      controller_->element_bounds().width(),
54      controller_->element_bounds().height());
55
56  // We need an array of AutofillSuggestion.
57  size_t count = controller_->names().size();
58
59  ScopedJavaLocalRef<jobjectArray> data_array =
60      Java_AutofillPopupBridge_createAutofillSuggestionArray(env, count);
61
62  for (size_t i = 0; i < count; ++i) {
63    ScopedJavaLocalRef<jstring> name =
64        base::android::ConvertUTF16ToJavaString(env, controller_->names()[i]);
65    ScopedJavaLocalRef<jstring> subtext =
66        base::android::ConvertUTF16ToJavaString(env,
67                                                controller_->subtexts()[i]);
68    Java_AutofillPopupBridge_addToAutofillSuggestionArray(
69        env,
70        data_array.obj(),
71        i,
72        name.obj(),
73        subtext.obj(),
74        controller_->identifiers()[i]);
75  }
76
77  Java_AutofillPopupBridge_show(
78      env, java_object_.obj(), data_array.obj(), controller_->IsRTL());
79}
80
81void AutofillPopupViewAndroid::SuggestionSelected(JNIEnv* env,
82                                                  jobject obj,
83                                                  jint list_index) {
84  controller_->AcceptSuggestion(list_index);
85}
86
87void AutofillPopupViewAndroid::PopupDismissed(JNIEnv* env, jobject obj) {
88  if (controller_)
89    controller_->ViewDestroyed();
90
91  delete this;
92}
93
94void AutofillPopupViewAndroid::InvalidateRow(size_t) {}
95
96// static
97bool AutofillPopupViewAndroid::RegisterAutofillPopupViewAndroid(JNIEnv* env) {
98  return RegisterNativesImpl(env);
99}
100
101// static
102AutofillPopupView* AutofillPopupView::Create(
103    AutofillPopupController* controller) {
104  return new AutofillPopupViewAndroid(controller);
105}
106
107}  // namespace autofill
108