package io.mpos.ui.paybutton.controller;
import io.mpos.accessories.parameters.AccessoryParameters;
import io.mpos.transactionprovider.CardProcess;
import io.mpos.transactionprovider.CardProcessDetails;
import io.mpos.transactionprovider.ReadCardProcessListener;
import io.mpos.transactionprovider.TransactionProvider;
import io.mpos.transactions.CardDetails;
import io.mpos.ui.shared.MposUi;
public class StatefulReadCardProcessProxy {
public interface Callback {
void onCompleted(CardProcessDetails processDetails, CardDetails cardDetails);
void onStatusChanged(CardProcessDetails processDetails);
}
private boolean mOngoing = false;
private CardProcess mProcess;
private CardProcessDetails mProcessDetails;
private CardDetails mCardDetails;
private Callback mCallback;
private final static StatefulReadCardProcessProxy INSTANCE = new StatefulReadCardProcessProxy();
public static StatefulReadCardProcessProxy getInstance() {
return INSTANCE;
}
public void readCard(AccessoryParameters accessoryParameters) {
cleanupForNewCardRead();
TransactionProvider transactionProvider = MposUi.getInitializedInstance().getTransactionProvider();
transactionProvider.readCard(accessoryParameters, mCardProcessListener);
mOngoing = true;
}
public boolean requestAbort() {
return mProcess != null && mProcess.requestAbort();
}
public boolean isAbortable() {
return mProcess != null && mProcess.canBeAborted();
}
public boolean isOngoing() {
return mOngoing;
}
private ReadCardProcessListener mCardProcessListener = new ReadCardProcessListener() {
@Override
public void onCompleted(CardProcess cardProcess, CardProcessDetails processDetails) {
mProcess = cardProcess;
mProcessDetails = processDetails;
mCardDetails = cardProcess.getCardDetails();
mOngoing = false;
if (mCallback != null) {
mCallback.onCompleted(processDetails, cardProcess.getCardDetails());
}
}
@Override
public void onStatusChanged(CardProcess cardProcess, CardProcessDetails processDetails) {
mProcess = cardProcess;
mProcessDetails = processDetails;
if (mCallback != null) {
mCallback.onStatusChanged(processDetails);
}
}
};
public void attachCallback(Callback callback) {
mCallback = callback;
if (mCallback != null && mProcessDetails != null) {
if (mOngoing) {
mCallback.onStatusChanged(mProcessDetails);
} else {
mCallback.onCompleted(mProcessDetails, mCardDetails);
}
}
}
public void teardown() {
if (!mOngoing) {
mProcess = null;
mProcessDetails = null;
mOngoing = false;
}
}
public void cleanupForNewCardRead() {
mCardDetails = null;
}
public CardDetails getCardDetails() {
return mCardDetails;
}
}