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