• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.arch.lifecycle.ViewModelProviders;
20 import android.content.Context;
21 import android.content.Intent;
22 import android.net.wifi.WifiConfiguration;
23 import android.os.Bundle;
24 import android.support.v4.app.Fragment;
25 import android.support.v4.app.FragmentTransaction;
26 
27 import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
28 import com.android.settingslib.wifi.AccessPoint;
29 import com.android.tv.settings.R;
30 import com.android.tv.settings.connectivity.setup.AddStartState;
31 import com.android.tv.settings.connectivity.setup.AdvancedWifiOptionsFlow;
32 import com.android.tv.settings.connectivity.setup.ConnectAuthFailureState;
33 import com.android.tv.settings.connectivity.setup.ConnectFailedState;
34 import com.android.tv.settings.connectivity.setup.ConnectRejectedByApState;
35 import com.android.tv.settings.connectivity.setup.ConnectState;
36 import com.android.tv.settings.connectivity.setup.ConnectTimeOutState;
37 import com.android.tv.settings.connectivity.setup.EnterPasswordState;
38 import com.android.tv.settings.connectivity.setup.KnownNetworkState;
39 import com.android.tv.settings.connectivity.setup.OptionsOrConnectState;
40 import com.android.tv.settings.connectivity.setup.SuccessState;
41 import com.android.tv.settings.connectivity.setup.UserChoiceInfo;
42 import com.android.tv.settings.connectivity.util.State;
43 import com.android.tv.settings.connectivity.util.StateMachine;
44 import com.android.tv.settings.connectivity.util.WifiSecurityUtil;
45 import com.android.tv.settings.core.instrumentation.InstrumentedActivity;
46 
47 /**
48  * Add a wifi network where we already know the ssid/security; normal post-install settings.
49  */
50 public class WifiConnectionActivity extends InstrumentedActivity implements
51         State.FragmentChangeListener {
52     private static final String TAG = "WifiConnectionActivity";
53 
54     private static final String EXTRA_WIFI_SSID = "wifi_ssid";
55     private static final String EXTRA_WIFI_SECURITY_NAME = "wifi_security_name";
56 
createIntent(Context context, AccessPoint result, int security)57     public static Intent createIntent(Context context, AccessPoint result, int security) {
58         return new Intent(context, WifiConnectionActivity.class)
59                 .putExtra(EXTRA_WIFI_SSID, result.getSsidStr())
60                 .putExtra(EXTRA_WIFI_SECURITY_NAME, security);
61     }
62 
createIntent(Context context, AccessPoint result)63     public static Intent createIntent(Context context, AccessPoint result) {
64         final int security = result.getSecurity();
65         return createIntent(context, result, security);
66     }
67 
createIntent(Context context, WifiConfiguration configuration)68     public static Intent createIntent(Context context, WifiConfiguration configuration) {
69         final int security = WifiSecurityUtil.getSecurity(configuration);
70         final String ssid = configuration.getPrintableSsid();
71         return new Intent(context, WifiConnectionActivity.class)
72                 .putExtra(EXTRA_WIFI_SSID, ssid)
73                 .putExtra(EXTRA_WIFI_SECURITY_NAME, security);
74     }
75 
76     private WifiConfiguration mConfiguration;
77     private int mWifiSecurity;
78     private StateMachine mStateMachine;
79     private State mConnectAuthFailureState;
80     private State mConnectFailedState;
81     private State mConnectRejectedByApState;
82     private State mConnectState;
83     private State mConnectTimeOutState;
84     private State mEnterPasswordState;
85     private State mKnownNetworkState;
86     private State mSuccessState;
87     private State mOptionsOrConnectState;
88     private State mAddStartState;
89     private State mFinishState;
90 
91     private final StateMachine.Callback mStateMachineCallback = new StateMachine.Callback() {
92         @Override
93         public void onFinish(int result) {
94             setResult(result);
95             finish();
96         }
97     };
98 
99     @Override
onCreate(Bundle savedInstanceState)100     protected void onCreate(Bundle savedInstanceState) {
101         super.onCreate(savedInstanceState);
102         setContentView(R.layout.wifi_container);
103         mStateMachine = ViewModelProviders.of(this).get(StateMachine.class);
104         mStateMachine.setCallback(mStateMachineCallback);
105         mKnownNetworkState = new KnownNetworkState(this);
106         mEnterPasswordState = new EnterPasswordState(this);
107         mConnectState = new ConnectState(this);
108         mConnectTimeOutState = new ConnectTimeOutState(this);
109         mConnectRejectedByApState = new ConnectRejectedByApState(this);
110         mConnectFailedState = new ConnectFailedState(this);
111         mConnectAuthFailureState = new ConnectAuthFailureState(this);
112         mSuccessState = new SuccessState(this);
113         mOptionsOrConnectState = new OptionsOrConnectState(this);
114         mAddStartState = new AddStartState(this);
115         mFinishState = new FinishState(this);
116 
117         /* KnownNetwork */
118         mStateMachine.addState(
119                 mKnownNetworkState,
120                 StateMachine.ADD_START,
121                 mAddStartState);
122         mStateMachine.addState(
123                 mKnownNetworkState,
124                 StateMachine.SELECT_WIFI,
125                 mFinishState);
126 
127         /* Add Start */
128         mStateMachine.addState(
129                 mAddStartState,
130                 StateMachine.PASSWORD,
131                 mEnterPasswordState);
132         mStateMachine.addState(
133                 mAddStartState,
134                 StateMachine.CONNECT,
135                 mConnectState);
136 
137         /* Enter Password */
138         mStateMachine.addState(
139                 mEnterPasswordState,
140                 StateMachine.OPTIONS_OR_CONNECT,
141                 mOptionsOrConnectState);
142 
143         /* Option or Connect */
144         mStateMachine.addState(
145                 mOptionsOrConnectState,
146                 StateMachine.CONNECT,
147                 mConnectState);
148 
149         /* Connect */
150         mStateMachine.addState(
151                 mConnectState,
152                 StateMachine.RESULT_REJECTED_BY_AP,
153                 mConnectRejectedByApState);
154         mStateMachine.addState(
155                 mConnectState,
156                 StateMachine.RESULT_UNKNOWN_ERROR,
157                 mConnectFailedState);
158         mStateMachine.addState(
159                 mConnectState,
160                 StateMachine.RESULT_TIMEOUT,
161                 mConnectTimeOutState);
162         mStateMachine.addState(
163                 mConnectState,
164                 StateMachine.RESULT_BAD_AUTH,
165                 mConnectAuthFailureState);
166         mStateMachine.addState(
167                 mConnectState,
168                 StateMachine.RESULT_SUCCESS,
169                 mSuccessState);
170 
171         /* Connect Failed */
172         mStateMachine.addState(
173                 mConnectFailedState,
174                 StateMachine.TRY_AGAIN,
175                 mOptionsOrConnectState
176         );
177         mStateMachine.addState(
178                 mConnectFailedState,
179                 StateMachine.SELECT_WIFI,
180                 mFinishState
181         );
182 
183         /* Connect Timeout */
184         mStateMachine.addState(
185                 mConnectTimeOutState,
186                 StateMachine.TRY_AGAIN,
187                 mOptionsOrConnectState
188         );
189         mStateMachine.addState(
190                 mConnectTimeOutState,
191                 StateMachine.SELECT_WIFI,
192                 mFinishState
193         );
194 
195         /* Connect Rejected By AP */
196         mStateMachine.addState(
197                 mConnectRejectedByApState,
198                 StateMachine.TRY_AGAIN,
199                 mOptionsOrConnectState);
200         mStateMachine.addState(
201                 mConnectRejectedByApState,
202                 StateMachine.SELECT_WIFI,
203                 mFinishState);
204 
205         /*Connect Auth Failure */
206         mStateMachine.addState(
207                 mConnectAuthFailureState,
208                 StateMachine.TRY_AGAIN,
209                 mOptionsOrConnectState
210         );
211         mStateMachine.addState(
212                 mConnectAuthFailureState,
213                 StateMachine.SELECT_WIFI,
214                 mFinishState
215         );
216 
217         mWifiSecurity = getIntent().getIntExtra(EXTRA_WIFI_SECURITY_NAME, 0);
218         mConfiguration = WifiConfigHelper.getConfiguration(
219                 this, getIntent().getStringExtra(EXTRA_WIFI_SSID), mWifiSecurity);
220 
221         AdvancedWifiOptionsFlow.createFlow(
222                 this, false, true, null,
223                 mOptionsOrConnectState, mConnectState, AdvancedWifiOptionsFlow.START_DEFAULT_PAGE);
224         UserChoiceInfo userChoiceInfo =
225                     ViewModelProviders.of(this).get(UserChoiceInfo.class);
226         userChoiceInfo.setWifiConfiguration(mConfiguration);
227         userChoiceInfo.setWifiSecurity(mWifiSecurity);
228         if (WifiConfigHelper.isNetworkSaved(mConfiguration)) {
229             mStateMachine.setStartState(mKnownNetworkState);
230         } else {
231             mStateMachine.setStartState(mAddStartState);
232         }
233         mStateMachine.start(true);
234     }
235 
236     @Override
onBackPressed()237     public void onBackPressed() {
238         mStateMachine.back();
239     }
240 
updateView(android.support.v4.app.Fragment fragment, boolean movingForward)241     private void updateView(android.support.v4.app.Fragment fragment, boolean movingForward) {
242         if (fragment != null) {
243             FragmentTransaction updateTransaction = getSupportFragmentManager().beginTransaction();
244             if (movingForward) {
245                 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
246             } else {
247                 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
248             }
249             updateTransaction.replace(R.id.wifi_container, fragment, TAG);
250             updateTransaction.commit();
251         }
252     }
253 
254     @Override
onFragmentChange(Fragment newFragment, boolean movingForward)255     public void onFragmentChange(Fragment newFragment, boolean movingForward) {
256         updateView(newFragment, movingForward);
257     }
258 
259     @Override
getMetricsCategory()260     public int getMetricsCategory() {
261         return MetricsEvent.SETTINGS_TV_WIFI_ADD_KNOWN_CATEGORY;
262     }
263 }
264