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