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.R;
20 import com.android.tv.settings.connectivity.setup.SelectFromListWizardFragment;
21 import com.android.tv.settings.connectivity.setup.TextInputWizardFragment;
22 import com.android.tv.settings.form.FormPage;
23 
24 import android.content.Context;
25 import android.content.Intent;
26 
27 import java.util.ArrayList;
28 
29 /**
30  * Wifi form pages.
31  */
32 public enum WifiFormPageType implements FormPageDisplayer.FormPageInfo {
33     CHOOSE_NETWORK(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE, R.string.title_select_wifi_network,
34             0, new int[] { R.string.other_network },
35             new int[] { R.drawable.ic_wifi_add}),
36     ENTER_SSID(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_ssid, 0,
37             TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS),
38     CHOOSE_SECURITY(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE, R.string.security_type, 0,
39             new int[] { R.string.wifi_security_type_none, R.string.wifi_security_type_wep,
40             R.string.wifi_security_type_wpa, R.string.wifi_security_type_eap }),
41     ENTER_PASSWORD(FormPageDisplayer.DISPLAY_TYPE_PSK_INPUT,
42             R.string.wifi_setup_input_password, 0, 0),
43     CONNECT(FormPageDisplayer.DISPLAY_TYPE_LOADING, R.string.wifi_connecting, 0),
44     CONNECT_FAILED(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
45             R.string.title_wifi_could_not_connect, 0, new int[] { R.string.wifi_action_try_again,
46             R.string.wifi_action_view_available_networks }),
47     CONNECT_TIMEOUT(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
48             R.string.title_wifi_could_not_connect_timeout, 0, new int[] {
49             R.string.wifi_action_try_again, R.string.wifi_action_view_available_networks }),
50     CONNECT_AUTHENTICATION_FAILURE(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
51             R.string.title_wifi_could_not_connect_authentication_failure, 0, new int[] {
52             R.string.wifi_action_try_again, R.string.wifi_action_view_available_networks }),
53     CONNECT_REJECTED_BY_AP(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
54             R.string.title_wifi_could_not_connect_ap_reject, 0, new int[] {
55             R.string.wifi_action_try_again, R.string.wifi_action_view_available_networks }),
56     SAVE(FormPageDisplayer.DISPLAY_TYPE_LOADING, R.string.wifi_saving, 0),
57     SAVE_FAILED(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
58             R.string.title_wifi_could_not_save, 0, new int[] { R.string.wifi_action_ok }),
59     SAVE_SUCCESS(FormPageDisplayer.DISPLAY_TYPE_LOADING, R.string.wifi_setup_save_success, 0),
60     SUCCESS(FormPageDisplayer.DISPLAY_TYPE_LOADING, R.string.wifi_setup_connection_success, 0),
61     SUMMARY_CONNECTED_WIFI(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
62             R.string.wifi_summary_title_connected,
63             R.string.wifi_summary_description_connected_to_wifi_network, new int[] {
64             R.string.wifi_action_dont_change_network, R.string.wifi_action_change_network }),
65     SUMMARY_CONNECTED_NON_WIFI(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
66             R.string.wifi_summary_title_connected, 0, new int[] { R.string.wifi_action_ok }),
67     SUMMARY_NOT_CONNECTED(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
68             R.string.wifi_summary_title_not_connected, 0, new int[] { R.string.wifi_action_ok }),
69     ADVANCED_OPTIONS(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
70             R.string.title_wifi_advanced_options, 0, new int[] { R.string.wifi_action_advanced_no,
71             R.string.wifi_action_advanced_yes }),
72     PROXY_SETTINGS(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE, R.string.title_wifi_proxy_settings,
73             R.string.proxy_warning_limited_support, new int[] { R.string.wifi_action_proxy_none,
74             R.string.wifi_action_proxy_manual }),
75     PROXY_HOSTNAME(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_proxy_hostname,
76             R.string.proxy_hostname_description, TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
77             R.string.proxy_hostname_hint),
78     PROXY_PORT(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_proxy_port,
79             R.string.proxy_port_description, TextInputWizardFragment.INPUT_TYPE_NUMERIC,
80             R.string.proxy_port_hint),
81     PROXY_BYPASS(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_proxy_bypass,
82             R.string.proxy_exclusionlist_description,
83             TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
84             R.string.proxy_exclusionlist_hint),
85     IP_SETTINGS(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE, R.string.title_wifi_ip_settings, 0,
86             new int[] { R.string.wifi_action_dhcp, R.string.wifi_action_static }),
87     IP_ADDRESS(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_ip_address,
88             R.string.wifi_ip_address_description, TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
89             R.string.wifi_ip_address_hint),
90     GATEWAY(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_gateway,
91             R.string.wifi_gateway_description, TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
92             R.string.wifi_gateway_hint),
93     NETWORK_PREFIX_LENGTH(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT,
94             R.string.title_wifi_network_prefix_length,
95             R.string.wifi_network_prefix_length_description,
96             TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
97             R.string.wifi_network_prefix_length_hint),
98     DNS1(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_dns1,
99             R.string.wifi_dns1_description, TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
100             R.string.wifi_dns1_hint),
101     DNS2(FormPageDisplayer.DISPLAY_TYPE_TEXT_INPUT, R.string.title_wifi_dns2,
102             R.string.wifi_dns2_description, TextInputWizardFragment.INPUT_TYPE_NO_SUGGESTIONS,
103             R.string.wifi_dns2_hint),
104     PROXY_SETTINGS_INVALID(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
105             R.string.title_wifi_proxy_settings_invalid, 0, new int[] {
106             R.string.wifi_action_try_again }),
107     IP_SETTINGS_INVALID(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE,
108             R.string.title_wifi_ip_settings_invalid, 0, new int[] {
109             R.string.wifi_action_try_again }),
110     KNOWN_NETWORK(FormPageDisplayer.DISPLAY_TYPE_LIST_CHOICE, R.string.title_wifi_known_network, 0,
111             new int[] { R.string.wifi_connect, R.string.wifi_forget_network }),
112     WPS(FormPageDisplayer.DISPLAY_TYPE_LOADING, 0, 0);
113 
114     private final int mDisplayType;
115     private final int mTitleResource;
116     private final int mDescriptionResource;
117     private final int mInputType;
118     private final int[] mDefaultListItemTitles;
119     private final int[] mDefaultListItemIcons;
120     private final int mDefaultPrefillResource;
121 
WifiFormPageType(int displayType, int titleResource, int descriptionResource)122     WifiFormPageType(int displayType, int titleResource, int descriptionResource) {
123         this(displayType, titleResource, descriptionResource,
124                 TextInputWizardFragment.INPUT_TYPE_NORMAL);
125     }
126 
WifiFormPageType(int displayType, int titleResource, int descriptionResource, int textType)127     WifiFormPageType(int displayType, int titleResource, int descriptionResource,
128             int textType) {
129         this(displayType, titleResource, descriptionResource, textType, 0);
130     }
131 
WifiFormPageType(int displayType, int titleResource, int descriptionResource, int textType, int defaultPrefillResource)132     WifiFormPageType(int displayType, int titleResource, int descriptionResource,
133             int textType, int defaultPrefillResource) {
134         mDisplayType = displayType;
135         mTitleResource = titleResource;
136         mDescriptionResource = descriptionResource;
137         mInputType = textType;
138         mDefaultListItemTitles = null;
139         mDefaultListItemIcons = null;
140         mDefaultPrefillResource = defaultPrefillResource;
141     }
142 
WifiFormPageType(int displayType, int titleResource, int descriptionResource, int[] defaultListItemTitles)143     WifiFormPageType(int displayType, int titleResource, int descriptionResource,
144             int[] defaultListItemTitles) {
145         this(displayType, titleResource, descriptionResource, defaultListItemTitles, null);
146     }
147 
WifiFormPageType(int displayType, int titleResource, int descriptionResource, int[] defaultListItemTitles, int[] defaultListItemIcons)148     WifiFormPageType(int displayType, int titleResource, int descriptionResource,
149             int[] defaultListItemTitles, int[] defaultListItemIcons) {
150         mDisplayType = displayType;
151         mTitleResource = titleResource;
152         mDescriptionResource = descriptionResource;
153         mInputType = TextInputWizardFragment.INPUT_TYPE_NORMAL;
154         mDefaultListItemTitles = defaultListItemTitles;
155         mDefaultListItemIcons = defaultListItemIcons;
156         if (mDefaultListItemTitles != null && mDefaultListItemIcons != null
157                 && mDefaultListItemTitles.length != mDefaultListItemIcons.length) {
158             throw new IllegalArgumentException("Form page type " + name()
159                     + " had title and icon arrays that we'ren't the same length! "
160                     + "The title array had length " + mDefaultListItemTitles.length
161                     + " but the icon array had length " + mDefaultListItemIcons.length + "!");
162         }
163         mDefaultPrefillResource = 0;
164     }
165 
166     @Override
getTitleResourceId()167     public int getTitleResourceId() {
168         return mTitleResource;
169     }
170 
171     @Override
getDescriptionResourceId()172     public int getDescriptionResourceId() {
173         return mDescriptionResource;
174     }
175 
176     @Override
getInputType()177     public int getInputType() {
178         return mInputType;
179     }
180 
181     @Override
getDisplayType()182     public int getDisplayType() {
183         return mDisplayType;
184     }
185 
186     @Override
getDefaultPrefillResourceId()187     public int getDefaultPrefillResourceId() {
188         return mDefaultPrefillResource;
189     }
190 
191 
192     @Override
getChoices( Context context, ArrayList<SelectFromListWizardFragment.ListItem> extraChoices)193     public ArrayList<SelectFromListWizardFragment.ListItem> getChoices(
194             Context context, ArrayList<SelectFromListWizardFragment.ListItem> extraChoices) {
195         ArrayList<SelectFromListWizardFragment.ListItem> choices = new ArrayList<>();
196         if (extraChoices != null) {
197             choices.addAll(extraChoices);
198         }
199 
200         if (mDefaultListItemTitles != null) {
201             // Find the largest priority of the items placed at the end of the list and place
202             // default items after.
203             int largestLastPriority = Integer.MIN_VALUE;
204             if (extraChoices != null) {
205                 for (SelectFromListWizardFragment.ListItem item : extraChoices) {
206                     if (item.getPinnedPosition()
207                             == SelectFromListWizardFragment.PinnedListItem.LAST) {
208                         SelectFromListWizardFragment.PinnedListItem pinnedItem =
209                                 (SelectFromListWizardFragment.PinnedListItem) item;
210                         largestLastPriority = java.lang.Math.max(
211                                 largestLastPriority, pinnedItem.getPinnedPriority());
212                     }
213                 }
214             }
215 
216             for (int i = 0; i < mDefaultListItemTitles.length; i++) {
217                 choices.add(new SelectFromListWizardFragment.PinnedListItem(
218                         context.getString(mDefaultListItemTitles[i]),
219                         mDefaultListItemIcons == null ? 0 : mDefaultListItemIcons[i],
220                         SelectFromListWizardFragment.PinnedListItem.LAST, i + largestLastPriority));
221             }
222         }
223         return choices;
224     }
225 
create()226     public FormPage create() {
227         return FormPage.createTextInputForm(name());
228     }
229 
create(Intent intent)230     public FormPage create(Intent intent) {
231         if (mDisplayType != FormPageDisplayer.DISPLAY_TYPE_LOADING) {
232             throw new IllegalArgumentException("Form page type " + name() + " had display type "
233                     + mDisplayType + " but " + FormPageDisplayer.DISPLAY_TYPE_LOADING
234                     + " expected!");
235         }
236         return FormPage.createIntentForm(name(), intent);
237     }
238 }
239