16f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing/*
26f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * Copyright (C) 2014 The Android Open Source Project
36f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing *
46f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * Licensed under the Apache License, Version 2.0 (the "License");
56f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * you may not use this file except in compliance with the License.
66f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * You may obtain a copy of the License at
76f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing *
86f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing *      http://www.apache.org/licenses/LICENSE-2.0
96f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing *
106f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * Unless required by applicable law or agreed to in writing, software
116f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * distributed under the License is distributed on an "AS IS" BASIS,
126f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
136f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * See the License for the specific language governing permissions and
146f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * limitations under the License.
156f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing */
166f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
176f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingpackage com.example.android.leanback;
186f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
196f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.app.Activity;
20ae746be7c46297b910a99c07697e33e3a5fd7facDake Guimport android.app.Fragment;
216f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.app.FragmentManager;
226f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.content.Context;
234e3ba904e4dbe45b80eb20288367620b84950232Kris Giesingimport android.content.res.Configuration;
246f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.graphics.drawable.Drawable;
256f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.os.Bundle;
266f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.support.v17.leanback.app.GuidedStepFragment;
276f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.support.v17.leanback.widget.GuidanceStylist;
286f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport android.support.v17.leanback.widget.GuidanceStylist.Guidance;
2920767a171ab46addb5d50248d4267db14c0c8883susnataimport android.support.v17.leanback.widget.GuidedAction;
3020767a171ab46addb5d50248d4267db14c0c8883susnataimport android.support.v17.leanback.widget.GuidedActionsStylist;
3120767a171ab46addb5d50248d4267db14c0c8883susnataimport android.support.v17.leanback.widget.GuidedDatePickerAction;
32b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Guimport android.support.v4.content.res.ResourcesCompat;
331f735b248bf5e9d37791b6aed4b2c634e41912abDake Guimport android.text.InputType;
348374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Guimport android.text.TextUtils;
354e3ba904e4dbe45b80eb20288367620b84950232Kris Giesingimport android.util.Log;
36ae746be7c46297b910a99c07697e33e3a5fd7facDake Guimport android.view.LayoutInflater;
37ae746be7c46297b910a99c07697e33e3a5fd7facDake Guimport android.view.View;
384e3ba904e4dbe45b80eb20288367620b84950232Kris Giesingimport android.view.ViewGroup;
3906c39be6a0e6e44986083280451115a4a701ec73Dake Guimport android.view.inputmethod.EditorInfo;
406f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
41cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Guimport java.util.ArrayList;
427298559f4bd911900e4baaaaf52be5fcb8353759Dake Guimport java.util.Calendar;
436f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingimport java.util.List;
446f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
456f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing/**
466f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing * Activity that showcases different aspects of GuidedStepFragments.
476f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing */
486f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesingpublic class GuidedStepActivity extends Activity {
496f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
509f4e25b607fc4ec53b4f2b4996f49481857afdabKris Giesing    private static final int BACK = 2;
516f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
528374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu    private static final int FIRST_NAME = 3;
538374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu    private static final int LAST_NAME = 4;
541f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu    private static final int PASSWORD = 5;
551f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu    private static final int PAYMENT = 6;
56cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    private static final int NEW_PAYMENT = 7;
577298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu    private static final int PAYMENT_EXPIRE = 8;
584e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
5997906d5d967189bdcac6491fffa20c2cb0003466Dake Gu    private static final long RADIO_ID_BASE = 0;
6097906d5d967189bdcac6491fffa20c2cb0003466Dake Gu    private static final long CHECKBOX_ID_BASE = 100;
6197906d5d967189bdcac6491fffa20c2cb0003466Dake Gu
6297906d5d967189bdcac6491fffa20c2cb0003466Dake Gu    private static final long DEFAULT_OPTION = RADIO_ID_BASE;
6397906d5d967189bdcac6491fffa20c2cb0003466Dake Gu
646f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    private static final String[] OPTION_NAMES = { "Option A", "Option B", "Option C" };
656f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    private static final String[] OPTION_DESCRIPTIONS = { "Here's one thing you can do",
666f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            "Here's another thing you can do", "Here's one more thing you can do" };
676f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
684e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    private static final String TAG = GuidedStepActivity.class.getSimpleName();
694e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
706f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    @Override
716f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    protected void onCreate(Bundle savedInstanceState) {
724e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        Log.v(TAG, "onCreate");
736f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        super.onCreate(savedInstanceState);
74ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu        setContentView(R.layout.guided_step_activity);
75c0a78151957be5562ba1c650585a37d084e9ce59Dake Gu        if (savedInstanceState == null) {
76c0a78151957be5562ba1c650585a37d084e9ce59Dake Gu            GuidedStepFragment.addAsRoot(this, new FirstStepFragment(), R.id.lb_guidedstep_host);
77c0a78151957be5562ba1c650585a37d084e9ce59Dake Gu        }
784e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    }
794e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
804e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    @Override
814e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    public void onConfigurationChanged(Configuration newConfig) {
824e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        Log.v(TAG, "onConfigurationChanged");
834e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        super.onConfigurationChanged(newConfig);
844e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    }
854e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
864e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    @Override
874e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    protected void onSaveInstanceState(Bundle outState) {
884e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        Log.v(TAG, "onSaveInstanceState");
894e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        super.onSaveInstanceState(outState);
904e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    }
914e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
924e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    @Override
934e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    protected void onRestoreInstanceState(Bundle savedInstanceState) {
944e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        Log.v(TAG, "onRestoreInstanceState");
954e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        super.onRestoreInstanceState(savedInstanceState);
966f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    }
976f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
98ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addAction(List<GuidedAction> actions, long id, String title,
99ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            String desc) {
100ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
101b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        actions.add(action = new GuidedAction.Builder(null)
1026f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .id(id)
1036f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .title(title)
1046f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .description(desc)
1056f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .build());
106ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1076f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    }
1086f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
109ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addAction(List<GuidedAction> actions, long id, String title,
110ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            String desc, List<GuidedAction> subActions) {
111ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
112b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        actions.add(action = new GuidedAction.Builder(null)
113cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                .id(id)
114cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                .title(title)
115cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                .description(desc)
116cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                .subActions(subActions)
117cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                .build());
118ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
119cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    }
120cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
121ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addEditableAction(Context context, List<GuidedAction> actions,
122ab46229b057fb33e73a6214c781b3b9a0562d046Dake Gu            long id, String title, String desc) {
123ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
124ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        actions.add(action = new GuidedAction.Builder(context)
1254e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing                .id(id)
1264e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing                .title(title)
1274e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing                .description(desc)
1284e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing                .editable(true)
129ab46229b057fb33e73a6214c781b3b9a0562d046Dake Gu                .icon(R.drawable.lb_ic_search_mic)
1304e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing                .build());
131ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1324e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    }
1334e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
134ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addEditableAction(List<GuidedAction> actions, long id, String title,
1358374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu            String editTitle, String desc) {
136ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
137b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        actions.add(action = new GuidedAction.Builder(null)
1388374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu                .id(id)
1398374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu                .title(title)
1408374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu                .editTitle(editTitle)
1418374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu                .description(desc)
1428374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu                .editable(true)
1438374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu                .build());
144ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1458374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu    }
1468374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu
147ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addEditableAction(List<GuidedAction> actions, long id, String title,
1481f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu            String editTitle, int editInputType, String desc, String editDesc) {
149ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
150b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        actions.add(action = new GuidedAction.Builder(null)
1511f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .id(id)
1521f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .title(title)
1531f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .editTitle(editTitle)
1541f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .editInputType(editInputType)
1551f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .description(desc)
1561f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .editDescription(editDesc)
1571f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .editable(true)
1581f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .build());
159ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1601f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu    }
1611f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu
162ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedDatePickerAction addDatePickerAction(List<GuidedAction> actions, long id,
163ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            String title) {
164ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedDatePickerAction action;
165ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        actions.add(action = new GuidedDatePickerAction.Builder(null)
1667298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                .id(id)
1677298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                .title(title)
1687298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                .datePickerFormat("MY")
1697298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                .build());
170ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1717298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu    }
1727298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu
173ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addEditableDescriptionAction(List<GuidedAction> actions, long id,
1741f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu            String title, String desc, String editDescription, int descriptionEditInputType) {
175ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
176b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        actions.add(action = new GuidedAction.Builder(null)
1771f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .id(id)
1781f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .title(title)
1791f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .description(desc)
1801f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .editDescription(editDescription)
1811f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .descriptionEditInputType(descriptionEditInputType)
1821f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .descriptionEditable(true)
1831f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                .build());
184ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1851f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu    }
1861f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu
187ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    private static GuidedAction addCheckedAction(List<GuidedAction> actions, long id,
18806c39be6a0e6e44986083280451115a4a701ec73Dake Gu            String title, String desc, int checkSetId) {
189ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        GuidedAction action;
190b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu        actions.add(action = new GuidedAction.Builder(null)
19197906d5d967189bdcac6491fffa20c2cb0003466Dake Gu                .id(id)
1926f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .title(title)
1936f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .description(desc)
19406c39be6a0e6e44986083280451115a4a701ec73Dake Gu                .checkSetId(checkSetId)
1956f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                .build());
196ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        return action;
1976f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    }
1986f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
1996f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    public static class FirstStepFragment extends GuidedStepFragment {
20020767a171ab46addb5d50248d4267db14c0c8883susnata
2016f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
2026f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public int onProvideTheme() {
2036f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            return R.style.Theme_Example_Leanback_GuidedStep_First;
2046f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
2056f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
2066f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
2076f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public Guidance onCreateGuidance(Bundle savedInstanceState) {
2086f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            String title = getString(R.string.guidedstep_first_title);
2096f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            String breadcrumb = getString(R.string.guidedstep_first_breadcrumb);
2106f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            String description = getString(R.string.guidedstep_first_description);
211b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            final Context context = getActivity();
212b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            Drawable icon = ResourcesCompat.getDrawable(context.getResources(),
213b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu                    R.drawable.ic_main_icon, context.getTheme());
2146f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            return new Guidance(title, description, breadcrumb, icon);
2156f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
2166f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
2176f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
2186f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
21947005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            Context context = getActivity();
22047005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            actions.add(new GuidedAction.Builder(context)
22147005bba6e07c4578530bd151967c0cce7daedc3Dake Gu                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
222971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .description("Let's do it")
223971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .build());
22447005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            actions.add(new GuidedAction.Builder(context)
22547005bba6e07c4578530bd151967c0cce7daedc3Dake Gu                    .clickAction(GuidedAction.ACTION_ID_CANCEL)
226971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .description("Never mind")
227971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .build());
2286f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
2296f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
2306f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
2316f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public void onGuidedActionClicked(GuidedAction action) {
2326f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            FragmentManager fm = getFragmentManager();
233971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
234ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                GuidedStepFragment.add(fm, new SecondStepFragment(), R.id.lb_guidedstep_host);
235971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu            } else if (action.getId() == GuidedAction.ACTION_ID_CANCEL){
236ca5018729526470dfb2599a88869deaa48a7fea9Dake Gu                finishGuidedStepFragments();
2376f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            }
2386f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
2396f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    }
2406f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
241ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    public interface NewPaymentFragmentTarget {
242ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        void onNewPaymentFragmentStarted();
243ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        void onNewPaymentAdded(int selection);
244ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    }
245ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
246cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    static ArrayList<String> sCards = new ArrayList<String>();
247cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    static int sSelectedCard = -1;
248cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    static {
249cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        sCards.add("Visa-1234");
250cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        sCards.add("Master-4321");
251cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    }
252cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
253cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    public static class NewPaymentStepFragment extends GuidedStepFragment {
254cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
255ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        NewPaymentFragmentTarget mNewPaymentTarget;
256ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
257ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        @Override
258ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        public void onCreate(Bundle savedInstance) {
259ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            super.onCreate(savedInstance);
260ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            Fragment targetFragment = getTargetFragment();
261ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            if (targetFragment instanceof NewPaymentFragmentTarget) {
262ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                mNewPaymentTarget = ((NewPaymentFragmentTarget) targetFragment);
263ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                mNewPaymentTarget.onNewPaymentFragmentStarted();
264ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            }
265ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        }
266ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
267cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
268cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        public Guidance onCreateGuidance(Bundle savedInstanceState) {
269cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            String title = getString(R.string.guidedstep_newpayment_title);
270cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            String breadcrumb = getString(R.string.guidedstep_newpayment_breadcrumb);
271cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            String description = getString(R.string.guidedstep_newpayment_description);
272b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            final Context context = getActivity();
273b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            Drawable icon = ResourcesCompat.getDrawable(context.getResources(),
274b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu                    R.drawable.ic_main_icon, context.getTheme());
275cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            return new Guidance(title, description, breadcrumb, icon);
276cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
277cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
278cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
279cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
280cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            addEditableAction(actions, NEW_PAYMENT, "Input credit card number", "",
281cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    InputType.TYPE_CLASS_NUMBER,
282cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    "Input credit card number", "Input credit card number");
2837298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            addDatePickerAction(actions, PAYMENT_EXPIRE, "Exp:");
284cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
285cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
286cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
287cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
28847005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            Context context = getActivity();
28947005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            actions.add(new GuidedAction.Builder(context).clickAction(GuidedAction.ACTION_ID_OK)
290cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    .build());
291cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            actions.get(actions.size() - 1).setEnabled(false);
292cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
293cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
294cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
295cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        public void onGuidedActionClicked(GuidedAction action) {
296cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            if (action.getId() == GuidedAction.ACTION_ID_OK) {
297cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                CharSequence desc = findActionById(NEW_PAYMENT).getDescription();
298cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                String cardNumber = desc.subSequence(desc.length() - 4, desc.length()).toString();
299cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                String card;
300cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                if ((Integer.parseInt(cardNumber) & 1) == 0) {
301cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    card = "Visa "+cardNumber;
302cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                } else {
303cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    card = "Master "+cardNumber;
304cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                }
305ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                int selection = sCards.size();
306cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                sCards.add(card);
307ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                if (mNewPaymentTarget != null) {
308ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                    mNewPaymentTarget.onNewPaymentAdded(selection);
309ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                }
310cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                popBackStackToGuidedStepFragment(NewPaymentStepFragment.class,
311cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
312cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            }
313cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
314cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
315cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
316cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        public long onGuidedActionEditedAndProceed(GuidedAction action) {
317cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            if (action.getId() == NEW_PAYMENT) {
318cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                CharSequence editTitle = action.getEditTitle();
3197298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                if (isCardNumberValid(editTitle)) {
320cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    editTitle = editTitle.subSequence(editTitle.length() - 4, editTitle.length());
321cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    action.setDescription("Visa XXXX-XXXX-XXXX-" + editTitle);
3227298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                    updateOkButton(isExpDateValid(findActionById(PAYMENT_EXPIRE)));
323cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    return GuidedAction.ACTION_ID_NEXT;
324cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                } else if (editTitle.length() == 0) {
325cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    action.setDescription("Input credit card number");
326cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    updateOkButton(false);
327cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    return GuidedAction.ACTION_ID_CURRENT;
328cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                } else {
329cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    action.setDescription("Error credit card number");
330cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    updateOkButton(false);
331cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    return GuidedAction.ACTION_ID_CURRENT;
332cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                }
3337298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            } else if (action.getId() == PAYMENT_EXPIRE) {
3347298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                updateOkButton(isExpDateValid(action) &&
3357298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu                        isCardNumberValid(findActionById(NEW_PAYMENT).getEditTitle()));
336cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            }
337cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            return GuidedAction.ACTION_ID_NEXT;
338cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
339cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
3407298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu        boolean isCardNumberValid(CharSequence number) {
3417298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            return TextUtils.isDigitsOnly(number) && number.length() == 16;
3427298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu        }
3437298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu
3447298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu        boolean isExpDateValid(GuidedAction action) {
3457298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            long date = ((GuidedDatePickerAction) action).getDate();
3467298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            Calendar c = Calendar.getInstance();
3477298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            c.setTimeInMillis(date);
3487298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu            return Calendar.getInstance().before(c);
3497298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu        }
3507298559f4bd911900e4baaaaf52be5fcb8353759Dake Gu
351cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        void updateOkButton(boolean enabled) {
352cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            findButtonActionById(GuidedAction.ACTION_ID_OK).setEnabled(enabled);
353cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            notifyButtonActionChanged(findButtonActionPositionById(GuidedAction.ACTION_ID_OK));
354cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
355cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu    }
356cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
357ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu    public static class SecondStepFragment extends GuidedStepFragment
358ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            implements NewPaymentFragmentTarget {
359ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
360ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
361ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        boolean mExpandPaymentListInOnCreateView;
362ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
363ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        @Override
364ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        public void onNewPaymentAdded(int selection) {
365ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            // if a new payment is added, we dont need expand the sub actions list.
366ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            mExpandPaymentListInOnCreateView = false;
367ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            sSelectedCard = selection;
368ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            updatePaymentAction(findActionById(PAYMENT));
369ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            findButtonActionById(GuidedAction.ACTION_ID_CONTINUE).setEnabled(sSelectedCard != -1);
370ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        }
371ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
372ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        @Override
373ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        public void onNewPaymentFragmentStarted() {
374ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            // if a new payment fragment is opened, when come back we should expand the payment
375ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            // sub actions list unless user created a new payment in onNewPaymentAdded
376ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            mExpandPaymentListInOnCreateView = true;
377ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        }
3786f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
379e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas        @Override
38006c39be6a0e6e44986083280451115a4a701ec73Dake Gu        public GuidedActionsStylist onCreateActionsStylist() {
38106c39be6a0e6e44986083280451115a4a701ec73Dake Gu            return new GuidedActionsStylist() {
382e2104f4b5c8e3ad63570306a25e61502dfe4c418Aurimas Liutikas                @Override
38306c39be6a0e6e44986083280451115a4a701ec73Dake Gu                protected void setupImeOptions(GuidedActionsStylist.ViewHolder vh,
38406c39be6a0e6e44986083280451115a4a701ec73Dake Gu                        GuidedAction action) {
38506c39be6a0e6e44986083280451115a4a701ec73Dake Gu                    if (action.getId() == PASSWORD) {
38606c39be6a0e6e44986083280451115a4a701ec73Dake Gu                        vh.getEditableDescriptionView().setImeActionLabel("Confirm!",
38706c39be6a0e6e44986083280451115a4a701ec73Dake Gu                                EditorInfo.IME_ACTION_DONE);
38806c39be6a0e6e44986083280451115a4a701ec73Dake Gu                    } else {
38906c39be6a0e6e44986083280451115a4a701ec73Dake Gu                        super.setupImeOptions(vh, action);
39006c39be6a0e6e44986083280451115a4a701ec73Dake Gu                    }
39106c39be6a0e6e44986083280451115a4a701ec73Dake Gu                }
39206c39be6a0e6e44986083280451115a4a701ec73Dake Gu            };
39306c39be6a0e6e44986083280451115a4a701ec73Dake Gu        }
39406c39be6a0e6e44986083280451115a4a701ec73Dake Gu
3956f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
3966f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public Guidance onCreateGuidance(Bundle savedInstanceState) {
3976f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            String title = getString(R.string.guidedstep_second_title);
3986f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            String breadcrumb = getString(R.string.guidedstep_second_breadcrumb);
3996f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            String description = getString(R.string.guidedstep_second_description);
400b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            final Context context = getActivity();
401b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            Drawable icon = ResourcesCompat.getDrawable(context.getResources(),
402b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu                    R.drawable.ic_main_icon, context.getTheme());
4036f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            return new Guidance(title, description, breadcrumb, icon);
4046f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
4056f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
4066f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
4074e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
4084c78d0f4beb89792eb955aa4fae85a730966e6a4Dake Gu            addEditableAction(getActivity(), actions, FIRST_NAME, "Pat", "Your first name");
4094c78d0f4beb89792eb955aa4fae85a730966e6a4Dake Gu            addEditableAction(getActivity(), actions, LAST_NAME, "Smith", "Your last name");
410cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            List<GuidedAction> subActions = new ArrayList<GuidedAction>();
411ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            updatePaymentAction(addAction(actions, PAYMENT, "Select Payment", "", subActions));
4121f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu            addEditableDescriptionAction(actions, PASSWORD, "Password", "", "",
4131f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                    InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
4147d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu        }
4157d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu
4167d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu        @Override
4177d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
41847005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            actions.add(new GuidedAction.Builder(getActivity())
41947005bba6e07c4578530bd151967c0cce7daedc3Dake Gu                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
420971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .description("Continue")
421ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                    .enabled(isPasswordValid() && isPaymentValid())
422971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .build());
4234e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        }
4244e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
4254e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        @Override
4264e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        public void onGuidedActionClicked(GuidedAction action) {
427971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
4284e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing                FragmentManager fm = getFragmentManager();
429ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                GuidedStepFragment.add(fm, new ThirdStepFragment(), R.id.lb_guidedstep_host);
4304e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            }
4314e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        }
4324e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
433ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        void updatePaymentAction(GuidedAction paymentAction) {
434ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            List<GuidedAction> subActions = paymentAction.getSubActions();
435ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            subActions.clear();
436ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            for (int i = 0; i < sCards.size(); i++) {
437ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                addCheckedAction(subActions, -1, sCards.get(i), "",
438ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                        GuidedAction.DEFAULT_CHECK_SET_ID);
439ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                if (i == sSelectedCard) {
440ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                    subActions.get(i).setChecked(true);
441ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                }
442ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            }
443ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            addAction(subActions, NEW_PAYMENT, "Add New Card", "");
444ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            paymentAction.setDescription(sSelectedCard == -1 ? "" : sCards.get(sSelectedCard));
445ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        }
446ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu
4478374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu        @Override
4481f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        public long onGuidedActionEditedAndProceed(GuidedAction action) {
449cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            if (action.getId() == PASSWORD) {
4501f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                CharSequence password = action.getEditDescription();
4511f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                if (password.length() > 0) {
4521f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                    if (isPaymentValid()) {
4531f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                        updateContinue(true);
4541f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                        return GuidedAction.ACTION_ID_NEXT;
4551f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                    } else {
4561f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                        updateContinue(false);
4571f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                        return GuidedAction.ACTION_ID_CURRENT;
4581f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                    }
4591f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                } else {
4601f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                    updateContinue(false);
4611f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                    return GuidedAction.ACTION_ID_CURRENT;
4621f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu                }
4638374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu            }
4641f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu            return GuidedAction.ACTION_ID_NEXT;
4651f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        }
4661f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu
467cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
468cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        public boolean onSubGuidedActionClicked(GuidedAction action) {
469cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            if (action.isChecked()) {
470cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                String payment = action.getTitle().toString();
471cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                for (int i = 0; i < sCards.size(); i++) {
472cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    if (payment.equals(sCards.get(i))) {
473cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                        sSelectedCard = i;
474cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                        findActionById(PAYMENT).setDescription(payment);
475cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                        notifyActionChanged(findActionPositionById(PAYMENT));
476cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                        updateContinue(isPasswordValid());
477cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                        break;
478cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                    }
479cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                }
480cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                return true;
481cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            } else {
482cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                FragmentManager fm = getFragmentManager();
483ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                NewPaymentStepFragment newPaymentFragment = new NewPaymentStepFragment();
484ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                newPaymentFragment.setTargetFragment(this, 0);
485ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                GuidedStepFragment.add(fm, newPaymentFragment, R.id.lb_guidedstep_host);
486cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu                return false;
487cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            }
488cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
489cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
490cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        @Override
491ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu        public View onCreateView(LayoutInflater inflater, ViewGroup container,
492ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                Bundle savedInstanceState) {
493ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            View view = super.onCreateView(inflater, container, savedInstanceState);
494ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            if (mExpandPaymentListInOnCreateView) {
495ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                expandAction(findActionById(PAYMENT), false);
496cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            }
497ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu            return view;
498cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu        }
499cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu
5001f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        boolean isPaymentValid() {
501cf49916e96a2a8a19ea8112d91862e7ede4ceb67Dake Gu            CharSequence paymentType = findActionById(PAYMENT).getDescription();
502aec263932c93cd9980fee043d31b9c34ff835aa8Keyvan Amiri            return (paymentType.length() >= 4 &&
503aec263932c93cd9980fee043d31b9c34ff835aa8Keyvan Amiri                    paymentType.subSequence(0, 4).toString().equals("Visa")) ||
504aec263932c93cd9980fee043d31b9c34ff835aa8Keyvan Amiri                    (paymentType.length() >= 6 &&
505aec263932c93cd9980fee043d31b9c34ff835aa8Keyvan Amiri                    paymentType.subSequence(0, 6).toString().equals("Master"));
5061f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        }
5071f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu
5081f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        boolean isPasswordValid() {
5091f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu            return findActionById(PASSWORD).getEditDescription().length() > 0;
5101f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        }
5111f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu
5121f735b248bf5e9d37791b6aed4b2c634e41912abDake Gu        void updateContinue(boolean enabled) {
5137d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu            findButtonActionById(GuidedAction.ACTION_ID_CONTINUE).setEnabled(enabled);
5147d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu            notifyButtonActionChanged(findButtonActionPositionById(
5157d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu                    GuidedAction.ACTION_ID_CONTINUE));
5168374a4e00678fec6ed5aa3fcd1befcaeb8423b6cDake Gu        }
5174e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing    }
5184e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
519da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    public static class ThirdStepFragment extends GuidedStepFragment {
5204e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
52197906d5d967189bdcac6491fffa20c2cb0003466Dake Gu        private long mSelectedOption = DEFAULT_OPTION;
5224e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
5234e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        @Override
5244e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        public Guidance onCreateGuidance(Bundle savedInstanceState) {
5254e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            String title = getString(R.string.guidedstep_third_title);
5264e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            String breadcrumb = getString(R.string.guidedstep_third_breadcrumb);
5274e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            String description = getString(R.string.guidedstep_third_description);
528b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            final Context context = getActivity();
529b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            Drawable icon = ResourcesCompat.getDrawable(context.getResources(),
530b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu                    R.drawable.ic_main_icon, context.getTheme());
5314e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            return new Guidance(title, description, breadcrumb, icon);
5324e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        }
5334e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing
5344e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing        @Override
5356f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public GuidanceStylist onCreateGuidanceStylist() {
5366f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            return new GuidanceStylist() {
5376f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                @Override
5386f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                public int onProvideLayoutId() {
5396f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    return R.layout.guidedstep_second_guidance;
5406f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                }
5416f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            };
5426f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
5436f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
5446f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
5456f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
54697906d5d967189bdcac6491fffa20c2cb0003466Dake Gu            String desc = "The description can be quite long as well.  " +
54797906d5d967189bdcac6491fffa20c2cb0003466Dake Gu                    "Just be sure to set multilineDescription to true in the GuidedAction.";
548b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            actions.add(new GuidedAction.Builder(getActivity())
5496f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    .title("Note that Guided Actions can have titles that are quite long.")
5506f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    .description(desc)
5516f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    .multilineDescription(true)
5526f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    .infoOnly(true)
553ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                    .enabled(true)
554ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                    .focusable(false)
5556f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    .build());
5566f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            for (int i = 0; i < OPTION_NAMES.length; i++) {
557ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                addCheckedAction(actions, RADIO_ID_BASE + i, OPTION_NAMES[i],
55806c39be6a0e6e44986083280451115a4a701ec73Dake Gu                        OPTION_DESCRIPTIONS[i], GuidedAction.DEFAULT_CHECK_SET_ID);
5596f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                if (i == DEFAULT_OPTION) {
5606f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                    actions.get(actions.size() -1).setChecked(true);
5616f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing                }
5626f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            }
56306c39be6a0e6e44986083280451115a4a701ec73Dake Gu            for (int i = 0; i < OPTION_NAMES.length; i++) {
564ae746be7c46297b910a99c07697e33e3a5fd7facDake Gu                addCheckedAction(actions, CHECKBOX_ID_BASE + i, OPTION_NAMES[i],
56506c39be6a0e6e44986083280451115a4a701ec73Dake Gu                        OPTION_DESCRIPTIONS[i], GuidedAction.CHECKBOX_CHECK_SET_ID);
56606c39be6a0e6e44986083280451115a4a701ec73Dake Gu            }
5677d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu        }
5687d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu
5697d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu        @Override
5707d9ba1eb1d51f531ff17cf1967f522bcb78f2064Dake Gu        public void onCreateButtonActions(List<GuidedAction> actions, Bundle savedInstanceState) {
57147005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            actions.add(new GuidedAction.Builder(getActivity())
57247005bba6e07c4578530bd151967c0cce7daedc3Dake Gu                    .clickAction(GuidedAction.ACTION_ID_CONTINUE)
573971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .build());
5746f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
5756f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
5766f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
5776f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public void onGuidedActionClicked(GuidedAction action) {
578971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu            if (action.getId() == GuidedAction.ACTION_ID_CONTINUE) {
5799f4e25b607fc4ec53b4f2b4996f49481857afdabKris Giesing                FragmentManager fm = getFragmentManager();
580da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                FourthStepFragment f = new FourthStepFragment();
581da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                Bundle arguments = new Bundle();
58297906d5d967189bdcac6491fffa20c2cb0003466Dake Gu                arguments.putLong(FourthStepFragment.EXTRA_OPTION, mSelectedOption);
583da2c70f656f02c377b796694ca27d93e2b698733Dake Gu                f.setArguments(arguments);
584ee3c13ee552002263be40f6a5986f61c605b0bacDake Gu                GuidedStepFragment.add(fm, f, R.id.lb_guidedstep_host);
58506c39be6a0e6e44986083280451115a4a701ec73Dake Gu            } else if (action.getCheckSetId() == GuidedAction.DEFAULT_CHECK_SET_ID) {
58697906d5d967189bdcac6491fffa20c2cb0003466Dake Gu                mSelectedOption = action.getId();
5879f4e25b607fc4ec53b4f2b4996f49481857afdabKris Giesing            }
5886f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
5896f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
5906f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    }
5916f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
592da2c70f656f02c377b796694ca27d93e2b698733Dake Gu    public static class FourthStepFragment extends GuidedStepFragment {
593da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        public static final String EXTRA_OPTION = "extra_option";
594da2c70f656f02c377b796694ca27d93e2b698733Dake Gu
595da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        public FourthStepFragment() {
596da2c70f656f02c377b796694ca27d93e2b698733Dake Gu        }
5976f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
59897906d5d967189bdcac6491fffa20c2cb0003466Dake Gu        public long getOption() {
599da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            Bundle b = getArguments();
600da2c70f656f02c377b796694ca27d93e2b698733Dake Gu            if (b == null) return 0;
60197906d5d967189bdcac6491fffa20c2cb0003466Dake Gu            return b.getLong(EXTRA_OPTION, 0);
6026f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
6036f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
6046f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
6056f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public Guidance onCreateGuidance(Bundle savedInstanceState) {
6064e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            String title = getString(R.string.guidedstep_fourth_title);
6074e3ba904e4dbe45b80eb20288367620b84950232Kris Giesing            String breadcrumb = getString(R.string.guidedstep_fourth_breadcrumb);
60897906d5d967189bdcac6491fffa20c2cb0003466Dake Gu            String description = "You chose: " + OPTION_NAMES[(int) getOption()];
609b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            final Context context = getActivity();
610b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu            Drawable icon = ResourcesCompat.getDrawable(context.getResources(),
611b7087e036a48f5a3db28d02ff7f9b97fbbc46c4fDake Gu                    R.drawable.ic_main_icon, context.getTheme());
6126f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            return new Guidance(title, description, breadcrumb, icon);
6136f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
6146f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
6156f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
6166f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) {
61747005bba6e07c4578530bd151967c0cce7daedc3Dake Gu            actions.add(new GuidedAction.Builder(getActivity())
61847005bba6e07c4578530bd151967c0cce7daedc3Dake Gu                    .clickAction(GuidedAction.ACTION_ID_FINISH)
619971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .description("All Done...")
620971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu                    .build());
621ca5018729526470dfb2599a88869deaa48a7fea9Dake Gu            addAction(actions, BACK, "Start Over", "Let's try this again...");
6226f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
6236f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
6246f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        @Override
6256f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        public void onGuidedActionClicked(GuidedAction action) {
626971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu            if (action.getId() == GuidedAction.ACTION_ID_FINISH) {
627ca5018729526470dfb2599a88869deaa48a7fea9Dake Gu                finishGuidedStepFragments();
628971cfadff0da45fa2e899a8cedd05e5cb99dd672Dake Gu            } else if (action.getId() == BACK) {
629ca5018729526470dfb2599a88869deaa48a7fea9Dake Gu                // pop 4, 3, 2
630ca5018729526470dfb2599a88869deaa48a7fea9Dake Gu                popBackStackToGuidedStepFragment(SecondStepFragment.class,
631ca5018729526470dfb2599a88869deaa48a7fea9Dake Gu                        FragmentManager.POP_BACK_STACK_INCLUSIVE);
6326f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing            }
6336f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing        }
6346f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
6356f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing    }
6366f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing
6376f0d24aab5d9668c489097d26d4c3643f575b0c8Kris Giesing}
638