package com.fourtails.usuariolecturista.fragments; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.app.AlertDialog; import android.app.DatePickerDialog; import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Button; import android.widget.CheckBox; import android.widget.DatePicker; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import com.fourtails.usuariolecturista.MainActivity; import com.fourtails.usuariolecturista.R; import com.fourtails.usuariolecturista.ottoEvents.PrepayPaymentAttemptEvent; import com.fourtails.usuariolecturista.utilities.DatePickerFragmentCreditCard; import com.melnykov.fab.FloatingActionButton; import com.stripe.android.model.Card; import java.util.Calendar; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; /** * Prepaid fragment */ public class PrepayCalculatorFragment extends Fragment { public final String TAG = "PrepaidFragment"; /** * Dialog views * */ TextView textViewCreditCardExpirationDate; EditText editTextCreditCardNumber; EditText editTextCreditCardName; EditText editTextCCV; TextView textViewSubTotalPay; CheckBox checkBoxAgreedTAC; Button payButton; private AlertDialog payDialog = null; int selectedMonth; int selectedYear; /** * **************** */ @Bind(R.id.editTextPrepaidInput) public EditText litersToBuy; @OnClick(R.id.keyboardButton_0) public void keyboard0Clicked() { keyboardClicked(0); } @OnClick(R.id.keyboardButton_1) public void keyboard1Clicked() { keyboardClicked(1); } @OnClick(R.id.keyboardButton_2) public void keyboard2Clicked() { keyboardClicked(2); } @OnClick(R.id.keyboardButton_3) public void keyboard3Clicked() { keyboardClicked(3); } @OnClick(R.id.keyboardButton_4) public void keyboard4Clicked() { keyboardClicked(4); } @OnClick(R.id.keyboardButton_5) public void keyboard5Clicked() { keyboardClicked(5); } @OnClick(R.id.keyboardButton_6) public void keyboard6Clicked() { keyboardClicked(6); } @OnClick(R.id.keyboardButton_7) public void keyboard7Clicked() { keyboardClicked(7); } @OnClick(R.id.keyboardButton_8) public void keyboard8Clicked() { keyboardClicked(8); } @OnClick(R.id.keyboardButton_9) public void keyboard9Clicked() { keyboardClicked(9); } @OnClick(R.id.keyboardButton_backspace) public void keyboardBackspaceClicked() { // delete one character String cubicMeterString = litersToBuy.getText().toString(); if (cubicMeterString.length() > 0) { String tempString = new StringBuilder(cubicMeterString) .deleteCharAt(cubicMeterString.length() - 1).toString(); litersToBuy.setText(tempString); if (tempString.length() == 0) { hideFab(); hidePayButton(); textViewPrepaidPrice.setText(null); } } else { hideFab(); hidePayButton(); textViewPrepaidPrice.setText(null); } } @OnClick(R.id.keyboardButton_clear) public void keyboardClearClicked() { // clear password field hideFab(); hidePayButton(); litersToBuy.setText(null); textViewPrepaidPrice.setText(null); } public void keyboardClicked(int key) { litersToBuy.append(String.valueOf(key)); showFab(); } @Bind(R.id.textViewPrepaidPrice) TextView textViewPrepaidPrice; @Bind(R.id.fabCalculate) FloatingActionButton fabCalculate; @OnClick(R.id.fabCalculate) public void calculateClicked() { if (litersToBuy.getText().length() > 0 && MainActivity.prepayFactor > 0) { int liters = Integer.parseInt(litersToBuy.getText().toString()); if (liters > 0) { showPayButton(); double peso = liters * MainActivity.prepayFactor; textViewPrepaidPrice.setText(String.valueOf(peso)); } } } @OnClick(R.id.buttonPrePay) public void creditCardClicked() { inflateCreditCardDialog(); } @Bind(R.id.buttonPrePay) Button buttonPrePay; public PrepayCalculatorFragment() { // Required empty public constructor } public boolean isFabButtonShowing = false; public boolean isPayButtonShowing = false; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_prepay_calculator, container, false); ButterKnife.bind(this, view); fabCalculate.hide(); fabCalculate.setVisibility(View.INVISIBLE); buttonPrePay.setVisibility(View.INVISIBLE); return view; } @Override public void onResume() { super.onResume(); // Set title MainActivity.bus.post(getResources().getString(R.string.toolbarTitlePrepaidOptions)); } /** * Show the calculate button */ private void showFab() { if (!isFabButtonShowing) { isFabButtonShowing = true; // Set the content view to 0% opacity but visible, so that it is visible // (but fully transparent) during the animation. fabCalculate.setAlpha(0f); fabCalculate.setVisibility(View.VISIBLE); // Animate the content view to 100% opacity, and clear any animation // listener set on the view. fabCalculate.animate() .alpha(1f) .setDuration(MainActivity.mShortAnimationDuration) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fabCalculate.show(); } }); } } /** * Hide the calculate button */ private void hideFab() { if (isFabButtonShowing) { isFabButtonShowing = false; fabCalculate.hide(); // Set the content view to 0% opacity but visible, so that it is visible // (but fully transparent) during the animation. fabCalculate.setAlpha(1f); fabCalculate.setVisibility(View.VISIBLE); // Animate the content view to 100% opacity, and clear any animation // listener set on the view. fabCalculate.animate() .alpha(0f) .setDuration(MainActivity.mShortAnimationDuration) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { fabCalculate.setVisibility(View.INVISIBLE); } }); } } private void showPayButton() { if (!isPayButtonShowing) { isPayButtonShowing = true; buttonPrePay.setAlpha(0f); buttonPrePay.setVisibility(View.VISIBLE); buttonPrePay.animate() .alpha(1f) .setDuration(MainActivity.mShortAnimationDuration) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { buttonPrePay.setVisibility(View.VISIBLE); } }); } } private void hidePayButton() { if (isPayButtonShowing) { isPayButtonShowing = false; buttonPrePay.animate() .alpha(0f) .setDuration(MainActivity.mShortAnimationDuration) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { buttonPrePay.setVisibility(View.INVISIBLE); } }); } } /** * Inflates the credit card alert dialog, can't be injected */ private void inflateCreditCardDialog() { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.fragment_add_credit_card, null); AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setView(view); payDialog = builder.show(); textViewCreditCardExpirationDate = (TextView) view.findViewById(R.id.editTextCreditCardExpirationDate); // spinnerCreditCardSelector = (Spinner) view.findViewById(R.id.spinnerCreditCardSelector); editTextCreditCardNumber = (EditText) view.findViewById(R.id.editTextCreditCardNumber); editTextCreditCardName = (EditText) view.findViewById(R.id.editTextCreditCardName); editTextCCV = (EditText) view.findViewById(R.id.editTextCCV); checkBoxAgreedTAC = (CheckBox) view.findViewById(R.id.checkBoxAgreedTAC); textViewSubTotalPay = (TextView) view.findViewById(R.id.textViewSubTotalPay); payButton = (Button) view.findViewById(R.id.buttonPayWithCC); textViewSubTotalPay.setText(String.valueOf(textViewPrepaidPrice.getText())); textViewCreditCardExpirationDate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { showDatePicker(); } }); payButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { payButtonClicked(); } }); } /** * Checks if TAC is accepted and the credit card is valid, if so, then goes to main Activity * to initiate the payment process */ private void payButtonClicked() { if (checkBoxAgreedTAC.isChecked()) { boolean validCard = validateCard(); if (validCard) { Double payAmount = Double.parseDouble(textViewPrepaidPrice.getText().toString()); MainActivity.bus.post(new PrepayPaymentAttemptEvent(payAmount, Long.parseLong(litersToBuy.getText().toString()))); if (PrepayCalculatorFragment.this.payDialog != null) { PrepayCalculatorFragment.this.payDialog.dismiss(); } } } else { Toast.makeText(getActivity(), getResources().getString(R.string.TACMustAgreedMessage), Toast.LENGTH_SHORT).show(); } } /** * Square Credit card validation * * @return */ private boolean validateCard() { Card card = new Card( editTextCreditCardNumber.getText().toString(), selectedMonth, selectedYear, editTextCCV.getText().toString() ); boolean validation = card.validateCard(); if (validation) { return true; } else if (!card.validateNumber()) { Toast.makeText(getActivity(), getResources().getString(R.string.creditCardErrorNumber), Toast.LENGTH_SHORT).show(); return false; } else if (!card.validateExpiryDate()) { Toast.makeText(getActivity(), getResources().getString(R.string.creditCardErrorExpiryDate), Toast.LENGTH_SHORT).show(); return false; } else if (!card.validateCVC()) { Toast.makeText(getActivity(), getResources().getString(R.string.creditCardErrorCCV), Toast.LENGTH_SHORT).show(); return false; } else { Toast.makeText(getActivity(), getResources().getString(R.string.creditCardError), Toast.LENGTH_SHORT).show(); return false; } } /** * This will call for an special date picker without the "day" */ private void showDatePicker() { DatePickerFragmentCreditCard date = new DatePickerFragmentCreditCard(); /** * Set Up Current Date Into dialog */ Calendar calendar = Calendar.getInstance(); Bundle args = new Bundle(); args.putInt("year", calendar.get(Calendar.YEAR)); args.putInt("month", calendar.get(Calendar.MONTH)); args.putInt("day", calendar.get(Calendar.DAY_OF_MONTH)); args.putLong("currentDateInMillis", calendar.getTimeInMillis()); date.setArguments(args); /** * Set Call back to capture selected date */ date.setCallBack(ondate); date.show(getFragmentManager(), "Date Picker"); } /** * Dialog Listener */ DatePickerDialog.OnDateSetListener ondate = new DatePickerDialog.OnDateSetListener() { public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { selectedMonth = monthOfYear + 1; selectedYear = year; textViewCreditCardExpirationDate.setText(String.valueOf(monthOfYear + 1) + "-" + String.valueOf(year)); } }; }