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