/* * Copyright (C) 2016 Payworks GmbH (http://www.payworks.com) * * The MIT License (MIT) * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package io.mpos.ui.tester; import android.app.Dialog; import android.content.DialogInterface; import android.content.Intent; import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.DialogFragment; import android.support.v4.content.ContextCompat; import android.support.v7.app.AlertDialog; import android.support.v7.app.AppCompatActivity; import android.text.Html; import android.text.method.LinkMovementMethod; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.TextView; import android.widget.Toast; import java.math.BigDecimal; import java.util.EnumSet; import io.mpos.Mpos; import io.mpos.accessories.AccessoryFamily; import io.mpos.accessories.parameters.AccessoryParameters; import io.mpos.errors.MposError; import io.mpos.provider.ProviderMode; import io.mpos.transactionprovider.processparameters.TransactionProcessParameters; import io.mpos.transactions.CardDetails; import io.mpos.transactions.Currency; import io.mpos.transactions.parameters.TransactionParameters; import io.mpos.ui.acquirer.ApplicationName; import io.mpos.ui.shared.MposUi; import io.mpos.ui.shared.model.MposUiConfiguration; import static android.view.View.OnClickListener; @SuppressWarnings("ConstantConditions") public class CheckoutActivity extends AppCompatActivity { private final static String MERCHANT_ID = "<create a test merchant in the gateway manager>"; private final static String MERCHANT_SECRET = "<create a test merchant in the gateway manager>"; private String mLastTransactionIdentifier = null; private boolean mIsAcquirerMode = false; @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_checkout); TextView sdkVersionText = (TextView) findViewById(R.id.sdk_version); sdkVersionText.setText("SDK version : " + Mpos.getVersion()); MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, MERCHANT_ID, MERCHANT_SECRET); // MOCK mode findViewById(R.id.transaction_signature).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initMockMode(); startPayment(108.20); } }); findViewById(R.id.transaction_application_selection).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initMockMode(); startPayment(113.73); } }); findViewById(R.id.transaction_declined).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initMockMode(); startPayment(110.40); } }); findViewById(R.id.transaction_ask_for_tip).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { initMockMode(); TransactionProcessParameters processParameters = new TransactionProcessParameters.Builder() .addAskForTipStep() .build(); startPayment(105, true, processParameters); } }); // TEST mode findViewById(R.id.transaction_e105_charge).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mIsAcquirerMode) { initTestMode(); MposUi mposUi = MposUi.getInitializedInstance(); AccessoryParameters accessoryParameters = new AccessoryParameters.Builder(AccessoryFamily.VERIFONE_E105).audioJack().build(); mposUi.getConfiguration().setTerminalParameters(accessoryParameters); } startPayment(13.37); } }); findViewById(R.id.transaction_miura_charge).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mIsAcquirerMode) { initTestMode(); } startPayment(13.37); } }); findViewById(R.id.transaction_miura_preauthorize).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mIsAcquirerMode) { initTestMode(); } startPayment(13.37, false); } }); findViewById(R.id.transaction_miura_charge_with_tip).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mIsAcquirerMode) { initTestMode(); } TransactionProcessParameters processParameters = new TransactionProcessParameters.Builder().addAskForTipStep().build(); startPayment(13.37, true, processParameters); } }); findViewById(R.id.read_card).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (!mIsAcquirerMode) { initTestMode(); } readCard(); } }); // Initialization findViewById(R.id.init_with_concardis).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIsAcquirerMode = true; MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, ApplicationName.CONCARDIS, "test-integrator"); } }); findViewById(R.id.init_with_mcashier).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIsAcquirerMode = true; MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, ApplicationName.MCASHIER, "test-integrator"); } }); findViewById(R.id.init_with_secure_retail).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIsAcquirerMode = true; MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, ApplicationName.SECURE_RETAIL, "test-integrator"); } }); findViewById(R.id.init_with_yourbrand).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIsAcquirerMode = true; MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, ApplicationName.YOURBRAND, "test-integrator"); } }); findViewById(R.id.init_with_barclaycard).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIsAcquirerMode = true; MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, ApplicationName.BARCLAYCARD, "test-integrator"); } }); findViewById(R.id.init_with_provider).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mIsAcquirerMode = false; initTestMode(); } }); // Acquirer findViewById(R.id.show_login).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = MposUi.getInitializedInstance().createLoginIntent(); startActivityForResult(intent, MposUi.REQUEST_CODE_LOGIN); } }); findViewById(R.id.show_settings).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent intent = MposUi.getInitializedInstance().createSettingsIntent(); startActivityForResult(intent, MposUi.REQUEST_CODE_SETTINGS); } }); findViewById(R.id.logout).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { MposUi.getInitializedInstance().logout(); } }); // Last transaction action findViewById(R.id.summary_last).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Intent summaryIntent = MposUi.getInitializedInstance().createTransactionSummaryIntent(mLastTransactionIdentifier); startActivityForResult(summaryIntent, MposUi.REQUEST_CODE_SHOW_SUMMARY); } }); findViewById(R.id.refund_last).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TransactionParameters transactionParameters = new TransactionParameters.Builder().refund(mLastTransactionIdentifier) .subject("subject-refund") .build(); Intent refundIntent = MposUi.getInitializedInstance().createTransactionIntent(transactionParameters); startActivity(refundIntent); } }); findViewById(R.id.capture_last).setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { TransactionParameters transactionParameters = new TransactionParameters.Builder().capture(mLastTransactionIdentifier).build(); Intent captureIntent = MposUi.getInitializedInstance().createTransactionIntent(transactionParameters); startActivity(captureIntent); } }); findViewById(R.id.print_last).setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { Intent intent = MposUi.getInitializedInstance().createPrintReceiptIntent(mLastTransactionIdentifier); startActivityForResult(intent, MposUi.REQUEST_CODE_PRINT_RECEIPT); } }); updateViews(); } void initMockMode() { MposUi mposUi = MposUi.initialize(CheckoutActivity.this, ProviderMode.MOCK, "mock", "mock"); AccessoryParameters mockAccessoryParameters = new AccessoryParameters.Builder(AccessoryFamily.MOCK).mocked().build(); mposUi.getConfiguration().setTerminalParameters(mockAccessoryParameters); MposUi.getInitializedInstance().getConfiguration().setPrinterParameters(mockAccessoryParameters); mposUi.getConfiguration().setSummaryFeatures(EnumSet.allOf(MposUiConfiguration.SummaryFeature.class)); // // Styling the summary screen. // MposUi.getInitializedInstance(). // getConfiguration().getAppearance(). // setApprovedBackgroundColor(ContextCompat.getColor(this, R.color.mpu_pw_brand_color3)). // setPreAuthorizedBackgroundColor(ContextCompat.getColor(this, R.color.mpu_pw_brand_color4)). // setDeclinedBackgroundColor(ContextCompat.getColor(this, R.color.mpu_pw_brand_color5)). // setRefundedBackgroundColor(ContextCompat.getColor(this, R.color.mpu_pw_brand_color2)). // setApprovedTextColor(ContextCompat.getColor(this, android.R.color.black)). // setPreAuthorizedTextColor(ContextCompat.getColor(this, android.R.color.black)). // setDeclinedTextColor(ContextCompat.getColor(this, android.R.color.black)). // setRefundedTextColor(ContextCompat.getColor(this, android.R.color.black)); } void initTestMode() { MposUi mposUi = MposUi.initialize(CheckoutActivity.this, ProviderMode.TEST, MERCHANT_ID, MERCHANT_SECRET); mposUi.getConfiguration().setSummaryFeatures(EnumSet.allOf(MposUiConfiguration.SummaryFeature.class)); AccessoryParameters accessoryParameters = new AccessoryParameters.Builder(AccessoryFamily.MIURA_MPI).bluetooth().build(); mposUi.getConfiguration().setTerminalParameters(accessoryParameters); AccessoryParameters printerAccessoryParams = new AccessoryParameters.Builder(AccessoryFamily.SEWOO).bluetooth().build(); MposUi.getInitializedInstance().getConfiguration().setPrinterParameters(printerAccessoryParams); //Styling the MposUI MposUi.getInitializedInstance(). getConfiguration().getAppearance(). setColorPrimary(ContextCompat.getColor(this, R.color.mpu_pw_brand_color3)). setColorPrimaryDark(ContextCompat.getColor(this, R.color.mpu_pw_brand_color3_dark)). setTextColorPrimary(Color.WHITE); } void startPayment(double amount, boolean autoCapture) { startPayment(amount, autoCapture, null); } void startPayment(double amount) { startPayment(amount, true, null); } void startPayment(double amount, boolean autoCapture, TransactionProcessParameters processParameters) { TransactionParameters params = new TransactionParameters.Builder() .charge(BigDecimal.valueOf(amount), Currency.EUR) .subject("How much wood would a woodchuck chuck if a woodchuck could chuck wood?") .customIdentifier("customId") .autoCapture(autoCapture) .build(); Intent intent = MposUi.getInitializedInstance().createTransactionIntent(params, processParameters); startActivityForResult(intent, MposUi.REQUEST_CODE_PAYMENT); } void readCard() { Intent intent = MposUi.getInitializedInstance().createReadCardIntent(); startActivityForResult(intent, MposUi.REQUEST_CODE_READ_CARD); } void updateViews() { int visibility = mLastTransactionIdentifier != null ? View.VISIBLE : View.GONE; findViewById(R.id.summary_last).setVisibility(visibility); findViewById(R.id.refund_last).setVisibility(visibility); findViewById(R.id.print_last).setVisibility(visibility); findViewById(R.id.capture_last).setVisibility(visibility); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == MposUi.REQUEST_CODE_PAYMENT) { if (resultCode == MposUi.RESULT_CODE_APPROVED) { Toast.makeText(this, "Transaction Approved", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Transaction Failed", Toast.LENGTH_SHORT).show(); } mLastTransactionIdentifier = data.getStringExtra(MposUi.RESULT_EXTRA_TRANSACTION_IDENTIFIER); updateViews(); } else if (requestCode == MposUi.REQUEST_CODE_PRINT_RECEIPT) { if (resultCode == MposUi.RESULT_CODE_PRINT_SUCCESS) { Toast.makeText(this, "Printing Receipt Success", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Printing Receipt Failed", Toast.LENGTH_SHORT).show(); } } else if (requestCode == MposUi.REQUEST_CODE_SHOW_SUMMARY) { // resultCode is always MposUi.RESULT_CODE_SUMMARY_CLOSED Toast.makeText(this, "Summary Closed", Toast.LENGTH_SHORT).show(); } else if (requestCode == MposUi.REQUEST_CODE_LOGIN) { if (resultCode == MposUi.RESULT_CODE_LOGIN_SUCCESS) { Toast.makeText(this, "Login Success", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Login Failed", Toast.LENGTH_SHORT).show(); } } else if (requestCode == MposUi.REQUEST_CODE_SETTINGS) { // resultCode is always MposUi.RESULT_CODE_SETTINGS_CLOSED Toast.makeText(this, "Summary Closed", Toast.LENGTH_SHORT).show(); } else if (requestCode == MposUi.REQUEST_CODE_READ_CARD) { if (resultCode == MposUi.RESULT_CODE_READ_CARD_SUCCESS) { // Results of the read card is available on the MposUi instance CardDetails cardDetails = MposUi.getInitializedInstance().getCardDetails(); Toast.makeText(this, "Reading card success", Toast.LENGTH_SHORT).show(); } else { MposError error = MposUi.getInitializedInstance().getError(); if (error == null) { Toast.makeText(this, "Read card aborted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Read card failed" + error.getErrorType().name(), Toast.LENGTH_SHORT).show(); } } } // an error could have occurred regardless of the main outcome // e.g. a transaction was successful but there was an error when sending the receipt MposError error = MposUi.getInitializedInstance().getError(); if (error != null) { Toast.makeText(this, "An error occurred: " + error.getInfo(), Toast.LENGTH_SHORT).show(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_info, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_info) { new InfoDialog().show(getSupportFragmentManager(), "INFO"); return true; } return super.onOptionsItemSelected(item); } public static class InfoDialog extends DialogFragment { @NonNull @Override public Dialog onCreateDialog(Bundle savedInstanceState) { // Get app version LayoutInflater layoutInflater = getActivity().getLayoutInflater(); View rootView = layoutInflater.inflate(R.layout.dialog_info, null); ((TextView) rootView.findViewById(R.id.info_sdk_version)).setText("SDK Version: " + Mpos.getVersion()); ((TextView) rootView.findViewById(R.id.info_body)).setText(Html.fromHtml(getString(R.string.info_body))); ((TextView) rootView.findViewById(R.id.info_body)).setMovementMethod(LinkMovementMethod.getInstance()); return new AlertDialog.Builder(getActivity(), getTheme()) .setView(rootView) .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int i) { dialog.dismiss(); } }).create(); } } }