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 17 package com.android.tv.settings.connectivity; 18 19 import android.app.Fragment; 20 import android.app.FragmentManager; 21 import android.app.FragmentTransaction; 22 import android.content.Context; 23 import android.os.Bundle; 24 import android.text.TextUtils; 25 import android.util.Log; 26 27 import com.android.tv.settings.connectivity.setup.MessageWizardFragment; 28 import com.android.tv.settings.connectivity.setup.PasswordInputWizardFragment; 29 import com.android.tv.settings.connectivity.setup.SelectFromListWizardFragment; 30 import com.android.tv.settings.connectivity.setup.SelectFromListWizardFragment.ListItem; 31 import com.android.tv.settings.connectivity.setup.TextInputWizardFragment; 32 import com.android.tv.settings.form.FormPage; 33 import com.android.tv.settings.form.FormPageResultListener; 34 35 import java.util.ArrayList; 36 37 /** 38 * Displays form pages. 39 */ 40 public class FormPageDisplayer 41 implements TextInputWizardFragment.Listener, SelectFromListWizardFragment.Listener, 42 PasswordInputWizardFragment.Listener { 43 44 public static final int DISPLAY_TYPE_TEXT_INPUT = 1; 45 public static final int DISPLAY_TYPE_LIST_CHOICE = 2; 46 public static final int DISPLAY_TYPE_LOADING = 3; 47 public static final int DISPLAY_TYPE_PASSWORD_INPUT = 4; 48 49 public interface FormPageInfo { 50 /** 51 * @return the resource id of the title for this page. 52 */ 53 int getTitleResourceId(); 54 55 /** 56 * @return the resource id of the description for this page. 0 if no description. 57 */ 58 int getDescriptionResourceId(); 59 60 /** 61 * @return the input type for the editable text field for this page. 62 */ 63 int getInputType(); 64 65 /** 66 * @return the way this form page should be displayed. 67 */ 68 int getDisplayType(); 69 70 /** 71 * @return the set of choices for this form page. 72 */ 73 ArrayList<SelectFromListWizardFragment.ListItem> getChoices(Context context, 74 ArrayList<SelectFromListWizardFragment.ListItem> extraChoices); 75 } 76 77 public interface UserActivityListener { 78 void onUserActivity(); 79 } 80 81 private static final String TAG = "FormPageDisplayer"; 82 private static final boolean DEBUG = false; 83 private static final String RESULT_LIST_ITEM = "result_list_item"; 84 85 private final Context mContext; 86 private final FragmentManager mFragmentManager; 87 private TextInputWizardFragment.Listener mTextInputWizardFragmentListener; 88 private PasswordInputWizardFragment.Listener mPasswordInputWizardFragmentListener; 89 private SelectFromListWizardFragment.Listener mSelectFromListWizardFragmentListener; 90 private final int mContentViewId; 91 92 public FormPageDisplayer(Context context, FragmentManager fragmentManager, int contentViewId) { 93 mContext = context; 94 mFragmentManager = fragmentManager; 95 mContentViewId = contentViewId; 96 } 97 98 @Override 99 public boolean onTextInputComplete(String text) { 100 if (mTextInputWizardFragmentListener != null) { 101 return mTextInputWizardFragmentListener.onTextInputComplete(text); 102 } 103 return true; 104 } 105 106 @Override 107 public boolean onPasswordInputComplete(String text) { 108 if (mPasswordInputWizardFragmentListener != null) { 109 return mPasswordInputWizardFragmentListener.onPasswordInputComplete(text); 110 } 111 return true; 112 } 113 114 @Override 115 public void onListSelectionComplete(ListItem listItem) { 116 if (mSelectFromListWizardFragmentListener != null) { 117 mSelectFromListWizardFragmentListener.onListSelectionComplete(listItem); 118 } 119 } 120 121 @Override 122 public void onListFocusChanged(ListItem listItem) { 123 if (mSelectFromListWizardFragmentListener != null) { 124 mSelectFromListWizardFragmentListener.onListFocusChanged(listItem); 125 } 126 } 127 128 public Fragment displayPage(FormPageInfo formPageInfo, String titleArgument, 129 String descriptionArgument, 130 ArrayList<SelectFromListWizardFragment.ListItem> extraChoices, 131 FormPage previousFormPage, UserActivityListener userActivityListener, 132 boolean showProgress, FormPage currentFormPage, 133 FormPageResultListener formPageResultListener, boolean forward, boolean emptyAllowed) { 134 if (DEBUG) { 135 Log.d(TAG, "Displaying: " + currentFormPage.getTitle()); 136 } 137 switch (formPageInfo.getDisplayType()) { 138 case DISPLAY_TYPE_LIST_CHOICE: 139 return displayList(formPageInfo, titleArgument, descriptionArgument, extraChoices, 140 currentFormPage, formPageResultListener, previousFormPage, 141 userActivityListener, forward); 142 143 case DISPLAY_TYPE_TEXT_INPUT: 144 return displayTextInput(formPageInfo, titleArgument, descriptionArgument, 145 currentFormPage, formPageResultListener, previousFormPage, forward, 146 emptyAllowed); 147 148 case DISPLAY_TYPE_PASSWORD_INPUT: 149 return displayPasswordInput(formPageInfo, titleArgument, descriptionArgument, 150 currentFormPage, formPageResultListener, previousFormPage, forward, 151 emptyAllowed); 152 153 case DISPLAY_TYPE_LOADING: 154 return displayLoading(formPageInfo, titleArgument, showProgress, forward); 155 156 default: 157 return null; 158 } 159 } 160 161 public ListItem getListItem(FormPage formPage) { 162 return formPage.getData().getParcelable(RESULT_LIST_ITEM); 163 } 164 165 public void displayFragment(Fragment fragment, boolean forward) { 166 FragmentTransaction transaction = mFragmentManager.beginTransaction(); 167 if (forward) { 168 transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 169 } else { 170 transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 171 } 172 transaction.replace(mContentViewId, fragment).commit(); 173 } 174 175 private Fragment displayList(final FormPageInfo formPageInfo, String titleArgument, 176 String descriptionArgument, 177 ArrayList<SelectFromListWizardFragment.ListItem> extraChoices, final FormPage formPage, 178 final FormPageResultListener formPageResultListener, FormPage lastPage, 179 final UserActivityListener userActivityListener, boolean forward) { 180 Fragment fragment = SelectFromListWizardFragment.newInstance( 181 getTitle(formPageInfo, titleArgument), 182 getDescription(formPageInfo, descriptionArgument), 183 formPageInfo.getChoices(mContext, extraChoices), lastPage == null ? null 184 : (ListItem) lastPage.getData().getParcelable(RESULT_LIST_ITEM)); 185 displayFragment(fragment, forward); 186 mSelectFromListWizardFragmentListener = new SelectFromListWizardFragment.Listener() { 187 @Override 188 public void onListSelectionComplete(ListItem selection) { 189 Bundle result = new Bundle(); 190 result.putParcelable(RESULT_LIST_ITEM, selection); 191 result.putString(FormPage.DATA_KEY_SUMMARY_STRING, selection.getName()); 192 formPageResultListener.onBundlePageResult(formPage, result); 193 } 194 195 @Override 196 public void onListFocusChanged(ListItem listItem) { 197 if (userActivityListener != null) { 198 userActivityListener.onUserActivity(); 199 } 200 } 201 }; 202 return fragment; 203 } 204 205 private Fragment displayTextInput(FormPageInfo formPageInfo, String titleArgument, 206 String descriptionArgument, final FormPage formPage, 207 final FormPageResultListener listener, FormPage lastPage, boolean forward, 208 final boolean emptyAllowed) { 209 Fragment fragment = TextInputWizardFragment.newInstance( 210 getTitle(formPageInfo, titleArgument), 211 getDescription(formPageInfo, descriptionArgument), 212 formPageInfo.getInputType(), lastPage == null ? null : lastPage.getDataSummary()); 213 displayFragment(fragment, forward); 214 215 mTextInputWizardFragmentListener = new TextInputWizardFragment.Listener() { 216 @Override 217 public boolean onTextInputComplete(String text) { 218 if (!TextUtils.isEmpty(text) || emptyAllowed) { 219 Bundle result = new Bundle(); 220 result.putString(FormPage.DATA_KEY_SUMMARY_STRING, text); 221 listener.onBundlePageResult(formPage, result); 222 return true; 223 } 224 return false; 225 } 226 }; 227 return fragment; 228 } 229 230 private Fragment displayPasswordInput(FormPageInfo formPageInfo, String titleArgument, 231 String descriptionArgument, final FormPage formPage, 232 final FormPageResultListener listener, FormPage lastPage, boolean forward, 233 final boolean emptyAllowed) { 234 Fragment fragment = PasswordInputWizardFragment.newInstance( 235 getTitle(formPageInfo, titleArgument), 236 getDescription(formPageInfo, descriptionArgument), 237 lastPage == null ? null : lastPage.getDataSummary()); 238 displayFragment(fragment, forward); 239 240 mPasswordInputWizardFragmentListener = new PasswordInputWizardFragment.Listener() { 241 @Override 242 public boolean onPasswordInputComplete(String text) { 243 if (!TextUtils.isEmpty(text) || emptyAllowed) { 244 Bundle result = new Bundle(); 245 result.putString(FormPage.DATA_KEY_SUMMARY_STRING, text); 246 listener.onBundlePageResult(formPage, result); 247 return true; 248 } 249 return false; 250 } 251 }; 252 return fragment; 253 } 254 255 private Fragment displayLoading(FormPageInfo formPageInfo, String argument, 256 boolean showProgress, boolean forward) { 257 Fragment fragment = MessageWizardFragment.newInstance( 258 getTitle(formPageInfo, argument), showProgress); 259 displayFragment(fragment, forward); 260 return fragment; 261 } 262 263 private String getTitle(FormPageInfo formPageInfo, String argument) { 264 return mContext.getString(formPageInfo.getTitleResourceId(), argument); 265 } 266 267 private String getDescription(FormPageInfo formPageInfo, String argument) { 268 int descriptionResourceId = formPageInfo.getDescriptionResourceId(); 269 return (descriptionResourceId != 0) ? mContext.getString(descriptionResourceId, argument) 270 : null; 271 } 272 } 273