| Index: chrome/browser/ui/android/autofill/autofill_dialog_view_android.cc
|
| diff --git a/chrome/browser/ui/android/autofill/autofill_dialog_view_android.cc b/chrome/browser/ui/android/autofill/autofill_dialog_view_android.cc
|
| deleted file mode 100644
|
| index 22a7dfc0c035aa9b8734392533eed948daafec0c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/android/autofill/autofill_dialog_view_android.cc
|
| +++ /dev/null
|
| @@ -1,865 +0,0 @@
|
| -// Copyright (c) 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/ui/android/autofill/autofill_dialog_view_android.h"
|
| -
|
| -#include "base/android/jni_android.h"
|
| -#include "base/android/jni_array.h"
|
| -#include "base/android/jni_string.h"
|
| -#include "base/android/scoped_java_ref.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/browser_process.h"
|
| -#include "chrome/browser/ui/android/window_android_helper.h"
|
| -#include "chrome/browser/ui/autofill/data_model_wrapper.h"
|
| -#include "components/autofill/core/browser/autofill_profile.h"
|
| -#include "components/autofill/core/browser/autofill_type.h"
|
| -#include "components/autofill/core/browser/credit_card.h"
|
| -#include "content/public/browser/web_contents.h"
|
| -#include "grit/generated_resources.h"
|
| -#include "jni/AutofillDialogGlue_jni.h"
|
| -#include "ui/android/window_android.h"
|
| -#include "ui/base/l10n/l10n_util.h"
|
| -#include "ui/base/models/combobox_model.h"
|
| -#include "ui/base/models/menu_model.h"
|
| -#include "ui/gfx/android/java_bitmap.h"
|
| -#include "ui/gfx/rect.h"
|
| -
|
| -namespace autofill {
|
| -
|
| -// AutofillDialogView ----------------------------------------------------------
|
| -
|
| -// static
|
| -AutofillDialogView* AutofillDialogView::Create(
|
| - AutofillDialogController* controller) {
|
| - return new AutofillDialogViewAndroid(controller);
|
| -}
|
| -
|
| -// AutofillDialogView ----------------------------------------------------------
|
| -
|
| -AutofillDialogViewAndroid::AutofillDialogViewAndroid(
|
| - AutofillDialogController* controller)
|
| - : controller_(controller) {}
|
| -
|
| -AutofillDialogViewAndroid::~AutofillDialogViewAndroid() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - Java_AutofillDialogGlue_onDestroy(env, java_object_.obj());
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::Show() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - java_object_.Reset(Java_AutofillDialogGlue_create(
|
| - env,
|
| - reinterpret_cast<jint>(this),
|
| - WindowAndroidHelper::FromWebContents(controller_->web_contents())->
|
| - GetWindowAndroid()->GetJavaObject().obj()));
|
| - ModelChanged();
|
| - UpdateNotificationArea();
|
| - UpdateAccountChooser();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::Hide() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - // This will call DialogDismissed(), and that could cause |this| to be
|
| - // deleted by the |controller|.
|
| - Java_AutofillDialogGlue_dismissDialog(env, java_object_.obj());
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateNotificationArea() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - std::vector<DialogNotification> notifications =
|
| - controller_->CurrentNotifications();
|
| - const size_t count = notifications.size();
|
| - ScopedJavaLocalRef<jobjectArray> notification_array =
|
| - Java_AutofillDialogGlue_createAutofillDialogNotificationArray(
|
| - env, count);
|
| - for (size_t i = 0; i < count; ++i) {
|
| - ScopedJavaLocalRef<jstring> text =
|
| - base::android::ConvertUTF16ToJavaString(
|
| - env, notifications[i].display_text());
|
| -
|
| - Java_AutofillDialogGlue_addToAutofillDialogNotificationArray(
|
| - env,
|
| - notification_array.obj(),
|
| - i,
|
| - static_cast<int>(notifications[i].type()),
|
| - static_cast<int>(notifications[i].GetBackgroundColor()),
|
| - static_cast<int>(notifications[i].GetTextColor()),
|
| - notifications[i].HasArrow(),
|
| - notifications[i].HasCheckbox(),
|
| - notifications[i].checked(),
|
| - notifications[i].interactive(),
|
| - text.obj());
|
| - }
|
| -
|
| - Java_AutofillDialogGlue_updateNotificationArea(env,
|
| - java_object_.obj(),
|
| - notification_array.obj());
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateAccountChooser() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - std::vector<string16> account_names;
|
| - int selected_account_index = -1;
|
| -
|
| - ui::MenuModel* model = controller_->MenuModelForAccountChooser();
|
| - if (controller_->ShouldShowSpinner()) {
|
| - // Do not show accounts if not yet known.
|
| - } else if (!model) {
|
| - // TODO(aruslan): http://crbug.com/177495 Publish Android accounts.
|
| - account_names.push_back(controller_->AccountChooserText());
|
| - selected_account_index = 0;
|
| - } else {
|
| - for (int i = 0; i < model->GetItemCount(); ++i) {
|
| - if (model->IsItemCheckedAt(i))
|
| - selected_account_index = i;
|
| - account_names.push_back(model->GetLabelAt(i));
|
| - }
|
| - }
|
| -
|
| - ScopedJavaLocalRef<jobjectArray> jaccount_names =
|
| - base::android::ToJavaArrayOfStrings(env, account_names);
|
| - Java_AutofillDialogGlue_updateAccountChooser(
|
| - env, java_object_.obj(), jaccount_names.obj(), selected_account_index);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateButtonStrip() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateDetailArea() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateForErrors() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateAutocheckoutStepsArea() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateSection(DialogSection section) {
|
| - UpdateOrFillSectionToJava(section, true, UNKNOWN_TYPE);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::FillSection(
|
| - DialogSection section,
|
| - const DetailInput& originating_input) {
|
| - UpdateOrFillSectionToJava(section, false, originating_input.type);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::GetUserInput(DialogSection section,
|
| - DetailOutputMap* output) {
|
| - GetUserInputImpl(section, output);
|
| -}
|
| -
|
| -string16 AutofillDialogViewAndroid::GetCvc() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jstring> cvc =
|
| - Java_AutofillDialogGlue_getCvc(env, java_object_.obj());
|
| - return base::android::ConvertJavaStringToUTF16(env, cvc.obj());
|
| -}
|
| -
|
| -bool AutofillDialogViewAndroid::SaveDetailsLocally() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - return Java_AutofillDialogGlue_shouldSaveDetailsLocally(env,
|
| - java_object_.obj());
|
| -}
|
| -
|
| -const content::NavigationController* AutofillDialogViewAndroid::ShowSignIn() {
|
| - NOTIMPLEMENTED();
|
| - return NULL;
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::HideSignIn() {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -// TODO(aruslan): bind to the automatic sign-in.
|
| -bool AutofillDialogViewAndroid::StartAutomaticSignIn(
|
| - const std::string& username) {
|
| - if (username.empty())
|
| - return false;
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jstring> jusername =
|
| - base::android::ConvertUTF8ToJavaString(env, username);
|
| - Java_AutofillDialogGlue_startAutomaticSignIn(env, java_object_.obj(),
|
| - jusername.obj());
|
| - return true;
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateProgressBar(double value) {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - Java_AutofillDialogGlue_updateProgressBar(env, java_object_.obj(), value);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::ModelChanged() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - Java_AutofillDialogGlue_modelChanged(
|
| - env, java_object_.obj(),
|
| - controller_->ShouldShowSpinner());
|
| - UpdateSection(SECTION_EMAIL);
|
| - UpdateSection(SECTION_CC);
|
| - UpdateSection(SECTION_BILLING);
|
| - UpdateSection(SECTION_CC_BILLING);
|
| - UpdateSection(SECTION_SHIPPING);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::OnSignInResize(const gfx::Size& pref_size) {
|
| - NOTIMPLEMENTED();
|
| -}
|
| -
|
| -TestableAutofillDialogView* AutofillDialogViewAndroid::GetTestableView() {
|
| - return NULL;
|
| -}
|
| -
|
| -// TODO(aruslan): bind to the list of accounts population.
|
| -std::vector<std::string> AutofillDialogViewAndroid::GetAvailableUserAccounts() {
|
| - std::vector<std::string> account_names;
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jobjectArray> jaccount_names =
|
| - Java_AutofillDialogGlue_getUserAccountNames(env, java_object_.obj());
|
| - base::android::AppendJavaStringArrayToStringVector(
|
| - env, jaccount_names.obj(), &account_names);
|
| - return account_names;
|
| -}
|
| -
|
| -// Calls from Java to C++
|
| -
|
| -void AutofillDialogViewAndroid::ItemSelected(JNIEnv* env, jobject obj,
|
| - jint section, jint index) {
|
| - ui::MenuModel* menuModel =
|
| - GetMenuModelForSection(static_cast<DialogSection>(section));
|
| - if (menuModel)
|
| - menuModel->ActivatedAt(index);
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jobject> AutofillDialogViewAndroid::GetIconForField(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint field_id,
|
| - jstring jinput) {
|
| - string16 input = base::android::ConvertJavaStringToUTF16(env, jinput);
|
| - return GetJavaBitmap(controller_->IconForField(
|
| - static_cast<AutofillFieldType>(field_id), input));
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jstring> AutofillDialogViewAndroid::GetPlaceholderForField(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint section,
|
| - jint field_id) {
|
| - if (static_cast<int>(field_id) == CREDIT_CARD_VERIFICATION_CODE) {
|
| - return base::android::ConvertUTF16ToJavaString(
|
| - env,
|
| - l10n_util::GetStringUTF16(IDS_AUTOFILL_DIALOG_PLACEHOLDER_CVC));
|
| - }
|
| - return ScopedJavaLocalRef<jstring>();
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jstring> AutofillDialogViewAndroid::GetDialogButtonText(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint dialog_button_id) {
|
| - switch (static_cast<ui::DialogButton>(dialog_button_id)) {
|
| - case ui::DIALOG_BUTTON_OK:
|
| - return base::android::ConvertUTF16ToJavaString(
|
| - env,
|
| - controller_->ConfirmButtonText());
|
| -
|
| - case ui::DIALOG_BUTTON_CANCEL:
|
| - return base::android::ConvertUTF16ToJavaString(
|
| - env,
|
| - controller_->CancelButtonText());
|
| -
|
| - case ui::DIALOG_BUTTON_NONE:
|
| - break;
|
| - }
|
| -
|
| - NOTREACHED();
|
| - return ScopedJavaLocalRef<jstring>();
|
| -}
|
| -
|
| -jboolean AutofillDialogViewAndroid::IsDialogButtonEnabled(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint dialog_button_id) {
|
| - return static_cast<jboolean>(
|
| - controller_->IsDialogButtonEnabled(
|
| - static_cast<ui::DialogButton>(dialog_button_id)));
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jstring> AutofillDialogViewAndroid::GetSaveLocallyText(
|
| - JNIEnv* env,
|
| - jobject obj) {
|
| - return base::android::ConvertUTF16ToJavaString(
|
| - env,
|
| - controller_->SaveLocallyText());
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jstring> AutofillDialogViewAndroid::GetLegalDocumentsText(
|
| - JNIEnv* env,
|
| - jobject obj) {
|
| - return base::android::ConvertUTF16ToJavaString(
|
| - env,
|
| - controller_->LegalDocumentsText());
|
| -}
|
| -
|
| -jboolean AutofillDialogViewAndroid::IsTheAddItem(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint section,
|
| - jint index) {
|
| - return IsTheAddMenuItem(static_cast<DialogSection>(section),
|
| - static_cast<int>(index));
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::AccountSelected(JNIEnv* env, jobject obj,
|
| - jint index) {
|
| - ui::MenuModel* model = controller_->MenuModelForAccountChooser();
|
| - if (!model)
|
| - return;
|
| -
|
| - model->ActivatedAt(index);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::NotificationCheckboxStateChanged(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint type,
|
| - jboolean checked) {
|
| - controller_->NotificationCheckboxStateChanged(
|
| - static_cast<DialogNotification::Type>(type),
|
| - static_cast<bool>(checked));
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::EditingStart(JNIEnv* env, jobject obj,
|
| - jint jsection) {
|
| - const DialogSection section = static_cast<DialogSection>(jsection);
|
| - // TODO(estade): respect |suggestion_state.text_style|.
|
| - const SuggestionState& suggestion_state =
|
| - controller_->SuggestionStateForSection(section);
|
| - if (suggestion_state.text.empty()) {
|
| - // The section is already in the editing mode, or it's the "Add...".
|
| - return;
|
| - }
|
| -
|
| - controller_->EditClickedForSection(section);
|
| - UpdateOrFillSectionToJava(section, false, UNKNOWN_TYPE);
|
| -}
|
| -
|
| -jboolean AutofillDialogViewAndroid::EditingComplete(JNIEnv* env,
|
| - jobject obj,
|
| - jint jsection) {
|
| - // Unfortunately, edits are not sent to the models, http://crbug.com/223919.
|
| - const DialogSection section = static_cast<DialogSection>(jsection);
|
| - if (ValidateSection(section, VALIDATE_FINAL)) {
|
| - UpdateOrFillSectionToJava(section, false, UNKNOWN_TYPE);
|
| - return true;
|
| - }
|
| -
|
| - return false;
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::EditingCancel(JNIEnv* env,
|
| - jobject obj,
|
| - jint jsection) {
|
| - const DialogSection section = static_cast<DialogSection>(jsection);
|
| - controller_->EditCancelledForSection(section);
|
| - UpdateSection(section);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::EditedOrActivatedField(JNIEnv* env,
|
| - jobject obj,
|
| - jint jsection,
|
| - jint detail_input,
|
| - jint view_android,
|
| - jstring value,
|
| - jboolean was_edit) {
|
| - const DialogSection section = static_cast<DialogSection>(jsection);
|
| - DetailInput* input = reinterpret_cast<DetailInput*>(detail_input);
|
| - ui::ViewAndroid* view = reinterpret_cast<ui::ViewAndroid*>(view_android);
|
| - gfx::Rect rect = gfx::Rect(0, 0, 0, 0);
|
| - string16 value16 = base::android::ConvertJavaStringToUTF16(
|
| - env, value);
|
| - controller_->UserEditedOrActivatedInput(
|
| - section, input, view, rect, value16, was_edit);
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jstring> AutofillDialogViewAndroid::ValidateField(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint jsection,
|
| - jint type,
|
| - jstring value) {
|
| - string16 field_value = base::android::ConvertJavaStringToUTF16(env, value);
|
| - const DialogSection section = static_cast<DialogSection>(jsection);
|
| - AutofillFieldType field_type = static_cast<AutofillFieldType>(type);
|
| - string16 error_message =
|
| - controller_->InputValidityMessage(section, field_type, field_value);
|
| - ScopedJavaLocalRef<jstring> error_text =
|
| - base::android::ConvertUTF16ToJavaString(env, error_message);
|
| - return error_text;
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::ValidateSection(JNIEnv* env,
|
| - jobject obj,
|
| - jint section) {
|
| - ValidateSection(static_cast<DialogSection>(section), VALIDATE_EDIT);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::DialogSubmit(JNIEnv* env, jobject obj) {
|
| - // TODO(aurimas): add validation step.
|
| - controller_->OnAccept();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::DialogCancel(JNIEnv* env, jobject obj) {
|
| - controller_->OnCancel();
|
| - Hide();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::DialogDismissed(JNIEnv* env, jobject obj) {
|
| - // This might delete |this|, as |this| is owned by the |controller_|.
|
| - controller_->ViewClosed();
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jstring> AutofillDialogViewAndroid::GetLabelForSection(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint section) {
|
| - string16 label(controller_->LabelForSection(
|
| - static_cast<DialogSection>(section)));
|
| - return base::android::ConvertUTF16ToJavaString(env, label);
|
| -}
|
| -
|
| -ScopedJavaLocalRef<jobjectArray> AutofillDialogViewAndroid::GetListForField(
|
| - JNIEnv* env,
|
| - jobject obj,
|
| - jint field) {
|
| - ui::ComboboxModel* model = controller_->ComboboxModelForAutofillType(
|
| - static_cast<AutofillFieldType>(field));
|
| - if (!model)
|
| - return ScopedJavaLocalRef<jobjectArray>();
|
| -
|
| - std::vector<string16> list(model->GetItemCount());
|
| - for (int i = 0; i < model->GetItemCount(); ++i) {
|
| - list[i] = model->GetItemAt(i);
|
| - }
|
| - return base::android::ToJavaArrayOfStrings(env, list);
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::ContinueAutomaticSignin(
|
| - JNIEnv* env, jobject obj,
|
| - jstring jaccount_name, jstring jsid, jstring jlsid) {
|
| - const std::string account_name =
|
| - base::android::ConvertJavaStringToUTF8(env, jaccount_name);
|
| - const std::string sid =
|
| - base::android::ConvertJavaStringToUTF8(env, jsid);
|
| - const std::string lsid =
|
| - base::android::ConvertJavaStringToUTF8(env, jlsid);
|
| - // TODO(aruslan): bind to the automatic sign-in.
|
| - // controller_->ContinueAutomaticSignIn(account_name, sid, lsid);
|
| -}
|
| -
|
| -// static
|
| -bool AutofillDialogViewAndroid::RegisterAutofillDialogViewAndroid(JNIEnv* env) {
|
| - return RegisterNativesImpl(env);
|
| -}
|
| -
|
| -bool AutofillDialogViewAndroid::ValidateSection(DialogSection section,
|
| - ValidationType type) {
|
| - DetailOutputMap detail_outputs;
|
| - GetUserInput(section, &detail_outputs);
|
| - ValidityData invalid_inputs =
|
| - controller_->InputsAreValid(section, detail_outputs, type);
|
| -
|
| - const size_t item_count = invalid_inputs.size();
|
| - if (item_count == 0) return true;
|
| -
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jobjectArray> error_array =
|
| - Java_AutofillDialogGlue_createAutofillDialogFieldError(env, item_count);
|
| - size_t i = 0;
|
| - for (ValidityData::const_iterator iter =
|
| - invalid_inputs.begin(); iter != invalid_inputs.end(); ++iter, ++i) {
|
| - ScopedJavaLocalRef<jstring> error_text =
|
| - base::android::ConvertUTF16ToJavaString(env, iter->second);
|
| - Java_AutofillDialogGlue_addToAutofillDialogFieldErrorArray(
|
| - env, error_array.obj(), i, iter->first, error_text.obj());
|
| - }
|
| - Java_AutofillDialogGlue_updateSectionErrors(env,
|
| - java_object_.obj(),
|
| - section,
|
| - error_array.obj());
|
| - return false;
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateSaveLocallyCheckBox() {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - Java_AutofillDialogGlue_updateSaveLocallyCheckBox(
|
| - env, java_object_.obj(), controller_->ShouldOfferToSaveInChrome());
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::UpdateOrFillSectionToJava(
|
| - DialogSection section,
|
| - bool clobber_inputs,
|
| - int field_type_to_always_clobber) {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - const DetailInputs& updated_inputs =
|
| - controller_->RequestedFieldsForSection(section);
|
| -
|
| - const size_t input_count = updated_inputs.size();
|
| - ScopedJavaLocalRef<jobjectArray> field_array =
|
| - Java_AutofillDialogGlue_createAutofillDialogFieldArray(
|
| - env, input_count);
|
| -
|
| - for (size_t i = 0; i < input_count; ++i) {
|
| - const DetailInput& input = updated_inputs[i];
|
| -
|
| - ScopedJavaLocalRef<jstring> autofilled =
|
| - base::android::ConvertUTF16ToJavaString(env, input.initial_value);
|
| -
|
| - string16 placeholder16;
|
| - if (input.placeholder_text_rid > 0)
|
| - placeholder16 = l10n_util::GetStringUTF16(input.placeholder_text_rid);
|
| - ScopedJavaLocalRef<jstring> placeholder =
|
| - base::android::ConvertUTF16ToJavaString(env, placeholder16);
|
| -
|
| - Java_AutofillDialogGlue_addToAutofillDialogFieldArray(
|
| - env,
|
| - field_array.obj(),
|
| - i,
|
| - reinterpret_cast<jint>(&input),
|
| - input.type,
|
| - placeholder.obj(),
|
| - autofilled.obj());
|
| - }
|
| -
|
| - ui::MenuModel* menu_model = GetMenuModelForSection(section);
|
| - const int item_count = menu_model->GetItemCount();
|
| -
|
| - // Never show the "Manage..." item.
|
| - // TODO(aruslan): fix this once we have UI design http://crbug.com/235639.
|
| - const int jitem_count = item_count >= 1 ? item_count - 1 : 0;
|
| -
|
| - ScopedJavaLocalRef<jobjectArray> menu_array =
|
| - Java_AutofillDialogGlue_createAutofillDialogMenuItemArray(env,
|
| - jitem_count);
|
| - const int selected_item = GetSelectedItemIndexForSection(section);
|
| -
|
| - for (int i = 0; i < jitem_count; ++i) {
|
| - const MenuItemButtonType button_type = GetMenuItemButtonType(section, i);
|
| - string16 line1_value = menu_model->GetLabelAt(i);
|
| - string16 line2_value = menu_model->GetSublabelAt(i);
|
| - gfx::Image icon_value;
|
| - menu_model->GetIconAt(i, &icon_value);
|
| -
|
| - if (i == selected_item) {
|
| - CollapseUserDataIntoMenuItem(section,
|
| - &line1_value, &line2_value,
|
| - &icon_value);
|
| - }
|
| -
|
| - ScopedJavaLocalRef<jstring> line1 =
|
| - base::android::ConvertUTF16ToJavaString(env, line1_value);
|
| - ScopedJavaLocalRef<jstring> line2 =
|
| - base::android::ConvertUTF16ToJavaString(env, line2_value);
|
| - ScopedJavaLocalRef<jobject> icon = GetJavaBitmap(icon_value);
|
| -
|
| - Java_AutofillDialogGlue_addToAutofillDialogMenuItemArray(
|
| - env, menu_array.obj(), i,
|
| - line1.obj(), line2.obj(), icon.obj(),
|
| - static_cast<int>(button_type));
|
| - }
|
| -
|
| - const SuggestionState& suggestion_state =
|
| - controller_->SuggestionStateForSection(section);
|
| - ScopedJavaLocalRef<jstring> suggestion_text =
|
| - base::android::ConvertUTF16ToJavaString(env, suggestion_state.text);
|
| - ScopedJavaLocalRef<jstring> suggestion_text_extra =
|
| - base::android::ConvertUTF16ToJavaString(env, suggestion_state.extra_text);
|
| - ScopedJavaLocalRef<jobject> suggestion_icon =
|
| - GetJavaBitmap(suggestion_state.icon);
|
| - ScopedJavaLocalRef<jobject> suggestion_icon_extra =
|
| - GetJavaBitmap(suggestion_state.extra_icon);
|
| -
|
| - Java_AutofillDialogGlue_updateSection(env,
|
| - java_object_.obj(),
|
| - section,
|
| - controller_->SectionIsActive(section),
|
| - field_array.obj(),
|
| - suggestion_text.obj(),
|
| - suggestion_icon.obj(),
|
| - suggestion_text_extra.obj(),
|
| - suggestion_icon_extra.obj(),
|
| - menu_array.obj(),
|
| - selected_item,
|
| - clobber_inputs,
|
| - field_type_to_always_clobber);
|
| -
|
| - UpdateSaveLocallyCheckBox();
|
| -}
|
| -
|
| -void AutofillDialogViewAndroid::GetUserInputImpl(
|
| - DialogSection section,
|
| - DetailOutputMap* output) const {
|
| - JNIEnv* env = base::android::AttachCurrentThread();
|
| - ScopedJavaLocalRef<jobjectArray> fields =
|
| - Java_AutofillDialogGlue_getSection(env, java_object_.obj(), section);
|
| - if (fields.is_null())
|
| - return;
|
| -
|
| - const int arrayLength = env->GetArrayLength(fields.obj());
|
| - for (int i = 0; i < arrayLength; ++i) {
|
| - ScopedJavaLocalRef<jobject> field(
|
| - env, env->GetObjectArrayElement(fields.obj(), i));
|
| - DetailInput* input = reinterpret_cast<DetailInput*>(
|
| - Java_AutofillDialogGlue_getFieldNativePointer(env, field.obj()));
|
| - string16 value = base::android::ConvertJavaStringToUTF16(
|
| - env, Java_AutofillDialogGlue_getFieldValue(env, field.obj()).obj());
|
| - output->insert(std::make_pair(input, value));
|
| - }
|
| -}
|
| -
|
| -ui::MenuModel* AutofillDialogViewAndroid::GetMenuModelForSection(
|
| - DialogSection section) const {
|
| - // TODO(aruslan/estade): This should use MenuModelForSectionHack(), which
|
| - // never returns NULL. Later the controller should return a proper platform-
|
| - // specific menu model to match the platform UI flow (or it shouldn't attempt
|
| - // to control the presentation details).
|
| - return controller_->MenuModelForSectionHack(section);
|
| -}
|
| -
|
| -// Returns the index of the currently selected item in |section|, or -1.
|
| -int AutofillDialogViewAndroid::GetSelectedItemIndexForSection(
|
| - DialogSection section) const {
|
| - ui::MenuModel* menuModel = GetMenuModelForSection(section);
|
| - if (!menuModel) return -1;
|
| -
|
| - for (int i = 0; i < menuModel->GetItemCount(); ++i) {
|
| - if (menuModel->IsItemCheckedAt(i))
|
| - return i;
|
| - }
|
| -
|
| - return -1;
|
| -}
|
| -
|
| -// Returns true if the item at |index| in |section| is the "Add...".
|
| -bool AutofillDialogViewAndroid::IsTheAddMenuItem(
|
| - DialogSection section, int index) const {
|
| - ui::MenuModel* menuModel = GetMenuModelForSection(section);
|
| - return menuModel && index == menuModel->GetItemCount() - 2;
|
| -}
|
| -
|
| -// Returns true if the item at |index| in |section| is the "Manage...".
|
| -bool AutofillDialogViewAndroid::IsTheManageMenuItem(
|
| - DialogSection section, int index) const {
|
| - ui::MenuModel* menuModel = GetMenuModelForSection(section);
|
| - return menuModel && index == menuModel->GetItemCount() - 1;
|
| -}
|
| -
|
| -// Returns an |image| converted to a Java image, or null if |image| is empty.
|
| -ScopedJavaLocalRef<jobject> AutofillDialogViewAndroid::GetJavaBitmap(
|
| - const gfx::Image& image) const {
|
| - ScopedJavaLocalRef<jobject> bitmap;
|
| - const SkBitmap& sk_bitmap = image.AsBitmap();
|
| - if (!sk_bitmap.isNull() && sk_bitmap.bytesPerPixel() != 0)
|
| - bitmap = gfx::ConvertToJavaBitmap(&sk_bitmap);
|
| - return bitmap;
|
| -}
|
| -
|
| -// Returns a MenuItemButtonType for a menu item at |index| in |section|.
|
| -AutofillDialogViewAndroid::MBT AutofillDialogViewAndroid::GetMenuItemButtonType(
|
| - DialogSection section,
|
| - int index) const {
|
| - // TODO(aruslan): Remove/fix this once http://crbug.com/224162 is closed.
|
| - ui::MenuModel* menu_model = GetMenuModelForSection(section);
|
| - if (!menu_model)
|
| - return MENU_ITEM_BUTTON_TYPE_NONE;
|
| -
|
| - // "Use billing for shipping" is not editable and it's always first.
|
| - if (section == SECTION_SHIPPING && index == 0)
|
| - return MENU_ITEM_BUTTON_TYPE_NONE;
|
| -
|
| - // The last item ("Manage...") is never editable.
|
| - if (IsTheManageMenuItem(section, index))
|
| - return MENU_ITEM_BUTTON_TYPE_NONE;
|
| -
|
| - // The second last item ("Add..."):
|
| - if (IsTheAddMenuItem(section, index)) {
|
| - const bool currently_selected =
|
| - index == GetSelectedItemIndexForSection(section);
|
| - // - should show "Add..." button if not selected;
|
| - if (!currently_selected)
|
| - return MENU_ITEM_BUTTON_TYPE_ADD;
|
| -
|
| - // - should show "Add..." button if selected and doesn't have user data;
|
| - string16 label, sublabel;
|
| - gfx::Image icon;
|
| - const bool has_user_data =
|
| - CollapseUserDataIntoMenuItem(section, &label, &sublabel, &icon);
|
| - if (!has_user_data)
|
| - return MENU_ITEM_BUTTON_TYPE_ADD;
|
| -
|
| - // - otherwise, should show the "Edit..." button (as any "normal" items).
|
| - }
|
| -
|
| - return MENU_ITEM_BUTTON_TYPE_EDIT;
|
| -}
|
| -
|
| -// TODO(aruslan): Remove/fix this once http://crbug.com/230685 is closed.
|
| -namespace {
|
| -
|
| -bool IsCreditCardType(AutofillFieldType type) {
|
| - return AutofillType(type).group() == AutofillType::CREDIT_CARD;
|
| -}
|
| -
|
| -class CollapsedAutofillProfileWrapper : public AutofillProfileWrapper {
|
| - public:
|
| - explicit CollapsedAutofillProfileWrapper(const AutofillProfile* profile)
|
| - : AutofillProfileWrapper(profile, 0) {
|
| - }
|
| - virtual ~CollapsedAutofillProfileWrapper() {
|
| - }
|
| -
|
| - virtual string16 GetDisplayText() OVERRIDE {
|
| - const string16 name_full = GetInfo(NAME_FULL);
|
| - const string16 comma = ASCIIToUTF16(", ");
|
| - const string16 address2 = GetInfo(ADDRESS_HOME_LINE2);
|
| -
|
| - string16 label;
|
| - if (!name_full.empty())
|
| - label = name_full + comma;
|
| - label += GetInfo(ADDRESS_HOME_LINE1);
|
| - if (!address2.empty())
|
| - label += comma + address2;
|
| - return label;
|
| - }
|
| -
|
| - string16 GetSublabel() {
|
| - const string16 comma = ASCIIToUTF16(", ");
|
| - return
|
| - GetInfo(ADDRESS_HOME_CITY) + comma +
|
| - GetInfo(ADDRESS_HOME_STATE) + ASCIIToUTF16(" ") +
|
| - GetInfo(ADDRESS_HOME_ZIP);
|
| - }
|
| -
|
| - private:
|
| - DISALLOW_COPY_AND_ASSIGN(CollapsedAutofillProfileWrapper);
|
| -};
|
| -
|
| -
|
| -// Get billing info from |output| and put it into |card|, |cvc|, and |profile|.
|
| -// These outparams are required because |card|/|profile| accept different types
|
| -// of raw info.
|
| -void GetBillingInfoFromOutputs(const DetailOutputMap& output,
|
| - CreditCard* card,
|
| - AutofillProfile* profile) {
|
| - for (DetailOutputMap::const_iterator it = output.begin();
|
| - it != output.end(); ++it) {
|
| - string16 trimmed;
|
| - TrimWhitespace(it->second, TRIM_ALL, &trimmed);
|
| -
|
| - if (it->first->type == ADDRESS_HOME_COUNTRY ||
|
| - it->first->type == ADDRESS_BILLING_COUNTRY) {
|
| - profile->SetInfo(it->first->type,
|
| - trimmed,
|
| - g_browser_process->GetApplicationLocale());
|
| - } else {
|
| - // Copy the credit card name to |profile| in addition to |card| as
|
| - // wallet::Instrument requires a recipient name for its billing address.
|
| - if (profile && it->first->type == CREDIT_CARD_NAME)
|
| - profile->SetRawInfo(NAME_FULL, trimmed);
|
| -
|
| - if (IsCreditCardType(it->first->type)) {
|
| - if (card)
|
| - card->SetRawInfo(it->first->type, trimmed);
|
| - } else if (profile) {
|
| - profile->SetRawInfo(it->first->type, trimmed);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -// Returns true and fills in the |label|, |sublabel| and |icon if
|
| -// a given |section| has the user input.
|
| -// TODO(aruslan): Remove/fix this once http://crbug.com/230685 is closed.
|
| -bool AutofillDialogViewAndroid::CollapseUserDataIntoMenuItem(
|
| - DialogSection section,
|
| - string16* label_to_set,
|
| - string16* sublabel_to_set,
|
| - gfx::Image* icon_to_set) const {
|
| - const SuggestionState& suggestion_state =
|
| - controller_->SuggestionStateForSection(section);
|
| - if (!suggestion_state.text.empty())
|
| - return false;
|
| -
|
| - DetailOutputMap inputs;
|
| - GetUserInputImpl(section, &inputs);
|
| -
|
| - string16 label;
|
| - string16 sublabel;
|
| - gfx::Image icon;
|
| -
|
| - switch (section) {
|
| - case SECTION_CC: {
|
| - CreditCard card;
|
| - GetBillingInfoFromOutputs(inputs, &card, NULL);
|
| - AutofillCreditCardWrapper ccw(&card);
|
| - label = card.Label();
|
| - icon = ccw.GetIcon();
|
| - break;
|
| - }
|
| -
|
| - case SECTION_BILLING: {
|
| - AutofillProfile profile;
|
| - GetBillingInfoFromOutputs(inputs, NULL, &profile);
|
| - CollapsedAutofillProfileWrapper pw(&profile);
|
| - label = pw.GetDisplayText();
|
| - sublabel = pw.GetSublabel();
|
| - break;
|
| - }
|
| -
|
| - case SECTION_CC_BILLING: {
|
| - CreditCard card;
|
| - AutofillProfile profile;
|
| - GetBillingInfoFromOutputs(inputs, &card, &profile);
|
| - AutofillCreditCardWrapper ccw(&card);
|
| - CollapsedAutofillProfileWrapper pw(&profile);
|
| - label = ccw.GetDisplayText();
|
| - sublabel = pw.GetDisplayText();
|
| - icon = ccw.GetIcon();
|
| - break;
|
| - }
|
| -
|
| - case SECTION_SHIPPING: {
|
| - AutofillProfile profile;
|
| - GetBillingInfoFromOutputs(inputs, NULL, &profile);
|
| - CollapsedAutofillProfileWrapper pw(&profile);
|
| - label = pw.GetDisplayText();
|
| - sublabel = pw.GetSublabel();
|
| - break;
|
| - }
|
| -
|
| - case SECTION_EMAIL: {
|
| - for (DetailOutputMap::const_iterator iter = inputs.begin();
|
| - iter != inputs.end(); ++iter) {
|
| - if (iter->first->type == EMAIL_ADDRESS)
|
| - label = iter->second;
|
| - }
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (label.empty())
|
| - return false;
|
| -
|
| - *label_to_set = label;
|
| - *sublabel_to_set = sublabel;
|
| - *icon_to_set = icon;
|
| - return true;
|
| -}
|
| -} // namespace autofill
|
|
|