Copiar package com.d1sample;
import android.app.Activity;
import android.content.Context;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.bridge.ReactContextBaseJavaModule;
import com.facebook.react.bridge.ReactMethod;
import com.facebook.react.bridge.ReadableArray;
import com.google.gson.GsonBuilder;
import com.thalesgroup.gemalto.d1.ConfigParams;
import com.thalesgroup.gemalto.d1.D1Exception;
import com.thalesgroup.gemalto.d1.D1Params;
import com.thalesgroup.gemalto.d1.D1Task;
import com.thalesgroup.gemalto.d1.card.OEMPayType;
import com.thalesgroup.gemalto.d1.d1pay.ContactlessTransactionListener;
import com.thalesgroup.gemalto.d1.d1pay.D1PayConfigParams;
import com.thalesgroup.gemalto.d1.d1pay.VerificationMethod;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import androidx.annotation.NonNull;
/**
* D1 React Native entry point.
*/
public class D1Plugin extends ReactContextBaseJavaModule {
private D1Task mD1Task;
private final ReactApplicationContext mReactApplicationContext;
D1Plugin(final ReactApplicationContext context) {
super(context);
mReactApplicationContext = context;
}
@NonNull
@Override
public String getName() {
return "D1Plugin";
}
/**
* Configures the D1 SDK.
*
* @param serviceUrl D1 Service URL.
* @param issuerId Issuer ID.
* @param exponent Public key exponent.
* @param modulus Public key modulus.
* @param digitalCardUrl D1 Digital URL.
* @param consumerId Consumer ID.
* @param callback Callback.
*/
@ReactMethod
public void configure(@NonNull final String serviceUrl,
@NonNull final String issuerId,
@NonNull final ReadableArray exponent,
@NonNull final ReadableArray modulus,
@NonNull final String digitalCardUrl,
@NonNull final String consumerId,
@NotNull final String visaClientId,
@NotNull final String samsungServiceId,
@NonNull final Callback callback) {
final Double[] exponentArray = exponent.toArrayList().toArray(new Double[0]);
final Double[] modulusArray = modulus.toArrayList().toArray(new Double[0]);
final byte[] exponentBytes = new byte[exponentArray.length];
for (int i = 0; i < exponentArray.length; i++) {
exponentBytes[i] = exponentArray[i].byteValue();
}
final byte[] modulusBytes = new byte[modulusArray.length];
for (int i = 0; i < modulusArray.length; i++) {
modulusBytes[i] = modulusArray[i].byteValue();
}
configure(mReactApplicationContext,
Objects.requireNonNull(getCurrentActivity()),
serviceUrl,
issuerId,
exponentBytes,
modulusBytes,
digitalCardUrl,
consumerId,
visaClientId,
samsungServiceId,
callback);
}
/**
* Logs in.
*
* @param issuerToken Issuer token.
* @param callback Callback.
*/
@ReactMethod
public void login(@NonNull final String issuerToken, @NonNull final Callback callback) {
login(issuerToken.getBytes(StandardCharsets.UTF_8), callback);
}
/**
* Configures the D1 SDK.
*
* @param context Application context.
* @param activity Enclosing Activity.
* @param serviceUrl Service URL.
* @param issuerId Issuer ID.
* @param exponent Public key exponent.
* @param modulus Public key modulus.
* @param digitalCardUrl Digital Card URL.
* @param consumerId Customer ID>
* @param callback Callback.
*/
private void configure(@NonNull final Context context,
@NonNull final Activity activity,
@NonNull final String serviceUrl,
@NonNull final String issuerId,
@NonNull final byte[] exponent,
@NonNull final byte[] modulus,
@NonNull final String digitalCardUrl,
@NonNull final String consumerId,
@NotNull final String visaClientId,
@NotNull final String samsungServiceId,
@NonNull final Callback callback) {
mD1Task = new D1Task.Builder().setContext(context).setD1ServiceURL(serviceUrl).setIssuerID(issuerId)
.setD1ServiceRSAExponent(exponent).setD1ServiceRSAModulus(modulus)
.setDigitalCardURL(digitalCardUrl).build();
final D1Params coreConfig = ConfigParams.buildConfigCore(consumerId);
final D1Params cardConfig = ConfigParams.buildConfigCard(activity, OEMPayType.GOOGLE_PAY, visaClientId, samsungServiceId);
// D1Pay config.
final D1PayConfigParams d1PayConfigParams = D1PayConfigParams.getInstance();
d1PayConfigParams.setContactlessTransactionListener(new D1PayTransactionListener());
d1PayConfigParams.setReplenishAuthenticationUIStrings("Replenishment Title",
"Replenishment Subtitle",
"Replenishment Description",
"Cancel");
mD1Task.configure(new D1Task.ConfigCallback<Void>() {
@Override
public void onSuccess(final Void data) {
callback.invoke((Object) null);
}
@Override
public void onError(@NonNull final List<D1Exception> exceptions) {
callback.invoke(createJsonError(exceptions));
}
}, coreConfig, cardConfig, d1PayConfigParams);
}
/**
* Logs in.
*
* @param issuerToken Issuer token.
* @param callback Callback.
*/
private void login(@NonNull final byte[] issuerToken, @NonNull final Callback callback) {
getD1Task().login(issuerToken, new D1Task.Callback<>() {
@Override
public void onSuccess(final Void data) {
callback.invoke((Object) null);
}
@Override
public void onError(@NonNull final D1Exception exception) {
callback.invoke(createJsonError(Collections.singletonList(exception)));
}
});
}
/**
* Retrieves the {@code D1Task} instance.
*
* @return {@code D1Task} instance.
*/
@NonNull
private D1Task getD1Task() {
if (mD1Task == null) {
throw new IllegalStateException("Need to configure D1 SDK first.");
}
return mD1Task;
}
/**
* Creates a JSON representation of the {@code D1Exception}
*
* @param exceptions Exception.
* @return JSON representation.
*/
private String createJsonError(final List<D1Exception> exceptions) {
final List<Map<String, Object>> json = new ArrayList<>();
for (final D1Exception exception : exceptions) {
final Map<String, Object> jsonMap = new HashMap<>();
jsonMap.put("message", exception.getLocalizedMessage());
jsonMap.put("code", exception.getErrorCode().getCode());
json.add(jsonMap);
}
if (json.size() > 1) {
return new GsonBuilder().setPrettyPrinting().create().toJson(json);
} else if (json.size() == 1) {
return new GsonBuilder().setPrettyPrinting().create().toJson(json.get(0));
}
return new GsonBuilder().setPrettyPrinting().create().toJson(json);
}
/**
* {@code ContactlessTransactionListener} implementation.
*/
private static class D1PayTransactionListener extends ContactlessTransactionListener {
@Override
public void onTransactionStarted() {
// TODO
}
@Override
public void onAuthenticationRequired(@NonNull final VerificationMethod verificationMethod) {
// TODO
}
@Override
public void onReadyToTap() {
// TODO
}
@Override
public void onTransactionCompleted() {
// TODO
}
@Override
public void onError(@NonNull final D1Exception e) {
// TODO
}
}
}