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