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