Home | History | Annotate | Download | only in connectivity
      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