/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package android.support.v17.leanback.supportleanbackshowcase.app.wizard; import android.app.FragmentManager; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v17.leanback.supportleanbackshowcase.R; import android.support.v17.leanback.widget.GuidanceStylist; import android.support.v17.leanback.widget.GuidedAction; import android.support.v17.leanback.widget.GuidedDatePickerAction; import android.text.TextUtils; import java.util.Calendar; import java.util.List; /** * A fragment for allowing users to enter a new payment information. */ public class WizardNewPaymentStepFragment extends WizardExampleBaseStepFragment { private static final int ACTION_ID_CARD_NUMBER = 1; private static final int ACTION_ID_PAYMENT_EXP = ACTION_ID_CARD_NUMBER + 1; @NonNull @Override public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { String title = getString(R.string.wizard_example_new_payment_guidance_title); String description = getString(R.string.wizard_example_new_payment_guidance_description); String breadcrumb = mMovie.getBreadcrump(); GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description, breadcrumb, null); return guidance; } @Override public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { actions.add(new GuidedAction.Builder(getActivity()) .id(ACTION_ID_CARD_NUMBER) .title(R.string.wizard_example_input_card) .editTitle("") .description(R.string.wizard_example_input_card) .editDescription("Card number") .editable(true) .build() ); actions.add(new GuidedDatePickerAction.Builder(getActivity()) .id(ACTION_ID_PAYMENT_EXP) .title(R.string.wizard_example_expiration_date) .datePickerFormat("MY") .build() ); } @Override public void onCreateButtonActions(@NonNull List<GuidedAction> actions, Bundle savedInstanceState) { actions.add(new GuidedAction.Builder(getActivity()) .clickAction(GuidedAction.ACTION_ID_OK) .build() ); actions.get(actions.size() - 1).setEnabled(false); } @Override public void onGuidedActionClicked(GuidedAction action) { if (action.getId() == GuidedAction.ACTION_ID_OK) { CharSequence cardNumber = findActionById(ACTION_ID_CARD_NUMBER).getDescription(); WizardExample2ndStepFragment.sSelectedCard = WizardExample2ndStepFragment.sCards.size(); WizardExample2ndStepFragment.sCards.add(cardNumber.toString()); popBackStackToGuidedStepFragment(WizardNewPaymentStepFragment.class, FragmentManager.POP_BACK_STACK_INCLUSIVE); } } @Override public long onGuidedActionEditedAndProceed(GuidedAction action) { boolean cardNumberCheck = false; boolean expDateCheck = false; if (action.getId() == ACTION_ID_CARD_NUMBER) { CharSequence cardNumber = action.getEditTitle(); cardNumberCheck = isCardNumberValid(cardNumber); expDateCheck = isExpDateValid(findActionById(ACTION_ID_PAYMENT_EXP)); updateOkButton(cardNumberCheck && expDateCheck); if (cardNumberCheck) { String last4Digits = cardNumber.subSequence(cardNumber.length() - 4, cardNumber.length()).toString(); if ( (Integer.parseInt(last4Digits) & 1) == 0 ) action.setDescription(getString(R.string.wizard_example_visa, last4Digits)); else action.setDescription(getString(R.string.wizard_example_master, last4Digits)); return GuidedAction.ACTION_ID_NEXT; } else if (cardNumber.length() == 0) { action.setDescription(getString(R.string.wizard_example_input_card)); return GuidedAction.ACTION_ID_CURRENT; } else { action.setDescription(getString(R.string.wizard_example_input_credit_wrong)); return GuidedAction.ACTION_ID_CURRENT; } } else if (action.getId() == ACTION_ID_PAYMENT_EXP) { expDateCheck = isExpDateValid(action); cardNumberCheck = isCardNumberValid(findActionById(ACTION_ID_CARD_NUMBER) .getEditTitle()); updateOkButton(cardNumberCheck && expDateCheck); if (expDateCheck) { return GuidedAction.ACTION_ID_NEXT; } } return GuidedAction.ACTION_ID_CURRENT; } private void updateOkButton(boolean enabled) { findButtonActionById(GuidedAction.ACTION_ID_OK).setEnabled(enabled); notifyButtonActionChanged(findButtonActionPositionById(GuidedAction.ACTION_ID_OK)); } private static boolean isCardNumberValid(CharSequence number) { return (TextUtils.isDigitsOnly(number) && number.length() == 16); } private static boolean isExpDateValid(GuidedAction dateAction) { long date = ((GuidedDatePickerAction) dateAction).getDate(); Calendar c = Calendar.getInstance(); c.setTimeInMillis(date); return Calendar.getInstance().before(c); } }