GuidedStepActivity.java revision 067d9b9e5a56d015931a2b23f0aa2262942bb20a
1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.example.android.leanback; 18 19import android.app.Activity; 20import android.app.FragmentManager; 21import android.content.Context; 22import android.content.Intent; 23import android.content.res.Configuration; 24import android.graphics.drawable.Drawable; 25import android.os.Bundle; 26import android.support.v17.leanback.app.GuidedStepFragment; 27import android.support.v17.leanback.widget.GuidedAction; 28import android.support.v17.leanback.widget.GuidanceStylist; 29import android.support.v17.leanback.widget.GuidanceStylist.Guidance; 30import android.util.Log; 31import android.view.ViewGroup; 32import android.view.ViewTreeObserver.OnGlobalLayoutListener; 33 34import java.util.List; 35 36/** 37 * Activity that showcases different aspects of GuidedStepFragments. 38 */ 39public class GuidedStepActivity extends Activity { 40 41 private static final int CONTINUE = 1; 42 private static final int BACK = 2; 43 44 private static final int FIRST_NAME = 1; 45 private static final int LAST_NAME = 2; 46 47 private static final int OPTION_CHECK_SET_ID = 10; 48 private static final int DEFAULT_OPTION = 0; 49 private static final String[] OPTION_NAMES = { "Option A", "Option B", "Option C" }; 50 private static final String[] OPTION_DESCRIPTIONS = { "Here's one thing you can do", 51 "Here's another thing you can do", "Here's one more thing you can do" }; 52 private static final int[] OPTION_DRAWABLES = { R.drawable.ic_guidedstep_option_a, 53 R.drawable.ic_guidedstep_option_b, R.drawable.ic_guidedstep_option_c }; 54 55 private static final String TAG = GuidedStepActivity.class.getSimpleName(); 56 57 @Override 58 protected void onCreate(Bundle savedInstanceState) { 59 Log.v(TAG, "onCreate"); 60 super.onCreate(savedInstanceState); 61 GuidedStepFragment.addAsRoot(this, new FirstStepFragment(), android.R.id.content); 62 } 63 64 @Override 65 public void onConfigurationChanged(Configuration newConfig) { 66 Log.v(TAG, "onConfigurationChanged"); 67 super.onConfigurationChanged(newConfig); 68 } 69 70 @Override 71 protected void onSaveInstanceState(Bundle outState) { 72 Log.v(TAG, "onSaveInstanceState"); 73 super.onSaveInstanceState(outState); 74 } 75 76 @Override 77 protected void onRestoreInstanceState(Bundle savedInstanceState) { 78 Log.v(TAG, "onRestoreInstanceState"); 79 super.onRestoreInstanceState(savedInstanceState); 80 } 81 82 private static void addAction(List<GuidedAction> actions, long id, String title, String desc) { 83 actions.add(new GuidedAction.Builder() 84 .id(id) 85 .title(title) 86 .description(desc) 87 .build()); 88 } 89 90 private static void addEditableAction(List<GuidedAction> actions, long id, String title, String desc) { 91 actions.add(new GuidedAction.Builder() 92 .id(id) 93 .title(title) 94 .description(desc) 95 .editable(true) 96 .build()); 97 } 98 99 private static void addCheckedAction(List<GuidedAction> actions, int iconResId, Context context, 100 String title, String desc) { 101 actions.add(new GuidedAction.Builder() 102 .title(title) 103 .description(desc) 104 .checkSetId(OPTION_CHECK_SET_ID) 105 .iconResourceId(iconResId, context) 106 .build()); 107 } 108 109 /** 110 * The first fragment is instantiated via XML, so it must be public. 111 */ 112 public static class FirstStepFragment extends GuidedStepFragment { 113 @Override 114 public int onProvideTheme() { 115 return R.style.Theme_Example_Leanback_GuidedStep_First; 116 } 117 118 @Override 119 public Guidance onCreateGuidance(Bundle savedInstanceState) { 120 String title = getString(R.string.guidedstep_first_title); 121 String breadcrumb = getString(R.string.guidedstep_first_breadcrumb); 122 String description = getString(R.string.guidedstep_first_description); 123 Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon); 124 return new Guidance(title, description, breadcrumb, icon); 125 } 126 127 @Override 128 public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 129 addAction(actions, CONTINUE, "Continue", "Let's do it"); 130 addAction(actions, BACK, "Cancel", "Nevermind"); 131 } 132 133 @Override 134 public void onGuidedActionClicked(GuidedAction action) { 135 FragmentManager fm = getFragmentManager(); 136 if (action.getId() == CONTINUE) { 137 GuidedStepFragment.add(fm, new SecondStepFragment(), android.R.id.content); 138 } else { 139 getActivity().finish(); 140 } 141 } 142 } 143 144 public static class SecondStepFragment extends GuidedStepFragment { 145 146 @Override 147 public Guidance onCreateGuidance(Bundle savedInstanceState) { 148 String title = getString(R.string.guidedstep_second_title); 149 String breadcrumb = getString(R.string.guidedstep_second_breadcrumb); 150 String description = getString(R.string.guidedstep_second_description); 151 Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon); 152 return new Guidance(title, description, breadcrumb, icon); 153 } 154 155 @Override 156 public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 157 addEditableAction(actions, FIRST_NAME, "Pat", "Your first name"); 158 addEditableAction(actions, LAST_NAME, "Smith", "Your last name"); 159 } 160 161 @Override 162 public void onGuidedActionClicked(GuidedAction action) { 163 if (action.getId() == LAST_NAME) { 164 FragmentManager fm = getFragmentManager(); 165 GuidedStepFragment.add(fm, new ThirdStepFragment()); 166 } 167 } 168 169 } 170 171 public static class ThirdStepFragment extends GuidedStepFragment { 172 173 private int mSelectedOption = DEFAULT_OPTION; 174 175 @Override 176 public Guidance onCreateGuidance(Bundle savedInstanceState) { 177 String title = getString(R.string.guidedstep_third_title); 178 String breadcrumb = getString(R.string.guidedstep_third_breadcrumb); 179 String description = getString(R.string.guidedstep_third_description); 180 Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon); 181 return new Guidance(title, description, breadcrumb, icon); 182 } 183 184 @Override 185 public GuidanceStylist onCreateGuidanceStylist() { 186 return new GuidanceStylist() { 187 @Override 188 public int onProvideLayoutId() { 189 return R.layout.guidedstep_second_guidance; 190 } 191 }; 192 } 193 194 @Override 195 public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 196 String desc = "The description can be quite long as well. "; 197 desc += "Just be sure to set multilineDescription to true in the GuidedAction."; 198 actions.add(new GuidedAction.Builder() 199 .title("Note that Guided Actions can have titles that are quite long.") 200 .description(desc) 201 .multilineDescription(true) 202 .infoOnly(true) 203 .enabled(false) 204 .build()); 205 for (int i = 0; i < OPTION_NAMES.length; i++) { 206 addCheckedAction(actions, OPTION_DRAWABLES[i], getActivity(), OPTION_NAMES[i], 207 OPTION_DESCRIPTIONS[i]); 208 if (i == DEFAULT_OPTION) { 209 actions.get(actions.size() -1).setChecked(true); 210 } 211 } 212 addAction(actions, CONTINUE, "Continue", ""); 213 } 214 215 @Override 216 public void onGuidedActionClicked(GuidedAction action) { 217 if (action.getId() == CONTINUE) { 218 FragmentManager fm = getFragmentManager(); 219 FourthStepFragment f = new FourthStepFragment(); 220 Bundle arguments = new Bundle(); 221 arguments.putInt(FourthStepFragment.EXTRA_OPTION, mSelectedOption); 222 f.setArguments(arguments); 223 GuidedStepFragment.add(fm, f, android.R.id.content); 224 } else { 225 mSelectedOption = getSelectedActionPosition()-1; 226 } 227 } 228 229 } 230 231 public static class FourthStepFragment extends GuidedStepFragment { 232 public static final String EXTRA_OPTION = "extra_option"; 233 234 public FourthStepFragment() { 235 } 236 237 public int getOption() { 238 Bundle b = getArguments(); 239 if (b == null) return 0; 240 return b.getInt(EXTRA_OPTION, 0); 241 } 242 243 @Override 244 public Guidance onCreateGuidance(Bundle savedInstanceState) { 245 String title = getString(R.string.guidedstep_fourth_title); 246 String breadcrumb = getString(R.string.guidedstep_fourth_breadcrumb); 247 String description = "You chose: " + OPTION_NAMES[getOption()]; 248 Drawable icon = getActivity().getDrawable(R.drawable.ic_main_icon); 249 return new Guidance(title, description, breadcrumb, icon); 250 } 251 252 @Override 253 public void onCreateActions(List<GuidedAction> actions, Bundle savedInstanceState) { 254 addAction(actions, CONTINUE, "Done", "All finished"); 255 addAction(actions, BACK, "Back", "Forgot something..."); 256 } 257 258 @Override 259 public void onGuidedActionClicked(GuidedAction action) { 260 if (action.getId() == CONTINUE) { 261 getActivity().finish(); 262 } else { 263 getFragmentManager().popBackStack(); 264 } 265 } 266 267 } 268 269} 270