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.os.Bundle; 21 import android.support.v4.app.Fragment; 22 import android.support.v4.app.FragmentTransaction; 23 24 import com.android.internal.logging.nano.MetricsProto; 25 import com.android.tv.settings.R; 26 import com.android.tv.settings.connectivity.setup.AdvancedWifiOptionsFlow; 27 import com.android.tv.settings.connectivity.setup.ChooseSecurityState; 28 import com.android.tv.settings.connectivity.setup.ConnectAuthFailureState; 29 import com.android.tv.settings.connectivity.setup.ConnectFailedState; 30 import com.android.tv.settings.connectivity.setup.ConnectRejectedByApState; 31 import com.android.tv.settings.connectivity.setup.ConnectState; 32 import com.android.tv.settings.connectivity.setup.ConnectTimeOutState; 33 import com.android.tv.settings.connectivity.setup.EnterPasswordState; 34 import com.android.tv.settings.connectivity.setup.EnterSsidState; 35 import com.android.tv.settings.connectivity.setup.OptionsOrConnectState; 36 import com.android.tv.settings.connectivity.setup.SuccessState; 37 import com.android.tv.settings.connectivity.setup.UserChoiceInfo; 38 import com.android.tv.settings.connectivity.util.State; 39 import com.android.tv.settings.connectivity.util.StateMachine; 40 import com.android.tv.settings.core.instrumentation.InstrumentedActivity; 41 42 /** 43 * Manual-style add wifi network (the kind you'd use for adding a hidden or out-of-range network.) 44 */ 45 public class AddWifiNetworkActivity extends InstrumentedActivity 46 implements State.FragmentChangeListener { 47 private static final String TAG = "AddWifiNetworkActivity"; 48 private State mChooseSecurityState; 49 private State mConnectAuthFailureState; 50 private State mConnectFailedState; 51 private State mConnectRejectedByApState; 52 private State mConnectState; 53 private State mConnectTimeOutState; 54 private State mEnterPasswordState; 55 private State mEnterSsidState; 56 private State mSuccessState; 57 private State mOptionsOrConnectState; 58 private State mEnterAdvancedFlowOrRetryState; 59 private State mFinishState; 60 private StateMachine mStateMachine; 61 private final StateMachine.Callback mStateMachineCallback = new StateMachine.Callback() { 62 @Override 63 public void onFinish(int result) { 64 setResult(result); 65 finish(); 66 } 67 }; 68 69 @Override 70 protected void onCreate(Bundle savedInstanceState) { 71 super.onCreate(savedInstanceState); 72 setContentView(R.layout.wifi_container); 73 mStateMachine = ViewModelProviders.of(this).get(StateMachine.class); 74 mStateMachine.setCallback(mStateMachineCallback); 75 UserChoiceInfo userChoiceInfo = ViewModelProviders.of(this).get(UserChoiceInfo.class); 76 userChoiceInfo.getWifiConfiguration().hiddenSSID = true; 77 78 mEnterSsidState = new EnterSsidState(this); 79 mChooseSecurityState = new ChooseSecurityState(this); 80 mEnterPasswordState = new EnterPasswordState(this); 81 mConnectState = new ConnectState(this); 82 mSuccessState = new SuccessState(this); 83 mOptionsOrConnectState = new OptionsOrConnectState(this); 84 mConnectTimeOutState = new ConnectTimeOutState(this); 85 mConnectRejectedByApState = new ConnectRejectedByApState(this); 86 mConnectFailedState = new ConnectFailedState(this); 87 mConnectAuthFailureState = new ConnectAuthFailureState(this); 88 mFinishState = new FinishState(this); 89 mEnterAdvancedFlowOrRetryState = new EnterAdvancedFlowOrRetryState(this); 90 91 AdvancedWifiOptionsFlow.createFlow( 92 this, true, true, null, mOptionsOrConnectState, 93 mConnectState, AdvancedWifiOptionsFlow.START_DEFAULT_PAGE); 94 AdvancedWifiOptionsFlow.createFlow( 95 this, true, true, null, mEnterAdvancedFlowOrRetryState, 96 mConnectState, AdvancedWifiOptionsFlow.START_DEFAULT_PAGE); 97 98 /* Enter SSID */ 99 mStateMachine.addState( 100 mEnterSsidState, 101 StateMachine.CONTINUE, 102 mChooseSecurityState 103 ); 104 105 /* Choose security */ 106 mStateMachine.addState( 107 mChooseSecurityState, 108 StateMachine.OPTIONS_OR_CONNECT, 109 mOptionsOrConnectState 110 ); 111 mStateMachine.addState( 112 mChooseSecurityState, 113 StateMachine.PASSWORD, 114 mEnterPasswordState 115 ); 116 117 /* Enter Password */ 118 mStateMachine.addState( 119 mEnterPasswordState, 120 StateMachine.OPTIONS_OR_CONNECT, 121 mOptionsOrConnectState 122 ); 123 124 /* Options or Connect */ 125 mStateMachine.addState( 126 mOptionsOrConnectState, 127 StateMachine.CONNECT, 128 mConnectState 129 ); 130 131 /* Connect */ 132 mStateMachine.addState( 133 mConnectState, 134 StateMachine.RESULT_REJECTED_BY_AP, 135 mConnectRejectedByApState); 136 mStateMachine.addState( 137 mConnectState, 138 StateMachine.RESULT_UNKNOWN_ERROR, 139 mConnectFailedState); 140 mStateMachine.addState( 141 mConnectState, 142 StateMachine.RESULT_TIMEOUT, 143 mConnectTimeOutState); 144 mStateMachine.addState( 145 mConnectState, 146 StateMachine.RESULT_BAD_AUTH, 147 mConnectAuthFailureState); 148 mStateMachine.addState( 149 mConnectState, 150 StateMachine.RESULT_SUCCESS, 151 mSuccessState); 152 153 /* Connect Failed */ 154 mStateMachine.addState( 155 mConnectFailedState, 156 StateMachine.TRY_AGAIN, 157 mOptionsOrConnectState 158 ); 159 160 mStateMachine.addState( 161 mConnectFailedState, 162 StateMachine.SELECT_WIFI, 163 mFinishState 164 ); 165 166 /* Connect Timeout */ 167 mStateMachine.addState( 168 mConnectTimeOutState, 169 StateMachine.TRY_AGAIN, 170 mOptionsOrConnectState 171 ); 172 mStateMachine.addState( 173 mConnectTimeOutState, 174 StateMachine.SELECT_WIFI, 175 mFinishState 176 ); 177 178 /* Connect Rejected By AP */ 179 mStateMachine.addState( 180 mConnectRejectedByApState, 181 StateMachine.TRY_AGAIN, 182 mOptionsOrConnectState); 183 mStateMachine.addState( 184 mConnectRejectedByApState, 185 StateMachine.SELECT_WIFI, 186 mFinishState); 187 188 /* Connect Auth Failure */ 189 mStateMachine.addState( 190 mConnectAuthFailureState, 191 StateMachine.TRY_AGAIN, 192 mEnterAdvancedFlowOrRetryState); 193 mStateMachine.addState( 194 mConnectRejectedByApState, 195 StateMachine.SELECT_WIFI, 196 mFinishState); 197 198 /* Enter Advanced Flow or Retry */ 199 mStateMachine.addState( 200 mEnterAdvancedFlowOrRetryState, 201 StateMachine.CONTINUE, 202 mEnterSsidState); 203 mStateMachine.setStartState(mEnterSsidState); 204 mStateMachine.start(true); 205 } 206 207 @Override 208 public int getMetricsCategory() { 209 // do not log visibility. 210 return MetricsProto.MetricsEvent.ACTION_WIFI_ADD_NETWORK; 211 } 212 213 @Override 214 public void onBackPressed() { 215 mStateMachine.back(); 216 } 217 218 private void updateView(Fragment fragment, boolean movingForward) { 219 if (fragment != null) { 220 FragmentTransaction updateTransaction = getSupportFragmentManager().beginTransaction(); 221 if (movingForward) { 222 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 223 } else { 224 updateTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 225 } 226 updateTransaction.replace(R.id.wifi_container, fragment, TAG); 227 updateTransaction.commit(); 228 } 229 } 230 231 @Override 232 public void onFragmentChange(Fragment newFragment, boolean movingForward) { 233 updateView(newFragment, movingForward); 234 } 235 } 236