package io.mpos.ui.paybutton.view; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import io.mpos.accessories.parameters.AccessoryParameters; import io.mpos.errors.ErrorType; import io.mpos.errors.MposError; import io.mpos.transactionprovider.CardProcessDetails; import io.mpos.transactions.CardDetails; import io.mpos.ui.R; import io.mpos.ui.acquirer.MposUiAccountManager; import io.mpos.ui.acquirer.view.LoginFragment; import io.mpos.ui.paybutton.controller.StatefulReadCardProcessProxy; import io.mpos.ui.shared.MposUi; import io.mpos.ui.shared.util.ErrorHolder; import io.mpos.ui.shared.util.UiHelper; import io.mpos.ui.shared.util.UiState; import io.mpos.ui.shared.view.AbstractBaseActivity; import io.mpos.ui.shared.view.ErrorFragment; public class ReadCardActivity extends AbstractBaseActivity implements ReadCardFragment.Interaction, ErrorFragment.Interaction, LoginFragment.Interaction { private static final String TAG = "ReadCardActivity"; public final static String BUNDLE_EXTRA_ACQUIRER_LOGIN = "io.mpos.ui.paybutton.ReadCardActivity.BUNDLE_EXTRA_ACQUIRER_LOGIN"; public final static String BUNDLE_EXTRA_ACQUIRER_APPLICATION_ID = "io.mpos.ui.paybutton.ReadCardActivity.BUNDLE_EXTRA_ACQUIRER_LOGIN"; public final static String SAVED_INSTANCE_STATE_UI_STATE = "io.mpos.ui.paybutton.view.ReadCardActivity.UI_STATE"; private boolean mIsAcquirerMode; private String mApplicationIdentifier; private StatefulReadCardProcessProxy mReadCardProcess; private MposUiAccountManager mMposUiAccountManager; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.mpu_activity_read_card); setTitle(R.string.MPUReadCard); if (getCallingActivity() == null) { Log.w(TAG, "The transaction activity was started without startActivityForResult() and will not return a result code."); } UiHelper.setActionbarWithCustomColors(this, (android.support.v7.widget.Toolbar) findViewById(R.id.mpu_toolbar)); ErrorHolder.getInstance().clear(); parseExtras(); mReadCardProcess = StatefulReadCardProcessProxy.getInstance(); if (savedInstanceState != null) { setUiState((UiState) savedInstanceState.getSerializable(SAVED_INSTANCE_STATE_UI_STATE)); } if (!mReadCardProcess.isOngoing() && savedInstanceState == null) { if (mIsAcquirerMode) { mMposUiAccountManager = MposUiAccountManager.getInitializedInstance(); if (mMposUiAccountManager.isLoggedIn()) { startReadCard(); } else { showLoginFragment(mApplicationIdentifier); } } else { startReadCard(); } } } @Override protected void onSaveInstanceState(Bundle outState) { outState.putSerializable(SAVED_INSTANCE_STATE_UI_STATE, getUiState()); super.onSaveInstanceState(outState); } private void parseExtras() { if (getIntent().hasExtra(BUNDLE_EXTRA_ACQUIRER_LOGIN)) { mIsAcquirerMode = getIntent().hasExtra(BUNDLE_EXTRA_ACQUIRER_LOGIN); mApplicationIdentifier = getIntent().getStringExtra(BUNDLE_EXTRA_ACQUIRER_APPLICATION_ID); } } @Override protected void onResume() { super.onResume(); mReadCardProcess.attachCallback(mReadCardCallback); } @Override protected void onPause() { super.onPause(); mReadCardProcess.attachCallback(null); } @Override public void onBackPressed() { navigateBack(); } @Override public void navigateBack() { if (getUiState() == UiState.LOGIN_DISPLAYING) { finishWithResult(false); } else if (getUiState() == UiState.FORGOT_PASSWORD_DISPLAYING) { LoginFragment loginFragment = (LoginFragment) getFragmentManager().findFragmentByTag(LoginFragment.TAG); if (loginFragment != null) { loginFragment.setLoginMode(true); } } else if (getUiState() == UiState.READING_CARD_ERROR) { finishWithResult(false); } else { Toast.makeText(this, R.string.MPUBackButtonDisabled, Toast.LENGTH_LONG).show(); } } public void startReadCard() { AccessoryParameters accessoryParameters = MposUi.getInitializedInstance().getConfiguration().getTerminalParameters(); mReadCardProcess.readCard(accessoryParameters); } private StatefulReadCardProcessProxy.Callback mReadCardCallback = new StatefulReadCardProcessProxy.Callback() { @Override public void onCompleted(CardProcessDetails processDetails, CardDetails cardDetails) { completeAndPostResult(processDetails, cardDetails); } @Override public void onStatusChanged(CardProcessDetails processDetails) { ReadCardFragment readCardFragment = (ReadCardFragment) getFragmentManager().findFragmentByTag(ReadCardFragment.TAG); if (readCardFragment == null) { readCardFragment = ReadCardFragment.newInstance(); getFragmentManager().beginTransaction().replace(R.id.mpu_fragment_container, readCardFragment, ReadCardFragment.TAG).commit(); } showFragment(readCardFragment, ReadCardFragment.TAG, UiState.READING_CARD, false); readCardFragment.updateStatus(processDetails, mReadCardProcess.isAbortable()); } }; private void completeAndPostResult(CardProcessDetails processDetails, CardDetails cardDetails) { switch (processDetails.getState()) { case COMPLETED: postReadCardCompleted(cardDetails); break; case FAILED: postReadCardError(processDetails.getError()); break; case ABORTED: postReadCardAborted(); break; } } private void postReadCardCompleted(CardDetails cardDetails) { if (cardDetails != null) { finishWithResult(true); } else { finishWithResult(false); } } private void postReadCardError(MposError error) { ErrorHolder.getInstance().setError(error); if (mIsAcquirerMode && error.getErrorType() == ErrorType.SERVER_AUTHENTICATION_FAILED) { mMposUiAccountManager.logout(false); } showErrorFragment(error); } private void postReadCardAborted() { finishWithResult(false); } private void finishWithResult(boolean success) { if (success) { setResult(MposUi.RESULT_CODE_READ_CARD_SUCCESS); } else { setResult(MposUi.RESULT_CODE_READ_CARD_FAILED); } mReadCardProcess.teardown(); finish(); } @Override public void onReadCardAbortButtonClicked() { mReadCardProcess.requestAbort(); } @Override public void onErrorRetryButtonClicked() { startReadCard(); } @Override public void onErrorCloseButtonClicked() { finishWithResult(false); } @Override public void onLoginCompleted() { startReadCard(); } @Override public void onLoginModeChanged(boolean loginMode) { if (loginMode) { setUiState(UiState.LOGIN_DISPLAYING); } else { setUiState(UiState.FORGOT_PASSWORD_DISPLAYING); } } private void showLoginFragment(String applicationIdentifier) { LoginFragment fragment = LoginFragment.newInstance(applicationIdentifier); showFragment(fragment, LoginFragment.TAG, UiState.LOGIN_DISPLAYING, true); } private void showReadCardFragment() { ReadCardFragment fragment = ReadCardFragment.newInstance(); showFragment(fragment, ReadCardFragment.TAG, UiState.READING_CARD, false); } private void showErrorFragment(MposError error) { ErrorFragment fragment = ErrorFragment.newInstance(true, error, null); showFragment(fragment, ErrorFragment.TAG, UiState.READING_CARD_ERROR, true); } }