summaryrefslogtreecommitdiffstats
path: root/chrome/browser/ui/android/autofill/autofill_dialog_result.cc
blob: d17ff4cab4404badc561d00efe9a7d9a7848b507 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Copyright 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_result.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/bind.h"
#include "base/logging.h"
#include "base/strings/string_split.h"
#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/ui/autofill/data_model_wrapper.h"
#include "components/autofill/content/browser/wallet/full_wallet.h"
#include "components/autofill/core/browser/credit_card.h"
#include "components/autofill/core/common/form_data.h"
#include "jni/AutofillDialogResult_jni.h"

namespace autofill {

namespace {

std::string ConvertNullOrJavaStringToUTF8(JNIEnv* env, jstring str) {
  return str ? base::android::ConvertJavaStringToUTF8(env, str) : std::string();
}

base::string16 ConvertNullOrJavaStringToUTF16(JNIEnv* env, jstring str) {
  return str ? base::android::ConvertJavaStringToUTF16(env, str)
             : base::string16();
}

#define FETCH_JFIELD(env, jobj, cls, getter) \
    (Java_##cls##_get##getter((env), (jobj)))

#define FETCH_JSTRING(utf, env, jobj, cls, getter) \
    (ConvertNullOrJavaStringTo##utf( \
        (env), FETCH_JFIELD((env), (jobj), cls, getter).obj()))

scoped_ptr<wallet::Address> ParseJavaWalletAddress(
    JNIEnv* env, jobject address) {
  if (!address)
    return scoped_ptr<wallet::Address>();

  const base::string16 recipient_name =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, Name);

  std::vector<base::string16> address_lines;
  const base::string16 street_address =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, StreetAddress);
  base::SplitString(street_address, base::char16('\n'), &address_lines);

  const base::string16 locality_name =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, Locality);
  const base::string16 dependent_locality_name =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, DependentLocality);
  const base::string16 administrative_area_name =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, AdministrativeArea);
  const base::string16 postal_code_number =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, PostalCode);
  const base::string16 sorting_code =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, SortingCode);
  const base::string16 phone_number =
      FETCH_JSTRING(UTF16, env, address, ResultAddress, PhoneNumber);
  const std::string country_name_code =
      FETCH_JSTRING(UTF8, env, address, ResultAddress, CountryCode);
  DCHECK(!country_name_code.empty());
  const std::string language_code =
      FETCH_JSTRING(UTF8, env, address, ResultAddress, LanguageCode);

  return scoped_ptr<wallet::Address>(new wallet::Address(
      country_name_code,
      recipient_name,
      address_lines,
      locality_name,
      dependent_locality_name,
      administrative_area_name,
      postal_code_number,
      sorting_code,
      phone_number,
      std::string(),
      language_code));
}

scoped_ptr<wallet::FullWallet> ParseJavaWallet(JNIEnv* env, jobject wallet) {
  const ScopedJavaLocalRef<jobject> billing_address(
      FETCH_JFIELD(env, wallet, ResultWallet, BillingAddress));
  const ScopedJavaLocalRef<jobject> shipping_address(
      FETCH_JFIELD(env, wallet, ResultWallet, ShippingAddress));
  const ScopedJavaLocalRef<jobject> card(
      FETCH_JFIELD(env, wallet, ResultWallet, Card));

  const int expiration_month =
      FETCH_JFIELD(env, card.obj(), ResultCard, ExpirationMonth);
  const int expiration_year =
      FETCH_JFIELD(env, card.obj(), ResultCard, ExpirationYear);
  const std::string pan =
      FETCH_JSTRING(UTF8, env, card.obj(), ResultCard, Pan);
  const std::string cvn =
      FETCH_JSTRING(UTF8, env, card.obj(), ResultCard, Cvn);

  return wallet::FullWallet::CreateFullWalletFromClearText(
      expiration_month,
      expiration_year,
      pan,
      cvn,
      ParseJavaWalletAddress(env, billing_address.obj()),
      ParseJavaWalletAddress(env, shipping_address.obj()));
}

base::string16 ParseWalletEmail(JNIEnv* env, jobject wallet) {
  return FETCH_JSTRING(UTF16, env, wallet, ResultWallet, Email);
}

std::string ParseGoogleTransactionId(JNIEnv* env, jobject wallet) {
  return FETCH_JSTRING(UTF8, env, wallet, ResultWallet, GoogleTransactionId);
}

#undef FETCH_JSTRING
#undef FETCH_FIELD

}  // namespace

// static
scoped_ptr<wallet::FullWallet> AutofillDialogResult::ConvertFromJava(
    JNIEnv* env, jobject wallet) {
  return ParseJavaWallet(env, wallet);
}

// static
base::string16 AutofillDialogResult::GetWalletEmail(
    JNIEnv* env, jobject wallet) {
  return ParseWalletEmail(env, wallet);
}

// static
std::string AutofillDialogResult::GetWalletGoogleTransactionId(
    JNIEnv* env, jobject wallet) {
  return ParseGoogleTransactionId(env, wallet);
}

// static
bool AutofillDialogResult::RegisterAutofillDialogResult(JNIEnv* env) {
  return RegisterNativesImpl(env);
}

}  // namespace autofill