package com.thalesgroup.gemalto.d1.validation;
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.List;
import java.util.Locale;
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity;
import io.flutter.embedding.engine.FlutterEngine;
import io.flutter.plugin.common.MethodCall;
import io.flutter.plugin.common.MethodChannel;
public class MainActivity extends FlutterActivity {
private final String CHANNEL = "d1plugin";
private D1Task mD1Task;
@Override
public void configureFlutterEngine(@NonNull final FlutterEngine flutterEngine) {
super.configureFlutterEngine(flutterEngine);
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(),
CHANNEL).setMethodCallHandler((call, result) -> {
switch (call.method) {
case "configure":
configure(call, result);
break;
case "login":
login(call, result);
break;
case "logout":
logout(call, result);
break;
default:
result.notImplemented();
break;
}
});
}
/**
* Configures the D1 SDK.
*
* @param call Call.
* @param result Result.
*/
private void configure(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
final String consumerId = call.argument("consumerId");
final String d1ServiceUrl = call.argument("d1ServiceUrl");
final String digitalCardUrl = call.argument("digitalCardUrl");
final String issuerId = call.argument("issuerId");
final String modulus = call.argument("modulus");
final String exponent = call.argument("exponent");
final String visaClientId = call.argument("visaClientId");
final String samsungServiceId = call.argument("samsungServiceId");
assert consumerId != null;
assert d1ServiceUrl != null;
assert digitalCardUrl != null;
assert issuerId != null;
assert modulus != null;
assert exponent != null;
// D1Core config.
mD1Task = new D1Task.Builder().setContext(getApplicationContext()).setD1ServiceURL(d1ServiceUrl)
.setIssuerID(issuerId).setD1ServiceRSAExponent(hexStringToByteArray(exponent))
.setD1ServiceRSAModulus(hexStringToByteArray(modulus))
.setDigitalCardURL(digitalCardUrl).build();
final D1Params coreConfig = ConfigParams.buildConfigCore(consumerId);
final D1Params cardConfig = ConfigParams.buildConfigCard(this, OEMPayType.NONE, 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 unused) {
result.success(null);
}
@Override
public void onError(@NonNull final List<D1Exception> list) {
if (!list.isEmpty()) {
result.error(String.format(Locale.US, "%d", list.get(0).getCauseErrorCode()),
list.get(0).getLocalizedMessage(),
null);
}
}
}, coreConfig, cardConfig, d1PayConfigParams);
}
/**
* Logs in to D1 services.
*
* @param call Call.
* @param result Result.
*/
private void login(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
final String authToken = call.argument("authToken");
assert authToken != null;
getD1Task().login(authToken.getBytes(StandardCharsets.UTF_8), new D1Task.Callback<Void>() {
@Override
public void onSuccess(final Void unused) {
result.success(null);
}
@Override
public void onError(@NonNull final D1Exception exception) {
result.error(String.format(Locale.US, "%d", exception.getCauseErrorCode()),
exception.getLocalizedMessage(),
null);
}
});
}
/**
* Logs out from D1 services.
*
* @param call Call.
* @param result Result.
*/
private void logout(@NonNull MethodCall call, @NonNull MethodChannel.Result result) {
getD1Task().logout(new D1Task.Callback<Void>() {
@Override
public void onSuccess(final Void unused) {
result.success(null);
}
@Override
public void onError(@NonNull final D1Exception exception) {
result.error(String.format(Locale.US, "%d", exception.getCauseErrorCode()),
exception.getLocalizedMessage(),
null);
}
});
}
/**
* Retrieves the {@code D1Task} instance.
*
* @return {@code D1Task} instance.
*/
private D1Task getD1Task() {
if (mD1Task == null) {
throw new IllegalStateException("Need to configure D1 SDK first.");
}
return mD1Task;
}
/**
* Converts a HEX String to byte array.
*
* @param input Input HEX String.
* @return Output byte array.
*/
private byte[] hexStringToByteArray(@NonNull final String input) {
final int len = input.length();
final byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(input.charAt(i), 16) << 4) + Character.digit(input.charAt(i + 1), 16));
}
return data;
}
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
}
}
}