Home | History | Annotate | Download | only in connectivity
      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