13454409cf332f945482f471c9ee61aa70ccc26d3susnata/* 23454409cf332f945482f471c9ee61aa70ccc26d3susnata * Copyright (C) 2015 The Android Open Source Project 33454409cf332f945482f471c9ee61aa70ccc26d3susnata * 43454409cf332f945482f471c9ee61aa70ccc26d3susnata * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except 53454409cf332f945482f471c9ee61aa70ccc26d3susnata * in compliance with the License. You may obtain a copy of the License at 63454409cf332f945482f471c9ee61aa70ccc26d3susnata * 73454409cf332f945482f471c9ee61aa70ccc26d3susnata * http://www.apache.org/licenses/LICENSE-2.0 83454409cf332f945482f471c9ee61aa70ccc26d3susnata * 93454409cf332f945482f471c9ee61aa70ccc26d3susnata * Unless required by applicable law or agreed to in writing, software distributed under the License 103454409cf332f945482f471c9ee61aa70ccc26d3susnata * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express 113454409cf332f945482f471c9ee61aa70ccc26d3susnata * or implied. See the License for the specific language governing permissions and limitations under 123454409cf332f945482f471c9ee61aa70ccc26d3susnata * the License. 133454409cf332f945482f471c9ee61aa70ccc26d3susnata */ 143454409cf332f945482f471c9ee61aa70ccc26d3susnata 15a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiripackage android.support.v17.leanback.supportleanbackshowcase.app.wizard; 16a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 17a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.app.FragmentManager; 18a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.os.Bundle; 19a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.support.annotation.NonNull; 20a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.support.v17.leanback.supportleanbackshowcase.R; 21a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.support.v17.leanback.widget.GuidanceStylist; 22a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.support.v17.leanback.widget.GuidedAction; 23a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.support.v17.leanback.widget.GuidedDatePickerAction; 24a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport android.text.TextUtils; 25a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 26a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport java.util.Calendar; 27a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiriimport java.util.List; 28a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 29a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri/** 303454409cf332f945482f471c9ee61aa70ccc26d3susnata * A fragment for allowing users to enter a new payment information. 31a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri */ 32a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiripublic class WizardNewPaymentStepFragment extends WizardExampleBaseStepFragment { 33a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 34a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri private static final int ACTION_ID_CARD_NUMBER = 1; 35a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri private static final int ACTION_ID_PAYMENT_EXP = ACTION_ID_CARD_NUMBER + 1; 36a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 37a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri @NonNull 38a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri @Override 39a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri public GuidanceStylist.Guidance onCreateGuidance(Bundle savedInstanceState) { 40a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri String title = getString(R.string.wizard_example_new_payment_guidance_title); 41a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri String description = getString(R.string.wizard_example_new_payment_guidance_description); 42a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri String breadcrumb = mMovie.getBreadcrump(); 43a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 44a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri GuidanceStylist.Guidance guidance = new GuidanceStylist.Guidance(title, description, 45a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri breadcrumb, null); 46a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return guidance; 47a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 48a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 49a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri @Override 50a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 51a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri actions.add(new GuidedAction.Builder(getActivity()) 52a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .id(ACTION_ID_CARD_NUMBER) 53a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .title(R.string.wizard_example_input_card) 54a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .editTitle("") 55a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .description(R.string.wizard_example_input_card) 56a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .editDescription("Card number") 57a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .editable(true) 58a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .build() 59a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri ); 60a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 61a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri actions.add(new GuidedDatePickerAction.Builder(getActivity()) 62a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .id(ACTION_ID_PAYMENT_EXP) 63a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .title(R.string.wizard_example_expiration_date) 64a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .datePickerFormat("MY") 65a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .build() 66a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri ); 67a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 68a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 69a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri @Override 70a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri public void onCreateButtonActions(@NonNull List<GuidedAction> actions, 71a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri Bundle savedInstanceState) { 72a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri actions.add(new GuidedAction.Builder(getActivity()) 73a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .clickAction(GuidedAction.ACTION_ID_OK) 74a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .build() 75a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri ); 76a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri actions.get(actions.size() - 1).setEnabled(false); 77a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 78a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 79a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri @Override 80a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri public void onGuidedActionClicked(GuidedAction action) { 81a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri if (action.getId() == GuidedAction.ACTION_ID_OK) { 82a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri CharSequence cardNumber = findActionById(ACTION_ID_CARD_NUMBER).getDescription(); 83a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri WizardExample2ndStepFragment.sSelectedCard = WizardExample2ndStepFragment.sCards.size(); 84a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri WizardExample2ndStepFragment.sCards.add(cardNumber.toString()); 85a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri popBackStackToGuidedStepFragment(WizardNewPaymentStepFragment.class, 86a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri FragmentManager.POP_BACK_STACK_INCLUSIVE); 87a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 88a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 89a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 90a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri @Override 91a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri public long onGuidedActionEditedAndProceed(GuidedAction action) { 92a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 93a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri boolean cardNumberCheck = false; 94a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri boolean expDateCheck = false; 95a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 96a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri if (action.getId() == ACTION_ID_CARD_NUMBER) { 97a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri CharSequence cardNumber = action.getEditTitle(); 98a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri cardNumberCheck = isCardNumberValid(cardNumber); 99a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri expDateCheck = isExpDateValid(findActionById(ACTION_ID_PAYMENT_EXP)); 100a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri updateOkButton(cardNumberCheck && expDateCheck); 101a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 102a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri if (cardNumberCheck) { 103a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri String last4Digits = cardNumber.subSequence(cardNumber.length() - 4, 104a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri cardNumber.length()).toString(); 105a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 106a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri if ( (Integer.parseInt(last4Digits) & 1) == 0 ) 107a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri action.setDescription(getString(R.string.wizard_example_visa, 108a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri last4Digits)); 109a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri else 110a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri action.setDescription(getString(R.string.wizard_example_master, 111a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri last4Digits)); 112a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 113a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return GuidedAction.ACTION_ID_NEXT; 114a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } else if (cardNumber.length() == 0) { 115a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri action.setDescription(getString(R.string.wizard_example_input_card)); 116a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return GuidedAction.ACTION_ID_CURRENT; 117a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } else { 118a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri action.setDescription(getString(R.string.wizard_example_input_credit_wrong)); 119a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return GuidedAction.ACTION_ID_CURRENT; 120a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 121a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 122a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } else if (action.getId() == ACTION_ID_PAYMENT_EXP) { 123a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri expDateCheck = isExpDateValid(action); 124a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri cardNumberCheck = isCardNumberValid(findActionById(ACTION_ID_CARD_NUMBER) 125a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri .getEditTitle()); 126a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri updateOkButton(cardNumberCheck && expDateCheck); 127a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri if (expDateCheck) { 128a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return GuidedAction.ACTION_ID_NEXT; 129a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 130a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 131a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return GuidedAction.ACTION_ID_CURRENT; 132a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 133a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 134a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri private void updateOkButton(boolean enabled) { 135a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri findButtonActionById(GuidedAction.ACTION_ID_OK).setEnabled(enabled); 136a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri notifyButtonActionChanged(findButtonActionPositionById(GuidedAction.ACTION_ID_OK)); 137a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 138a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 139a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri private static boolean isCardNumberValid(CharSequence number) { 140a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return (TextUtils.isDigitsOnly(number) && number.length() == 16); 141a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 142a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri 143a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri private static boolean isExpDateValid(GuidedAction dateAction) { 144a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri long date = ((GuidedDatePickerAction) dateAction).getDate(); 145a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri Calendar c = Calendar.getInstance(); 146a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri c.setTimeInMillis(date); 147a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri return Calendar.getInstance().before(c); 148a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri } 149a1e57afa053b57929b7914276660e1ba4800635fKeyvan Amiri} 150