Commit a10f8b64 authored by Liquan (Max) Gu's avatar Liquan (Max) Gu Committed by Commit Bot

[PlayBilling] Move instrument detail extraction into helper

Before Change:
The instrument detail extraction logic lives in
AndroidPaymentApp#onIntentCompleted.

After Change:
The instrument detail extraction logic lives in
WebPaymentIntentHelper#extractInstrumentDetailsFromIntentResponse.

Change:
Move code.

Bug: 1057488

Change-Id: I884bd6745e3c57b576f761bb8b4222253183e447
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2095840Reviewed-by: default avatarMohamed Heikal <mheikal@chromium.org>
Reviewed-by: default avatarRouslan Solomakhin <rouslan@chromium.org>
Commit-Queue: Liquan (Max) Gu <maxlg@chromium.org>
Cr-Commit-Position: refs/heads/master@{#748815}
parent 1dc7262d
......@@ -455,7 +455,6 @@ android_library("chrome_java") {
"//components/ntp_tiles:ntp_tiles_enums_java",
"//components/offline_pages/core:offline_page_model_enums_java",
"//components/password_manager/core/browser:password_manager_java_enums_srcjar",
"//components/payments/content/android:error_strings_generated_srcjar",
"//components/payments/content/android:method_strings_generated_srcjar",
"//components/search_engines:search_engine_type_java",
"//components/signin/core/browser:signin_enums_javagen",
......
......@@ -4,7 +4,6 @@
package org.chromium.chrome.browser.payments;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface.OnClickListener;
......@@ -42,7 +41,6 @@ import org.chromium.ui.base.WindowAndroid;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;
......@@ -57,11 +55,6 @@ public class AndroidPaymentApp extends PaymentApp implements WindowAndroid.Inten
/** The maximum number of milliseconds to wait for a connection to READY_TO_PAY service. */
private static final long SERVICE_CONNECTION_TIMEOUT_MS = 1000;
// Response from the payment app.
private static final String EXTRA_DEPRECATED_RESPONSE_INSTRUMENT_DETAILS = "instrumentDetails";
private static final String EXTRA_RESPONSE_DETAILS = "details";
private static final String EXTRA_RESPONSE_METHOD_NAME = "methodName";
private static final String EMPTY_JSON_DATA = "{}";
private final Handler mHandler;
......@@ -346,28 +339,12 @@ public class AndroidPaymentApp extends PaymentApp implements WindowAndroid.Inten
public void onIntentCompleted(WindowAndroid window, int resultCode, Intent data) {
ThreadUtils.assertOnUiThread();
window.removeIntentCallback(this);
if (data == null) {
mInstrumentDetailsCallback.onInstrumentDetailsError(ErrorStrings.MISSING_INTENT_DATA);
} else if (data.getExtras() == null) {
mInstrumentDetailsCallback.onInstrumentDetailsError(ErrorStrings.MISSING_INTENT_EXTRAS);
} else if (resultCode == Activity.RESULT_CANCELED) {
mInstrumentDetailsCallback.onInstrumentDetailsError(ErrorStrings.RESULT_CANCELED);
} else if (resultCode != Activity.RESULT_OK) {
mInstrumentDetailsCallback.onInstrumentDetailsError(String.format(
Locale.US, ErrorStrings.UNRECOGNIZED_ACTIVITY_RESULT, resultCode));
} else {
String details = data.getExtras().getString(EXTRA_RESPONSE_DETAILS);
if (details == null) {
details = data.getExtras().getString(EXTRA_DEPRECATED_RESPONSE_INSTRUMENT_DETAILS);
}
if (details == null) details = EMPTY_JSON_DATA;
String methodName = data.getExtras().getString(EXTRA_RESPONSE_METHOD_NAME);
if (methodName == null) methodName = "";
// TODO(crbug.com/1026667): Support payer data delegation for native apps instead of
// returning empty PayerData.
mInstrumentDetailsCallback.onInstrumentDetailsReady(
methodName, details, new PayerData());
}
WebPaymentIntentHelper.parsePaymentResponse(resultCode, data,
(errorString)
-> notifyErrorInvokingPaymentApp(errorString),
(methodName, details)
-> mInstrumentDetailsCallback.onInstrumentDetailsReady(
methodName, details, new PayerData()));
mInstrumentDetailsCallback = null;
}
......
......@@ -74,6 +74,7 @@ android_library("java") {
"//url:gurl_java",
"//url:origin_java",
]
srcjar_deps = [ ":error_strings_generated_srcjar" ]
}
java_cpp_strings("error_strings_generated_srcjar") {
......
......@@ -4,12 +4,15 @@
package org.chromium.components.payments.intent;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.JsonWriter;
import androidx.annotation.Nullable;
import org.chromium.components.payments.ErrorStrings;
import org.chromium.components.payments.intent.WebPaymentIntentHelperType.PaymentCurrencyAmount;
import org.chromium.components.payments.intent.WebPaymentIntentHelperType.PaymentDetailsModifier;
import org.chromium.components.payments.intent.WebPaymentIntentHelperType.PaymentItem;
......@@ -20,6 +23,7 @@ import java.io.StringWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
......@@ -51,8 +55,60 @@ public class WebPaymentIntentHelper {
private static final String EXTRA_DEPRECATED_METHOD_NAME = "methodName";
private static final String EXTRA_DEPRECATED_ORIGIN = "origin";
// Response from the payment app.
private static final String EXTRA_DEPRECATED_RESPONSE_INSTRUMENT_DETAILS = "instrumentDetails";
private static final String EXTRA_RESPONSE_DETAILS = "details";
private static final String EXTRA_RESPONSE_METHOD_NAME = "methodName";
private static final String EMPTY_JSON_DATA = "{}";
/** Invoked to report error for {@link #parsePaymentResponse}. */
public interface PaymentErrorCallback {
/** @param errorString The string that explains the error. */
void onError(String errorString);
}
/** Invoked to receive parsed data for {@link #parsePaymentResponse}. */
public interface PaymentSuccessCallback {
/**
* @param methodName The method name parsed from the intent response.
* @param details The instrument details parsed from the intent response.
*/
void onSuccess(String methodName, String details);
}
/**
* Parse the Payment Intent response.
* @param resultCode Result code of the requested intent.
* @param data The intent response data.
* @param errorCallback Callback to handle parsing errors. Invoked synchronously.
* @param successCallback Callback to receive the parsed data. Invoked synchronously.
**/
public static void parsePaymentResponse(int resultCode, Intent data,
PaymentErrorCallback errorCallback, PaymentSuccessCallback successCallback) {
if (data == null) {
errorCallback.onError(ErrorStrings.MISSING_INTENT_DATA);
} else if (data.getExtras() == null) {
errorCallback.onError(ErrorStrings.MISSING_INTENT_EXTRAS);
} else if (resultCode == Activity.RESULT_CANCELED) {
errorCallback.onError(ErrorStrings.RESULT_CANCELED);
} else if (resultCode != Activity.RESULT_OK) {
errorCallback.onError(String.format(
Locale.US, ErrorStrings.UNRECOGNIZED_ACTIVITY_RESULT, resultCode));
} else {
String details = data.getExtras().getString(EXTRA_RESPONSE_DETAILS);
if (details == null) {
details = data.getExtras().getString(EXTRA_DEPRECATED_RESPONSE_INSTRUMENT_DETAILS);
}
if (details == null) details = EMPTY_JSON_DATA;
String methodName = data.getExtras().getString(EXTRA_RESPONSE_METHOD_NAME);
if (methodName == null) methodName = "";
// TODO(crbug.com/1026667): Support payer data delegation for native apps instead of
// returning empty PayerData.
successCallback.onSuccess(/*methodName=*/methodName, /*details=*/details);
}
}
/**
* Build the 'extra' property for an intent.
*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment